X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Flibwrapper.cpp;h=0cc7001612d25a30ca7e8f3720e5d94df5813952;hb=918852f5133cec813a5b7ed602c6c76bdcb0bc3f;hp=62c322a769239e5a538b7d7b449f38947699b5ff;hpb=75d9e8b04d7e7d730002ff220d385b7827491822;p=mstardict diff --git a/src/libwrapper.cpp b/src/libwrapper.cpp index 62c322a..0cc7001 100644 --- a/src/libwrapper.cpp +++ b/src/libwrapper.cpp @@ -107,27 +107,82 @@ std::string xdxf2text(const char *p) } static -string parse_data(const gchar *data) +string parse_data(const gchar *data, + const gchar *oword) { if (!data) return ""; - string res; + string mark; guint32 data_size, sec_size = 0; gchar *m_str; const gchar *p = data; data_size = *((guint32 *) p); p += sizeof(guint32); + size_t iPlugin; + size_t nPlugins = pMStarDict->oStarDictPlugins->ParseDataPlugins.nplugins(); + unsigned int parsed_size; + ParseResult parse_result; + while (guint32(p - data) < data_size) { + for (iPlugin = 0; iPlugin < nPlugins; iPlugin++) { + parse_result.clear(); + if (pMStarDict->oStarDictPlugins->ParseDataPlugins.parse(iPlugin, p, &parsed_size, parse_result, oword)) { + p += parsed_size; + break; + } + } + if (iPlugin != nPlugins) { + for (std::list::iterator it = parse_result.item_list.begin(); it != parse_result.item_list.end(); ++it) { + switch (it->type) { + case ParseResultItemType_mark: + g_debug("ParseResultItemType_mark"); + mark += it->mark->pango; + break; + case ParseResultItemType_link: +// g_debug("ParseResultItemType_link: %s", it->mark->pango.c_str()); + mark += it->mark->pango; + break; + case ParseResultItemType_res: + { + g_debug("ParseResultItemType_res"); + bool loaded = false; + if (it->res->type == "image") { + } else if (it->res->type == "sound") { + } else if (it->res->type == "video") { + } else { + } + if (!loaded) { + mark += ""; + gchar *m_str = g_markup_escape_text(it->res->key.c_str(), -1); + mark += m_str; + g_free(m_str); + mark += ""; + } + break; + } + case ParseResultItemType_widget: + g_debug("ParseResultItemType_widget"); + break; + default: + g_debug("ParseResultItemType_default"); + break; + } + } + parse_result.clear(); + continue; + } + switch (*p++) { case 'g': + case 'h': case 'm': case 'l': //need more work... sec_size = strlen(p); if (sec_size) { - res += "\n"; + mark += "\n"; m_str = g_strndup(p, sec_size); - res += m_str; + mark += m_str; g_free(m_str); } sec_size++; @@ -135,9 +190,9 @@ string parse_data(const gchar *data) case 'x': sec_size = strlen(p); if (sec_size) { - res += "\n"; + mark += "\n"; m_str = g_strndup(p, sec_size); - res += xdxf2text(m_str); + mark += xdxf2text(m_str); g_free(m_str); } sec_size++; @@ -145,9 +200,9 @@ string parse_data(const gchar *data) case 't': sec_size = strlen(p); if (sec_size) { - res += "\n"; + mark += "\n"; m_str = g_strndup(p, sec_size); - res += "[" + string(m_str) + "]"; + mark += "[" + string(m_str) + "]"; g_free(m_str); } sec_size++; @@ -165,7 +220,7 @@ string parse_data(const gchar *data) p += sec_size; } - return res; + return mark; } void @@ -175,20 +230,20 @@ Library::ListWords(CurrentIndex *iIndex) sizeof(CurrentIndex) * query_dictmask.size()); - pMStarDict->ResultsListClear(); + oStarDict->ResultsListClear(); int iWordCount = 0; const gchar *poCurrentWord = poGetCurrentWord(iIndex, query_dictmask, 0); if (poCurrentWord) { - pMStarDict->ResultsListInsertLast(poCurrentWord); + oStarDict->ResultsListInsertLast(poCurrentWord); iWordCount++; while (iWordCount < 30 && (poCurrentWord = poGetNextWord(NULL, iIndex, query_dictmask, 0))) { - pMStarDict->ResultsListInsertLast(poCurrentWord); + oStarDict->ResultsListInsertLast(poCurrentWord); iWordCount++; } } - pMStarDict->ReScroll(); + oStarDict->ResultsReScroll(); if (iCurrent) g_free(iCurrent); @@ -204,6 +259,7 @@ Library::BuildResultData(std::vector < InstantDictIndex > &dictmask, int iRealLib; bool bFound = false, bLookupWord = false, bLookupSynonymWord = false; gint nWord = 0, count = 0, i = 0, j = 0; + glong iWordIdx; iRealLib = dictmask[iLib].index; @@ -237,22 +293,20 @@ Library::BuildResultData(std::vector < InstantDictIndex > &dictmask, count = GetOrigWordCount(iIndex[iLib].idx, iRealLib, true); for (i = 0; i < count; i++) { res_list.push_back(TSearchResult(dict_name(iLib), - poGetWord(iIndex[iLib].idx, iRealLib, - 0), - parse_data - (poGetOrigWordData - (iIndex[iLib].idx + i, iRealLib)))); + poGetOrigWord(iIndex[iLib].idx, iRealLib), + parse_data(poGetOrigWordData(iIndex[iLib].idx + i, iRealLib), + poGetOrigWord(iIndex[iLib].idx, iRealLib)))); } i = 1; } else { i = 0; } for (j = 0; i < nWord; i++, j++) { + iWordIdx = poGetOrigSynonymWordIdx(iIndex[iLib].synidx + j, iRealLib); res_list.push_back(TSearchResult(dict_name(iLib), - poGetWord(iIndex[iLib].synidx + j, - iRealLib, 0), - parse_data(poGetOrigWordData - (iIndex[iLib].synidx + j, iRealLib)))); + poGetOrigWord(iWordIdx, iRealLib), + parse_data(poGetOrigWordData(iWordIdx, iRealLib), + poGetOrigWord(iWordIdx, iRealLib)))); } bFound = true; @@ -292,17 +346,17 @@ Library::LookupWithFuzzy(const gchar *sWord) gchar *fuzzy_reslist[MAX_FUZZY_MATCH_ITEM]; bool bFound = false; - pMStarDict->ResultsListClear(); + oStarDict->ResultsListClear(); bFound = Libs::LookupWithFuzzy(sWord, fuzzy_reslist, MAX_FUZZY_MATCH_ITEM, query_dictmask); if (bFound) { SimpleLookup(fuzzy_reslist[0], iCurrentIndex); for (int i = 0; i < MAX_FUZZY_MATCH_ITEM && fuzzy_reslist[i]; i++) { - pMStarDict->ResultsListInsertLast(fuzzy_reslist[i]); + oStarDict->ResultsListInsertLast(fuzzy_reslist[i]); g_free(fuzzy_reslist[i]); } - pMStarDict->ReScroll(); + oStarDict->ResultsReScroll(); } return bFound; @@ -316,15 +370,15 @@ Library::LookupWithRule(const gchar *sWord) gchar **ppMatchWord = (gchar **) g_malloc(sizeof(gchar *) * (MAX_MATCH_ITEM_PER_LIB) * query_dictmask.size()); - pMStarDict->ResultsListClear(); + oStarDict->ResultsListClear(); iMatchCount = Libs::LookupWithRule(sWord, ppMatchWord, query_dictmask); if (iMatchCount) { for (gint i = 0; i < iMatchCount; i++) - pMStarDict->ResultsListInsertLast(ppMatchWord[i]); + oStarDict->ResultsListInsertLast(ppMatchWord[i]); SimpleLookup(ppMatchWord[0], iCurrentIndex); - pMStarDict->ReScroll(); + oStarDict->ResultsReScroll(); for (gint i = 0; i < iMatchCount; i++) g_free(ppMatchWord[i]); @@ -343,15 +397,15 @@ Library::LookupWithRegex(const gchar *sWord) gchar **ppMatchWord = (gchar **) g_malloc(sizeof(gchar *) * (MAX_MATCH_ITEM_PER_LIB) * query_dictmask.size()); - pMStarDict->ResultsListClear(); + oStarDict->ResultsListClear(); iMatchCount = Libs::LookupWithRegex(sWord, ppMatchWord, query_dictmask); if (iMatchCount) { for (gint i = 0; i < iMatchCount; i++) - pMStarDict->ResultsListInsertLast(ppMatchWord[i]); + oStarDict->ResultsListInsertLast(ppMatchWord[i]); SimpleLookup(ppMatchWord[0], iCurrentIndex); - pMStarDict->ReScroll(); + oStarDict->ResultsReScroll(); for (gint i = 0; i < iMatchCount; i++) g_free(ppMatchWord[i]); @@ -362,18 +416,35 @@ Library::LookupWithRegex(const gchar *sWord) return bFound; } +static void +LookupProgressDialogUpdate(gpointer data, + double fraction) +{ + GtkWidget *dialog = GTK_WIDGET(data); + GtkWidget *progress; + + progress = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), "progress_bar")); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), fraction); + + while (gtk_events_pending()) + gtk_main_iteration(); +} + bool Library::LookupData(const gchar *sWord) { + GtkWidget *dialog; bool cancel = false; bool bFound = false; std::vector < std::vector < gchar * > > reslist(query_dictmask.size()); - pMStarDict->ResultsListClear(); - pMStarDict->ShowProgressIndicator(true); - bFound = Libs::LookupData(sWord, &reslist[0], NULL, NULL, &cancel, query_dictmask); + oStarDict->ResultsListClear(); + oStarDict->ShowProgressIndicator(true); + dialog = oStarDict->CreateLookupProgressDialog(&cancel); + + bFound = Libs::LookupData(sWord, &reslist[0], LookupProgressDialogUpdate, (gpointer) dialog, &cancel, query_dictmask); if (bFound) { for (size_t iLib = 0; iLib < query_dictmask.size(); iLib++) { if (!reslist[iLib].empty()) { @@ -381,19 +452,21 @@ Library::LookupData(const gchar *sWord) for (std::vector < gchar *>::iterator i = reslist[iLib].begin(); i != reslist[iLib].end(); ++i) { - pMStarDict->ResultsListInsertLast(*i); + oStarDict->ResultsListInsertLast(*i); } break; } } - pMStarDict->ReScroll(); + oStarDict->ResultsReScroll(); } - pMStarDict->ShowProgressIndicator(false); + oStarDict->ShowProgressIndicator(false); + oStarDict->DestroyLookupProgressDialog(dialog); return bFound; } -Library::Library():Libs(NULL, FALSE, 0, 0) +Library::Library(MStarDict *mStarDict):Libs(NULL, FALSE, 0, 0) { + oStarDict = mStarDict; iCurrentIndex = NULL; }