Adds checking dbus error messages
[platform/core/multimedia/libmm-sound.git] / common / mm_sound_dbus.c
index fcd43b3..010b9e8 100644 (file)
@@ -20,7 +20,7 @@ struct dbus_path {
        char *interface;
 };
 
-const struct dbus_path g_paths[AUDIO_PROVIDER_MAX] = {
+static const struct dbus_path g_paths[AUDIO_PROVIDER_MAX] = {
        [AUDIO_PROVIDER_SOUND_SERVER] = {
                .bus_name = "org.tizen.SoundServer",
                .object = "/org/tizen/SoundServer1",
@@ -45,18 +45,23 @@ const struct dbus_path g_paths[AUDIO_PROVIDER_MAX] = {
                .bus_name = "org.tizen.AudioClient",
                .object = "/org/tizen/AudioClient1",
                .interface = "org.tizen.AudioClient1"
+       },
+       [AUDIO_PROVIDER_SOUND_PLAYER] = {
+               .bus_name = "org.pulseaudio.Server",
+               .object = "/org/pulseaudio/SoundPlayer",
+               .interface = "org.pulseaudio.SoundPlayer"
        }
 };
 
-const mm_sound_dbus_method_info_t g_methods[AUDIO_METHOD_MAX] = {
+static const mm_sound_dbus_method_info_t g_methods[AUDIO_METHOD_MAX] = {
        [AUDIO_METHOD_TEST] = {
                .name = "MethodTest1",
        },
-       [AUDIO_METHOD_PLAY_FILE_START_WITH_STREAM_INFO] = {
-               .name = "PlayFileStartWithStreamInfo",
+       [AUDIO_METHOD_SOUND_PLAY] = {
+               .name = "SoundPlay",
        },
-       [AUDIO_METHOD_PLAY_FILE_STOP] = {
-               .name = "PlayFileStop",
+       [AUDIO_METHOD_SOUND_STOP] = {
+               .name = "SoundStop",
        },
        [AUDIO_METHOD_PLAY_DTMF_WITH_STREAM_INFO] = {
                .name = "PlayDTMFWithStreamInfo",
@@ -64,6 +69,9 @@ const mm_sound_dbus_method_info_t g_methods[AUDIO_METHOD_MAX] = {
        [AUDIO_METHOD_SET_VOLUME_LEVEL] = {
                .name = "SetVolumeLevel",
        },
+       [AUDIO_METHOD_SET_MUTE] = {
+               .name = "SetVolumeMute",
+       },
        [AUDIO_METHOD_GET_CONNECTED_DEVICE_LIST] = {
                .name = "GetConnectedDeviceList",
        },
@@ -93,12 +101,12 @@ const mm_sound_dbus_method_info_t g_methods[AUDIO_METHOD_MAX] = {
        },
 };
 
-const mm_sound_dbus_signal_info_t g_events[AUDIO_EVENT_MAX] = {
+static const mm_sound_dbus_signal_info_t g_events[AUDIO_EVENT_MAX] = {
        [AUDIO_EVENT_TEST] = {
                .name = "SignalTest1",
        },
-       [AUDIO_EVENT_PLAY_FILE_END] = {
-               .name = "PlayFileEnd",
+       [AUDIO_EVENT_SOUND_PLAY_EOS] = {
+               .name = "EOS",
        },
        [AUDIO_EVENT_VOLUME_CHANGED] = {
                .name = "VolumeChanged",
@@ -126,6 +134,9 @@ const mm_sound_dbus_signal_info_t g_events[AUDIO_EVENT_MAX] = {
        },
        [AUDIO_EVENT_CLIENT_HANDLED] = {
                .name = "ClientSignalHandled",
+       },
+       [AUDIO_EVENT_DUCKING_STATE_CHANGED] = {
+               .name = "DuckingStateChanged",
        }
 };
 
@@ -158,37 +169,15 @@ static const GDBusErrorEntry mm_sound_error_entries[] = {
                Wrapper Functions of GDbus
 ******************************************************************************************/
 
-static int _parse_error_msg(char *full_err_msg, char **err_name, char **err_msg)
+static int _convert_error_name(const char *err_msg)
 {
-       char *save_p = NULL, *domain, *_err_name, *_err_msg;
-
-       if (!(domain = strtok_r(full_err_msg, ":", &save_p))) {
-               debug_error("get domain failed");
-               return -1;
-       }
-       if (!(_err_name = strtok_r(NULL, ":", &save_p))) {
-               debug_error("get err name failed");
-               return -1;
-       }
-       if (!(_err_msg = strtok_r(NULL, ":", &save_p))) {
-               debug_error("get err msg failed");
-               return -1;
-       }
+       int i;
 
-       *err_name = _err_name;
-       *err_msg = _err_msg;
-
-       return 0;
-}
-
-static int _convert_error_name(const char *err_name)
-{
-       int i = 0;
-
-       debug_error("error name is [%s]", err_name);
+       if (!err_msg)
+               return MM_ERROR_SOUND_INTERNAL;
 
        for (i = 0; i < G_N_ELEMENTS(mm_sound_error_entries); i++) {
-               if (!strcmp(mm_sound_error_entries[i].dbus_error_name, err_name))
+               if (strstr(err_msg, mm_sound_error_entries[i].dbus_error_name))
                        return mm_sound_error_entries[i].error_code;
        }
 
@@ -212,6 +201,7 @@ static int _dbus_method_call(GDBusConnection *conn, const char *bus_name, const
                        debug_error("intf null");
                if (!method)
                        debug_error("method null");
+               g_variant_unref(args);
                return MM_ERROR_INVALID_ARGUMENT;
        }
 
@@ -222,23 +212,18 @@ static int _dbus_method_call(GDBusConnection *conn, const char *bus_name, const
                                                                                        NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
 
        if (!dbus_reply || err) {
-               char *err_name = NULL, *err_msg = NULL;
                debug_error("Method Call '%s.%s' Failed, %s", intf, method, err ? err->message : NULL);
                ret = MM_ERROR_SOUND_INTERNAL;
-               if (err) {
-                       if (_parse_error_msg(err->message, &err_name, &err_msg) < 0) {
-                               debug_error("failed to parse error message");
-                               g_error_free(err);
-                               return MM_ERROR_SOUND_INTERNAL;
-                       }
-                       ret = _convert_error_name(err_name);
-               }
+               if (err)
+                       ret = _convert_error_name(err->message);
+
                g_error_free(err);
        } else {
                debug_log("Method Call '%s.%s' Success", intf, method);
        }
 
-       *result = dbus_reply;
+       if (result)
+               *result = dbus_reply;
 
        return ret;
 }
@@ -344,15 +329,18 @@ int mm_sound_dbus_method_call_to(audio_provider_t provider, audio_method_t metho
 
        if (method_type >= AUDIO_METHOD_MAX) {
                debug_error("Invalid method type : %d", method_type);
+               g_variant_unref(args);
                return MM_ERROR_INVALID_ARGUMENT;
        }
        if (provider >= AUDIO_PROVIDER_MAX) {
                debug_error("Invalid provider : %d", provider);
+               g_variant_unref(args);
                return MM_ERROR_INVALID_ARGUMENT;
        }
 
        if (!(conn = _dbus_get_connection(G_BUS_TYPE_SYSTEM))) {
                debug_error("Get Dbus Connection Error");
+               g_variant_unref(args);
                return MM_ERROR_SOUND_INTERNAL;
        }
 
@@ -392,10 +380,12 @@ static void _dbus_signal_callback(GDBusConnection *connection,
                (cb_data->user_cb)(AUDIO_EVENT_FOCUS_CHANGED, params, cb_data->user_data);
        else if (!strcmp(signal_name, g_events[AUDIO_EVENT_FOCUS_WATCH].name))
                (cb_data->user_cb)(AUDIO_EVENT_FOCUS_WATCH, params, cb_data->user_data);
-       else if (!strcmp(signal_name, g_events[AUDIO_EVENT_PLAY_FILE_END].name))
-               (cb_data->user_cb)(AUDIO_EVENT_PLAY_FILE_END, params, cb_data->user_data);
+       else if (!strcmp(signal_name, g_events[AUDIO_EVENT_SOUND_PLAY_EOS].name))
+               (cb_data->user_cb)(AUDIO_EVENT_SOUND_PLAY_EOS, params, cb_data->user_data);
        else if (!strcmp(signal_name, g_events[AUDIO_EVENT_DEVICE_RUNNING_CHANGED].name))
                (cb_data->user_cb)(AUDIO_EVENT_DEVICE_RUNNING_CHANGED, params, cb_data->user_data);
+       else if (!strcmp(signal_name, g_events[AUDIO_EVENT_DUCKING_STATE_CHANGED].name))
+               (cb_data->user_cb)(AUDIO_EVENT_DUCKING_STATE_CHANGED, params, cb_data->user_data);
 }
 
 static void callback_data_free_func(gpointer data)
@@ -435,7 +425,7 @@ int mm_sound_dbus_signal_subscribe_to(audio_provider_t provider, audio_event_t e
                return MM_ERROR_SOUND_INTERNAL;
        }
 
-       if (!(cb_data = (struct callback_data*)g_malloc0(sizeof(struct callback_data)))) {
+       if (!(cb_data = (struct callback_data*)g_try_malloc0(sizeof(struct callback_data)))) {
                debug_error("Allocate for callback data failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
@@ -455,7 +445,7 @@ int mm_sound_dbus_signal_subscribe_to(audio_provider_t provider, audio_event_t e
        return MM_ERROR_NONE;
 
 fail:
-       free(cb_data);
+       g_free(cb_data);
        return MM_ERROR_SOUND_INTERNAL;
 }