1.main
int main(int argc, char **argv) {
//接收到“SIGCHLD”的进程终止信号,调用exit_handler() 函数
signal(SIGCHLD, exit_handler);
int ret = -1;
#if 1
//
if(!pre_config()) {
MMI_ALOGE("pre config failed");
return -1;
}
/*Initialize configuration */
ret = init_config(MMI_CONFIG);
if(ret < 0) {
MMI_ALOGE("init config failed");
return -1;
}
if(!post_config()) {
MMI_ALOGE("post config failed");
return -1;
}
/*Load controller */
init_controller();
/*Initial the MMI screen */
build_main_ui();
MMI_KLOGE("mmi UI...., enjoy!!!!");
/*Start threads */
start_threads();
/*Launch threads */
MMI_KLOGE("starting modules");
launch_controller();
launch_clients();
/*Start Background Test */
if(is_autostart())
start_autorun(is_skip_pass());
#else
if(display_ffbm_string() != SUCCESS){
MMI_ALOGE("Fail to display FFBM string on main ui");
}
if(!pre_config()) {
MMI_ALOGE("config failed");
return -1;
}
init_controller();
//launch_controller();
#endif
sem_wait(&g_sem_exit);
write_file(WAKE_UNLOCK, "mmi");
out:sem_close(&g_sem_exit);
return 0;
}
1.1 static bool pre_config()
static bool pre_config() {
// MMI_PATH_CONFIG = “/etc/mmi/path_config.xml”
parse_strings(MMI_PATH_CONFIG);
/**start logcat process*/
launch_log();
/**Common init*/
write_file(WAKE_LOCK, "mmi");
sem_init(&g_sem_exit, 0, 0);
sem_init(&g_msg_sem, 0, 0);
sem_init(&g_sem_accept_ready, 0, 0);
sem_init(&g_data_print_sem, 0, 0);
sem_init(&g_result_sem, 0, 0);
pthread_mutex_init(&g_cur_layout_mutex, NULL);
#ifndef NO_UI
/**Init draw*/
if(!init_draw()) {
MMI_ALOGE("init draw env failed!");
return false;
}
#endif
create_func_map();
if(true == is_create_mmi_cfg() && SUCCESS != create_mmi_cfg()) {
MMI_ALOGE("Parse mmi.xml file failed");
return false;
}
return true;
}
1.1.1 parse_strings("/etc/mmi/path_config.xml")
读取/etc/mmi/path_config.xml 中的信息,传入parse_string 中的 unordered_map < string, string > &strings_map 为xmlparse.cpp 中定义的static unordered_map < string, string > strings_map;
int parse_strings(char *filepath, unordered_map < string, string > &strings_map) {
xmlDocPtr doc;
xmlNodePtr curNode;
char *name = NULL;
char *value = NULL;
... ...
MMI_ALOGI("start to loading xml file: '%s'", filepath);
doc = xmlReadFile(filepath, "UTF-8", XML_PARSE_RECOVER);
... ...
curNode = xmlDocGetRootElement(doc);
... ...
if(xmlStrcmp(curNode->name, BAD_CAST "resources")) {
MMI_ALOGE("document(%s) of the wrong type, root node != root \n", filepath);
xmlFreeDoc(doc);
return -1;
}
/*clear map before initialize */
strings_map.clear();
curNode = curNode->xmlChildrenNode;
while(curNode != NULL) {
if(!xmlStrcmp(curNode->name, BAD_CAST "string")) {
name = (char *) xmlGetProp(curNode, BAD_CAST "name");
value = (char *) xmlNodeGetContent(curNode);
if(name != NULL && value != NULL) {
strings_map[name] = value;
xmlFree(value);
}
}
curNode = curNode->next;
}
xmlFreeDoc(doc);
return 0;
}