3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
26 #include <vconf-keys.h>
27 /*#include "package-manager.h"*/
30 #include <sync_agent.h>
32 #include "plugin_slp_device_ctrl.h"
34 #ifndef OMADM_AGENT_LOG
36 #define LOG_TAG "PLUGIN_DEVICE_SLP_DM"
39 #define UA_RESULT_KEY "db/SyncML/oma-dm-service/UAresult"
41 //#define RB_ERR_CODE_MAX_COUNT 16
42 #define RB_ERR_CODE_MAX_COUNT 20
44 typedef struct _type_Redbend_OMADM_Table {
49 } type_redbend_omadm_table_s;
51 type_redbend_omadm_table_s redbend_omadm_table[RB_ERR_CODE_MAX_COUNT] = {
52 {200, "Successful", "0", NULL},
53 {410, "UPI_DELTA_PATH_ERROR", "fdaa", NULL},
54 {410, "UPI_DELTA_PATH_LENGTH_ERROR", "fdab", NULL},
55 {410, "UPI_GUI_INIT_ERROR", "fdba", NULL},
56 {410, "UPI_VERSION_ERROR", "fdbb", NULL},
57 {410, "UPI_SBL_VERIFY_ERROR", "fdca", NULL},
58 {410, "UPI_BOOT_VERIFY_ERROR", "fdcb", "kernel verification fail"},
59 {410, "UPI_PLATFORM_VERIFY_ERROR", "fdcc", "platform verification fail"},
60 {410, "UPI_CSC_VERIFY_ERROR", "fdcd", "csc verification fail"},
61 {410, "UPI_MODEM_VERIFY_ERROR", "fdce", "modem verification fail"},
62 {410, "UPI_SBL_UPDATE_ERROR", "fdda", "bootloader update fail"},
63 {410, "UPI_BOOT_UPDATE_ERROR", "fddb", "kernel update fail"},
64 {410, "UPI_PLATFORM_UPDATE_ERROR", "fddc", "platform update fail"},
65 {410, "UPI_CSC_UPDATE_ERROR", "fddd", "csc update fail"},
66 {410, "UPI_MODEM_UPDATE_ERROR", "fdde", "modem update fail"},
67 {410, "UPI_INVALID_PARAM_ERROR", "fdea", NULL},
68 {410, "UPI_STATUSFLAG_ERROR", "fdeb", NULL},
69 {410, "UPI_DELTACOUNT_ERROR", "fdec", "no delta file"},
70 {410, "UPI_NO_DELTA_ERROR", "fdfa", NULL},
71 {410, "UPI_NO_UA_ERROR", "fdfb", NULL},
73 /*{0, NULL, NULL, NULL},*/
76 static int _system_command(const char *command);
77 /*static int __get_mobile_tracker_status();*/
78 /*static int __return_pkgmgr_cb(pkg_request_id req_id, const char *pkg_type, const char *pkg_name, const char *key, const char *val, const void *pmsg, void *data);*/
80 int slp_device_ctrl_set_fota_flag()
81 { // return value : success[0] faile[1]
85 2010.09.08 document base
86 ("echo fota_enable > /sys/devices/platform/s3c_samsung_fota/samsung_fota_config");
87 _DEBUG_INFO("echo fota_enable > /sys/devices/platform/s3c_samsung_fota/samsung_fota_config \n");
88 2011.03.23 document base
89 ("/bin/change-booting-mode.sh --fota /opt/data/fota");
92 int ret = _system_command("/bin/sync");
93 _DEBUG_INFO("disk sync - ret : [%d]", ret);
95 _DEBUG_INFO("/bin/change-booting-mode.sh --fota /opt/usr/data/fota/save \n");
96 ret = system("/bin/change-booting-mode.sh --fota /opt/usr/data/fota/save");
97 _DEBUG_INFO("change-booting-mode.sh ret : [%d]", ret);
103 int ret = _system_command("/bin/change-booting-mode.sh --fota /opt/data/fota/save");
104 _DEBUG_INFO("change-booting-mode.sh ret : [%d]", ret);
107 _DEBUG_ERROR("error : %d", ret);
110 ret = _system_command("reboot fota");
131 char* slp_device_ctrl_get_fota_fail_ua_result()
137 char file_path[128] = {0,};
138 snprintf(file_path,128, "%s/cause", /*FOTA_SAVE_DIR*/ "/opt/usr/data/fota/save");
139 file_des = fopen(file_path, "rb");
140 if (file_des == NULL) {
141 _DEBUG_INFO("fopen fail - cause file \n");
145 fseek(file_des, 0, SEEK_END);
146 lSize = ftell(file_des);
148 _DEBUG_INFO("ftell nagative return ");
149 if (file_des != NULL)
155 char *str_result = NULL;
156 //str_result = (char *)calloc(1, lSize + 1);
157 str_result = (char *)malloc(sizeof(char)*(lSize+1));
158 if (str_result == NULL) {
159 if (file_des != NULL)
161 _DEBUG_INFO("malloc fail \n");
165 memset(str_result, 0x0, sizeof(char)*(lSize+1)); // PREVENT
167 result = fread(str_result, 1, lSize, file_des);
168 if ((result != lSize) || (str_result == NULL)) {
169 if (file_des != NULL)
171 _DEBUG_INFO("read fail or str_result == NULL \n");
173 if (str_result != NULL)
179 if (str_result[lSize - 1] == '\n')
180 str_result[lSize - 1] = 0;
182 _DEBUG_INFO("str_result [%s] \n", str_result);
184 if (file_des != NULL)
191 int slp_device_ctrl_get_fota_update_result()
195 int update_result = 400;
198 long file_data_size = 0;
200 //file_des = fopen("/opt/result", "rb");
201 char file_path[128] = {0,};
203 char * str_cause = NULL;
204 int vconf_result = 0;
205 char str_result_merge[128] = {0,};
207 snprintf(file_path,128, "%s/result", /*FOTA_SAVE_DIR*/ "/opt/usr/data/fota/save");
208 file_des = fopen(file_path, "rb");
211 bool match_found = false;
212 if (file_des == NULL) {
213 _DEBUG_INFO("fopen fail - result file \n");
217 fseek(file_des, 0, SEEK_END);
218 lSize = ftell(file_des);
220 _DEBUG_INFO("ftell nagative return ");
221 if (file_des != NULL)
227 char *str_result = NULL;
228 //str_result = (char *)calloc(1, lSize + 1);
229 str_result = (char *)malloc(sizeof(char)*(lSize+1));
230 if (str_result == NULL) {
231 if (file_des != NULL)
233 _DEBUG_INFO("malloc fail \n");
238 memset(str_result, 0x0, sizeof(char)*(lSize+1)); // PREVENT
240 result = fread(str_result, 1, lSize, file_des);
241 if ((result != lSize) || (str_result == NULL)) {
242 if (file_des != NULL)
244 _DEBUG_INFO("read fail or str_result == NULL \n");
246 if (str_result != NULL)
252 if (str_result[lSize - 1] == '\n') {
253 str_result[lSize - 1] = 0;
254 file_data_size = lSize -1;
256 file_data_size = lSize;
259 for (j = 0; j < RB_ERR_CODE_MAX_COUNT; j++) {
260 //if (strlen(str_result) == strlen(redbend_omadm_table[j].result_redbend)) {
261 if (file_data_size == strlen(redbend_omadm_table[j].result_redbend)) {
262 if ((strcmp(str_result, redbend_omadm_table[j].result_redbend) == 0)) {
263 update_result = redbend_omadm_table[j].result_code;
265 _DEBUG_INFO("Result meanning info [%s] \n", redbend_omadm_table[j].str_meanning);
267 ////////////////////////////////////////////////////////////////////////////////
268 if(redbend_omadm_table[j].str_redbend != NULL) {
269 str_cause = slp_device_ctrl_get_fota_fail_ua_result();
270 if(str_cause == NULL) {
271 vconf_result = vconf_set_str(UA_RESULT_KEY, redbend_omadm_table[j].str_meanning);
272 if(vconf_result == 0) {
273 _DEBUG_VERBOSE("vconf_set_str() success %s [%s]!!", UA_RESULT_KEY, redbend_omadm_table[j].str_meanning);
275 _DEBUG_VERBOSE("vconf_set_str() %s failed !!", UA_RESULT_KEY);
278 if( strlen(str_cause) > 0 ) {
279 snprintf(str_result_merge, 120, "%s - %s", redbend_omadm_table[j].str_meanning, str_cause);
280 vconf_result = vconf_set_str(UA_RESULT_KEY, str_result_merge);
281 if(vconf_result == 0) {
282 _DEBUG_VERBOSE("vconf_set_str() success %s [%s]!!", UA_RESULT_KEY, str_result_merge);
284 _DEBUG_VERBOSE("vconf_set_str() %s failed !!", UA_RESULT_KEY);
287 vconf_result = vconf_set_str(UA_RESULT_KEY, redbend_omadm_table[j].str_meanning);
288 if(vconf_result == 0) {
289 _DEBUG_VERBOSE("vconf_set_str() success %s [%s]!!", UA_RESULT_KEY, redbend_omadm_table[j].str_meanning);
291 _DEBUG_VERBOSE("vconf_set_str() %s failed !!", UA_RESULT_KEY);
296 vconf_result = vconf_set_str(UA_RESULT_KEY, redbend_omadm_table[j].str_meanning);
297 if(vconf_result == 0) {
298 _DEBUG_VERBOSE("vconf_set_str() success %s [%s]!!", UA_RESULT_KEY, redbend_omadm_table[j].str_meanning);
300 _DEBUG_VERBOSE("vconf_set_str() %s failed !!", UA_RESULT_KEY);
303 ////////////////////////////////////////////////////////////////////////////////
305 break; /* If existing error code, break-out from the for-loop. */
313 vconf_result = vconf_set_str(UA_RESULT_KEY, "No find");
314 if(vconf_result == 0) {
315 _DEBUG_VERBOSE("vconf_set_str() success %s [%s]!!", UA_RESULT_KEY, "No find");
317 _DEBUG_VERBOSE("vconf_set_str() %s failed !!", UA_RESULT_KEY);
322 if(str_cause != NULL)
324 if (str_result != NULL)
327 if (file_des != NULL)
330 _DEBUG_INFO("update_result - %d \n", update_result);
332 return update_result;
335 int slp_device_ctrl_reboot()
339 int ret = _system_command("/sbin/reboot");
345 /*will be insert.. // tel_process_power_command(TAPI_PHONE_POWER_RESET); ?? */
350 int slp_device_ctrl_fully_lock()
354 /*if (__get_mobile_tracker_status() == 0 ) {
355 _DEBUG_INFO("mobile tracker status OFF \n");
359 ("/opt/apps/deb.com.samsung.pwlock/bin/pwlock 1 &");
366 int slp_device_ctrl_partially_lock()
370 /*if (__get_mobile_tracker_status() == 0 ) {
371 _DEBUG_INFO("mobile tracker status OFF \n");
375 ("/opt/apps/deb.com.samsung.pwlock/bin/pwlock 1 &");
382 int slp_device_ctrl_unlock()
386 /*if (__get_mobile_tracker_status() == 0 ) {
387 _DEBUG_INFO("mobile tracker status OFF \n");
391 ("killall -9 pwlock");
397 int slp_device_ctrl_factory_reset()
401 /*if (__get_mobile_tracker_status() == 0 ) {
402 _DEBUG_INFO("mobile tracker status OFF \n");
405 ("/usr/bin/factory-reset.sh"); // */
411 /* static function */
412 static int _system_command(const char *command)
416 int pid = 0, status = 0;
417 char *const environ[] = { NULL };
419 retvm_if((command) == NULL, -1, "command is NULL!!");
423 _DEBUG_TRACE("ERROR : fork failed to create a process\n");
427 } else if (pid == 0) {
431 argv[2] = (char *)command;
434 execve("/bin/sh", argv, environ);
438 if (waitpid(pid, &status, 0) == -1) {
439 if (errno != EINTR) {
445 _DEBUG_ERROR("error : status [%d]", status);
456 /* TODO : holding ( wait until the MDM module is completed ) */
457 /*int Execute_Dev_App_Install(char *file_name, char *application_id)
459 if( file_name == NULL )
462 _DEBUG_INFO("file_name[%s] \n", file_name);
466 char *descriptor = NULL;
467 char abs_setup_file[256] = {0,};
469 snprintf(abs_setup_file,sizeof(abs_setup_file),"%s", file_name );
470 _DEBUG_INFO("[%s] , [%s] \n", abs_setup_file, file_name );
471 result = package_manager_install_application(&req_id, descriptor, abs_setup_file, PKG_QUIET PKG_DEFAULT, 0, NULL);
472 LOGTRACE("package_manager_install_application result[%d]\n", result);
473 if( result < PKG_COMMON_OK) {
474 LOGTRACE("Install failed! result[%d] \n", result );
475 snprintf(app_ID, PKG_TYPE_STRING_LEN_MAX+PKG_NAME_STRING_LEN_MAX+PKG_VERSION_STRING_LEN_MAX +2 , "%s" , pFile_name );
476 //pthread_mutex_unlock(&wait_mutex);
480 ecore_main_loop_begin();
481 snprintf(app_ID, PKG_TYPE_STRING_LEN_MAX+PKG_NAME_STRING_LEN_MAX+PKG_VERSION_STRING_LEN_MAX +2, "%s" , g_pkg_info.pkg_name );
486 if( result == PKG_COMMON_OK ) {
487 _DEBUG_INFO("package_manager_install_application() Success !!\n");
491 _DEBUG_INFO("package_manager_install_application() Success !!\n");
495 return result ; // 1(OK),0(FAIL)
498 /*int Execute_Dev_App_UnInstall(char *application_id)
503 return 0 ; // 1(OK),0(FAIL)
504 LOGTRACE("app_ID[%s] \n", app_ID);
506 if( strlen(app_ID) >= 256 ) // Prevent defect
508 LOGTRACE("strlen[app_ID] >= 256 \n");
509 return 0 ; // 1(OK),0(FAIL)
512 #if defined(_D_SLP_PKGMGR_)
514 char *descriptor = NULL;
515 char pkg_type[16] = {0,};
516 memcpy(pkg_type,app_ID,3);
519 result = package_manager_uninstall_application(&req_id, pkg_type, app_ID , PKG_QUIET PKG_DEFAULT, return_pkgmgr_cb, NULL);
520 if( result < PKG_COMMON_OK)
522 LOGTRACE("Uninstall failed! result[%d] \n", result);
526 ecore_main_loop_begin();
531 if( result == PKG_COMMON_OK ) {
532 char return_char[512] = {0,};
533 snprintf(return_char,510,"%s,success,%s", (char*)_D_APP_UNINSTALL_,app_ID ); // Prevent defect
534 QUEUE_sendto ( _D_SYNCML_DM_SERVICE_SOCKET_PATH , (void*) return_char , strlen(return_char) );
537 char return_char[512] = {0,};
538 snprintf(return_char,510,"%s,fail,%s", (char*)_D_APP_UNINSTALL_,app_ID ); // Prevent defect
539 QUEUE_sendto ( _D_SYNCML_DM_SERVICE_SOCKET_PATH , (void*) return_char , strlen(return_char) );
542 return result ; // 1(OK),0(FAIL)
545 /*int Execute_Dev_App_Activate(char *applicaton_id, int activate_status)
550 return 0 ; // 1(OK),0(FAIL)
551 LOGTRACE("appID[%s] activate[%d] \n", app_ID, activate);
553 if( strlen(app_ID) >= 256 ) // Prevent defect
555 LOGTRACE("strlen[app_ID] >= 256 \n");
556 return 0 ; // 1(OK),0(FAIL)
559 #if defined(_D_SLP_PKGMGR_)
561 char *descriptor = NULL;
562 char pkg_type[16] = {0,};
563 memcpy(pkg_type,app_ID,3);
566 result = package_manager_activate_application(&req_id, pkg_type, app_ID , activate, return_pkgmgr_cb, NULL);
567 if( result < PKG_COMMON_OK)
569 LOGTRACE("Uninstall failed! result[%d] \n", result);
573 ecore_main_loop_begin();
578 if( result == PKG_COMMON_OK ) {
579 char return_char[512] = {0,};
581 snprintf(return_char,510,"%s,success,%s", (char*)_D_APP_ACTIVE_,app_ID ); // prevent defect
584 snprintf(return_char,510,"%s,success,%s", (char*)_D_APP_INACTIVE_,app_ID ); // prevent defect
587 QUEUE_sendto ( _D_SYNCML_DM_SERVICE_SOCKET_PATH , (void*) return_char , strlen(return_char) );
590 char return_char[512] = {0,};
592 snprintf(return_char,510,"%s,fail,%s", (char*)_D_APP_ACTIVE_,app_ID ); // prevent defect
595 snprintf(return_char,510,"%s,fail,%s", (char*)_D_APP_INACTIVE_,app_ID ); // prevent defect
597 QUEUE_sendto ( _D_SYNCML_DM_SERVICE_SOCKET_PATH , (void*) return_char , strlen(return_char) );
600 return result ; // 1(OK),0(FAIL)
603 /*static int __return_pkgmgr_cb(pkg_request_id req_id, const char *pkg_type, const char *pkg_name, const char *key, const char *val, const void *pmsg, void *data)
605 LOGTRACE("return_cb req_id[%d] pkg_type[%s] pkg_name[%s] key[%s] val[%s]\n", req_id, pkg_type, pkg_name, key, val);
606 // printf("return_cb req_id[%d] pkg_type[%s] pkg_name[%s] key[%s] val[%s]\n", req_id, pkg_type, pkg_name, key, val);
608 if( strncmp(key, "end", strlen("end") ) == 0) {
609 snprintf(g_pkg_info.pkg_type, PKG_TYPE_STRING_LEN_MAX, "%s", pkg_type);
610 snprintf(g_pkg_info.pkg_name, PKG_NAME_STRING_LEN_MAX, "%s", pkg_name);
611 //snprintf(g_pkg_info.pkg_version, PKG_VERSION_STRING_LEN_MAX, "%s", val);
612 //exit(0); ==> exit ���� �׳� process ��ü�� �� ����..
613 ecore_main_loop_quit(); // ==> ecore_main_loop_begin() ���� ��� ����
614 //pthread_cond_signal(&wait_cond); // sending signal
616 else if( strncmp(key, "install_percent", strlen("install_percent") ) == 0) {
617 LOGTRACE("install_percent[%s] \n", val);
619 return 0; // Prevent defect 25315
622 /*static int __get_mobile_tracker_status()
624 char str_key_name[128] = { 0, };
627 memset(str_key_name, 0, sizeof(str_key_name));
628 snprintf(str_key_name, sizeof(str_key_name), "%s", VCONFKEY_SETAPPL_STATE_MOBILE_TRACKER_BOOL); //db/setting/mobile_tracker
630 if (!vconf_get_bool(str_key_name, &int_key)) {
631 _DEBUG_VERBOSE("%s success , int_key : %d \n", VCONFKEY_SETAPPL_STATE_MOBILE_TRACKER_BOOL, int_key);
633 _DEBUG_VERBOSE("%s failed \n", VCONFKEY_SETAPPL_STATE_MOBILE_TRACKER_BOOL);
636 _DEBUG_VERBOSE(" %s vconf %d value \n", VCONFKEY_SETAPPL_STATE_MOBILE_TRACKER_BOOL, int_key);