/// <summary> /// Создает канал для вебсервиса толкового словаря /// </summary> /// <returns>канал вебсервиса толкового словаря</returns> internal IExplDic CreateChannel() { IExplDic explService = explFactory.CreateChannel(); ((IClientChannel)explService).Open(); return(explService); }
/// <summary> /// осуществляет поиск слова в словаре и загружает ближащие слова /// </summary> /// <param name="sWord">слово для поиска</param> /// <param name="collection">коллекция которую надо обновить информацией их толкового словаря</param> /// <returns>номер нижнего слова из диапазона запрашиваемых слов</returns> public int GoToWord(string sWord, ObservableCollection <WordSemanticBranch> collection) { IExplDic aDic = null; int nRequestLowerBound = 1; try { aDic = CreateChannel(); int nMaxRows = 0; int nLowerBound = aDic.Search(out nMaxRows, sWord, true, string.Empty, false, null, false, m_LsId); nRequestLowerBound = nLowerBound - ROWS_PER_PAGE / 2; if (nRequestLowerBound < 1) { nRequestLowerBound = 1; } AddDictionaryWords(nLowerBound, collection); ((IClientChannel)aDic).Close(); } catch (Exception ex) { if (aDic != null) { ((IClientChannel)aDic).Abort(); } MessageBox.Show(string.Format("{0} {1}", "GoToWord", ex.Message)); } return(nRequestLowerBound); }
/// <summary> /// проверят логин/пароль пользователя путем запроса веб-сервису толкового словаря /// </summary> /// <returns>true, если пользователь найден и имеет доступ к словарю</returns> public bool CheckCredentials() { IExplDic curChannel = null; try { curChannel = CreateChannel(); string[] roles = curChannel.GetUserRoles(m_LsId); ((IClientChannel)curChannel).Close(); } catch (Exception ex) { if (ex.InnerException != null) { MessageBox.Show(ex.InnerException.Message); } else { MessageBox.Show(ex.Message); } if (curChannel != null) { ((IClientChannel)curChannel).Abort(); } return(false); } return(true); }
/// <summary> /// Возвращает семнатическую ветвь. Слово и все его непосреджственные потомки из словарной статьи. /// </summary> /// <param name="sWord">слово родитель</param> /// <param name="SearchOption">настройки поиска</param> /// <returns>объект семантической ветви</returns> public WordSemanticBranch GetSemanticLink(string sWord, Options SearchOption) { WordSemanticBranch lnk = null; IExplDic curChannel = null; try { lnk = new WordSemanticBranch(); lock (m_dbHelper) { WordItem anWord = m_dbHelper.GetWord(sWord); if (anWord == null) { anWord = m_dbHelper.AddWord(sWord, true); } lnk.ParentWord = new RegistryWord(anWord); } curChannel = CreateChannel(); ExplDictService.nom[] articles = curChannel.ExplGetArticles(sWord, false, false, false, m_LsId); foreach (ExplDictService.nom article in articles) { if (ShouldSkip(article.part)) //существительное { continue; } foreach (ExplDictService.formula Value in article.formula) { if (Value.kind == 0 && //смысл Value.lv == 2) //толкование { string text = Value.interpr; string[] words = text.Split(new char[] { ' ', ',', '.', '!', '?', ';', ':' }); short nGroup = 0; foreach (string word in words) { lnk.Children.AddRange(GetChildren(sWord, word, curChannel, nGroup)); nGroup++; } } } } ((IClientChannel)curChannel).Close(); } catch (Exception ex) { if (curChannel != null) { ((IClientChannel)curChannel).Abort(); } MessageBox.Show(string.Format("{0} {1}", "GetSemanticLink", ex.Message)); } return(lnk); }
/// <summary> /// Обновляет коллекцию семантических ветвей после запроса списка слов из толкового словаря /// </summary> /// <param name="nLowerBound">нижняя граница слов, которые надо получить из толкового словаря</param> /// <param name="collection" out>коллекция которую надо обновить информацией их толкового словаря</param> public void AddDictionaryWords(int nLowerBound, ObservableCollection <WordSemanticBranch> collection) { //for debug purposes //return; IExplDic aDic = null; try { aDic = CreateChannel(); //int nMaxRows = aDic.GetRowCount(string.Empty, false, null, false, m_LsId); int nRequestLowerBound = nLowerBound - ROWS_PER_PAGE / 2; if (nRequestLowerBound < 1) { nRequestLowerBound = 1; } ExplDictService.elList[] page = aDic.SupplyPageOfData(nRequestLowerBound, ROWS_PER_PAGE, true, string.Empty, false, null, false, m_LsId); foreach (ExplDictService.elList elem in page) { WordSemanticBranch newBranch = GetSemanticLinkFromDB(RegistryWord.CreateNameWithHomonym(elem.word, elem.omon)); if (newBranch == null) { newBranch = new WordSemanticBranch(); newBranch.ParentWord = new RegistryWord(elem); } int nIndex = collection.IndexOf(newBranch); if (nIndex < 0) { collection.Add(newBranch); } else { collection[nIndex] = newBranch; } } ((IClientChannel)aDic).Close(); } catch (Exception ex) { if (aDic != null) { ((IClientChannel)aDic).Abort(); } MessageBox.Show(string.Format("{0} {1}", "AddDictionaryWords", ex.Message)); } }
/// <summary> /// находит все исходные формы слова /// </summary> /// <param name="sParent">слово родитель</param> /// <param name="sAnyFormWord">слово из правой части словарной статьи</param> /// <param name="explChannel">канал толкового словаря</param> /// <param name="relGroupId">номер группы отношений. используется если одно слово имеет несколько равнозначных исходных форм</param> /// <returns>список потомков с снайденным типом связи</returns> List <WordLink> GetChildren(string sParent, string sAnyFormWord, IExplDic explChannel, short relGroupId) { Ilib5 wordFormsChannel = null; List <WordLink> listChildren = null; try { listChildren = new List <WordLink>(); if (sAnyFormWord.Length == 0) { return(listChildren); } wordFormsChannel = CreateWordFormsChannel(); WordUniAndPartAndOmon[] forms = wordFormsChannel.getAllFirstWFormsWithParts(sAnyFormWord); foreach (WordUniAndPartAndOmon form in forms) { string s = form.part; string sOriginalForm = form.forma; if (IsNoun(form.part)) { sOriginalForm = RemoveAccents(sOriginalForm); if (sOriginalForm.Length > 0) { //can this be equal to zero? int nVal = explChannel.ExplCheckReestr(sOriginalForm, form.omon, m_LsId); if (nVal < 0 && form.omon != 0) { nVal = explChannel.ExplCheckReestr(sOriginalForm, 0, m_LsId); sOriginalForm = RegistryWord.CreateNameWithHomonym(sOriginalForm, string.Empty); } else { sOriginalForm = RegistryWord.CreateNameWithHomonym(sOriginalForm, form.omon == 0 ? string.Empty : form.omon.ToString()); } lock (m_dbHelper) { RelationItem newItem = m_dbHelper.GetRelationItem(sParent, sOriginalForm); if (newItem == null) { RelationType relType = (nVal < 0) ? RelationType.Absent : (listChildren.Count > 0 ? RelationType.Tentative : RelationType.Normal); newItem = m_dbHelper.AddRelation(sParent, sOriginalForm, relType, relGroupId); } WordItem aWord = m_dbHelper.GetWord(sOriginalForm); WordLink aLink = new WordLink(newItem, aWord); if (!listChildren.Contains(aLink)) { listChildren.Add(aLink); } } } } } ((IClientChannel)wordFormsChannel).Close(); } catch (Exception ex) { if (wordFormsChannel != null) { ((IClientChannel)wordFormsChannel).Abort(); } MessageBox.Show(string.Format("{0} {1}", "GetChildren", ex.Message)); } return(listChildren); }