tizen 2.3 release tizen_2.3 submit/tizen_2.3/20150202.063255 tizen_2.3_release
authorjk7744.park <jk7744.park@samsung.com>
Sun, 1 Feb 2015 04:48:13 +0000 (13:48 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Sun, 1 Feb 2015 04:48:13 +0000 (13:48 +0900)
20 files changed:
configure.ac
lib/include/media-server-ipc.h
lib/include/media-util.h
lib/media-util-db.c
lib/media-util-register.c
media-server.manifest [moved from wearable/media-server.manifest with 89% similarity]
mobile/media-server.manifest [deleted file]
packaging/media-server.spec
src/common/include/media-common-external-storage.h
src/common/include/media-common-types.h
src/common/media-common-external-storage.c
src/common/media-common-utils.c
src/scanner/include/media-scanner-db-svc.h
src/scanner/media-scanner-db-svc.c
src/scanner/media-scanner-scan.c
src/scanner/media-scanner-socket.c
src/server/media-server-db-svc.c
src/server/media-server-main.c
src/server/media-server-socket.c
src/server/media-server-thumb.c

index ff09ca8..edcd8bf 100755 (executable)
@@ -116,10 +116,6 @@ if test "x$USE_DEVICED" = "xyes"; then
        PKG_CHECK_MODULES(LIBPMCONTROL, deviced)
        AC_SUBST(LIBPMCONTROL_CFLAGS)
        AC_SUBST(LIBPMCONTROL_LIBS)
-else
-        PKG_CHECK_MODULES(LIBPMCONTROL, pmapi)
-        AC_SUBST(LIBPMCONTROL_CFLAGS)
-        AC_SUBST(LIBPMCONTROL_LIBS)
 fi
 AM_CONDITIONAL(USE_DEVICED, test "x$USE_DEVICED" = "xyes")
 
index cc460a2..36f667f 100755 (executable)
@@ -65,6 +65,7 @@ typedef enum{
        MS_MSG_SCANNER_READY,                           /**< Ready from media scanner */
        MS_MSG_SCANNER_RESULT,                          /**< Result of directory scanning */
        MS_MSG_SCANNER_BULK_RESULT,                     /**< Request bulk insert */
+       MS_MSG_STORAGE_META,                            /**< Request updating meta data */
        MS_MSG_MAX                                                      /**< Invalid msg type */
 }ms_msg_type_e;
 
index 1dca482..f7e6948 100755 (executable)
@@ -34,7 +34,7 @@
 #define MEDIA_ROOT_PATH_INTERNAL       MOUNT_PATH"/media"
 #define MEDIA_ROOT_PATH_SDCARD STORAGE_PATH"/sdcard"
 
-#define MEDIA_THUMB_ROOT_PATH          MOUNT_PATH"/media"
+#define MEDIA_THUMB_ROOT_PATH          MOUNT_PATH"/share/media"
 #define MEDIA_DB_NAME                          MOUNT_PATH"/dbspace/.media.db"          /**<  media db name*/
 #define MEDIA_DATA_PATH                        MOUNT_PATH"/data/file-manager-service"
 
index e324f88..67f84f6 100755 (executable)
@@ -119,6 +119,7 @@ static int __media_db_disconnect_db_with_handle(sqlite3 *db_handle)
 }
 
 extern char MEDIA_IPC_PATH[][50];
+#define MAX_RETRY_COUNT 3
 
 static int __media_db_request_update_tcp(ms_msg_type_e msg_type, const char *request_msg)
 {
@@ -128,6 +129,7 @@ static int __media_db_request_update_tcp(ms_msg_type_e msg_type, const char *req
        ms_sock_info_s sock_info;
        struct sockaddr_un serv_addr;
        int port = MS_DB_UPDATE_PORT;
+       int retry_count = 0;
 
        if(!MS_STRING_VALID(request_msg))
        {
@@ -188,12 +190,21 @@ RETRY:
                        goto RETRY;
                }
 
-               close(sockfd);
                if (errno == EWOULDBLOCK) {
+                       if(retry_count < MAX_RETRY_COUNT)       {
+                               MSAPI_DBG_ERR("TIME OUT[%d]", retry_count);
+                               retry_count ++;
+                               goto RETRY;
+                       }
+
+                       close(sockfd);
                        MSAPI_DBG_ERR("Timeout. Can't try any more");
                        return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
                } else {
                        MSAPI_DBG_ERR("recv failed : %s", strerror(errno));
+
+                       close(sockfd);
+
                        return MS_MEDIA_ERR_SOCKET_RECEIVE;
                }
        }
index 4b8beb1..f59d1ef 100755 (executable)
@@ -134,11 +134,11 @@ gboolean _read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
        req_result.pid = recv_msg.pid;
        req_result.result = recv_msg.result;
        if (recv_msg.msg_type ==MS_MSG_SCANNER_RESULT) {
-               req_result.complete_path = strdup(recv_msg.msg);
+               req_result.complete_path = strndup(recv_msg.msg, MAX_FILEPATH_LEN);
                req_result.request_type = MEDIA_DIRECTORY_SCAN;
                MSAPI_DBG("complete_path :%d", req_result.complete_path);
        } else if (recv_msg.msg_type == MS_MSG_SCANNER_BULK_RESULT) {
-               req_result.complete_path = strdup(recv_msg.msg);
+               req_result.complete_path = strndup(recv_msg.msg, MAX_FILEPATH_LEN);
                req_result.request_type = MEDIA_FILES_REGISTER;
        }
 
similarity index 89%
rename from wearable/media-server.manifest
rename to media-server.manifest
index bac7cc6..f447e3b 100644 (file)
@@ -6,6 +6,8 @@
                </provide>
                <request>
                        <smack request="system::media" type="rwxat"/>
+                       <smack request="system::media::root" type="rwxat"/>
+                       <smack request="system::ext_storage" type="rwxat"/>
                        <smack request="system::vconf" type="rwxat"/>
                        <smack request="system::vconf_system" type="r"/>
                        <smack request="deviced" type="rwx"/>
diff --git a/mobile/media-server.manifest b/mobile/media-server.manifest
deleted file mode 100644 (file)
index d378f4c..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<manifest>
-       <define>
-               <domain name="media-server" policy="restricted" plist="media-thumbnail-server, media-data-sdk"/>
-               <provide>
-                       <label name="media-server::vconf"/>
-               </provide>
-               <request>
-                       <smack request="system::media" type="rwxat"/>
-                       <smack request="system::ext_storage" type="rwxat"/>
-                       <smack request="system::vconf" type="rwxat"/>
-                       <smack request="system::vconf_system" type="r"/>
-                       <smack request="deviced" type="rwx"/>
-               </request>
-       </define>
-       <request>
-               <domain name="_"/>
-       </request>
-       <assign>
-               <filesystem path="/usr/bin/media-server" label="media-server" exec_label="media-server" />
-               <filesystem path="/usr/bin/media-scanner" label="media-server" exec_label="media-server" />
-               <filesystem path="/usr/bin/mediadb-update" label="media-server" exec_label="media-server" />
-               <filesystem path="/etc/rc.d/init.d/mediasvr" label="_" exec_label="none" />
-               <filesystem path="/etc/rc.d/rc3.d/S99mediasvr" label="_" exec_label="none" />
-               <filesystem path="/etc/rc.d/rc5.d/S99mediasvr" label="_" exec_label="none" />
-       </assign>
-</manifest>
-
index 27a96ef..425663d 100755 (executable)
@@ -10,12 +10,7 @@ Source2:    media-scanner.service.wearable
 Source3:    media-server.service.mobile
 
 Requires(post): /usr/bin/vconftool
-
-%if %{_repository} == "wearable"
 Requires: deviced
-%else
-Requires: system-server
-%endif
 
 BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires:  pkgconfig(vconf)
@@ -23,18 +18,10 @@ BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(dbus-glib-1)
 BuildRequires:  pkgconfig(sqlite3)
 BuildRequires:  pkgconfig(db-util)
-
-%if %{_repository} == "wearable"
 BuildRequires:  pkgconfig(deviced)
-%else
-BuildRequires:  pkgconfig(pmapi)
-%endif
-
 BuildRequires:  pkgconfig(security-server)
-
-%if %{_repository} == "mobile"
 BuildRequires:  pkgconfig(notification)
-%endif
+
 
 %description
 Description: File manager service server
@@ -70,22 +57,9 @@ export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
 export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
 %endif
 
-%if %{_repository} == "wearable"
-export CFLAGS="$CFLAGS -DTIZEN_WEARABLE"
-export CXXFLAGS="$CXXFLAGS -DTIZEN_WEARABLE"
-export FFLAGS="$FFLAGS -DTIZEN_WEARABLE"
-%endif
-
 %autogen
 
-%configure \
-%if %{_repository} == "wearable"
-       --disable-notification \
-%else
-       --disable-deviced \
-%endif
-        --prefix=%{_prefix} --disable-static
-
+%configure --prefix=%{_prefix} --disable-static
 
 make %{?jobs:-j%jobs}
 
@@ -93,17 +67,11 @@ make %{?jobs:-j%jobs}
 %make_install
 
 mkdir -p %{buildroot}/usr/lib/systemd/system/multi-user.target.wants
-%if %{_repository} == "wearable"
 install -m 644 %{SOURCE1} %{buildroot}/usr/lib/systemd/system/media-server.service
-%else
-install -m 644 %{SOURCE3} %{buildroot}/usr/lib/systemd/system/media-server.service
-%endif
 ln -s ../media-server.service %{buildroot}/usr/lib/systemd/system/multi-user.target.wants/media-server.service
 
-%if %{_repository} == "wearable"
 install -m 644 %{SOURCE2} %{buildroot}/usr/lib/systemd/system/media-scanner.service
 #ln -s ../media-scanner.service %{buildroot}/usr/lib/systemd/system/multi-user.target.wants/media-scanner.service
-%endif
 
 mkdir -p %{buildroot}/usr/etc
 cp -rf %{_builddir}/%{name}-%{version}/media-server-plugin %{buildroot}/usr/etc/media-server-plugin
@@ -119,20 +87,14 @@ vconftool set -t int memory/filemanager/Mmc "0" -i -f -s system::vconf_inhouse
 vconftool set -t string db/private/mediaserver/mmc_info "" -f -s media-server::vconf
 
 %files
-%if %{_repository} == "wearable"
-%manifest wearable/media-server.manifest
-%else
-%manifest mobile/media-server.manifest
-%endif
+%manifest media-server.manifest
 %defattr(-,root,root,-)
 %{_bindir}/media-server
 %{_bindir}/media-scanner
 %{_bindir}/mediadb-update
 /usr/lib/systemd/system/media-server.service
 /usr/lib/systemd/system/multi-user.target.wants/media-server.service
-%if %{_repository} == "wearable"
 /usr/lib/systemd/system/media-scanner.service
-%endif
 #/usr/lib/systemd/system/multi-user.target.wants/media-scanner.service
 /usr/etc/media-server-plugin
 #License
index 3da873d..a6cf430 100755 (executable)
@@ -32,8 +32,10 @@ ms_update_mmc_info(void);
 void
 ms_mmc_removed_handler(void);
 
+#ifndef DISABLE_NOTIFICATION
 int
 ms_present_mmc_status(ms_sdcard_status_type_t status);
+#endif
 
 void
 ms_mmc_vconf_cb(void *data);
index 9a96556..dfe0b75 100755 (executable)
@@ -77,6 +77,7 @@ typedef enum {
 typedef enum {
        MS_SCAN_INVALID,
        MS_SCAN_PART,
+       MS_SCAN_META,
        MS_SCAN_ALL,
 } ms_dir_scan_type_t;
 
index 40520bd..c408602 100755 (executable)
@@ -25,7 +25,7 @@
 #include <malloc.h>
 #include <vconf.h>
 #include <errno.h>
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_W
 #include <notification.h>
 #endif
 
@@ -210,7 +210,7 @@ void update_lang(void)
 int
 ms_present_mmc_status(ms_sdcard_status_type_t status)
 {
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_W
        int ret = NOTIFICATION_ERROR_NONE;
 
        update_lang();
@@ -218,11 +218,11 @@ ms_present_mmc_status(ms_sdcard_status_type_t status)
        if (status == MS_SDCARD_INSERTED)
                ret = notification_status_message_post(_GETSYSTEMSTR("IDS_COM_BODY_PREPARING_SD_CARD"));
        else if (status == MS_SDCARD_REMOVED)
-               ret = notification_status_message_post(_GETSYSTEMSTR("IDS_COM_BODY_SD_CARD_REMOVED"));
+               ret = notification_status_message_post(_GETSYSTEMSTR("IDS_COM_BODY_SD_CARD_UNEXPECTEDLY_REMOVED"));
 
        if(ret != NOTIFICATION_ERROR_NONE)
                return MS_MEDIA_ERR_INTERNAL;
-#endif
+#endif /*TIZEN_W*/
        return MS_MEDIA_ERR_NONE;
 }
 
index dd5d16d..f69e31f 100755 (executable)
@@ -202,6 +202,7 @@ ms_config_get_str(const char *key, char *value)
        res = vconf_get_str(key);
        if (res) {
                strncpy(value, res, strlen(res) + 1);
+               free(res);
                return true;
        }
 
index 0553ff1..f9bffaf 100755 (executable)
@@ -55,6 +55,9 @@ typedef int (*COUNT_DELETE_ITEMS_IN_FOLDER)(void *, const char *, int *, char **
 typedef int (*DELETE_ITEM)(void *, const char *, char **);
 typedef int (*GET_FOLDER_LIST)(void *, char*, char ***, int **, int **, int *, char **);
 typedef int (*UPDATE_FOLDER_TIME)(void *, const char *, char **);
+typedef int (*UPDATE_ITEM_META)(void *, const char *, int, char **);
+typedef int (*UPDATE_ITEM_BEGIN)(void *, int, char **);
+typedef int (*UPDATE_ITEM_END)(void *, char **);
 
 int
 msc_load_functions(void);
@@ -112,6 +115,10 @@ msc_update_folder_time(void **handle, char *folder_path);
 
 int
 msc_insert_item_immediately(void **handle, const char *path);
+
+int
+msc_update_meta_batch(void **handle, const char *path);
+
 /****************************************************************************************************
 FOR BULK COMMIT
 *****************************************************************************************************/
@@ -132,4 +139,10 @@ msc_validate_start(void **handle);
 void
 msc_validate_end(void **handle);
 
+void
+msc_update_start(void **handle);
+
+void
+msc_update_end(void **handle);
+
 #endif /*_MEDIA_SCANNER_DB_SVC_H_*/
index fc3209b..c1842f1 100755 (executable)
@@ -73,6 +73,9 @@ enum func_list {
        eDELETE_ITEM,
        eGET_FOLDER_LIST,
        eUPDATE_FOLDER_TIME,
+       eUPDATE_ITEM_META,
+       eUPDATE_ITEM_BEGIN,
+       eUPDATE_ITEM_END,
        eFUNC_MAX
 };
 
@@ -153,6 +156,9 @@ msc_load_functions(void)
                "delete_item",
                "get_folder_list",
                "update_folder_time",
+               "update_item_meta",
+               "update_item_begin",
+               "update_item_end",
                };
        /*init array for adding name of so*/
        so_array = g_array_new(FALSE, FALSE, sizeof(char*));
@@ -190,7 +196,7 @@ msc_load_functions(void)
        dlerror();    /* Clear any existing error */
 
        /*allocate for array of functions*/
-       MS_MALLOC(func_array, sizeof(void*) * lib_num);
+       MS_MALLOC(func_array, sizeof(void**) * lib_num);
        if (func_array == NULL) {
                MSC_DBG_ERR("malloc failed");
                MS_SAFE_FREE(scan_func_handle);
@@ -226,7 +232,7 @@ msc_load_functions(void)
                                MS_SAFE_FREE(func_array);
                                MS_SAFE_FREE(scan_func_handle);
 
-                               MSC_DBG_ERR("dlsym failed");
+                               MSC_DBG_ERR("dlsym failed [%s]", func_list[func_index]);
                                return MS_MEDIA_ERR_DYNAMIC_LINK;
                        }
                }
@@ -338,13 +344,14 @@ msc_validate_item(void **handle, const char *path)
                                }
                        } else {
                                /* the file has same name but it is changed, so we have to update DB */
+                               MSC_DBG_WAN("DELETE ITEM [%s]", path);
                                ret = ((DELETE_ITEM)func_array[lib_index][eDELETE_ITEM])(handle[lib_index], path, &err_msg); /*dlopen*/
                                if (ret != 0) {
                                        MSC_DBG_ERR("error : %s [%s] %s", g_array_index(so_array, char*, lib_index), err_msg, path);
                                        MS_SAFE_FREE(err_msg);
                                        res = MS_MEDIA_ERR_DB_DELETE_FAIL;
                                } else {
-                                       ret = msc_insert_item_immediately(handle, path);
+                                       ret = msc_insert_item_batch(handle, path);
                                        if (ret != 0) {
                                                res = MS_MEDIA_ERR_DB_INSERT_FAIL;
                                        } else {
@@ -627,6 +634,31 @@ msc_update_folder_time(void **handle, char *folder_path)
        return MS_MEDIA_ERR_NONE;
 }
 
+int
+msc_update_meta_batch(void **handle, const char *path)
+{
+       int lib_index;
+       int res = MS_MEDIA_ERR_NONE;
+       int ret;
+       char *err_msg = NULL;
+       ms_storage_type_t storage_type;
+
+       storage_type = ms_get_storage_type_by_full(path);
+
+       MSC_DBG_ERR("");
+
+       for (lib_index = 0; lib_index < lib_num; lib_index++) {
+               ret = ((UPDATE_ITEM_META)func_array[lib_index][eUPDATE_ITEM_META])(handle[lib_index], path, storage_type, &err_msg); /*dlopen*/
+               if (ret != 0) {
+                       MSC_DBG_ERR("error : %s [%s] %s", g_array_index(so_array, char*, lib_index), err_msg, path);
+                       MS_SAFE_FREE(err_msg);
+                       res = MS_MEDIA_ERR_DB_INSERT_FAIL;
+               }
+       }
+
+       return res;
+}
+
 /****************************************************************************************************
 FOR BULK COMMIT
 *****************************************************************************************************/
@@ -703,3 +735,35 @@ msc_validate_end(void **handle)
        }
 }
 
+void
+msc_update_start(void **handle)
+{
+       int lib_index;
+       int ret = 0;
+       char *err_msg = NULL;
+
+       for (lib_index = 0; lib_index < lib_num; lib_index++) {
+               ret = ((UPDATE_ITEM_BEGIN)func_array[lib_index][eUPDATE_ITEM_BEGIN])(handle[lib_index], MSC_VALID_COUNT, &err_msg);/*dlopen*/
+               if (ret != 0) {
+                       MSC_DBG_ERR("error : %s [%s]", g_array_index(so_array, char*, lib_index), err_msg);
+                       MS_SAFE_FREE(err_msg);
+               }
+       }
+}
+
+void
+msc_update_end(void **handle)
+{
+       int lib_index;
+       int ret = 0;
+       char *err_msg = NULL;
+
+       for (lib_index = 0; lib_index < lib_num; lib_index++) {
+               ret = ((UPDATE_ITEM_END)func_array[lib_index][eUPDATE_ITEM_END])(handle[lib_index], &err_msg);/*dlopen*/
+               if (ret != 0) {
+                       MSC_DBG_ERR("error : %s [%s]", g_array_index(so_array, char*, lib_index), err_msg);
+                       MS_SAFE_FREE(err_msg);
+               }
+       }
+}
+
index ddf3922..466cb60 100755 (executable)
 #include <dirent.h>
 #include <errno.h>
 #include <malloc.h>
-#ifdef TIZEN_WEARABLE
 #include <dd-display.h>
-#else
-#include <pmapi.h>
-#endif
 #include <vconf.h>
 
 #include "media-util.h"
@@ -89,20 +85,12 @@ static int __msc_set_power_mode(ms_db_status_type_t status)
 
        switch (status) {
        case MS_DB_UPDATING:
-#ifdef TIZEN_WEARABLE
                err = display_lock_state(LCD_OFF, STAY_CUR_STATE, 0);
-#else
-               err = pm_lock_state(LCD_OFF, STAY_CUR_STATE, 0);
-#endif
                if (err != 0)
                        res = MS_MEDIA_ERR_INTERNAL;
                break;
        case MS_DB_UPDATED:
-#ifdef TIZEN_WEARABLE
                err = display_unlock_state(LCD_OFF, STAY_CUR_STATE);
-#else
-               err = pm_unlock_state(LCD_OFF, STAY_CUR_STATE);
-#endif
                if (err != 0)
                        res = MS_MEDIA_ERR_INTERNAL;
                break;
@@ -299,7 +287,9 @@ static int __msc_dir_scan(void **handle, const char*start_path, ms_storage_type_
                                }
                        }
                        /* update modified time of directory */
-                       msc_update_folder_time(handle, current_path);
+                       if (scan_type == MS_MSG_STORAGE_PARTIAL
+                               && storage_type == MS_STORAGE_INTERNAL)
+                               msc_update_folder_time(handle, current_path);
                } else {
                        MSC_DBG_ERR("%s folder opendir fails", current_path);
                }
@@ -1125,3 +1115,167 @@ static void __msc_bacth_commit_disable(void* handle, bool ins_status, bool valid
        return;
 }
 
+static int __msc_dir_scan_meta_update(void **handle, const char*start_path, ms_storage_type_t storage_type)
+{
+       DIR *dp = NULL;
+       GArray *dir_array = NULL;
+       struct dirent entry;
+       struct dirent *result = NULL;
+       int ret = MS_MEDIA_ERR_NONE;
+       char *new_path = NULL;
+       char *current_path = NULL;
+       char path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       int (*scan_function)(void **, const char*) = msc_update_meta_batch;
+
+       /* make new array for storing directory */
+       dir_array = g_array_new (FALSE, FALSE, sizeof (char*));
+       if (dir_array == NULL){
+               MSC_DBG_ERR("g_array_new failed");
+               return MS_MEDIA_ERR_ALLOCATE_MEMORY_FAIL;
+       }
+       /* add first direcotiry to directory array */
+       g_array_append_val (dir_array, start_path);
+
+       /*start db update. the number of element in the array , db update is complete.*/
+       while (dir_array->len != 0) {
+               /*check poweroff status*/
+               ret = __msc_check_stop_status(storage_type);
+               if (ret != MS_MEDIA_ERR_NONE) {
+                       goto STOP_SCAN;
+               }
+
+               /* get the current path from directory array */
+               current_path = g_array_index(dir_array , char*, 0);
+               g_array_remove_index (dir_array, 0);
+//             MSC_DBG_SLOG("%d", dir_array->len);
+
+               if (__msc_check_scan_ignore(current_path)) {
+                       MSC_DBG_ERR("%s is ignore", current_path);
+                       MS_SAFE_FREE(current_path);
+                       continue;
+               }
+
+               dp = opendir(current_path);
+               if (dp != NULL) {
+                       while (!readdir_r(dp, &entry, &result)) {
+                               /*check poweroff status*/
+                               ret = __msc_check_stop_status(storage_type);
+                               if (ret != MS_MEDIA_ERR_NONE) {
+                                       goto STOP_SCAN;
+                               }
+
+                               if (result == NULL)
+                                       break;
+
+                               if (entry.d_name[0] == '.')
+                                       continue;
+
+                               if (entry.d_type & DT_REG) {
+                                       MSC_DBG_ERR("");
+                                        if (ms_strappend(path, sizeof(path), "%s/%s", current_path, entry.d_name) != MS_MEDIA_ERR_NONE) {
+                                               MSC_DBG_ERR("ms_strappend failed");
+                                               continue;
+                                       }
+                                       /* insert into media DB */
+                                       MSC_DBG_ERR("%s", path);
+                                       if (scan_function(handle,path) != MS_MEDIA_ERR_NONE) {
+                                               MSC_DBG_ERR("failed to update db");
+                                               continue;
+                                       }
+                               } else if (entry.d_type & DT_DIR) {
+                                       /* this request is recursive scanning */
+                                        if (ms_strappend(path, sizeof(path), "%s/%s", current_path, entry.d_name) != MS_MEDIA_ERR_NONE) {
+                                               MSC_DBG_ERR("ms_strappend failed");
+                                               continue;
+                                       }
+                                       /* add new directory to dir_array */
+                                       new_path = strdup(path);
+                                       g_array_append_val (dir_array, new_path);
+                               }
+                       }
+               } else {
+                       MSC_DBG_ERR("%s folder opendir fails", current_path);
+               }
+               if (dp) closedir(dp);
+               dp = NULL;
+               MS_SAFE_FREE(current_path);
+       }               /*db update while */
+STOP_SCAN:
+       if (dp) closedir(dp);
+
+       __msc_clear_file_list(dir_array);
+
+       if (ret != MS_MEDIA_ERR_NONE) MSC_DBG_INFO("ret : %d", ret);
+
+       return ret;
+}
+
+
+gboolean msc_metadata_update(void *data)
+{
+       ms_comm_msg_s *scan_data = data;
+       int err;
+       int ret;
+       void **handle = NULL;
+       char *start_path = NULL;
+       ms_storage_type_t storage_type = MS_STORAGE_INTERNAL;
+
+       MSC_DBG_INFO("META UPDATE START");
+
+       /*connect to media db, if conneting is failed, db updating is stopped*/
+       err = msc_connect_db(&handle);
+       if (err != MS_MEDIA_ERR_NONE)
+               return false;
+
+       /*call for bundle commit*/
+       msc_update_start(handle);
+
+       /*insert data into media db */
+
+       start_path = strdup(MEDIA_ROOT_PATH_INTERNAL);
+       ret = __msc_dir_scan_meta_update(handle, start_path, storage_type);
+
+       /* send notification */
+       msc_send_dir_update_noti(handle, MEDIA_ROOT_PATH_INTERNAL);
+
+       if (mmc_state == VCONFKEY_SYSMAN_MMC_MOUNTED) {
+               storage_type = MS_STORAGE_EXTERNAL;
+               start_path = strdup(MEDIA_ROOT_PATH_SDCARD);
+               ret = __msc_dir_scan_meta_update(handle, start_path, storage_type);
+               /* send notification */
+               msc_send_dir_update_noti(handle, MEDIA_ROOT_PATH_SDCARD);
+       }
+
+       /*call for bundle commit*/
+       msc_update_end(handle);
+
+       if (power_off) {
+               MSC_DBG_WAN("power off");
+               goto _POWEROFF;
+       }
+
+       /*disconnect form media db*/
+       if (handle) msc_disconnect_db(&handle);
+
+       /*Active flush */
+       malloc_trim(0);
+
+       msc_send_result(ret, scan_data);
+
+       MS_SAFE_FREE(scan_data);
+
+       MSC_DBG_INFO("META UPDATE END [%d]", ret);
+
+
+_POWEROFF:
+       MS_SAFE_FREE(scan_data);
+       if (handle) msc_disconnect_db(&handle);
+
+       return false;
+}
+
+
+void msc_metadata_update_thread(ms_comm_msg_s *recv_msg)
+{
+        g_thread_new("update_thread", (GThreadFunc)msc_metadata_update, recv_msg);
+}
index bedd40a..36c48af 100755 (executable)
@@ -105,6 +105,9 @@ gboolean msc_receive_request(GIOChannel *src, GIOCondition condition, gpointer d
                                g_async_queue_push(storage_queue, GINT_TO_POINTER(recv_msg));
                        }
                        break;
+               case MS_MSG_STORAGE_META:
+                       msc_metadata_update_thread(recv_msg);
+                       break;
                default:
                        {
                                MSC_DBG_ERR("THIS REQUEST IS INVALID %d", req_num);
index b99ba42..11dc2b1 100755 (executable)
@@ -152,7 +152,7 @@ ms_load_functions(void)
        dlerror();    /* Clear any existing error */
 
        /*allocate for array of functions*/
-       MS_MALLOC(func_array, sizeof(void*) * lib_num);
+       MS_MALLOC(func_array, sizeof(void**) * lib_num);
        if (func_array == NULL) {
                MS_DBG_ERR("malloc failed");
                MS_SAFE_FREE(func_handle);
index 4cd5c38..1efe491 100755 (executable)
@@ -59,6 +59,8 @@ static void __ms_add_event_receiver(GIOChannel *channel);
 static void __ms_remove_requst_receiver(GIOChannel *channel);
 static void __ms_add_requst_receiver(GMainLoop *mainloop, GIOChannel **channel);
 
+static char *priv_lang = NULL;
+
 bool check_process()
 {
        DIR *pdir;
@@ -173,27 +175,6 @@ static void _db_clear(void)
        ms_unload_functions();
 }
 
-static void _db_backup(void)
-{
-       int err = MS_MEDIA_ERR_NONE;
-       void **handle = NULL;
-
-       /*load functions from plusin(s)*/
-       err = ms_load_functions();
-       if (err != MS_MEDIA_ERR_NONE) {
-               MS_DBG_ERR("function load failed");
-               exit(0);
-       }
-
-       ms_connect_db(&handle);
-
-       /*disconnect form media db*/
-       if (handle) ms_disconnect_db(&handle);
-
-       /*unload functions*/
-       ms_unload_functions();
-}
-
 void _ms_signal_handler(int n)
 {
        int stat, pid, thumb_pid;
@@ -272,6 +253,51 @@ _ms_mmc_vconf_cb(keynode_t *key, void* data)
        return;
 }
 
+void
+_ms_change_lang_vconf_cb(keynode_t *key, void* data)
+{
+       char lang[10] = {0,};
+       char *eng = "en";
+       char *chi = "zh";
+       char *jpn = "ja";
+       char *kor = "ko";
+       bool need_update = FALSE;
+
+       if (!ms_config_get_str(VCONFKEY_LANGSET, lang)) {
+               MS_DBG_ERR("Get VCONFKEY_LANGSET failed.");
+               return;
+       }
+
+       MS_DBG("CURRENT LANGUAGE [%s %s]", priv_lang, lang);
+
+       if (strcmp(priv_lang, lang) == 0) {
+               need_update = FALSE;
+       } else if ((strncmp(lang, eng, strlen(eng)) == 0) ||
+                       (strncmp(lang, chi, strlen(chi)) == 0) ||
+                       (strncmp(lang, jpn, strlen(jpn)) == 0) ||
+                       (strncmp(lang, kor, strlen(kor)) == 0)) {
+                       need_update = TRUE;
+       } else {
+               if ((strncmp(priv_lang, eng, strlen(eng)) == 0) ||
+                       (strncmp(priv_lang, chi, strlen(chi)) == 0) ||
+                       (strncmp(priv_lang, jpn, strlen(jpn)) == 0) ||
+                       (strncmp(priv_lang, kor, strlen(kor)) == 0)) {
+                       need_update = TRUE;
+               }
+       }
+
+       if (need_update) {
+               ms_send_storage_scan_request(NULL, MS_SCAN_META);
+       } else {
+               MS_DBG_WARN("language is changed but do not update meta data");
+       }
+
+       MS_SAFE_FREE(priv_lang);
+       priv_lang = strdup(lang);
+
+       return;
+}
+
 static void _ms_check_pw_status(void)
 {
        int pw_status = 0;
@@ -383,15 +409,24 @@ static void __ms_add_requst_receiver(GMainLoop *mainloop, GIOChannel **channel)
 
 static void __ms_remove_requst_receiver(GIOChannel *channel)
 {
+       int fd = -1;
+
        /*close an IO channel*/
-       g_io_channel_unix_get_fd(channel);
+       fd = g_io_channel_unix_get_fd(channel);
        g_io_channel_shutdown(channel,  FALSE, NULL);
        g_io_channel_unref(channel);
+
+       if (fd > 0) {
+               if (close(fd) < 0) {
+                       MS_DBG_ERR("CLOSE ERROR %s", strerror(errno));
+               }
+       }
 }
 
 static void __ms_add_event_receiver(GIOChannel *channel)
 {
        int err;
+       char lang[10] = {0,};
 
        /*set power off callback function*/
        ms_add_poweoff_event_receiver(_power_off_cb,channel);
@@ -401,6 +436,17 @@ static void __ms_add_event_receiver(GIOChannel *channel)
        if (err == -1)
                MS_DBG_ERR("add call back function for event %s fails", VCONFKEY_SYSMAN_MMC_STATUS);
 
+       if (!ms_config_get_str(VCONFKEY_LANGSET, lang)) {
+               MS_DBG_ERR("Get VCONFKEY_LANGSET failed.");
+               return;
+       }
+
+       priv_lang = strdup(lang);
+
+       err = vconf_notify_key_changed(VCONFKEY_LANGSET, (vconf_callback_fn) _ms_change_lang_vconf_cb, NULL);
+       if (err == -1)
+               MS_DBG_ERR("add call back function for event %s fails", VCONFKEY_LANGSET);
+
 }
 
 static void __ms_remove_event_receiver(void)
@@ -429,6 +475,9 @@ static void __ms_check_mediadb(void)
 {
        _db_clear();
 
+       /* update internal storage */
+       ms_send_storage_scan_request(MEDIA_ROOT_PATH_INTERNAL, MS_SCAN_PART);
+
        /* update external storage */
        if (ms_is_mmc_inserted()) {
                ms_make_default_path_mmc();
index 7600a6b..8f8b15c 100755 (executable)
@@ -391,6 +391,9 @@ int ms_send_storage_scan_request(char *root_path, ms_dir_scan_type_t scan_type)
                case MS_SCAN_INVALID:
                        scan_msg.msg_type = MS_MSG_STORAGE_INVALID;
                        break;
+               case MS_SCAN_META:
+                       scan_msg.msg_type = MS_MSG_STORAGE_META;
+                       break;
                default :
                        ret = MS_MEDIA_ERR_INVALID_PARAMETER;
                        MS_DBG_ERR("ms_send_storage_scan_request invalid parameter");
@@ -399,8 +402,10 @@ int ms_send_storage_scan_request(char *root_path, ms_dir_scan_type_t scan_type)
        }
 
        /* msg_size & msg */
-       scan_msg.msg_size = strlen(root_path);
-       strncpy(scan_msg.msg, root_path, scan_msg.msg_size );
+       if (root_path != NULL) {
+               scan_msg.msg_size = strlen(root_path);
+               strncpy(scan_msg.msg, root_path, scan_msg.msg_size );
+       }
 
        ret = ms_send_scan_request(&scan_msg, -1);
 
index 7981f93..ed3c265 100755 (executable)
@@ -593,7 +593,10 @@ gboolean _ms_thumb_agent_timer()
                        g_shutdowning_thumb_server = FALSE;
                }
                usleep(200000);
-
+               g_io_channel_shutdown(g_udp_channel, FALSE, NULL);
+               g_io_channel_unref(g_udp_channel);
+               g_udp_channel = NULL;
+               g_communicate_sock = 0;
        } else {
                MS_DBG_ERR("g_server_pid is %d. Maybe there's problem in thumbnail-server", g_server_pid);
        }
@@ -770,9 +773,32 @@ gboolean _ms_thumb_request_to_server(gpointer data)
                        if (!_ms_thumb_agent_send_msg_to_thumb_server(recv_msg, &res_msg)) {
                                MS_DBG_ERR("_ms_thumb_agent_send_msg_to_thumb_server is failed");
 
+                               thumbMsg res_msg;
+                               memset((void *)&res_msg, 0, sizeof(res_msg));
+
+                               res_msg.msg_type = 6; // THUMB_RESPONSE
+                               res_msg.status = 1; //THUMB_FAIL
+                               res_msg.origin_path_size = strlen(recv_msg->org_path);
+                               strncpy(res_msg.org_path, recv_msg->org_path, res_msg.origin_path_size);
+                               res_msg.dst_path[0] = '\0';
+                               res_msg.dest_path_size = 1;
+
+                               int buf_size = 0;
+                               unsigned char *buf = NULL;
+                               _ms_thumb_set_buffer(&res_msg, &buf, &buf_size);
+
+                               if (send(client_sock, buf, buf_size, 0) != buf_size) {
+                                       MS_DBG_ERR("sendto failed : %s", strerror(errno));
+                               } else {
+                                       MS_DBG("Sent Refuse msg from %s", recv_msg->org_path);
+                               }
+
                                close(client_sock);
+
+                               MS_SAFE_FREE(buf);
                                MS_SAFE_FREE(req->recv_msg);
                                MS_SAFE_FREE(req);
+
                                return TRUE;
                        }
                }
@@ -869,10 +895,10 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
 
                res_msg.msg_type = 6; // THUMB_RESPONSE
                res_msg.status = 1; //THUMB_FAIL
-               res_msg.org_path[0] = '\0';
-               res_msg.origin_path_size = 0;
+               res_msg.origin_path_size = strlen(recv_msg->org_path);
+               strncpy(res_msg.org_path, recv_msg->org_path, res_msg.origin_path_size);
                res_msg.dst_path[0] = '\0';
-               res_msg.dest_path_size = 0;
+               res_msg.dest_path_size = 1;
 
                int buf_size = 0;
                unsigned char *buf = NULL;
@@ -992,6 +1018,8 @@ gpointer ms_thumb_agent_start_thread(gpointer data)
 
        g_main_loop_unref(g_thumb_agent_loop);
 
+       close(sockfd);
+
        return NULL;
 }