2 * Copyright 2017 Konsulko Group
4 * Based on bluetooth-manager.c
5 * Copyright 2016 ALPS ELECTRIC CO., LTD.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
24 #include <sys/types.h>
30 #include <glib-object.h>
33 #include "mediaplayer-manager.h"
35 static Binding_RegisterCallback_t g_RegisterCallback = { 0 };
36 static stMediaPlayerManage MediaPlayerManage = { 0 };
38 /* ------ LOCAL FUNCTIONS --------- */
40 g_mutex_lock(&(MediaPlayerManage.m));
44 g_mutex_unlock(&(MediaPlayerManage.m));
47 void DebugTraceSendMsg(int level, gchar* message)
49 #ifdef LOCAL_PRINT_DEBUG
56 case DT_LEVEL_WARNING:
77 g_print("%s",message);
86 GList* media_lightmediascanner_scan(void)
95 db_path = scanner1_get_data_base_path(MediaPlayerManage.lms_proxy);
97 ret = sqlite3_open(db_path, &conn);
99 LOGE("Cannot open SQLITE database: '%s'\n", db_path);
103 ret = sqlite3_prepare_v2(conn, SQL_QUERY, strlen(SQL_QUERY) + 1, &res, &tail);
105 LOGE("Cannot execute query '%s'\n", SQL_QUERY);
109 while (sqlite3_step(res) == SQLITE_ROW) {
111 const char *path = (const char *) sqlite3_column_text(res, 0);
113 ret = stat(path, &buf);
117 list = g_list_append(list, g_strdup_printf("file://%s", path));
125 on_interface_proxy_properties_changed (GDBusProxy *proxy,
126 GVariant *changed_properties,
127 const gchar* const *invalidated_properties)
132 const gchar *pInterface;
135 pInterface = g_dbus_proxy_get_interface_name (proxy);
137 if (0 != g_strcmp0(pInterface, LIGHTMEDIASCANNER_INTERFACE))
140 g_variant_iter_init (&iter, changed_properties);
141 while (g_variant_iter_next (&iter, "{&sv}", &key, &subValue))
144 if (0 == g_strcmp0(key,"IsScanning")) {
145 g_variant_get(subValue, "b", &val);
148 } else if (0 == g_strcmp0(key, "WriteLocked")) {
149 g_variant_get(subValue, "b", &val);
157 list = media_lightmediascanner_scan();
159 if (list != NULL && g_RegisterCallback.binding_device_added)
160 g_RegisterCallback.binding_device_added(list);
165 static int MediaPlayerDBusInit(void)
167 GError *error = NULL;
169 MediaPlayerManage.lms_proxy = scanner1_proxy_new_for_bus_sync(
170 G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, LIGHTMEDIASCANNER_SERVICE,
171 LIGHTMEDIASCANNER_PATH, NULL, &error);
173 if (MediaPlayerManage.lms_proxy == NULL) {
174 LOGE("Create LightMediaScanner Proxy failed\n");
178 g_signal_connect (MediaPlayerManage.lms_proxy,
179 "g-properties-changed",
180 G_CALLBACK (on_interface_proxy_properties_changed),
186 static void *media_event_loop_thread(void *unused)
188 GMainLoop *loop = g_main_loop_new(NULL, FALSE);
191 ret = MediaPlayerDBusInit();
193 LOGD("g_main_loop_run\n");
194 g_main_loop_run(loop);
197 g_main_loop_unref(loop);
203 unmount_cb (GFileMonitor *mon,
206 GFileMonitorEvent event,
209 gchar *path = g_file_get_path(file);
210 gchar *uri = g_strconcat("file://", path, NULL);
215 if (g_RegisterCallback.binding_device_removed &&
216 event == G_FILE_MONITOR_EVENT_DELETED) {
217 g_RegisterCallback.binding_device_removed(uri);
225 * Create MediaPlayer Manager Thread
226 * Note: mediaplayer-api should do MediaPlayerManagerInit() before any other
228 * Returns: 0 - success or error conditions
230 int MediaPlayerManagerInit() {
235 g_mutex_init(&(MediaPlayerManage.m));
237 file = g_file_new_for_path("/media");
238 g_assert(file != NULL);
240 mon = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
241 g_assert(mon != NULL);
242 g_signal_connect (mon, "changed", G_CALLBACK(unmount_cb), NULL);
244 pthread_create(&thread_id, NULL, media_event_loop_thread, NULL);
250 * Register MediaPlayer Manager Callback functions
252 void BindingAPIRegister(const Binding_RegisterCallback_t* pstRegisterCallback)
254 if (NULL != pstRegisterCallback)
256 if (NULL != pstRegisterCallback->binding_device_added)
258 g_RegisterCallback.binding_device_added =
259 pstRegisterCallback->binding_device_added;
262 if (NULL != pstRegisterCallback->binding_device_removed)
264 g_RegisterCallback.binding_device_removed =
265 pstRegisterCallback->binding_device_removed;