diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c index 4589bb5556970d50c8ac226d811f01a1f9028ac0..919476a4c74a4ad6930672302cd6b1d7c8de33fb 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 538a8f72e8481febb602a3d169d537d27869c534..01bf51b3b7a33acef508e694b828d4db96867879 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 9dc7372218f713be02a585986c7ea2e1efbc6e66..e967b00bf288b4f949cc40319bc46f149b92127b 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 f6050142ce743652ed2008e427dd5c5f2266b83a..1da6c7af1208fda589d7649314f919fc5ff34f68 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 f52f48626ad143c8fa158579818b2c33a2f3f1ab..e77c0ac076f56b56d36263160aa618e31a20aa17 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 2a5d84d1e057fb9644dd3d68710ba85cf2f8181a..fc4a042ac3e3eaadf636ea3de778caa042dab45c 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 6c779a36d7b354dac58e434832513a8aeaa55957..4708f7f6308ac534b3eb64005647012ded5ca317 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 906b7c479bbfe354367c0cc221cb6a4d9ce17a3e..f52d8ed6015bd929bae95d1e87bde76448f4af02 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 ); + };