Update source from tizen 2.3
[platform/core/base/rpm-installer.git] / frontend / src / rpm-appcore-intf.c
index bc92dca..dbaa26a 100755 (executable)
 
 #include <stdio.h>
 #include <pthread.h>
-
-#include <Elementary.h>
-#include <appcore-efl.h>
 #include <string.h>
-#include <glib-object.h>
+//#include <device/power.h>
 
 #include "rpm-frontend.h"
-#include "rpm-homeview.h"
 #include "rpm-installer-util.h"
 #include "rpm-installer.h"
 #include <pkgmgr_installer.h>
 
+#define CONFIG_PATH            "/usr/etc/rpm-installer-config.ini"
 static void __ri_start_processing(void *user_data);
-static Eina_Bool __ri_elm_exit_cb(void *data);
+static int __ri_is_signature_verification_enabled();
 
 int ret_val = -1;
-struct appdata ad;
+/*flag to check whether signature verification is on/off*/
+int sig_enable = 0;
+int broadcast_disable = 0;
 extern char scrolllabel[256];
 extern ri_frontend_data front_data;
 pkgmgr_installer *pi = NULL;
 
-/**< Called before main loop */
-int app_create(void *user_data)
-{
-
-       int ret = 0;
-       struct appdata *data = (struct appdata *)user_data;
-       ri_frontend_cmdline_arg *fdata = front_data.args;
-       /*In case of downgrade, popup should be shown even if quiet mode*/
-       ret = _ri_frontend_launch_main_view(data);
-       return ret;
-}
-
-/**< Called after main loop */
-int app_terminate(void *user_data)
-{
-       struct appdata *data = (struct appdata *)user_data;
-       ri_frontend_cmdline_arg *fdata = front_data.args;
-       if (fdata->quiet == 0) {
-               _ri_destroy_home_view(data);
-       }
-       return 0;
-}
 
-/**< Called when every window goes back */
-int app_pause(void *user_data)
+static int __ri_is_signature_verification_enabled()
 {
-       return 0;
-}
-
-/**< Called when any window comes on top */
-int app_resume(void *user_data)
-{
-       return 0;
-}
-
-/**< Called at the first idler*/
-int app_reset(bundle *b, void *user_data)
-{
-       return 0;
-}
-
-/**< Called at rotate device*/
-int app_rotation(enum appcore_rm mode, void *user_data)
-{
-       if (user_data == NULL) {
-               _d_msg(DEBUG_ERR, "arg supplied is NULL \n");
-               return -1;
+       char buffer[1024] = {'\0'};
+       char *p = NULL;
+       FILE *fi = NULL;
+       int len = 0;
+       int ret = 0;
+       fi = fopen(CONFIG_PATH, "r");
+       if (fi == NULL) {
+               _LOGE("Failed to open config file [%s]\n", CONFIG_PATH);
+               return 0;
        }
-       struct appdata *data = (struct appdata *)user_data;
-       int angle;
-       switch (mode) {
-       case APPCORE_RM_LANDSCAPE_NORMAL:
-               angle = -90;
-               break;
-
-       case APPCORE_RM_LANDSCAPE_REVERSE:
-               angle = 90;
-               break;
-
-       case APPCORE_RM_PORTRAIT_REVERSE:
-               angle = 180;
-               break;
-
-       case APPCORE_RM_UNKNOWN:
-       case APPCORE_RM_PORTRAIT_NORMAL:
-       default:
-               angle = 0;
-               break;
+       while (fgets(buffer, 1024, fi) != NULL) {
+               /* buffer will be like signature=off\n\0*/
+               if (strncmp(buffer, "signature", strlen("signature")) == 0) {
+                       len = strlen(buffer);
+                       /*remove newline character*/
+                       buffer[len - 1] = '\0';
+                       p = strchr(buffer, '=');
+                       if (p) {
+                               p++;
+                               if (strcmp(p, "on") == 0)
+                                       ret = 1;
+                               else
+                                       ret = 0;
+                       }
+               } else {
+                       continue;
+               }
        }
-       elm_win_rotation_with_resize_set(data->win_main, angle);
-       return 0;
+       fclose(fi);
+       return ret;
 }
 
-Eina_Bool show_popup_cb(void *data)
-{
-       /*Avoid log printing as it is an idler function*/
-       int state = -1;
-       int ret = -1;
-       const char message[256] = {'\0'};
-       state = _ri_get_backend_state_info();
-       switch (state) {
-       case REQUEST_ACCEPTED:
-               break;
-       case GOT_PACKAGE_INFO_SUCCESSFULLY:
-               break;
-       case REQUEST_PENDING:
-               strncpy(message, _("Continue Downgrade?"), 255);
-               _ri_package_downgrade_information(message);
-               /*request is not completed yet. We just got confirmation
-               from user whether to downgrade or not*/
-               _ri_set_backend_state_info(REQUEST_ACCEPTED);
-               break;
-       case REQUEST_COMPLETED:
-       default:
-               if (front_data.args->quiet == 0) {
-                       _ri_frontend_update_progress_info(&ad, scrolllabel);
-                       return 0;
-               } else
-                       elm_exit();
-               break;
-       }
-
-       return 1;
-}
 
 static void __ri_start_processing(void *user_data)
 {
        int ret = 0;
        if (user_data == NULL) {
-               _d_msg(DEBUG_ERR, "arg supplied is NULL \n");
-               return -1;
+               _LOGE("arg supplied is NULL \n");
+               return;
        }
        ri_frontend_data *data = (ri_frontend_data *) user_data;
-       g_type_init();
        ret = _ri_cmdline_process(data);
        ret_val = ret;
        _ri_cmdline_destroy(data);
@@ -165,29 +94,57 @@ static void __ri_start_processing(void *user_data)
 
 int main(int argc, char *argv[])
 {
+       int i = 0;
        int ret = 0;
+       char *errstr = NULL;
        ri_frontend_cmdline_arg *data = NULL;
-       struct appcore_ops ops;
-       ops.create = app_create;
-       ops.terminate = app_terminate;
-       ops.pause = app_pause;
-       ops.resume = app_resume;
-       ops.reset = app_reset;
-       ops.data = &ad;
-       ecore_init();
-       appcore_set_i18n(PACKAGE, LOCALE_PATH);
-       _d_msg_init("rpm-installer");
+       struct stat st;
+
+       _LOGD("------------------------------------------------");
+       _LOGD(" [START] rpm-installer: version=[%s]", RPM_INSTALLER_VERSION);
+       _LOGD("------------------------------------------------");
+
+       // hybrid
+       ret = _ri_parse_hybrid(argc, argv);
+       if (ret == RPM_INSTALLER_SUCCESS) {
+               _LOGD("------------------------------------------------");
+               _LOGD(" [END] rpm-installer: _ri_parse_hybrid() succeed.");
+               _LOGD("------------------------------------------------");
+               fprintf(stdout, "%d", ret);
+               return 0;
+       }
+
+       for (i = 0; i < argc; i++)
+       {
+               const char* pStr = argv[i];
+               if (pStr)
+               {
+                       _LOGD("argv[%d] = [%s]", i, pStr);
+               }
+       }
+
+       // power_lock
+//     ret = device_power_request_lock(POWER_LOCK_CPU, 0);
+//     _LOGD("device_power_lock_state(POWER_LOCK_CPU, 0), ret = [%d]", ret);
+
+       /* Initialize the xml parser */
+       xmlInitParser();
+       // _LOGD("xml parser initialized");
+
+       /*get signature verification config*/
+       sig_enable = __ri_is_signature_verification_enabled();
+       _LOGD("signature verification mode is [%s]", sig_enable?"on":"off");
+
        data = (ri_frontend_cmdline_arg *) calloc(1,
                                                  sizeof
                                                  (ri_frontend_cmdline_arg));
        if (data == NULL) {
-               _d_msg(DEBUG_ERR, "Not Enough Memory\n");
+               _LOGE("Not Enough Memory\n");
                ret = RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY;
                goto ERROR;
        }
        data->keyid = NULL;
        data->pkgid = NULL;
-       data->quiet = 0;
        data->req_cmd = INVALID_CMD;
        data->move_type = -1;
 
@@ -195,49 +152,101 @@ int main(int argc, char *argv[])
           to parse the arguments */
        if ((ret =
             _ri_parse_cmdline(argc, argv, data)) != RPM_INSTALLER_SUCCESS) {
-               _d_msg(DEBUG_ERR, "_ri_parse_cmdline failed \n");
+               _LOGE("_ri_parse_cmdline failed \n");
                goto ERROR;
        }
 
+#if 0
+       /*
+       Check for converted wgt package.
+       */
+       if(strstr(data->pkgid,".wgt") != NULL){
+               _LOGD("[%s] is eflwgt package.\n", data->pkgid);
+               if(data->req_cmd == INSTALL_CMD){
+                       data->req_cmd = EFLWGT_INSTALL_CMD;
+                       ret = _ri_process_wgt_package(&data->pkgid);
+                       if(ret != RPM_INSTALLER_SUCCESS){
+                               _ri_error_no_to_string(ret, &errstr);
+                               _LOGE("ERROR:[%s]",errstr);
+                               goto ERROR;
+                       }
+               }else{
+                       ret = RPM_INSTALLER_ERR_CMD_NOT_SUPPORTED;
+                       _ri_error_no_to_string(ret,&errstr);
+                       _LOGE("ERROR:[%s]",errstr);
+                       goto ERROR;
+               }
+       }
+#endif
+
+       if (strstr(data->keyid, "change-state") != NULL) {
+               _LOGE("change-state for [%s]\n", data->pkgid);
+               if (data->req_cmd == INSTALL_CMD) {
+                       data->req_cmd = ENABLE_CMD;
+               } else if (data->req_cmd == DELETE_CMD) {
+                       data->req_cmd = DISABLE_CMD;
+               } else {
+                       ret = RPM_INSTALLER_ERR_CMD_NOT_SUPPORTED;
+                       _ri_error_no_to_string(ret,&errstr);
+                       _LOGE("ERROR:[%s]",errstr);
+                       goto ERROR;
+               }
+       }
+
+       /*installation for coretpk*/
+       if ((strstr(argv[0], "coretpk") != NULL)
+                       && (data->req_cmd == INSTALL_CMD)) {
+               if (stat(data->pkgid, &st)) {
+                       ret = RPM_INSTALLER_ERR_UNKNOWN;
+                       _ri_error_no_to_string(ret, &errstr);
+                       _LOGE("ERROR:[%s]",errstr);
+                       goto ERROR;
+               }
+
+               if (S_ISDIR(st.st_mode)) {
+                       _LOGD("[%s] is directory for tpk.\n", data->pkgid);
+                       data->req_cmd = CORETPK_DIRECTORY_INSTALL_CMD;
+               } else {
+                       _LOGD("[%s] is tpk package.\n", data->pkgid);
+                       data->req_cmd = CORETPK_INSTALL_CMD;
+               }
+       }
+
        front_data.args = data;
        front_data.security_cookie = NULL;
        front_data.error = NULL;
 
        __ri_start_processing(&front_data);
 
-       /*The installer has finished the installation/uninstallation.
-          Now, if it was a non quiet operation we need to show the popup. */
-       ecore_idler_add(show_popup_cb, NULL);
+       ret = ret_val;
+       if ((strstr(data->keyid, ".tpk") != NULL) || (strstr(data->pkgid,".wgt") != NULL)) {
+               if(!ret_val) {
+                       _LOGD("sync() start");
+                       sync();
+                       _LOGD("sync() end");
+               }
+       }
+
 
-       _d_msg(DEBUG_RESULT, "About to run EFL Main Loop");
-       appcore_efl_main(PACKAGE, &argc, &argv, &ops);
-       _d_msg(DEBUG_RESULT, "%d\n", ret_val);
+ERROR:
+//     device_power_release_lock(POWER_LOCK_CPU);
 
-       _d_msg_deinit();
        if (pi) {
                pkgmgr_installer_free(pi);
                pi = NULL;
        }
-       if(!ret_val)
-               sync();
 
-       return ret_val;
-
- ERROR:
        if (data) {
-               if (data->pkgid) {
-                       free(data->pkgid);
-                       data->pkgid = NULL;
-               }
-               if (data->keyid) {
-                       free(data->keyid);
-                       data->keyid = NULL;
-               }
                free(data);
                data = NULL;
        }
-       _d_msg(DEBUG_RESULT, "%d\n", ret);
-       _d_msg_deinit();
+
+       xmlCleanupParser();
+       _LOGD("------------------------------------------------");
+       _LOGD(" [END] rpm-installer: result=[%d]", ret);
+       _LOGD("------------------------------------------------");
+
+
        return ret;
 
 }