bool SmileyPackCType::LoadSmileyDir(TCHAR* dir) { bkstring dirs = dir; dirs += _T("\\*.*"); _tfinddata_t c_file; INT_PTR hFile = _tfindfirst((TCHAR*)dirs.c_str(), &c_file); if (hFile > -1L) { do { if (c_file.name[0] != '.') { bkstring fullpath = dir; fullpath = fullpath + _T("\\") + c_file.name; TCHAR* div = _tcsrchr(c_file.name, '.'); if (div) { *div = 0; SmileyCType *smlc = new SmileyCType(fullpath, c_file.name); if (smlc->GetTriggerText().empty()) delete smlc; else m_SmileyList.insert(smlc); } } } while( _tfindnext( hFile, &c_file ) == 0 ); _findclose( hFile ); AddTriggersToSmileyLookup(); return true; } return false; }
bool SmileyPackType::LoadSmileyFileXEP(CMString& tbuf, bool onlyInfo, CMString&) { _TMatcher *m0, *m1, *m2; _TPattern *dbname_re = _TPattern::compile(_T("<DataBaseName>\\s*\"(.*?)\"\\s*</DataBaseName>"), _TPattern::MULTILINE_MATCHING); _TPattern *author_re = _TPattern::compile(_T("<PackageAuthor>\\s*\"(.*?)\"\\s*</PackageAuthor>"), _TPattern::MULTILINE_MATCHING); _TPattern *settings_re = _TPattern::compile(_T("<settings>(.*?)</settings>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); m0 = settings_re->createTMatcher(tbuf); if (m0->findFirstMatch()) { CMString settings = m0->getGroup(1); m1 = author_re->createTMatcher(settings); if (m1->findFirstMatch()) { m_Author = m1->getGroup(1); DecodeHTML(m_Author); } delete m1; m1 = dbname_re->createTMatcher(settings); if (m1->findFirstMatch()) { m_Name = m1->getGroup(1); DecodeHTML(m_Name); } delete m1; } delete m0; delete dbname_re; delete author_re; delete settings_re; if (!onlyInfo) { _TPattern *record_re = _TPattern::compile(_T("<record.*?ImageIndex=\"(.*?)\".*?>(?:\\s*\"(.*?)\")?(.*?)</record>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); _TPattern *expression_re = _TPattern::compile(_T("<Expression>\\s*\"(.*?)\"\\s*</Expression>"), _TPattern::MULTILINE_MATCHING); _TPattern *pastetext_re = _TPattern::compile(_T("<PasteText>\\s*\"(.*?)\"\\s*</PasteText>"), _TPattern::MULTILINE_MATCHING); _TPattern *images_re = _TPattern::compile(_T("<images>(.*?)</images>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); _TPattern *image_re = _TPattern::compile(_T("<Image>(.*?)</Image>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); _TPattern *imagedt_re = _TPattern::compile(_T("<!\\[CDATA\\[(.*?)\\]\\]>"), _TPattern::MULTILINE_MATCHING); m0 = images_re->createTMatcher(tbuf); if (m0->findFirstMatch()) { CMString images = m0->getGroup(1); m1 = imagedt_re->createTMatcher(images); if (m1->findFirstMatch()) { IStream* pStream = DecodeBase64Data(T2A_SM(m1->getGroup(1).c_str())); if (pStream != NULL) { if (m_hSmList != NULL) ImageList_Destroy(m_hSmList); m_hSmList = ImageList_Read(pStream); pStream->Release(); } } delete m1; } delete m0; m0 = record_re->createTMatcher(tbuf); while (m0->findNextMatch()) { SmileyType *dat = new SmileyType; dat->SetRegEx(true); dat->SetImList(m_hSmList, _ttol(m0->getGroup(1).c_str())); dat->m_ToolText = m0->getGroup(2); DecodeHTML(dat->m_ToolText); CMString rec = m0->getGroup(3); m1 = expression_re->createTMatcher(rec); if (m1->findFirstMatch()) { dat->m_TriggerText = m1->getGroup(1); DecodeHTML(dat->m_TriggerText); } delete m1; m1 = pastetext_re->createTMatcher(rec); if (m1->findFirstMatch()) { dat->m_InsertText = m1->getGroup(1); DecodeHTML(dat->m_InsertText); } delete m1; dat->SetHidden(dat->m_InsertText.IsEmpty()); m1 = image_re->createTMatcher(rec); if (m1->findFirstMatch()) { CMString images = m1->getGroup(1); m2 = imagedt_re->createTMatcher(images); if (m2->findFirstMatch()) { IStream* pStream = DecodeBase64Data(T2A_SM(m2->getGroup(1).c_str())); if (pStream != NULL) { dat->LoadFromImage(pStream); pStream->Release(); } } delete m2; } delete m1; m_SmileyList.insert(dat); } delete m0; delete record_re; delete expression_re; delete pastetext_re; delete images_re; delete image_re; delete imagedt_re; } m_VisibleCount = m_SmileyList.getCount(); AddTriggersToSmileyLookup(); selec.x = 0; selec.y = 0; win.x = 0; win.y = 0; return true; }
bool SmileyPackType::LoadSmileyFileMSL(CMString &tbuf, bool onlyInfo, CMString &modpath) { CMString pathstr, packstr; { _TPattern *pathsplit = _TPattern::compile(_T("(.*\\\\)(.*)\\.|$")); _TMatcher *m0 = pathsplit->createTMatcher(modpath); m0->findFirstMatch(); pathstr = m0->getGroup(1); packstr = m0->getGroup(2); delete m0; delete pathsplit; } { _TPattern *otherf = _TPattern::compile( _T("^\\s*(Name|Author|Date|Version|ButtonSmiley)\\s*=\\s*\"(.*)\""), _TPattern::MULTILINE_MATCHING); _TMatcher *m0 = otherf->createTMatcher(tbuf); while (m0->findNextMatch()) { if (m0->getGroup(1) == _T("Name")) m_Name = m0->getGroup(2); if (m0->getGroup(1) == _T("Author")) m_Author = m0->getGroup(2); if (m0->getGroup(1) == _T("Date")) m_Date = m0->getGroup(2); if (m0->getGroup(1) == _T("Version")) m_Version = m0->getGroup(2); if (m0->getGroup(1) == _T("ButtonSmiley")) m_ButtonSmiley = m0->getGroup(2); } delete m0; delete otherf; } if (!onlyInfo) { selec.x = selec.y = win.x = win.y = 0; { _TPattern *pat = _TPattern::compile( _T("^\\s*(Selection|Window)Size\\s*=\\s*(\\d+)\\s*,\\s*(\\d+)"), _TPattern::MULTILINE_MATCHING); _TMatcher *m0 = pat->createTMatcher(tbuf); while (m0->findNextMatch()) { POINT tpt; tpt.x = _ttol(m0->getGroup(2).c_str()); tpt.y = _ttol(m0->getGroup(3).c_str()); if (m0->getGroup(1) == _T("Selection")) selec = tpt; else if (m0->getGroup(1) == _T("Window")) win = tpt; } delete m0; delete pat; } _TPattern *smiley = _TPattern::compile( _T("^\\s*Smiley(\\*)?\\s*=") // Is Hidden _T("(?:\\s*\"(.*)\")") // Smiley file name _T("(?:[\\s,]+(\\-?\\d+))") // Icon resource id _T("(?:[\\s,]+(R|S)?\"(.*?)\")") // Trigger text _T("(?:[\\s,]+\"(.*?)\")?") // Tooltip or insert text _T("(?:[\\s,]+\"(.*?)\")?"), // Tooltip text _TPattern::MULTILINE_MATCHING); SmileyVectorType hiddenSmileys; unsigned smnum = 0; { _TMatcher *m0 = smiley->createTMatcher(tbuf); while (m0->findNextMatch()) { CMString resname = m0->getGroup(2); if (resname.Find(_T("http://")) != -1) { if (GetSmileyFile(resname, packstr)) continue; } else if (!resname.IsEmpty()) resname.Insert(0, pathstr); SmileyType *dat = new SmileyType; const int iconIndex = _ttol(m0->getGroup(3).c_str()); dat->SetHidden(m0->getStartingIndex(1) >= 0); if (m0->getStartingIndex(4) >= 0) { dat->SetRegEx(m0->getGroup(4) == _T("R")); dat->SetService(m0->getGroup(4) == _T("S")); } dat->m_TriggerText = m0->getGroup(5); if (dat->IsRegEx()) { if (m0->getStartingIndex(6) >= 0) ReplaceAllSpecials(m0->getGroup(6), dat->m_InsertText); if (m0->getStartingIndex(7) >= 0) ReplaceAllSpecials(m0->getGroup(7), dat->m_ToolText); else dat->m_ToolText = dat->m_InsertText; } else { if (m0->getStartingIndex(6) >= 0) ReplaceAllSpecials(m0->getGroup(6), dat->m_ToolText); else ReplaceAllSpecials(dat->m_TriggerText, dat->m_ToolText); } bool noerr; if (resname.IsEmpty()) { dat->SetHidden(true); dat->SetText(true); noerr = true; } else noerr = dat->LoadFromResource(resname, iconIndex); if (dat->IsHidden()) hiddenSmileys.insert(dat); else m_SmileyList.insert(dat); if (!noerr) { static const TCHAR errmsg[] = LPGENT("Smiley #%u in file %s for smiley pack %s not found."); TCHAR msgtxt[1024]; mir_sntprintf(msgtxt, TranslateTS(errmsg), smnum, resname.c_str(), modpath.c_str()); CallService(MS_NETLIB_LOG, (WPARAM)hNetlibUser, _T2A(msgtxt)); errorFound = true; } smnum++; } delete smiley; delete m0; } m_VisibleCount = m_SmileyList.getCount(); m_SmileyList.splice(hiddenSmileys); AddTriggersToSmileyLookup(); } return true; }