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); }
/** @加载皮肤配置文件 */ 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; }