【笔记】fastmmi 实现

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章