From 7174c1ecd69c0e54f345621b50a5facf30e03e16 Mon Sep 17 00:00:00 2001
From: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
Date: Thu, 20 Sep 2007 14:40:09 -0400
Subject: [PATCH] Send DTMF!

---
 sflphone-gtk/src/actions.c          |  2 +-
 sflphone-gtk/src/callmanager-glue.h | 37 +++++++++++++++++++++++++++++
 sflphone-gtk/src/dbus.c             | 24 +++++++++++++++++++
 sflphone-gtk/src/dbus.h             |  1 +
 src/dbus/callmanager-glue.h         | 17 +++++++++++++
 src/dbus/callmanager-introspec.xml  |  4 ++++
 src/dbus/callmanager.cpp            |  6 +++++
 src/dbus/callmanager.h              |  3 ++-
 8 files changed, 92 insertions(+), 2 deletions(-)

diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c
index 4589bb5556..919476a4c7 100644
--- a/sflphone-gtk/src/actions.c
+++ b/sflphone-gtk/src/actions.c
@@ -254,7 +254,7 @@ sflphone_keypad( guint keyval, gchar * key)
           dbus_hang_up(c);
           break;
         default:
-          //TODO send DTMF, 
+          dbus_play_dtmf(key);
           if (keyval < 255 || (keyval >65453 && keyval < 65466))
           { 
             gchar * temp = g_strconcat(call_get_number(c), key, NULL);
diff --git a/sflphone-gtk/src/callmanager-glue.h b/sflphone-gtk/src/callmanager-glue.h
index 538a8f72e8..01bf51b3b7 100644
--- a/sflphone-gtk/src/callmanager-glue.h
+++ b/sflphone-gtk/src/callmanager-glue.h
@@ -273,6 +273,43 @@ static
 inline
 #endif
 gboolean
+org_sflphone_SFLphone_CallManager_play_dt_mf (DBusGProxy *proxy, const char * IN_key, GError **error)
+
+{
+  return dbus_g_proxy_call (proxy, "playDTMF", error, G_TYPE_STRING, IN_key, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_sflphone_SFLphone_CallManager_play_dt_mf_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_sflphone_SFLphone_CallManager_play_dt_mf_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+  DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+  GError *error = NULL;
+  dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+  (*(org_sflphone_SFLphone_CallManager_play_dt_mf_reply)data->cb) (proxy, error, data->userdata);
+  return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_sflphone_SFLphone_CallManager_play_dt_mf_async (DBusGProxy *proxy, const char * IN_key, org_sflphone_SFLphone_CallManager_play_dt_mf_reply callback, gpointer userdata)
+
+{
+  DBusGAsyncData *stuff;
+  stuff = g_new (DBusGAsyncData, 1);
+  stuff->cb = G_CALLBACK (callback);
+  stuff->userdata = userdata;
+  return dbus_g_proxy_begin_call (proxy, "playDTMF", org_sflphone_SFLphone_CallManager_play_dt_mf_async_callback, stuff, g_free, G_TYPE_STRING, IN_key, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
 org_sflphone_SFLphone_CallManager_set_volume (DBusGProxy *proxy, const char * IN_device, const gdouble IN_value, GError **error)
 
 {
diff --git a/sflphone-gtk/src/dbus.c b/sflphone-gtk/src/dbus.c
index 9dc7372218..e967b00bf2 100644
--- a/sflphone-gtk/src/dbus.c
+++ b/sflphone-gtk/src/dbus.c
@@ -487,3 +487,27 @@ dbus_get_volume(const gchar * device)
   }
   return value;
 }
+
+
+void
+dbus_play_dtmf(const gchar * key)
+{
+  GError *error = NULL;
+  
+  org_sflphone_SFLphone_CallManager_play_dt_mf(
+    callManagerProxy, 
+    key, 
+    &error);
+
+  if (error) 
+  {
+    g_printerr ("Failed to call playDTMF() on callManagerProxy: %s\n",
+                error->message);
+    g_error_free (error);
+  } 
+  else 
+  {
+    g_print ("DBus called playDTMF() on callManagerProxy\n");
+
+  }
+}
diff --git a/sflphone-gtk/src/dbus.h b/sflphone-gtk/src/dbus.h
index f6050142ce..1da6c7af12 100644
--- a/sflphone-gtk/src/dbus.h
+++ b/sflphone-gtk/src/dbus.h
@@ -48,5 +48,6 @@ void dbus_set_account_details(account_t *a);
 void dbus_remove_account(gchar * accountID);
 void dbus_set_volume(const gchar * device, gdouble value);
 gdouble dbus_get_volume(const gchar * device);
+void dbus_play_dtmf(const gchar * key);
 
 #endif
diff --git a/src/dbus/callmanager-glue.h b/src/dbus/callmanager-glue.h
index f52f48626a..e77c0ac076 100644
--- a/src/dbus/callmanager-glue.h
+++ b/src/dbus/callmanager-glue.h
@@ -27,6 +27,7 @@ public:
         register_method(CallManager, hold, _hold_stub);
         register_method(CallManager, unhold, _unhold_stub);
         register_method(CallManager, transfert, _transfert_stub);
+        register_method(CallManager, playDTMF, _playDTMF_stub);
         register_method(CallManager, setVolume, _setVolume_stub);
         register_method(CallManager, getVolume, _getVolume_stub);
         register_method(CallManager, getCallDetails, _getCallDetails_stub);
@@ -73,6 +74,11 @@ public:
             { "to", "s", true },
             { 0, 0, 0 }
         };
+        static ::DBus::IntrospectedArgument playDTMF_args[] = 
+        {
+            { "key", "s", true },
+            { 0, 0, 0 }
+        };
         static ::DBus::IntrospectedArgument setVolume_args[] = 
         {
             { "device", "s", true },
@@ -141,6 +147,7 @@ public:
             { "hold", hold_args },
             { "unhold", unhold_args },
             { "transfert", transfert_args },
+            { "playDTMF", playDTMF_args },
             { "setVolume", setVolume_args },
             { "getVolume", getVolume_args },
             { "getCallDetails", getCallDetails_args },
@@ -189,6 +196,7 @@ public:
     virtual void hold( const ::DBus::String& callID ) = 0;
     virtual void unhold( const ::DBus::String& callID ) = 0;
     virtual void transfert( const ::DBus::String& callID, const ::DBus::String& to ) = 0;
+    virtual void playDTMF( const ::DBus::String& key ) = 0;
     virtual void setVolume( const ::DBus::String& device, const ::DBus::Double& value ) = 0;
     virtual ::DBus::Double getVolume( const ::DBus::String& device ) = 0;
     virtual std::map< ::DBus::String, ::DBus::String > getCallDetails( const ::DBus::String& callID ) = 0;
@@ -317,6 +325,15 @@ private:
         ::DBus::ReturnMessage reply(call);
         return reply;
     }
+    ::DBus::Message _playDTMF_stub( const ::DBus::CallMessage& call )
+    {
+        ::DBus::MessageIter ri = call.reader();
+
+        ::DBus::String argin1; ri >> argin1;
+        playDTMF(argin1);
+        ::DBus::ReturnMessage reply(call);
+        return reply;
+    }
     ::DBus::Message _setVolume_stub( const ::DBus::CallMessage& call )
     {
         ::DBus::MessageIter ri = call.reader();
diff --git a/src/dbus/callmanager-introspec.xml b/src/dbus/callmanager-introspec.xml
index 2a5d84d1e0..fc4a042ac3 100644
--- a/src/dbus/callmanager-introspec.xml
+++ b/src/dbus/callmanager-introspec.xml
@@ -33,6 +33,10 @@
       <arg type="s" name="to" direction="in"/>
     </method>
     
+    <method name="playDTMF">
+      <arg type="s" name="key" direction="in"/>
+    </method>
+    
     <method name="setVolume">
       <arg type="s" name="device" direction="in"/>
       <arg type="d" name="value" direction="in"/>
diff --git a/src/dbus/callmanager.cpp b/src/dbus/callmanager.cpp
index 6c779a36d7..4708f7f630 100644
--- a/src/dbus/callmanager.cpp
+++ b/src/dbus/callmanager.cpp
@@ -133,4 +133,10 @@ CallManager::getCurrentCallID(  )
     return Manager::instance().getCurrentCallId();
 }
 
+void 
+CallManager::playDTMF( const ::DBus::String& key )
+{
+  Manager::instance().sendDtmf(Manager::instance().getCurrentCallId(), key.c_str()[0]);
+}
+
 
diff --git a/src/dbus/callmanager.h b/src/dbus/callmanager.h
index 906b7c479b..f52d8ed601 100644
--- a/src/dbus/callmanager.h
+++ b/src/dbus/callmanager.h
@@ -50,7 +50,8 @@ public:
     ::DBus::Double getVolume( const ::DBus::String& device );
     std::map< ::DBus::String, ::DBus::String > getCallDetails( const ::DBus::String& callID );
     ::DBus::String getCurrentCallID(  );
-
+    void playDTMF( const ::DBus::String& key );
+    
 };
 
 
-- 
GitLab