Update user.service process & add mmc checker 52/76952/2
authorMinje Ahn <minje.ahn@samsung.com>
Tue, 28 Jun 2016 06:17:41 +0000 (15:17 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Tue, 28 Jun 2016 06:19:49 +0000 (15:19 +0900)
Change-Id: I5a0f0a17898f9f48c43f09a7f2dcf12e3c2985ec
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
Makefile.am
lib/include/media-util.h
packaging/media-server-user.service
packaging/media-server.spec
src/mediadb-update.c

index 9433f41..c1271b5 100644 (file)
@@ -171,7 +171,9 @@ mediadb_update_SOURCES = src/mediadb-update.c
 
 mediadb_update_CFLAGS = -I${srcdir}/lib/include \
                        $(GTHREAD_CFLAGS) \
-                       $(GLIB_CFLAGS)
+                       $(GLIB_CFLAGS) \
+                       $(GIO_CFLAGS) \
+                       $(DBUS_CFLAGS)
 
 mediadb_update_CFLAGS += -fPIE
 
@@ -180,6 +182,8 @@ mediadb_update_LDFLAGS = -pie
 mediadb_update_LDADD = libmedia-utils.la \
                        $(GLIB_LIBS) \
                        $(GTHREAD_LIBS) \
+                       $(GIO_LIBS) \
+                       $(DBUS_LIBS) \
                        -ldl
 
 ### includeheaders ###
index ec54c8a..e722938 100755 (executable)
@@ -39,7 +39,6 @@
 #define MEDIA_ROOT_PATH_SDCARD tzplatform_mkpath(TZ_SYS_STORAGE, "SDCard")
 #define MEDIA_ROOT_PATH_USB            tzplatform_getenv(TZ_SYS_STORAGE)
 #define MEDIA_ROOT_PATH_CLOUD  tzplatform_mkpath(TZ_SYS_STORAGE, "tnfs/cloud")
-#define MEDIA_DATA_PATH                tzplatform_mkpath(TZ_SYS_DATA, "file-manager-service")
 #define MEDIA_DB_NAME          tzplatform_mkpath(TZ_USER_DB, ".media.db")              /**<  media db name*/
 #define MEDIA_CONTENT_PATH             "content"               /**<  user content folder name*/
 
index d010d63..23902d6 100644 (file)
@@ -5,7 +5,7 @@ Description=Media server user
 Type=idle
 CPUAccounting=true
 CPUQuota=10%
-ExecStart=/usr/bin/sh -c "/usr/bin/mediadb-update check_db;/usr/bin/mkdir -p `/usr/bin/tzplatform-get TZ_USER_SHARE | /usr/bin/sed -e 's/^.*=//g'`/media/.thumb/phone;/usr/bin/mkdir -p `/usr/bin/tzplatform-get TZ_USER_SHARE | /usr/bin/sed -e 's/^.*=//g'`/media/.thumb/mmc;/usr/bin/mkdir -p `/usr/bin/tzplatform-get TZ_USER_DATA | /usr/bin/sed -e 's/^.*=//g'`/file-manager-service;/usr/bin/mediadb-update -r `/usr/bin/tzplatform-get TZ_USER_CONTENT | /usr/bin/sed -e 's/^.*=//g'`"
+ExecStart=/usr/bin/sh -c "/usr/bin/mediadb-update check_db;/usr/bin/mediadb-update check_mmc"
 
 [Install]
 WantedBy=default.target
index 5bff519..d56055f 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       media-server
 Summary:    A server for media content management
-Version:    0.2.91
+Version:    0.2.92
 Release:    0
 Group:      Multimedia/Service
 License:    Apache-2.0
index 4979110..e2c98f6 100755 (executable)
 #include <unistd.h>
 #include <dirent.h>
 #include <dlfcn.h>
+#include <gio/gio.h>
+#include <dbus/dbus.h>
 
 #include <glib.h>
 #include "media-util.h"
 
 #include <tzplatform_config.h>
 
+#define MMC_INFO_SIZE 256
+#define BUS_NAME       "org.tizen.system.storage"
+#define OBJECT_PATH    "/Org/Tizen/System/Storage"
+#define INTERFACE_NAME BUS_NAME
+#define DBUS_REPLY_TIMEOUT (-1)
+
+#define PATH_BLOCK                  OBJECT_PATH"/Block"
+#define PATH_BLOCK_DEVICES          PATH_BLOCK"/Devices"
+#define PATH_BLOCK_MANAGER          PATH_BLOCK"/Manager"
+#define INTERFACE_BLOCK             INTERFACE_NAME".Block"
+#define INTERFACE_BLOCK_MANAGER     INTERFACE_NAME".BlockManager"
+
+#define DEVICE_METHOD "GetDeviceList"
+#define DEVICE_USB "scsi"
+#define DEVICE_MMC "mmc"
+#define DEVICE_ALL "all"
+
+#define MU_SAFE_FREE(src)              { if (src) {free(src); src = NULL;} }
+
+
 GMainLoop * mainloop = NULL;
 
+typedef struct block_info_s{
+       char *mount_path;
+       int state;
+       int block_type;
+       int flags;
+       char *mount_uuid;
+} block_info_s;
+
 int (*svc_connect)                             (void ** handle, uid_t uid, char ** err_msg);
 int (*svc_disconnect)                  (void * handle, char ** err_msg);
 int (*svc_check_db)                    (void * handle, uid_t uid, char ** err_msg);
 int (*svc_get_storage_id)              (void * handle, const char *path, char *storage_id, uid_t uid, char ** err_msg);
+int (*svc_get_mmc_info)                (void * handle, char **storage_name, char **storage_path, int *validity, bool *info_exist, char **err_msg);
+int (*svc_insert_storage)              (void *handle, const char *storage_id, int storage_type, const char *storage_name, const char *storage_path, uid_t uid, char **err_msg);
+int (*svc_delete_storage)              (void * handle, const char *storage_id, const char *storage_name, uid_t uid, char **err_msg);
+int (*svc_set_storage_validity)        (void * handle, const char *storage_id, int validity, uid_t uid, char **err_msg);
+
+
 
 void callback(media_request_result_s * result, void *user_data)
 {
@@ -66,6 +102,224 @@ void print_help()
        printf("=======================================================================================\n");
 }
 
+
+static int __get_contents(const char *filename, char *buf)
+{
+       FILE *fp;
+
+       fp = fopen(filename, "rt");
+       if (fp == NULL)
+               return -1;
+       if (fgets(buf, 255, fp) == NULL)
+               printf("fgets failed\n");
+
+       fclose(fp);
+
+       return 0;
+}
+
+/*need optimize*/
+void __get_mmc_id(char **cid)
+{
+       const char *path = "/sys/block/mmcblk1/device/cid";
+       char mmc_cid[MMC_INFO_SIZE] = {0, };
+       memset(mmc_cid, 0x00, sizeof(mmc_cid));
+
+       if (__get_contents(path, mmc_cid) != 0) {
+               printf("_get_contents failed");
+               *cid = NULL;
+       } else {
+               *cid = strndup(mmc_cid, strlen(mmc_cid) - 1);
+       }
+}
+
+int __get_device_list(GArray **dev_list)
+{
+       GDBusConnection *g_bus = NULL;
+       GError *error = NULL;
+       GDBusMessage *message = NULL;
+       GDBusMessage *reply = NULL;
+       GVariant *reply_var = NULL;
+       GVariantIter *iter = NULL;
+       char *type_str = NULL;
+       int val_int[5] = {0, };
+       char *val_str[7] = {NULL, };
+       gboolean val_bool = FALSE;
+
+       g_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (!g_bus) {
+               g_error_free(error);
+               return -1;
+       }
+
+       message = g_dbus_message_new_method_call(BUS_NAME, PATH_BLOCK_MANAGER, INTERFACE_BLOCK_MANAGER, DEVICE_METHOD);
+       if (!message) {
+               g_object_unref(g_bus);
+               return -1;
+       }
+
+       g_dbus_message_set_body(message, g_variant_new("(s)", (gchar*)DEVICE_MMC));
+
+       reply = g_dbus_connection_send_message_with_reply_sync(g_bus, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, NULL, &error);
+       g_object_unref(message);
+       if (!reply) {
+               g_error_free(error);
+               g_object_unref(message);
+               g_object_unref(g_bus);
+               return -1;
+       }
+
+       reply_var = g_dbus_message_get_body(reply);
+       if (!reply_var) {
+               g_object_unref(reply);
+               g_object_unref(g_bus);
+               return -1;
+       }
+
+       type_str = strdup((char*)g_variant_get_type_string(reply_var));
+       if (!type_str) {
+               g_variant_unref(reply_var);
+               g_object_unref(reply);
+               g_object_unref(g_bus);
+               return -1;
+       }
+
+       g_variant_get(reply_var, type_str, &iter);
+
+       while (g_variant_iter_loop(iter, "(issssssisibii)", &val_int[0], &val_str[0], &val_str[1], &val_str[2]
+               , &val_str[3], &val_str[4], &val_str[5], &val_int[1], &val_str[6], &val_int[2], &val_bool, &val_int[3], &val_int[4])) {
+               int i = 0;
+               block_info_s *data = NULL;
+
+               if (val_int[2] == 0) {
+                       /* Do nothing */
+               } else {
+                       data = malloc(sizeof(block_info_s));
+
+                       data->block_type = val_int[0];
+                       data->mount_path = strdup(val_str[6]);
+                       data->state = val_int[2];
+                       data->mount_uuid = strdup(val_str[5]);
+                       data->flags = val_int[3];
+
+                       if (*dev_list == NULL) {
+                               *dev_list = g_array_new(FALSE, FALSE, sizeof(block_info_s*));
+                       }
+                       g_array_append_val(*dev_list, data);
+               }
+
+               for (i = 0; i < 7; i++) {
+                       MU_SAFE_FREE(val_str[i]);
+               }
+       }
+
+       g_variant_iter_free(iter);
+
+       g_variant_unref(reply_var);
+       g_object_unref(reply);
+       g_object_unref(g_bus);
+       MU_SAFE_FREE(type_str);
+
+       return 0;
+}
+
+void __release_device_list(GArray **dev_list)
+{
+       if (*dev_list) {
+               while ((*dev_list)->len != 0) {
+                       block_info_s *data = NULL;
+                       data = g_array_index(*dev_list , block_info_s*, 0);
+                       g_array_remove_index(*dev_list, 0);
+                       MU_SAFE_FREE(data->mount_path);
+                       MU_SAFE_FREE(data->mount_uuid);
+                       MU_SAFE_FREE(data);
+               }
+               g_array_free(*dev_list, FALSE);
+               *dev_list = NULL;
+       }
+}
+
+static void __check_mmc(void)
+{
+       int ret = 0;
+       GArray *dev_list = NULL;
+       void *funcHandle = NULL;
+       void *db_handle = NULL;
+       char *storage_name = NULL;
+       char *storage_path = NULL;
+       int validity = 0;
+       bool info_exist = FALSE;
+       char *insert_stg_id = NULL;
+       char *err_msg = NULL;
+
+       funcHandle = dlopen("/usr/lib/libmedia-content-plugin.so", RTLD_LAZY);
+       if (funcHandle == NULL) {
+               funcHandle = dlopen("/usr/lib64/libmedia-content-plugin.so", RTLD_LAZY);
+               if (funcHandle == NULL) {
+                       printf("Error when open plug-in\n");
+                       return;
+               }
+       }
+
+       svc_connect                     = dlsym(funcHandle, "connect_db");
+       svc_disconnect          = dlsym(funcHandle, "disconnect_db");
+       svc_get_mmc_info        = dlsym(funcHandle, "get_mmc_info");
+       svc_insert_storage      = dlsym(funcHandle, "insert_storage");
+       svc_delete_storage      = dlsym(funcHandle, "delete_storage");
+       svc_set_storage_validity        = dlsym(funcHandle, "set_storage_validity");
+
+       ret = svc_connect(&db_handle, tzplatform_getuid(TZ_USER_NAME), &err_msg);
+       if (ret < 0) {
+               printf("Error svc_connect\n");
+               dlclose(funcHandle);
+               return;
+       }
+
+       ret = svc_get_mmc_info(db_handle, &storage_name, &storage_path, &validity, &info_exist, &err_msg);
+       if (ret < 0 && strcmp(err_msg, "not found in DB") != 0) {
+               printf("Error svc_get_mmc_info\n");
+               dlclose(funcHandle);
+               return;
+       }
+
+       ret = __get_device_list(&dev_list);
+       if (ret == 0) {
+               if (dev_list != NULL) {
+                       int i = 0 ;
+                       int dev_num = dev_list->len;
+                       block_info_s *block_info = NULL;
+
+                       for (i = 0; i < dev_num; i++) {
+                               block_info = (block_info_s *)g_array_index(dev_list, int *, i);
+                               if (info_exist) {
+                                       ret = svc_delete_storage(db_handle, "media", storage_name, tzplatform_getuid(TZ_USER_NAME), &err_msg);
+                                       __get_mmc_id(&insert_stg_id);
+                                       ret = svc_insert_storage(db_handle, "media", 1, insert_stg_id, block_info->mount_path, tzplatform_getuid(TZ_USER_NAME), &err_msg);
+                                       MU_SAFE_FREE(insert_stg_id);
+                               } else {
+                                       __get_mmc_id(&insert_stg_id);
+                                       ret = svc_insert_storage(db_handle, "media", 1, insert_stg_id, block_info->mount_path, tzplatform_getuid(TZ_USER_NAME), &err_msg);
+                                       MU_SAFE_FREE(insert_stg_id);
+                               }
+                       }
+                       __release_device_list(&dev_list);
+               } else {
+                       ret = svc_set_storage_validity(db_handle, "media", 0, tzplatform_getuid(TZ_USER_NAME), &err_msg);
+                       if (ret < 0)
+                               printf("Error svc_set_storage_validity\n");
+               }
+       } else {
+               printf("__get_device_list failed\n");
+       }
+
+       ret = svc_disconnect(db_handle, &err_msg);
+       if (ret < 0) {
+               printf("Error svc_disconnect\n");
+               dlclose(funcHandle);
+               return;
+       }
+}
+
 static void __check_media_db(void)
 {
        void *funcHandle = NULL;
@@ -243,6 +497,11 @@ int main(int argc, char **argv)
                        exit(1);
                }
 
+               if (strcmp(argv1 , "check_mmc") == 0) {
+                       __check_mmc();
+                       exit(1);
+               }
+
                if (check_path(argv1) == DIRECTORY_OK) {
                        len = strlen(argv1);