summaryrefslogtreecommitdiff
path: root/plugins/Import/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-05-10 19:45:22 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-05-10 19:45:30 +0300
commit289f73c0c5d58c083c02c7c5b12427ebb8147625 (patch)
tree3d76f83202a715bc575cbf4cc6dbecb4f3b625bc /plugins/Import/src
parent15750b3ac9d8c76631cc43560b1cfa34460156c1 (diff)
Import: first version of pattern batch import that works
Diffstat (limited to 'plugins/Import/src')
-rw-r--r--plugins/Import/src/import.cpp74
-rw-r--r--plugins/Import/src/mcontacts.cpp2
-rw-r--r--plugins/Import/src/miranda.cpp119
-rw-r--r--plugins/Import/src/patterns.cpp255
-rw-r--r--plugins/Import/src/resource.h9
-rw-r--r--plugins/Import/src/stdafx.h10
6 files changed, 332 insertions, 137 deletions
diff --git a/plugins/Import/src/import.cpp b/plugins/Import/src/import.cpp
index 67c0d80fe2..e57a839b56 100644
--- a/plugins/Import/src/import.cpp
+++ b/plugins/Import/src/import.cpp
@@ -407,44 +407,52 @@ static PROTOACCOUNT* FindMyAccount(const char *szProto, const char *szBaseProto,
bool ImportAccounts(OBJLIST<char> &arSkippedModules)
{
- int protoCount = myGetD(NULL, "Protocols", "ProtoCount", 0);
bool bNeedManualMerge = false;
+ if (g_pActivePattern == nullptr) {
+ int protoCount = myGetD(NULL, "Protocols", "ProtoCount", 0);
- for (int i = 0; i < protoCount; i++) {
- char szSetting[100], szProto[100];
- itoa(i, szSetting, 10);
- if (myGetS(NULL, "Protocols", szSetting, szProto))
- continue;
+ for (int i = 0; i < protoCount; i++) {
+ char szSetting[100], szProto[100];
+ itoa(i, szSetting, 10);
+ if (myGetS(NULL, "Protocols", szSetting, szProto))
+ continue;
- itoa(800 + i, szSetting, 10);
- ptrW tszName(myGetWs(NULL, "Protocols", szSetting));
- AccountMap *pNew = new AccountMap(szProto, i, tszName);
- arAccountMap.insert(pNew);
+ itoa(800 + i, szSetting, 10);
+ ptrW tszName(myGetWs(NULL, "Protocols", szSetting));
+ AccountMap* pNew = new AccountMap(szProto, i, tszName);
+ arAccountMap.insert(pNew);
- itoa(200 + i, szSetting, 10);
- pNew->iOrder = myGetD(NULL, "Protocols", szSetting, 0);
+ itoa(200 + i, szSetting, 10);
+ pNew->iOrder = myGetD(NULL, "Protocols", szSetting, 0);
- // check if it's an account-based proto or an old style proto
- char szBaseProto[100];
- if (myGetS(NULL, szProto, "AM_BaseProto", szBaseProto))
- continue;
+ // check if it's an account-based proto or an old style proto
+ char szBaseProto[100];
+ if (myGetS(NULL, szProto, "AM_BaseProto", szBaseProto))
+ continue;
- // save base proto for the future use
- pNew->szBaseProto = mir_strdup(szBaseProto);
+ // save base proto for the future use
+ pNew->szBaseProto = mir_strdup(szBaseProto);
- // try the precise match first
- PROTOACCOUNT *pa = FindMyAccount(szProto, szBaseProto, tszName, true);
- if (pa) {
- pNew->pa = pa;
- continue;
- }
+ // try the precise match first
+ PROTOACCOUNT* pa = FindMyAccount(szProto, szBaseProto, tszName, true);
+ if (pa) {
+ pNew->pa = pa;
+ continue;
+ }
- // if fail, try to found an account by its name
- if (pa = FindMyAccount(szProto, szBaseProto, tszName, false)) {
- pNew->pa = pa;
- bNeedManualMerge = true;
+ // if fail, try to found an account by its name
+ if (pa = FindMyAccount(szProto, szBaseProto, tszName, false)) {
+ pNew->pa = pa;
+ bNeedManualMerge = true;
+ }
}
}
+ else {
+ AccountMap* pNew = new AccountMap("Pattern", 0, g_pActivePattern->wszName);
+ arAccountMap.insert(pNew);
+
+ bNeedManualMerge = true;
+ }
// all accounts to be converted automatically, no need to raise a dialog
if (bNeedManualMerge)
@@ -744,7 +752,7 @@ static MCONTACT ImportContact(MCONTACT hSrc)
return 0;
}
- // virtual protocols have no accounts and cannot change modul
+ // virtual protocols have no accounts and cannot change module
szSrcModuleName = szDstModuleName = pa->szModuleName;
}
else {
@@ -773,7 +781,7 @@ static MCONTACT ImportContact(MCONTACT hSrc)
}
wchar_t *pszUniqueID = L"<Unknown>";
- DBVARIANT dbv;
+ DBVARIANT dbv = {};
if (!myGet(hSrc, cc->szProto, pszUniqueSetting, &dbv)) {
// Does the contact already exist?
MCONTACT hDst;
@@ -825,7 +833,11 @@ static MCONTACT ImportContact(MCONTACT hSrc)
return INVALID_CONTACT_ID;
}
- db_set(hDst, szDstModuleName, pszUniqueSetting, &dbv);
+ if (dbv.type == 0)
+ srcDb->GetContactSetting(hSrc, cc->szProto, "ID", &dbv);
+
+ if (dbv.type != 0)
+ db_set(hDst, szDstModuleName, pszUniqueSetting, &dbv);
CreateGroup(tszGroup, hDst);
diff --git a/plugins/Import/src/mcontacts.cpp b/plugins/Import/src/mcontacts.cpp
index 6ac718d878..e2829e41bd 100644
--- a/plugins/Import/src/mcontacts.cpp
+++ b/plugins/Import/src/mcontacts.cpp
@@ -228,7 +228,7 @@ public:
else return 1;
if (dbei->cbBlob && cbLen) {
- int copySize = min(cbLen, dbei->cbBlob-1);
+ DWORD copySize = min(DWORD(cbLen), dbei->cbBlob-1);
if (!ReadFile(m_hFile, dbei->pBlob, copySize, &dwRead, 0) || dwRead != copySize)
return 0;
diff --git a/plugins/Import/src/miranda.cpp b/plugins/Import/src/miranda.cpp
index 7864c78e9d..762bacf5c5 100644
--- a/plugins/Import/src/miranda.cpp
+++ b/plugins/Import/src/miranda.cpp
@@ -33,33 +33,30 @@ CMirandaPageDlg::CMirandaPageDlg() :
CWizardPageDlg(IDD_MIRANDADB),
m_list(this, IDC_LIST),
btnBack(this, IDC_BACK),
- btnOther(this, IDC_OTHER)
+ btnPath(this, IDC_DIRECTORY),
+ btnOther(this, IDC_OTHER),
+ m_cmbFileType(this, IDC_FILETYPE)
{
- m_list.OnSelChange = Callback(this, &CMirandaPageDlg::onSelChanged_list);
-
btnBack.OnClick = Callback(this, &CMirandaPageDlg::onClick_Back);
+ btnPath.OnClick = Callback(this, &CMirandaPageDlg::onClick_Path);
btnOther.OnClick = Callback(this, &CMirandaPageDlg::onClick_Other);
+
+ m_cmbFileType.OnChange = Callback(this, &CMirandaPageDlg::onChange_Pattern);
}
bool CMirandaPageDlg::OnInitDialog()
{
- VARSW pfd(L"%miranda_path%\\Profiles");
- VARSW pfd1(L"%miranda_path%");
- VARSW pfd2(L"%miranda_profilesdir%");
- VARSW pfn(L"%miranda_profilename%");
-
- SearchForLists(pfd2, pfn);
- SearchForLists(pfd1, nullptr);
- if (mir_wstrcmpi(pfd, pfd2))
- SearchForLists(pfd, nullptr);
-
- SendDlgItemMessage(m_hwnd, IDC_LIST, LB_SETCURSEL, 0, 0);
- SendMessage(m_hwnd, WM_COMMAND, MAKELONG(IDC_LIST, LBN_SELCHANGE), 0);
-
- wchar_t filename[MAX_PATH];
- GetDlgItemText(m_hwnd, IDC_FILENAME, filename, _countof(filename));
- if (_waccess(filename, 4))
- SendMessage(m_hwndParent, WIZM_DISABLEBUTTON, 1, 0);
+ m_cmbFileType.AddString(TranslateT("Miranda NG database"), -1);
+
+ int iType = 1;
+ for (auto& it : g_plugin.m_patterns)
+ m_cmbFileType.AddString(it->wszName, iType++);
+
+ btnPath.Hide();
+ m_list.Disable();
+ SendMessage(m_hwndParent, WIZM_DISABLEBUTTON, 1, 0);
+
+ m_cmbFileType.SetCurSel(0);
return true;
}
@@ -72,9 +69,15 @@ int CMirandaPageDlg::Resizer(UTILRESIZECONTROL *urc)
case IDC_STATICTEXT2:
return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM;
+ case IDC_STATICTEXT3:
+ return RD_ANCHORX_LEFT | RD_ANCHORY_TOP;
+
case IDC_FILENAME:
return RD_ANCHORX_WIDTH | RD_ANCHORY_BOTTOM;
+ case IDC_FILETYPE:
+ return RD_ANCHORX_WIDTH | RD_ANCHORY_TOP;
+
case IDC_LIST:
return RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT;
}
@@ -133,44 +136,60 @@ void CMirandaPageDlg::onClick_Other(CCtrlButton*)
}
}
-void CMirandaPageDlg::onSelChanged_list(CCtrlListBox*)
+void CMirandaPageDlg::onClick_Path(CCtrlButton*)
{
- int sel = m_list.GetCurSel();
- if (sel != -1) {
- SetDlgItemText(m_hwnd, IDC_FILENAME, (wchar_t*)m_list.GetItemData(sel));
- SendMessage(m_hwndParent, WIZM_ENABLEBUTTON, 1, 0);
- }
-}
+ wchar_t str[MAX_PATH];
-void CMirandaPageDlg::SearchForLists(const wchar_t *mirandaPath, const wchar_t *mirandaProf)
-{
- // find in Miranda profile subfolders
- wchar_t searchspec[MAX_PATH];
- mir_snwprintf(searchspec, L"%s\\*.*", mirandaPath);
+ BROWSEINFOW br = {};
+ br.hwndOwner = m_hwnd;
+ br.pszDisplayName = str;
+ br.lpszTitle = TranslateT("Importing whole directory");
+ br.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
- WIN32_FIND_DATA fd;
- HANDLE hFind = FindFirstFile(searchspec, &fd);
- if (hFind == INVALID_HANDLE_VALUE)
+ PIDLIST_ABSOLUTE pList = SHBrowseForFolderW(&br);
+ if (pList == nullptr)
return;
- do {
- // find all subfolders except "." and ".."
- if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || !mir_wstrcmp(fd.cFileName, L".") || !mir_wstrcmp(fd.cFileName, L".."))
- continue;
+ SHGetPathFromIDListW(pList, str);
+ CoTaskMemFree(pList);
- // skip the current profile too
- if (mirandaProf != nullptr && !mir_wstrcmpi(mirandaProf, fd.cFileName))
- continue;
+ SetDlgItemText(m_hwnd, IDC_FILENAME, str);
- wchar_t buf[MAX_PATH], profile[MAX_PATH];
- mir_snwprintf(buf, L"%s\\%s\\%s.dat", mirandaPath, fd.cFileName, fd.cFileName);
- if (_waccess(buf, 0) == 0) {
- mir_snwprintf(profile, L"%s.dat", fd.cFileName);
- m_list.AddString(profile, (LPARAM)mir_wstrdup(buf));
- }
- } while (FindNextFile(hFind, &fd));
+ // find appropriate files and list them
+ wchar_t searchspec[MAX_PATH];
+ mir_snwprintf(searchspec, L"%s\\*.%s", str, g_pActivePattern->wszExt.c_str());
+ WIN32_FIND_DATA fd;
+ HANDLE hFind = FindFirstFile(searchspec, &fd);
+ if (hFind != INVALID_HANDLE_VALUE) {
+ do {
+ // find all subfolders except "." and ".."
+ if (!mir_wstrcmp(fd.cFileName, L".") || !mir_wstrcmp(fd.cFileName, L".."))
+ continue;
+
+ m_list.AddString(fd.cFileName);
+ } while (FindNextFile(hFind, &fd));
+ FindClose(hFind);
+ SendMessage(m_hwndParent, WIZM_ENABLEBUTTON, 1, 0);
+ }
+}
- FindClose(hFind);
+void CMirandaPageDlg::onChange_Pattern(CCtrlCombo*)
+{
+ int iCur = m_cmbFileType.GetCurSel();
+ if (iCur == -1)
+ return;
+
+ // standard import for Miranda
+ int iData = m_cmbFileType.GetItemData(iCur);
+ if (iData == -1) {
+ g_pActivePattern = nullptr;
+ btnPath.Hide();
+ }
+ // custom pattern import
+ else {
+ g_pActivePattern = &g_plugin.m_patterns[iData-1];
+ btnPath.Show();
+ }
}
//=======================================================================================
diff --git a/plugins/Import/src/patterns.cpp b/plugins/Import/src/patterns.cpp
index 54afc1d5ca..7e3b239654 100644
--- a/plugins/Import/src/patterns.cpp
+++ b/plugins/Import/src/patterns.cpp
@@ -123,82 +123,155 @@ void CMPlugin::LoadPattern(const wchar_t *pwszFileName)
class CDbxPattern : public MDatabaseReadonly, public MZeroedObject
{
- HANDLE m_hFile = INVALID_HANDLE_VALUE, m_hMap = nullptr;
- uint32_t m_iFileLen;
- char* m_pFile;
- CMStringW m_buf;
+ CMStringW m_buf, m_folder;
+ MCONTACT m_hCurrContact;
std::vector<DWORD> m_events;
+ std::vector<CMStringW> m_files;
public:
- CDbxPattern()
+ CDbxPattern() :
+ m_hCurrContact(0)
{}
~CDbxPattern()
{
}
- void Load()
+ bool Load(const wchar_t *pwszFileName)
{
- // mcontacts operates with the only contact with pseudo id=1
- m_cache->AddContactToCache(1);
+ m_buf.Empty();
+ m_events.clear();
+
+ HANDLE hFile = ::CreateFileW(pwszFileName, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, 0);
+ if (hFile == INVALID_HANDLE_VALUE) {
+ Netlib_Logf(0, "failed to open file <%S> for import: %d", pwszFileName, GetLastError());
+ return false;
+ }
+
+ HANDLE hMap = ::CreateFileMappingW(hFile, nullptr, PAGE_READONLY, 0, 0, L"ImportMapfile");
+ if (hMap == nullptr) {
+ Netlib_Logf(0, "failed to mmap file <%S> for import: %d", pwszFileName, GetLastError());
+ return false;
+ }
+
+ char *pFile = (char*)::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
+ if (pFile == nullptr) {
+ Netlib_Logf(0, "failed to map view of file <%S> for import: %d", pwszFileName, GetLastError());
+ return false;
+ }
switch (g_pActivePattern->iCodePage) {
case CP_UTF8:
- m_buf = mir_utf8decodeW(m_pFile);
+ m_buf = mir_utf8decodeW(pFile);
break;
case 1200:
- m_buf = mir_wstrdup((wchar_t*)m_pFile);
+ m_buf = mir_wstrdup((wchar_t*)pFile);
break;
default:
- m_buf = mir_a2u_cp(m_pFile, g_pActivePattern->iCodePage);
+ m_buf = mir_a2u_cp(pFile, g_pActivePattern->iCodePage);
break;
}
- if (m_buf.IsEmpty())
- return;
-
- int iOffset = 0;
- while (true) {
- int offsets[99];
- int nMatch = pcre16_exec(g_pActivePattern->regMessage.pattern, g_pActivePattern->regMessage.extra, m_buf, m_buf.GetLength(), iOffset, PCRE_NEWLINE_ANYCRLF, offsets, _countof(offsets));
- if (nMatch <= 0)
- break;
-
- m_events.push_back(offsets[0]);
- iOffset = offsets[1];
+ bool bRes = false;
+ if (!m_buf.IsEmpty()) {
+ int iOffset = 0;
+ while (true) {
+ int offsets[99];
+ int nMatch = pcre16_exec(g_pActivePattern->regMessage.pattern, g_pActivePattern->regMessage.extra, m_buf, m_buf.GetLength(), iOffset, PCRE_NEWLINE_ANYCRLF, offsets, _countof(offsets));
+ if (nMatch <= 0)
+ break;
+
+ m_events.push_back(offsets[0]);
+ iOffset = offsets[1];
+ }
+ bRes = true;
}
- if (m_pFile != nullptr)
- ::UnmapViewOfFile(m_pFile);
+ if (pFile != nullptr)
+ ::UnmapViewOfFile(pFile);
- if (m_hMap != nullptr)
- ::CloseHandle(m_hMap);
+ if (hMap != nullptr)
+ ::CloseHandle(hMap);
- if (m_hFile != INVALID_HANDLE_VALUE)
- ::CloseHandle(m_hFile);
+ if (hFile != INVALID_HANDLE_VALUE)
+ ::CloseHandle(hFile);
+
+ return bRes;
}
int Open(const wchar_t *profile)
{
- m_hFile = ::CreateFileW(profile, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, 0);
- if (m_hFile == INVALID_HANDLE_VALUE) {
- Netlib_Logf(0, "failed to open file <%S> for import: %d", profile, GetLastError());
- return EGROKPRF_CANTREAD;
+ CMStringW wszBaseFolder(profile);
+
+ // create a mask for loading multiple data files for a folder
+ DWORD dwAttr = GetFileAttributesW(profile);
+ if (dwAttr & FILE_ATTRIBUTE_DIRECTORY) {
+ wszBaseFolder = profile;
+ m_folder.AppendFormat(L"%s\\*.%s", profile, g_pActivePattern->wszExt.c_str());
+ }
+ else {
+ int i = wszBaseFolder.ReverseFind('\\');
+ if (i != -1)
+ wszBaseFolder = wszBaseFolder.Left(i - 1);
+ m_folder = profile;
}
- m_iFileLen = ::GetFileSize(m_hFile, 0);
- m_hMap = ::CreateFileMappingW(m_hFile, nullptr, PAGE_READONLY, 0, 0, L"ImportMapfile");
- if (m_hMap == nullptr) {
- Netlib_Logf(0, "failed to mmap file <%S> for import: %d", profile, GetLastError());
- return EGROKPRF_CANTREAD;
+ int hContact = 1;
+ WIN32_FIND_DATA fd;
+ HANDLE hFind = FindFirstFile(m_folder, &fd);
+ if (hFind != INVALID_HANDLE_VALUE) {
+ do {
+ // find all subfolders except "." and ".."
+ if (!mir_wstrcmp(fd.cFileName, L".") || !mir_wstrcmp(fd.cFileName, L".."))
+ continue;
+
+ CMStringW wszFullName(wszBaseFolder + L"\\" + fd.cFileName);
+ m_files.push_back(wszFullName);
+
+ auto *cc = m_cache->AddContactToCache(hContact);
+ cc->szProto = "Pattern";
+
+ // we try to restore user id from the file name
+ if (g_pActivePattern->iUseFilename) {
+ int offsets[100];
+ int nMatch = pcre16_exec(g_pActivePattern->regFilename.pattern, g_pActivePattern->regFilename.extra, wszFullName, wszFullName.GetLength(), 0, 0, offsets, _countof(offsets));
+ if (nMatch > 0) {
+ const wchar_t **substrings;
+ if (pcre16_get_substring_list(wszFullName, offsets, nMatch, &substrings) >= 0) {
+ DBCONTACTWRITESETTING dbcws = {};
+ dbcws.szModule = cc->szProto;
+ dbcws.value.type = DBVT_WCHAR;
+
+ if (g_pActivePattern->iInUID && substrings[g_pActivePattern->iInUID]) {
+ dbcws.szSetting = "ID";
+ dbcws.value.pwszVal = (wchar_t*)substrings[g_pActivePattern->iInUID];
+ WriteContactSetting(hContact, &dbcws);
+ }
+
+ if (g_pActivePattern->iInNick && substrings[g_pActivePattern->iInNick]) {
+ dbcws.szSetting = "Nick";
+ dbcws.value.pwszVal = (wchar_t*)substrings[g_pActivePattern->iInNick];
+ WriteContactSetting(hContact, &dbcws);
+ }
+
+ pcre16_free_substring_list(substrings);
+ }
+ }
+ }
+ hContact++;
+ }
+ while (FindNextFile(hFind, &fd));
+
+ FindClose(hFind);
}
- m_pFile = (char*)::MapViewOfFile(m_hMap, FILE_MAP_READ, 0, 0, 0);
- if (m_pFile == nullptr) {
- Netlib_Logf(0, "failed to map view of file <%S> for import: %d", profile, GetLastError());
+ if (m_files.empty())
+ return EGROKPRF_CANTREAD;
+
+ m_hCurrContact = 1;
+ if (!Load(m_files[0]))
return EGROKPRF_CANTREAD;
- }
return EGROKPRF_NOERROR;
}
@@ -216,7 +289,7 @@ public:
STDMETHODIMP_(LONG) GetContactCount(void) override
{
- return 1;
+ return (LONG)m_files.size();
}
STDMETHODIMP_(LONG) GetEventCount(MCONTACT) override
@@ -224,6 +297,81 @@ public:
return (LONG)m_events.size();
}
+ STDMETHODIMP_(BOOL) GetContactSettingWorker(MCONTACT hContact, LPCSTR szModule, LPCSTR szSetting, DBVARIANT* dbv, int isStatic)
+ {
+ if (szSetting == nullptr || szModule == nullptr)
+ return 1;
+
+ DBCachedContact *cc = nullptr;
+ if (hContact) {
+ cc = m_cache->GetCachedContact(hContact);
+ if (cc == nullptr)
+ return 1;
+ }
+
+ size_t settingNameLen = strlen(szSetting);
+ size_t moduleNameLen = strlen(szModule);
+ char* szCachedSettingName = m_cache->GetCachedSetting(szModule, szSetting, moduleNameLen, settingNameLen);
+
+ DBVARIANT *pCachedValue = m_cache->GetCachedValuePtr(hContact, szCachedSettingName, 0);
+ if (pCachedValue != nullptr) {
+ if (pCachedValue->type == DBVT_ASCIIZ || pCachedValue->type == DBVT_UTF8) {
+ int cbOrigLen = dbv->cchVal;
+ char *cbOrigPtr = dbv->pszVal;
+ memcpy(dbv, pCachedValue, sizeof(DBVARIANT));
+ if (isStatic) {
+ int cbLen = 0;
+ if (pCachedValue->pszVal != nullptr)
+ cbLen = (int)strlen(pCachedValue->pszVal);
+
+ cbOrigLen--;
+ dbv->pszVal = cbOrigPtr;
+ if (cbLen < cbOrigLen)
+ cbOrigLen = cbLen;
+ memcpy(dbv->pszVal, pCachedValue->pszVal, cbOrigLen);
+ dbv->pszVal[cbOrigLen] = 0;
+ dbv->cchVal = cbLen;
+ }
+ else {
+ dbv->pszVal = (char*)mir_alloc(strlen(pCachedValue->pszVal) + 1);
+ strcpy(dbv->pszVal, pCachedValue->pszVal);
+ }
+ }
+ else memcpy(dbv, pCachedValue, sizeof(DBVARIANT));
+
+ return (pCachedValue->type == DBVT_DELETED) ? 1 : 0;
+ }
+
+ return 1;
+ }
+
+ STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT hContact, DBCONTACTWRITESETTING *dbcws)
+ {
+ if (dbcws == nullptr || dbcws->szSetting == nullptr || dbcws->szModule == nullptr)
+ return 1;
+
+ if (hContact) {
+ DBCachedContact* cc = m_cache->GetCachedContact(hContact);
+ if (cc == nullptr)
+ return 1;
+ }
+
+ DBCONTACTWRITESETTING dbcwWork = *dbcws;
+ if (dbcwWork.value.type == DBVT_WCHAR) {
+ T2Utf value(dbcwWork.value.pwszVal);
+ dbcwWork.value.pszVal = NEWSTR_ALLOCA(value);
+ dbcwWork.value.type = DBVT_UTF8;
+ dbcwWork.value.cchVal = (WORD)strlen(dbcwWork.value.pszVal);
+ }
+
+ char* cachedSettingName = m_cache->GetCachedSetting(dbcwWork.szModule, dbcwWork.szSetting, mir_strlen(dbcwWork.szModule), mir_strlen(dbcwWork.szSetting));
+ DBVARIANT* cachedValue = m_cache->GetCachedValuePtr(hContact, cachedSettingName, 1);
+ if (cachedValue != nullptr)
+ m_cache->SetCachedVariant(&dbcwWork.value, cachedValue);
+
+ return 0;
+ }
+
////////////////////////////////////////////////////////////////////////////////////////
static int str2int(const wchar_t* str)
@@ -300,8 +448,16 @@ public:
return 0;
}
- STDMETHODIMP_(MEVENT) FindFirstEvent(MCONTACT) override
+ STDMETHODIMP_(MEVENT) FindFirstEvent(MCONTACT hContact) override
{
+ // no system history
+ if (hContact == 0)
+ return 0;
+
+ if (hContact != m_hCurrContact)
+ if (!Load(m_files[hContact-1]))
+ return 0;
+
return m_events.size() > 0 ? 1 : 0;
}
@@ -313,8 +469,16 @@ public:
return idx + 1;
}
- STDMETHODIMP_(MEVENT) FindLastEvent(MCONTACT) override
+ STDMETHODIMP_(MEVENT) FindLastEvent(MCONTACT hContact) override
{
+ // no system history
+ if (hContact == 0)
+ return 0;
+
+ if (hContact != m_hCurrContact)
+ if (!Load(m_files[hContact - 1]))
+ return 0;
+
return m_events.size() > 0 ? (MEVENT)m_events.size() : 0;
}
@@ -343,7 +507,6 @@ static MDatabaseCommon* pattern_load(const wchar_t *profile, BOOL)
if (db->Open(profile))
return nullptr;
- db->Load();
return db.release();
}
diff --git a/plugins/Import/src/resource.h b/plugins/Import/src/resource.h
index a2f6bb7088..9a2835b7d9 100644
--- a/plugins/Import/src/resource.h
+++ b/plugins/Import/src/resource.h
@@ -6,7 +6,6 @@
#define IDD_WIZARD 101
#define IDD_OPTIONS 102
#define IDD_ACCMERGE 105
-#define IDD_IMPORTTYPE 106
#define IDD_WIZARDINTRO 107
#define IDD_FINISHED 108
#define IDD_MIRABILISDB 109
@@ -17,11 +16,12 @@
#define IDR_LIST 113
#define IDI_IMPORT 114
#define IDC_DONTLOADPLUGIN 1001
-#define IDC_MIRANDA 1002
#define IDC_OTHER 1005
#define IDC_LIST 1006
#define IDC_FILENAME 1007
#define IDC_PROGRESS 1008
+#define IDC_OTHER2 1008
+#define IDC_DIRECTORY 1008
#define IDC_STATUS 1009
#define IDC_SPLITTER 1010
#define IDC_STATICTEXT1 1011
@@ -51,7 +51,6 @@
#define IDC_FT 1040
#define IDC_OPEN_FILE 1042
#define IDC_CHECK_DUPS 1043
-#define IDC_COMBO1 1045
#define IDC_FILETYPE 1045
#define IDM_COPY 40001
#define IDC_STATIC -1
@@ -60,9 +59,9 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 117
+#define _APS_NEXT_RESOURCE_VALUE 118
#define _APS_NEXT_COMMAND_VALUE 40002
-#define _APS_NEXT_CONTROL_VALUE 1046
+#define _APS_NEXT_CONTROL_VALUE 1047
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/plugins/Import/src/stdafx.h b/plugins/Import/src/stdafx.h
index 70c795a33d..f6a116503d 100644
--- a/plugins/Import/src/stdafx.h
+++ b/plugins/Import/src/stdafx.h
@@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <windows.h>
#include <commctrl.h> // datetimepicker
+#include <ShlObj.h>
#include <malloc.h>
#include <time.h>
@@ -88,6 +89,7 @@ struct CImportPattern : public MZeroedObject
struct CMPlugin : public PLUGIN<CMPlugin>
{
private:
+ friend class CMirandaPageDlg;
friend class CContactImportDlg;
void LoadPattern(const wchar_t *pwszFileName);
@@ -160,10 +162,9 @@ public:
class CMirandaPageDlg : public CWizardPageDlg
{
- void SearchForLists(const wchar_t *mirandaPath, const wchar_t *mirandaProf);
-
- CCtrlButton btnBack, btnOther;
+ CCtrlButton btnBack, btnOther, btnPath;
CCtrlListBox m_list;
+ CCtrlCombo m_cmbFileType;
public:
CMirandaPageDlg();
@@ -174,9 +175,10 @@ public:
void OnNext() override;
void onClick_Back(CCtrlButton*);
+ void onClick_Path(CCtrlButton*);
void onClick_Other(CCtrlButton*);
- void onSelChanged_list(CCtrlListBox*);
+ void onChange_Pattern(CCtrlCombo*);
};
class CMirandaOptionsPageDlg : public CWizardPageDlg