void CloudPinyinAddCandidateWord(void* arg) { FcitxCloudPinyin* cloudpinyin = (FcitxCloudPinyin*) arg; FcitxIM* im = FcitxInstanceGetCurrentIM(cloudpinyin->owner); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); if (cloudpinyin->initialized == false) return; /* check whether the current im is pinyin */ if (CHECK_VALID_IM) { /* there is something pending input */ if (FcitxInputStateGetRawInputBufferSize(input) >= cloudpinyin->config.iMinimumPinyinLength) { char* strToFree = NULL, *inputString; strToFree = GetCurrentString(cloudpinyin); inputString = SplitHZAndPY(strToFree); if (inputString) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, inputString); FcitxLog(LOGLEVEL, "%s", inputString); if (cacheEntry == NULL) CloudPinyinAddInputRequest(cloudpinyin, inputString); _CloudPinyinAddCandidateWord(cloudpinyin, inputString); } if (strToFree) free(strToFree); } } return; }
void _CloudPinyinAddCandidateWord(FcitxCloudPinyin* cloudpinyin, const char* pinyin) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, pinyin); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); int order = (cloudpinyin->config.iCandidateOrder <= 2) ? 1 : (cloudpinyin->config.iCandidateOrder - 1); if (cacheEntry) { FcitxCandidateWord* cand; /* only check the first three page */ int pagesize = FcitxCandidateWordGetPageSize(candList); int size = pagesize * CLOUDPINYIN_CHECK_PAGE_NUMBER; int i; if (cloudpinyin->config.iCandidateOrder <= 1) { order = 0; } for (i = 0;i < size && (cand = FcitxCandidateWordGetByTotalIndex(candList, i));i++) { if (strcmp(cand->strWord, cacheEntry->str) == 0) { if (i > order && i >= pagesize) { FcitxCandidateWordMoveByWord(candList, cand, order); if (order == 0) { CloudSetClientPreedit(cloudpinyin, cacheEntry->str); } } return; } } if (order == 0) { CloudSetClientPreedit(cloudpinyin, cacheEntry->str); } } FcitxCandidateWord candWord; CloudCandWord* cloudCand = fcitx_utils_malloc0(sizeof(CloudCandWord)); if (cacheEntry) { cloudCand->filled = true; cloudCand->timestamp = 0; candWord.strWord = strdup(cacheEntry->str); } else { cloudCand->filled = false; cloudCand->timestamp = CloudGetTimeStamp(); candWord.strWord = strdup(".."); } candWord.callback = CloudPinyinGetCandWord; candWord.owner = cloudpinyin; candWord.priv = cloudCand; candWord.wordType = MSG_TIPS; if (cloudpinyin->config.bDontShowSource) candWord.strExtra = NULL; else { candWord.strExtra = strdup(_(" (via cloud)")); candWord.extraType = MSG_TIPS; } FcitxCandidateWordInsert(candList, &candWord, order); }
void CloudPinyinFillCandidateWord(FcitxCloudPinyin* cloudpinyin, const char* pinyin) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, pinyin); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); struct _FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (cacheEntry) { FcitxCandidateWord* candWord; for (candWord = FcitxCandidateWordGetFirst(candList); candWord != NULL; candWord = FcitxCandidateWordGetNext(candList, candWord)) { if (candWord->owner == cloudpinyin) break; } if (candWord == NULL) return; CloudCandWord* cloudCand = candWord->priv; if (cloudCand->filled) return; FcitxCandidateWord* cand; int i = 0; int size = FcitxCandidateWordGetPageSize(candList) * CLOUDPINYIN_CHECK_PAGE_NUMBER; for (cand = FcitxCandidateWordGetFirst(candList); cand != NULL; cand = FcitxCandidateWordGetNext(candList, cand)) { if (strcmp(cand->strWord, cacheEntry->str) == 0) { FcitxCandidateWordRemove(candList, candWord); FcitxUIUpdateInputWindow(cloudpinyin->owner); candWord = NULL; break; } i ++; if (i >= size) break; } if (candWord) { if (cloudCand->filled == false) { cloudCand->filled = true; free(candWord->strWord); candWord->strWord = strdup(cacheEntry->str); FcitxUIUpdateInputWindow(cloudpinyin->owner); } } } }
void _CloudPinyinAddCandidateWord(FcitxCloudPinyin* cloudpinyin, const char* pinyin) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, pinyin); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); struct _FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (cacheEntry) { FcitxCandidateWord* cand; /* only check the first three page */ int size = FcitxCandidateWordGetPageSize(candList) * CLOUDPINYIN_CHECK_PAGE_NUMBER; int i = 0; for (cand = FcitxCandidateWordGetFirst(FcitxInputStateGetCandidateList(input)); cand != NULL; cand = FcitxCandidateWordGetNext(FcitxInputStateGetCandidateList(input), cand)) { if (strcmp(cand->strWord, cacheEntry->str) == 0) return; i ++; if (i >= size) break; } } FcitxCandidateWord candWord; CloudCandWord* cloudCand = fcitx_utils_malloc0(sizeof(CloudCandWord)); if (cacheEntry) { cloudCand->filled = true; candWord.strWord = strdup(cacheEntry->str); } else { cloudCand->filled = false; candWord.strWord = strdup(".."); } candWord.callback = CloudPinyinGetCandWord; candWord.owner = cloudpinyin; candWord.priv = cloudCand; candWord.wordType = MSG_TIPS; if (cloudpinyin->config.bDontShowSource) candWord.strExtra = NULL; else { candWord.strExtra = strdup(_(" (via cloud)")); candWord.extraType = MSG_TIPS; } int order = cloudpinyin->config.iCandidateOrder - 1; if (order < 0) order = 0; FcitxCandidateWordInsert(candList, &candWord, order); }
void CloudPinyinHandleRequest(FcitxCloudPinyin* cloudpinyin, CurlQueue* queue) { if (queue->type == RequestKey) { cloudpinyin->isrequestkey = false; if (queue->source != cloudpinyin->config.source) return; if (queue->http_code == 200) { if (engine[cloudpinyin->config.source].ParseKey) engine[cloudpinyin->config.source].ParseKey(cloudpinyin, queue); } } else if (queue->type == RequestPinyin) { if (queue->http_code == 200 && cloudpinyin->config.source == queue->source) { char *realstring = engine[cloudpinyin->config.source].ParsePinyin(cloudpinyin, queue); if (realstring) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, queue->pinyin); if (cacheEntry == NULL) cacheEntry = CloudPinyinAddToCache(cloudpinyin, queue->pinyin, realstring); FcitxIM* im = FcitxInstanceGetCurrentIM(cloudpinyin->owner); char* strToFree = NULL, *inputString; strToFree = GetCurrentString(cloudpinyin); inputString = SplitHZAndPY(strToFree); if (inputString) { FcitxLog(LOGLEVEL, "fill: %s %s", inputString, queue->pinyin); if (strcmp(inputString, queue->pinyin) == 0) { if (CHECK_VALID_IM) { CloudPinyinFillCandidateWord(cloudpinyin, inputString); } } } if (strToFree) free(strToFree); free(realstring); } } if (queue->http_code != 200) { cloudpinyin->errorcount ++; if (cloudpinyin->errorcount > MAX_ERROR) { cloudpinyin->initialized = false; cloudpinyin->key[0] = '\0'; cloudpinyin->errorcount = 0; } } } CloudPinyinReleaseCurlHandle(cloudpinyin, queue->curl); if (queue->str) free(queue->str); if (queue->pinyin) free(queue->pinyin); free(queue); }
void CloudPinyinFillCandidateWord(FcitxCloudPinyin* cloudpinyin, const char* pinyin) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, pinyin); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (cacheEntry) { int cloudidx; FcitxCandidateWord *candWord; for (cloudidx = 0; (candWord = FcitxCandidateWordGetByTotalIndex(candList, cloudidx)); cloudidx++) { if (candWord->owner == cloudpinyin) break; } if (candWord == NULL) return; CloudCandWord* cloudCand = candWord->priv; if (cloudCand->filled) return; FcitxCandidateWord *cand; int i; int pagesize = FcitxCandidateWordGetPageSize(candList); int size = pagesize * CLOUDPINYIN_CHECK_PAGE_NUMBER; for (i = 0;i < size && (cand = FcitxCandidateWordGetByTotalIndex(candList, i));i++) { if (strcmp(cand->strWord, cacheEntry->str) == 0) { uint64_t ts = cloudCand->timestamp; uint64_t curTs = CloudGetTimeStamp(); FcitxCandidateWordRemove(candList, candWord); /* if cloud word is not on the first page.. impossible */ if (cloudidx < pagesize) { /* if the duplication before cloud word */ if (i < cloudidx) { if (curTs - ts > LOADING_TIME_QUICK_THRESHOLD) { FcitxCandidateWordInsertPlaceHolder(candList, cloudidx); FcitxCandidateWord* placeHolder = FcitxCandidateWordGetByTotalIndex(candList, cloudidx); if (placeHolder && placeHolder->strWord == NULL) placeHolder->strWord = strdup(DUP_PLACE_HOLDER); } } else { if (i >= pagesize) { FcitxCandidateWordMove(candList, i - 1, cloudidx); } else { if (curTs - ts > LOADING_TIME_QUICK_THRESHOLD) { FcitxCandidateWordInsertPlaceHolder(candList, cloudidx); FcitxCandidateWord* placeHolder = FcitxCandidateWordGetByTotalIndex(candList, cloudidx); if (placeHolder && placeHolder->strWord == NULL) placeHolder->strWord = strdup(DUP_PLACE_HOLDER); } } } } FcitxUIUpdateInputWindow(cloudpinyin->owner); candWord = NULL; break; } } if (candWord) { if (cloudCand->filled == false) { cloudCand->filled = true; free(candWord->strWord); candWord->strWord = strdup(cacheEntry->str); if (cloudpinyin->config.iCandidateOrder <= 1 && (CloudGetTimeStamp() - cloudCand->timestamp <= LOADING_TIME_QUICK_THRESHOLD)) { FcitxCandidateWordMoveByWord(candList, candWord, 0); CloudSetClientPreedit(cloudpinyin, cacheEntry->str); } FcitxUIUpdateInputWindow(cloudpinyin->owner); } } } }