#include "pch.hxx" #include "strconst.h" #include "mimeole.h" #include "mimeutil.h" #include #include #include "goptions.h" #include #include #include #include "ipab.h" #define NO_IMPORT_ERROR #include #include #include "storutil.h" #include "demand.h" #include "msgfldr.h" #include "store.h" class CMailImporter : public IMailImporter { private: ULONG m_cRef; public: CMailImporter(void); ~CMailImporter(void); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); ULONG STDMETHODCALLTYPE AddRef(void); ULONG STDMETHODCALLTYPE Release(void); HRESULT Initialize(HWND hwnd); STDMETHODIMP OpenFolder(DWORD_PTR dwCookie, const TCHAR *szFolder, IMPORTFOLDERTYPE type, DWORD dwFlags, IFolderImport **ppFldrImp, DWORD_PTR *pdwCookie); }; class CFolderImport : public IFolderImport { private: ULONG m_cRef; IMessageFolder *m_pFolder; STDMETHODIMP ImportMessage(MSGTYPE type, DWORD dwState, LPSTREAM pstm); public: CFolderImport(void); ~CFolderImport(void); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); ULONG STDMETHODCALLTYPE AddRef(void); ULONG STDMETHODCALLTYPE Release(void); HRESULT Initialize(IMessageFolder *pFolder); STDMETHODIMP SetMessageCount(ULONG cMsg); STDMETHODIMP ImportMessage(MSGTYPE type, DWORD dwState, LPSTREAM pstm, const TCHAR **rgszAttach, DWORD cAttach); STDMETHODIMP ImportMessage(IMSG *pimsg); }; HRESULT GetImsgFromFolder(IMessageFolder *pfldr, LPMESSAGEINFO pMsgInfo, IMSG *pimsg); CFolderImport::CFolderImport() { m_cRef = 1; m_pFolder = NULL; } CFolderImport::~CFolderImport() { SafeRelease(m_pFolder); } ULONG CFolderImport::AddRef() { m_cRef++; return(m_cRef); } ULONG CFolderImport::Release() { ULONG cRef; cRef = --m_cRef; if (cRef == 0) delete this; return(cRef); } HRESULT CFolderImport::QueryInterface(REFIID riid, LPVOID *ppv) { HRESULT hr = S_OK; if (ppv == NULL) return(E_INVALIDARG); *ppv = NULL; if (IID_IFolderImport == riid) *ppv = (IFolderImport *)this; else if (IID_IUnknown == riid) *ppv = (IFolderImport *)this; else hr = E_NOINTERFACE; if (*ppv != NULL) ((LPUNKNOWN)*ppv)->AddRef(); return(hr); } HRESULT CFolderImport::Initialize(IMessageFolder *pFolder) { Assert(pFolder != NULL); m_pFolder = pFolder; m_pFolder->AddRef(); return(S_OK); } HRESULT CFolderImport::SetMessageCount(ULONG cMsg) { return(S_OK); } HRESULT CFolderImport::ImportMessage(MSGTYPE type, DWORD dwState, LPSTREAM pstm, const TCHAR **rgszAttach, DWORD cAttach) { IMimeMessage *pMsg; HRESULT hr; DWORD iAttach, dwPri; PROPVARIANT rVariant; DWORD dwMsgFlags; Assert(pstm != NULL); Assert(m_pFolder != NULL); if (rgszAttach == NULL) { Assert(cAttach == 0); return(ImportMessage(type, dwState, pstm)); } Assert(cAttach > 0); hr = HrRewindStream(pstm); if (FAILED(hr)) return(hr); hr = HrCreateMessage(&pMsg); if (SUCCEEDED(hr)) { hr = pMsg->Load(pstm); if (SUCCEEDED(hr)) { for (iAttach = 0; iAttach < cAttach; iAttach++) { Assert(rgszAttach[iAttach] != NULL); pMsg->AttachFile(rgszAttach[iAttach], NULL, NULL); } dwPri = dwState & MSG_PRI_MASK; if (dwPri != 0) { if (dwPri == MSG_PRI_HIGH) rVariant.ulVal = IMSG_PRI_HIGH; else if (dwPri == MSG_PRI_LOW) rVariant.ulVal = IMSG_PRI_LOW; else rVariant.ulVal = IMSG_PRI_NORMAL; rVariant.vt = VT_UI4; pMsg->SetProp(PIDTOSTR(PID_ATT_PRIORITY), 0, &rVariant); } // Compute the Default arf flags dwMsgFlags = 0; // Is the Message Read ? if (FALSE == ISFLAGSET(dwState, MSG_STATE_UNREAD)) FLAGSET(dwMsgFlags, ARF_READ); // Unsent if (ISFLAGSET(dwState, MSG_STATE_UNSENT)) FLAGSET(dwMsgFlags, ARF_UNSENT); // Submitted // if (ISFLAGSET(dwState, MSG_STATE_SUBMITTED)) // FLAGSET(dwMsgFlags, ARF_SUBMITTED); if (type == MSG_TYPE_NEWS) FLAGSET(dwMsgFlags, ARF_NEWSMSG); // Insert the message hr = m_pFolder->SaveMessage(NULL, SAVE_MESSAGE_GENID, dwMsgFlags, 0, pMsg, NOSTORECALLBACK); Assert(hr != E_PENDING); } pMsg->Release(); } return(hr); } HRESULT CFolderImport::ImportMessage(MSGTYPE type, DWORD dwState, LPSTREAM pstm) { WORD pri; IMimeMessage *pMsg; HRESULT hr; DWORD dwPri; PROPVARIANT rVariant; DWORD dwMsgFlags; Assert(pstm != NULL); Assert(m_pFolder != NULL); hr = HrRewindStream(pstm); if (FAILED(hr)) return(hr); hr = HrCreateMessage(&pMsg); if (SUCCEEDED(hr)) { if (SUCCEEDED(hr = pMsg->Load(pstm))) { dwPri = dwState & MSG_PRI_MASK; if (dwPri != 0) { if (dwPri == MSG_PRI_HIGH) rVariant.ulVal = IMSG_PRI_HIGH; else if (dwPri == MSG_PRI_LOW) rVariant.ulVal = IMSG_PRI_LOW; else rVariant.ulVal = IMSG_PRI_NORMAL; rVariant.vt = VT_UI4; pMsg->SetProp(PIDTOSTR(PID_ATT_PRIORITY), 0, &rVariant); } // Compute the Default arf flags dwMsgFlags = 0; // Is the Message Read ? if (FALSE == ISFLAGSET(dwState, MSG_STATE_UNREAD)) FLAGSET(dwMsgFlags, ARF_READ); // Unsent if (ISFLAGSET(dwState, MSG_STATE_UNSENT)) FLAGSET(dwMsgFlags, ARF_UNSENT); // Submitted // if (ISFLAGSET(dwState, MSG_STATE_SUBMITTED)) // FLAGSET(dwMsgFlags, ARF_SUBMITTED); if (type == MSG_TYPE_NEWS) FLAGSET(dwMsgFlags, ARF_NEWSMSG); // Insert the message hr = m_pFolder->SaveMessage(NULL, SAVE_MESSAGE_GENID, dwMsgFlags, 0, pMsg, NOSTORECALLBACK); Assert(hr != E_PENDING); } pMsg->Release(); } return(hr); } HRESULT CFolderImport::ImportMessage(IMSG *pimsg) { HRESULT hr; MESSAGEID id; MESSAGEINFO info; LPMIMEMESSAGE pMsg; Assert(pimsg != NULL); hr = HrImsgToMailMsg(pimsg, &pMsg, NULL); if (!FAILED(hr)) { hr = m_pFolder->SaveMessage(&id, SAVE_MESSAGE_GENID, ISFLAGSET(pimsg->uFlags, MSGFLAG_READ) ? ARF_READ : 0, 0, pMsg, NOSTORECALLBACK); Assert(hr != E_PENDING); if (SUCCEEDED(hr)) { // handle receive time ZeroMemory(&info, sizeof(MESSAGEINFO)); info.idMessage = id; if (DB_S_FOUND == m_pFolder->FindRecord(IINDEX_PRIMARY, COLUMNS_ALL, &info, NULL)) { Assert(pimsg->ftReceive.dwLowDateTime != 0 || pimsg->ftReceive.dwHighDateTime != 0); CopyMemory(&info.ftReceived, &pimsg->ftReceive, sizeof(FILETIME)); m_pFolder->UpdateRecord(&info); m_pFolder->FreeRecord(&info); } } pMsg->Release(); } return(hr); } CMailImporter::CMailImporter() { m_cRef = 1; } CMailImporter::~CMailImporter() { } HRESULT CMailImporter::QueryInterface(REFIID riid, LPVOID *ppv) { HRESULT hr = S_OK; if (ppv == NULL) return(E_INVALIDARG); *ppv = NULL; if (IID_IMailImporter == riid) *ppv = (IMailImporter *)this; else if (IID_IUnknown == riid) *ppv = (IMailImporter *)this; else hr = E_NOINTERFACE; if (*ppv != NULL) ((LPUNKNOWN)*ppv)->AddRef(); return(hr); } ULONG CMailImporter::AddRef() { m_cRef++; return(m_cRef); } ULONG CMailImporter::Release() { ULONG cRef; cRef = --m_cRef; if (cRef == 0) delete this; return(cRef); } HRESULT CMailImporter::Initialize(HWND hwnd) { return S_OK; } HRESULT CMailImporter::OpenFolder(DWORD_PTR dwCookie, const TCHAR *szFolder, IMPORTFOLDERTYPE type, DWORD dwFlags, IFolderImport **ppFldrImp, DWORD_PTR *pdwCookie) { HRESULT hr; FOLDERID idFolder, idFolderNew; CFolderImport *pFldrImp; IMessageFolder *pFolder; TCHAR sz[CCHMAX_FOLDER_NAME + 1]; Assert(szFolder != NULL); Assert(ppFldrImp != NULL); Assert(dwFlags == 0); *ppFldrImp = NULL; if (dwCookie == COOKIE_ROOT) idFolder = FOLDERID_LOCAL_STORE; else idFolder = (FOLDERID)dwCookie; idFolderNew = FOLDERID_INVALID; if (type != FOLDER_TYPE_NORMAL) { LoadString(g_hLocRes, idsInbox + (type - FOLDER_TYPE_INBOX), sz, ARRAYSIZE(sz)); szFolder = sz; } if (FAILED(GetFolderIdFromName(g_pStore, szFolder, idFolder, &idFolderNew))) { FOLDERINFO Folder={0}; Folder.idParent = idFolder; Folder.tySpecial = FOLDER_NOTSPECIAL; Folder.pszName = (LPSTR)szFolder; Folder.dwFlags = FOLDER_SUBSCRIBED; hr = g_pStore->CreateFolder(NOFLAGS, &Folder, NOSTORECALLBACK); Assert(hr != E_PENDING); if (FAILED(hr)) return(hr); idFolderNew = Folder.idFolder; } hr = g_pStore->OpenFolder(idFolderNew, NULL, NOFLAGS, &pFolder); if (FAILED(hr)) return(hr); pFldrImp = new CFolderImport; if (pFldrImp == NULL) { hr = E_OUTOFMEMORY; } else { hr = pFldrImp->Initialize(pFolder); if (FAILED(hr)) { pFldrImp->Release(); pFldrImp = NULL; } } pFolder->Release(); *ppFldrImp = pFldrImp; *pdwCookie = (DWORD_PTR)idFolderNew; return(S_OK); } void DoImport(HWND hwnd) { HRESULT hr; HMODULE hlibImport; PFNPERFORMIMPORT lpfnPerformImport; CMailImporter *pImp; hr = hrImportLoad; hlibImport = LoadLibrary(c_szImnimpDll); if (hlibImport != NULL) { lpfnPerformImport = (PFNPERFORMIMPORT)GetProcAddress(hlibImport, achPerformImport); if (lpfnPerformImport != NULL) { pImp = new CMailImporter; if (pImp == NULL) { hr = E_OUTOFMEMORY; } else { hr = pImp->Initialize(hwnd); if (SUCCEEDED(hr)) lpfnPerformImport(hwnd, pImp, 0); pImp->Release(); } } FreeLibrary(hlibImport); } if (FAILED(hr)) { AthErrorMessageW(hwnd, MAKEINTRESOURCEW(idsAthenaMail), MAKEINTRESOURCEW(idsErrImport), hr); } } // EXPORT STUFF IMPFOLDERNODE *InsertFolderNode(IMPFOLDERNODE *plist, IMPFOLDERNODE *pnode) { BOOL fNodeNormal, fCurrNormal; IMPFOLDERNODE *pprev, *pcurr; Assert(pnode != NULL); pnode->pnext = NULL; if (plist == NULL) return(pnode); pprev = NULL; pcurr = plist; while (pcurr != NULL) { fNodeNormal = pnode->type == FOLDER_TYPE_NORMAL; fCurrNormal = pcurr->type == FOLDER_TYPE_NORMAL; if (!fNodeNormal && fCurrNormal) break; if (fNodeNormal == fCurrNormal && lstrcmpi(pnode->szName, pcurr->szName) <= 0) break; pprev = pcurr; pcurr = pcurr->pnext; } if (pcurr == NULL) { // insert at end of list Assert(pprev != NULL); pprev->pnext = pnode; } else if (pprev == NULL) { // insert at beginning of list pnode->pnext = plist; plist = pnode; } else { pprev->pnext = pnode; pnode->pnext = pcurr; } return(plist); } HRESULT ExpGetSubFolders(IMPFOLDERNODE *pparent, FOLDERID idParent, IMPFOLDERNODE **pplist) { HRESULT hr; TCHAR *sz; IMPFOLDERNODE *pnode, *plist; HANDLE_16 hnd; FOLDERINFO Folder={0}; IEnumerateFolders *pEnum; Assert(pplist != NULL); Assert(idParent != FOLDERID_INVALID); *pplist = NULL; plist = NULL; hr = g_pStore->EnumChildren(idParent, FALSE, &pEnum); if (SUCCEEDED(hr)) { while (S_OK == pEnum->Next(1, &Folder, NULL)) { if (!MemAlloc((void **)&pnode, sizeof(IMPFOLDERNODE) + CCHMAX_FOLDER_NAME * sizeof(TCHAR))) { hr = E_OUTOFMEMORY; break; } ZeroMemory(pnode, sizeof(IMPFOLDERNODE)); sz = (TCHAR *)((BYTE *)pnode + sizeof(IMPFOLDERNODE)); pnode->pparent = pparent; pnode->depth = (pparent != NULL) ? (pparent->depth + 1) : 0; pnode->szName = sz; StrCpyN(sz, Folder.pszName, CCHMAX_FOLDER_NAME); pnode->lparam = (LPARAM)Folder.idFolder; pnode->cMsg = Folder.cMessages; if (Folder.tySpecial == FOLDER_INBOX) pnode->type = FOLDER_TYPE_INBOX; else if (Folder.tySpecial == FOLDER_OUTBOX) pnode->type = FOLDER_TYPE_OUTBOX; else if (Folder.tySpecial == FOLDER_SENT) pnode->type = FOLDER_TYPE_SENT; else if (Folder.tySpecial == FOLDER_DELETED) pnode->type = FOLDER_TYPE_DELETED; else if (Folder.tySpecial == FOLDER_DRAFT) pnode->type = FOLDER_TYPE_DRAFT; plist = InsertFolderNode(plist, pnode); hr = ExpGetSubFolders(pnode, Folder.idFolder, &pnode->pchild); if (FAILED(hr)) break; g_pStore->FreeRecord(&Folder); } pEnum->Release(); } *pplist = plist; g_pStore->FreeRecord(&Folder); return(hr); } HRESULT WINAPI_16 ExpGetFolderList(IMPFOLDERNODE **pplist) { IMPFOLDERNODE *plist; HRESULT hr; if (pplist == NULL) return(E_INVALIDARG); plist = NULL; hr = ExpGetSubFolders(NULL, FOLDERID_LOCAL_STORE, &plist); if (FAILED(hr)) { ExpFreeFolderList(plist); plist = NULL; } *pplist = plist; return(hr); } void WINAPI_16 ExpFreeFolderList(IMPFOLDERNODE *plist) { IMPFOLDERNODE *pnode; while (plist != NULL) { if (plist->pchild != NULL) ExpFreeFolderList(plist->pchild); pnode = plist; plist = plist->pnext; MemFree(pnode); } } void DoExport(HWND hwnd) { HRESULT hr; HMODULE hlibImport; PFNEXPMSGS lpfnExportMessages; hr = hrImportLoad; hlibImport = LoadLibrary(c_szImnimpDll); if (hlibImport != NULL) { lpfnExportMessages = (PFNEXPMSGS)GetProcAddress(hlibImport, MAKEINTRESOURCE(MAKELONG(3, 0))); if (lpfnExportMessages != NULL) { lpfnExportMessages(hwnd); hr = S_OK; } FreeLibrary(hlibImport); } if (FAILED(hr)) { AthErrorMessageW(hwnd, MAKEINTRESOURCEW(idsAthenaMail), MAKEINTRESOURCEW(idsErrExport), hr); } } typedef struct tagEXPENUM { IMessageFolder *pFolder; HROWSET hRowset; } EXPENUM; HRESULT WINAPI_16 ExpGetFirstImsg(HANDLE idFolder, IMSG *pimsg, HANDLE_16 *phnd) { EXPENUM *penum; HRESULT hr; MESSAGEINFO MsgInfo; Assert(pimsg != NULL); Assert(phnd != NULL); *phnd = NULL; hr = E_FAIL; penum = NULL; if (!MemAlloc((void **)&penum, sizeof(EXPENUM))) { hr = E_OUTOFMEMORY; } else { ZeroMemory(penum, sizeof(EXPENUM)); hr = g_pStore->OpenFolder((FOLDERID)idFolder, NULL, NOFLAGS, &penum->pFolder); if (!FAILED(hr)) { hr = penum->pFolder->CreateRowset(IINDEX_PRIMARY, NOFLAGS, &penum->hRowset); if (!FAILED(hr)) { hr = penum->pFolder->QueryRowset(penum->hRowset, 1, (LPVOID *)&MsgInfo, NULL); if (!FAILED(hr)) { if (S_OK == hr) { hr = GetImsgFromFolder(penum->pFolder, &MsgInfo, pimsg); penum->pFolder->FreeRecord(&MsgInfo); } else Assert(S_FALSE == hr); } } } } if (hr != S_OK) { ExpGetImsgClose((HANDLE_16)penum); penum = NULL; } *phnd = (HANDLE_16)penum; return(hr); } HRESULT WINAPI_16 ExpGetNextImsg(IMSG *pimsg, HANDLE_16 hnd) { HRESULT hr; EXPENUM *pee; MESSAGEINFO MsgInfo; Assert(pimsg != NULL); Assert(hnd != NULL); pee = (EXPENUM *)hnd; hr = pee->pFolder->QueryRowset(pee->hRowset, 1, (LPVOID *)&MsgInfo, NULL); if (hr == S_OK) { hr = GetImsgFromFolder(pee->pFolder, &MsgInfo, pimsg); pee->pFolder->FreeRecord(&MsgInfo); } return(hr); } void WINAPI_16 ExpGetImsgClose(HANDLE_16 hnd) { EXPENUM *pee; pee = (EXPENUM *)hnd; if (pee != NULL) { if (pee->pFolder != NULL) { pee->pFolder->CloseRowset(&pee->hRowset); pee->pFolder->Release(); } MemFree(pee); } } HRESULT GetImsgFromFolder(IMessageFolder *pfldr, LPMESSAGEINFO pMsgInfo, IMSG *pimsg) { LPMIMEMESSAGE pMsg; HRESULT hr = E_OUTOFMEMORY; // for import/export we want the secure message, so pass TRUE hr = pfldr->OpenMessage(pMsgInfo->idMessage, OPEN_MESSAGE_SECURE, &pMsg, NOSTORECALLBACK); if (SUCCEEDED(hr)) { hr = HrMailMsgToImsg(pMsg, pMsgInfo, pimsg); pMsg->Release(); } return(hr); } void DoMigration(HWND hwnd) { HMODULE hlibImport; PFNPERFORMMIGRATION lpfnPerformMigration; CMailImporter *pImp; if (!!DwGetOption(OPT_MIGRATION_PERFORMED)) return; hlibImport = LoadLibrary(c_szImnimpDll); if (hlibImport != NULL) { lpfnPerformMigration = (PFNPERFORMMIGRATION)GetProcAddress(hlibImport, achPerformMigration); if (lpfnPerformMigration != NULL) { pImp = new CMailImporter; if (pImp != NULL) { if (SUCCEEDED(pImp->Initialize(hwnd)) && SUCCEEDED(lpfnPerformMigration(hwnd, pImp, 0))) { SetDwOption(OPT_MIGRATION_PERFORMED, TRUE, NULL, 0); } pImp->Release(); } } FreeLibrary(hlibImport); } } HRESULT SimpleImportMailFolders( IMailImporter *pMailImporter, IMailImport *pMailImport, DWORD_PTR dwSourceCookie, DWORD_PTR dwParentDestCookie) { HRESULT hr = S_OK; DWORD_PTR cookie; IMPORTFOLDER folder; IFolderImport *pFolderImport = NULL; IEnumFOLDERS *pFolderEnum = NULL; // Enumerate source folders IF_FAILEXIT(hr = pMailImport->EnumerateFolders(dwSourceCookie, &pFolderEnum)); do { // Get next source folder hr = pFolderEnum->Next(&folder); if (hr == S_OK) { // Open the destination folder by this name in this hierarchy position hr = pMailImporter->OpenFolder(dwParentDestCookie, folder.szName, FOLDER_TYPE_NORMAL, 0, &pFolderImport, &cookie); if (!FAILED(hr)) { // Import the enumerated source folder into the opened destination folder pMailImport->ImportFolder(folder.dwCookie, pFolderImport); // Close the destination folder SafeRelease(pFolderImport); if (folder.fSubFolders > 0) { // Recursively import subfolders SimpleImportMailFolders(pMailImporter, pMailImport, folder.dwCookie, cookie); } } } } while (hr == S_OK); exit: SafeRelease(pFolderImport); SafeRelease(pFolderEnum); return hr; } HRESULT SimpleImportNewsList(CMessageStore *pSrcStore) { HRESULT hr = S_OK; IEnumerateFolders *pEnum = NULL; FOLDERINFO info; IF_FAILEXIT(hr = pSrcStore->EnumChildren(FOLDERID_ROOT, TRUE, &pEnum)); while (S_OK == pEnum->Next(1, &info, NULL)) { // info.pszName is the server/account name // info.pszAccountId is the source's account ID // info.idFolder is this account's folder ID // info.dwFlags contains FOLDER_HASCHILDREN // info.tyFolder specifies FOLDER_NEWS if ((info.tyFolder == FOLDER_NEWS) && (info.dwFlags & FOLDER_HASCHILDREN)) { IImnAccount *pAccount = NULL; // Match this account to the destination hr = g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, info.pszName, &pAccount); if ((hr == S_OK) && (pAccount != NULL)) { TCHAR szID[CCHMAX_ACCOUNT_NAME]; hr = pAccount->GetPropSz(AP_ACCOUNT_ID, szID, ARRAYSIZE(szID)); if (hr == S_OK) { IEnumerateFolders *pEnumDest = NULL; IEnumerateFolders *pEnumChild = NULL; FOLDERID destFolderID = 0; // Lookup destination folder id for this account name hr = g_pStore->EnumChildren(FOLDERID_ROOT, TRUE, &pEnumDest); if ((hr == S_OK) && (pEnumDest != NULL)) { FOLDERINFO infoDest; while (S_OK == pEnumDest->Next(1, &infoDest, NULL)) { if ((destFolderID == 0) && (_tcscmp(info.pszName, infoDest.pszName) == 0)) { destFolderID = infoDest.idFolder; } g_pStore->FreeRecord(&infoDest); } } SafeRelease(pEnumDest); // Read in source newsgroups hr = pSrcStore->EnumChildren(info.idFolder, TRUE, &pEnumChild); if ((hr == S_OK) && (pEnumChild != NULL)) { FOLDERINFO infoChild; // Add folders to destination account while(S_OK == pEnumChild->Next(1, &infoChild, NULL)) { LPSTR oldID; // infoChild.idParent needs to be the dest server folder ID oldID = infoChild.pszAccountId; infoChild.pszAccountId = szID; infoChild.idParent = destFolderID; hr = g_pStore->CreateFolder(CREATE_FOLDER_LOCALONLY, &infoChild, NOSTORECALLBACK); if (SUCCEEDED(hr)) { hr = g_pStore->SubscribeToFolder(infoChild.idFolder, TRUE, NULL); } infoChild.pszAccountId = oldID; pSrcStore->FreeRecord(&infoChild); } } SafeRelease(pEnumChild); } } SafeRelease(pAccount); } pSrcStore->FreeRecord(&info); } exit: SafeRelease(pEnum); return hr; } HRESULT ImportMailStoreToGUID(IMailImport *pMailImport, GUID *pDestUUID, LPCSTR pszDestStoreDir) { HRESULT hr = S_OK; CMailImporter *pNew=NULL; pNew = new CMailImporter; IF_NULLEXIT(pNew); // Sometimes during the SimpleStoreInit, Wab is initialized as well. // Since it is never terminated, some registry key will remain opened. // The consumer of this function will not be able to unload a mapped user // hive because of this. To fix this problem, we added the Wab init here // and an corresponding Wab done later on. HrInitWab (TRUE); IF_FAILEXIT(SimpleStoreInit(pDestUUID, pszDestStoreDir)); IF_FAILEXIT(SimpleImportMailFolders(pNew, pMailImport, COOKIE_ROOT, COOKIE_ROOT)); exit: SimpleStoreRelease(); HrInitWab (FALSE); SafeRelease(pNew); return hr; } HRESULT ImportNewsListToGUID(LPCSTR pszSrcPath, GUID *pDestUUID, LPCSTR pszDestStoreDir) { HRESULT hr = S_OK; CMessageStore *pSrcStore=NULL; pSrcStore = new CMessageStore(FALSE); IF_NULLEXIT(pSrcStore); IF_FAILEXIT(pSrcStore->Initialize(pszSrcPath)); // Sometimes during the SimpleStoreInit, Wab is initialized as well. // Since it is never terminated, some registry key will remain opened. // The consumer of this function will not be able to unload a mapped user // hive because of this. To fix this problem, we added the Wab init here // and an corresponding Wab done later on. HrInitWab (TRUE); IF_FAILEXIT(SimpleStoreInit(pDestUUID, pszDestStoreDir)); IF_FAILEXIT(SimpleImportNewsList(pSrcStore)); exit: SimpleStoreRelease(); HrInitWab (FALSE); SafeRelease(pSrcStore); return hr; }