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);
162 g_list_free_full(list, g_free);
167 static int MediaPlayerDBusInit(void)
169 GError *error = NULL;
171 MediaPlayerManage.lms_proxy = scanner1_proxy_new_for_bus_sync(
172 G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, LIGHTMEDIASCANNER_SERVICE,
173 LIGHTMEDIASCANNER_PATH, NULL, &error);
175 if (MediaPlayerManage.lms_proxy == NULL) {
176 LOGE("Create LightMediaScanner Proxy failed\n");
180 g_signal_connect (MediaPlayerManage.lms_proxy,
181 "g-properties-changed",
182 G_CALLBACK (on_interface_proxy_properties_changed),
188 static void *media_event_loop_thread(void *unused)
190 GMainLoop *loop = g_main_loop_new(NULL, FALSE);
193 ret = MediaPlayerDBusInit();
195 LOGD("g_main_loop_run\n");
196 g_main_loop_run(loop);
199 g_main_loop_unref(loop);
205 unmount_cb (GFileMonitor *mon,
208 GFileMonitorEvent event,
211 gchar *path = g_file_get_path(file);
212 gchar *uri = g_strconcat("file://", path, NULL);
217 if (g_RegisterCallback.binding_device_removed &&
218 event == G_FILE_MONITOR_EVENT_DELETED) {
219 g_RegisterCallback.binding_device_removed(uri);
227 * Create MediaPlayer Manager Thread
228 * Note: mediaplayer-api should do MediaPlayerManagerInit() before any other
230 * Returns: 0 - success or error conditions
232 int MediaPlayerManagerInit() {
237 g_mutex_init(&(MediaPlayerManage.m));
239 file = g_file_new_for_path("/media");
240 g_assert(file != NULL);
242 mon = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
243 g_assert(mon != NULL);
244 g_signal_connect (mon, "changed", G_CALLBACK(unmount_cb), NULL);
246 pthread_create(&thread_id, NULL, media_event_loop_thread, NULL);
252 * Register MediaPlayer Manager Callback functions
254 void BindingAPIRegister(const Binding_RegisterCallback_t* pstRegisterCallback)
256 if (NULL != pstRegisterCallback)
258 if (NULL != pstRegisterCallback->binding_device_added)
260 g_RegisterCallback.binding_device_added =
261 pstRegisterCallback->binding_device_added;
264 if (NULL != pstRegisterCallback->binding_device_removed)
266 g_RegisterCallback.binding_device_removed =
267 pstRegisterCallback->binding_device_removed;