Esempio n. 1
0
void CloudPinyinDestroy(void* arg)
{
    FcitxCloudPinyin* cloudpinyin = (FcitxCloudPinyin*) arg;
    char c = 1;
    write(cloudpinyin->pipeNotify, &c, sizeof(char));
    pthread_join(cloudpinyin->pid, NULL);
    pthread_mutex_destroy(&cloudpinyin->pendingQueueLock);
    pthread_mutex_destroy(&cloudpinyin->finishQueueLock);
    while (cloudpinyin->cache)
    {
        CloudPinyinCache* head = cloudpinyin->cache;
        HASH_DEL(cloudpinyin->cache, cloudpinyin->cache);
        free(head->pinyin);
        free(head->str);
        free(head);
    }

    close(cloudpinyin->pipeRecv);
    close(cloudpinyin->pipeNotify);

    close(cloudpinyin->fetch->pipeRecv);
    close(cloudpinyin->fetch->pipeNotify);
    int i = 0;
    for (i = 0; i < MAX_HANDLE; i ++) {
        if (cloudpinyin->freeList[i].curl) {
            curl_easy_cleanup(cloudpinyin->freeList[i].curl);
        }
    }

    curl_multi_cleanup(cloudpinyin->fetch->curlm);
#define _FREE_QUEUE(NAME) \
    while(NAME) { \
        CurlQueue* queue = NAME; \
        NAME = NAME->next; \
        fcitx_utils_free(queue->str); \
        fcitx_utils_free(queue->pinyin); \
        free(queue); \
    }
    _FREE_QUEUE(cloudpinyin->pendingQueue)
    _FREE_QUEUE(cloudpinyin->finishQueue)
    _FREE_QUEUE(cloudpinyin->fetch->queue)
    FcitxConfigFree(&cloudpinyin->config.config);
    free(cloudpinyin->fetch);
    free(cloudpinyin);
}
Esempio n. 2
0
File: skin.c Progetto: areslp/fcitx
/**
@加载皮肤配置文件
*/
int LoadSkinConfig(FcitxSkin* sc, char** skinType)
{
    FILE    *fp;
    boolean    isreload = False;
    int ret = 0;
    if (sc->config.configFile) {
        utarray_done(&sc->skinMainBar.skinPlacement);
        FcitxConfigFree(&sc->config);
        UnloadImage(sc);
    }
    memset(sc, 0, sizeof(FcitxSkin));
    utarray_init(&sc->skinMainBar.skinPlacement, &place_icd);

reload:
    if (!isreload) {
        char *buf;
        fcitx_utils_alloc_cat_str(buf, *skinType, "/fcitx_skin.conf");
        fp = FcitxXDGGetFileWithPrefix("skin", buf, "r", NULL);
        free(buf);
    } else {
        char *path = fcitx_utils_get_fcitx_path_with_filename(
                         "pkgdatadir", "/skin/default/fcitx_skin.conf");
        fp = fopen(path, "r");
        free(path);
    }

    if (fp) {
        FcitxConfigFile *cfile;
        FcitxConfigFileDesc* skinDesc = GetSkinDesc();
        if (sc->config.configFile == NULL) {
            cfile = FcitxConfigParseConfigFileFp(fp, skinDesc);
        } else {
            cfile = sc->config.configFile;
            cfile = FcitxConfigParseIniFp(fp, cfile);
        }
        if (!cfile) {
            fclose(fp);
            fp = NULL;
        } else {
            FcitxSkinConfigBind(sc, cfile, skinDesc);
            FcitxConfigBindSync((FcitxGenericConfig*)sc);
        }
    }

    if (!fp) {
        if (isreload) {
            FcitxLog(FATAL, _("Can not load default skin, is installion correct?"));
            perror("fopen");
            ret = 1;    // 如果安装目录里面也没有配置文件,那就只好告诉用户,无法运行了
        } else {
            perror("fopen");
            FcitxLog(WARNING, _("Can not load skin %s, return to default"), *skinType);
            if (*skinType)
                free(*skinType);
            *skinType = strdup("default");
            isreload = true;
            goto reload;
        }
    }

    if (fp)
        fclose(fp);
    sc->skinType = skinType;

    return ret;

}