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));
120 sqlite3_finalize(res);
127 on_interface_proxy_properties_changed (GDBusProxy *proxy,
128 GVariant *changed_properties,
129 const gchar* const *invalidated_properties)
134 const gchar *pInterface;
137 pInterface = g_dbus_proxy_get_interface_name (proxy);
139 if (0 != g_strcmp0(pInterface, LIGHTMEDIASCANNER_INTERFACE))
142 g_variant_iter_init (&iter, changed_properties);
143 while (g_variant_iter_next (&iter, "{&sv}", &key, &subValue))
146 if (0 == g_strcmp0(key,"IsScanning")) {
147 g_variant_get(subValue, "b", &val);
150 } else if (0 == g_strcmp0(key, "WriteLocked")) {
151 g_variant_get(subValue, "b", &val);
159 list = media_lightmediascanner_scan();
161 if (list != NULL && g_RegisterCallback.binding_device_added)
162 g_RegisterCallback.binding_device_added(list);
164 g_list_free_full(list, g_free);
169 static int MediaPlayerDBusInit(void)
171 GError *error = NULL;
173 MediaPlayerManage.lms_proxy = scanner1_proxy_new_for_bus_sync(
174 G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, LIGHTMEDIASCANNER_SERVICE,
175 LIGHTMEDIASCANNER_PATH, NULL, &error);
177 if (MediaPlayerManage.lms_proxy == NULL) {
178 LOGE("Create LightMediaScanner Proxy failed\n");
182 g_signal_connect (MediaPlayerManage.lms_proxy,
183 "g-properties-changed",
184 G_CALLBACK (on_interface_proxy_properties_changed),
190 static void *media_event_loop_thread(void *unused)
192 GMainLoop *loop = g_main_loop_new(NULL, FALSE);
195 ret = MediaPlayerDBusInit();
197 LOGD("g_main_loop_run\n");
198 g_main_loop_run(loop);
201 g_main_loop_unref(loop);
207 unmount_cb (GFileMonitor *mon,
210 GFileMonitorEvent event,
213 gchar *path = g_file_get_path(file);
214 gchar *uri = g_strconcat("file://", path, NULL);
219 if (g_RegisterCallback.binding_device_removed &&
220 event == G_FILE_MONITOR_EVENT_DELETED) {
221 g_RegisterCallback.binding_device_removed(uri);
229 * Create MediaPlayer Manager Thread
230 * Note: mediaplayer-api should do MediaPlayerManagerInit() before any other
232 * Returns: 0 - success or error conditions
234 int MediaPlayerManagerInit() {
239 g_mutex_init(&(MediaPlayerManage.m));
241 file = g_file_new_for_path("/media");
242 g_assert(file != NULL);
244 mon = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
245 g_assert(mon != NULL);
246 g_signal_connect (mon, "changed", G_CALLBACK(unmount_cb), NULL);
248 pthread_create(&thread_id, NULL, media_event_loop_thread, NULL);
254 * Register MediaPlayer Manager Callback functions
256 void BindingAPIRegister(const Binding_RegisterCallback_t* pstRegisterCallback)
258 if (NULL != pstRegisterCallback)
260 if (NULL != pstRegisterCallback->binding_device_added)
262 g_RegisterCallback.binding_device_added =
263 pstRegisterCallback->binding_device_added;
266 if (NULL != pstRegisterCallback->binding_device_removed)
268 g_RegisterCallback.binding_device_removed =
269 pstRegisterCallback->binding_device_removed;