#include "pch.hxx" #include "strconst.h" #include "error.h" #include "acctutil.h" #include "inetcfg.h" #include #include "impapi.h" #include #include #include "shlwapip.h" #include "regutil.h" #include #include "instance.h" #include #include #include "demand.h" ASSERTDATA void HandleIncompleteAccts(HWND hwnd, BOOL fMail); DWORD g_dwIcwFlags = 0; //Cleared when switching identities static const TCHAR c_szSetShellNext[] = TEXT("SetShellNext"); HRESULT GetDefaultNameEmail(BOOL fMail, LPSTR pszName, int cchName, LPSTR pszEmail, int cchEmail) { HRESULT hr; IImnAccount *pAcct; Assert(pszName != NULL); Assert(pszEmail != NULL); pAcct = NULL; hr = g_pAcctMan->GetDefaultAccount(fMail ? ACCT_MAIL : ACCT_NEWS, &pAcct); if (FAILED(hr)) { Assert(pAcct == NULL); fMail = !fMail; hr = g_pAcctMan->GetDefaultAccount(fMail ? ACCT_MAIL : ACCT_NEWS, &pAcct); if (FAILED(hr)) return(E_FAIL); } Assert(pAcct != NULL); *pszName = 0; *pszEmail = 0; pAcct->GetPropSz(fMail ? AP_SMTP_DISPLAY_NAME : AP_NNTP_DISPLAY_NAME, pszName, cchName); pAcct->GetPropSz(fMail ? AP_SMTP_EMAIL_ADDRESS : AP_NNTP_EMAIL_ADDRESS, pszEmail, cchEmail); pAcct->Release(); return(S_OK); } HRESULT NeedToRunICW(LPCSTR pszCmdLine) { char *sz; HINSTANCE hlib; HRESULT hr; LONG lRes; HKEY hkey; BOOL fRunICW; PFNCHECKCONNECTIONWIZARD pfnWiz; PFNSETSHELLNEXT pfnSet; DWORD dw, cb, dwType; Assert(pszCmdLine != NULL); hr = S_FALSE; g_dwIcwFlags = 0; //re-initialize this in case the user is switching fRunICW = TRUE; cb = sizeof(DWORD); if (ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, ICW_REGPATHSETTINGS, ICW_REGKEYCOMPLETED, &dwType, (LPBYTE)&dw, &cb)) fRunICW = (dw == 0); if (fRunICW) { if (MemAlloc((void **)&sz, MAX_PATH)) { hlib = LoadLibrary(c_szInetcfgDll); if (hlib != NULL) { pfnWiz = (PFNCHECKCONNECTIONWIZARD)GetProcAddress(hlib, c_szCheckConnWiz); pfnSet = (PFNSETSHELLNEXT)GetProcAddress(hlib, c_szSetShellNext); if (pfnWiz != NULL && pfnSet != NULL) { if (GetExePath(c_szMainExe, &sz[1], MAX_PATH - 1, FALSE)) { sz[0] = '"'; cb = lstrlen(sz); sz[cb] = '"'; cb++; sz[cb] = 0; // in case we don't append the arg dw = lstrlen(pszCmdLine); if (dw > 0 && (dw + cb + 3) <= MAX_PATH) // room for a space (between exe and arg), escape backslash, and terminating NULL { sz[cb] = ' '; cb++; if (*pszCmdLine == '/') { sz[cb] = '/'; cb++; } StrCpyN(&sz[cb], pszCmdLine, (MAX_PATH - cb)); } dwType = ICW_LAUNCHFULL | ICW_LAUNCHMANUAL; if (ERROR_SUCCESS == pfnSet(sz)) dwType |= ICW_USE_SHELLNEXT; if (ERROR_SUCCESS == pfnWiz(dwType, &dw)) { if (!!(dw & (ICW_LAUNCHEDFULL | ICW_LAUNCHEDMANUAL))) hr = S_OK; else hr = S_FALSE; } } } FreeLibrary(hlib); } MemFree(sz); } } return(hr); } void SetStartFolderType(FOLDERTYPE fType) { if (fType == FOLDER_LOCAL || fType == FOLDER_IMAP || fType == FOLDER_HTTPMAIL) g_dwIcwFlags |= ICW_MAIL_START; else if (fType == FOLDER_NEWS) g_dwIcwFlags |= ICW_NEWS_START; else { Assert(fType == FOLDER_ROOTNODE); } } BOOL FMailWizardNeeded(VOID) { // Locals ULONG cAccts; // We better have been initialized Assert(g_pAcctMan != NULL); // No SMTP, POP3 or IMAP servers ? if (!g_pAcctMan || FAILED(g_pAcctMan->GetAccountCount(ACCT_MAIL, &cAccts))) cAccts = 0; // No mail servers configured return(cAccts == 0); } // fForce defaults to FALSE, fShowUI defaults to TRUE HRESULT ProcessICW(HWND hwnd, FOLDERTYPE fType, BOOL fForce, BOOL fShowUI) { HRESULT hr; DWORD dwProp; FOLDERID id; BOOL fMail, fBrowse; DWORD cNewsServers; TCHAR sz[CCHMAX_DISPLAY_NAME], szT[CCHMAX_ACCOUNT_NAME]; IImnAccount *pAcct; if (fType == FOLDER_ROOTNODE) { // we're at the root if (!!(g_dwIcwFlags & ICW_MAIL_START)) { // if we were started up with a mail arg, then we'll behave // as if we're in a mail folder fType = FOLDER_LOCAL; } else if (!!(g_dwIcwFlags & ICW_NEWS_START)) { // started with a news arg, so we'll behave as if // we're in a news folder fType = FOLDER_NEWS; } else { // just started at the root, let's assume mail fType = FOLDER_LOCAL; } } fMail = (fType != FOLDER_NEWS) && ((g_dwAthenaMode & MODE_OUTLOOKNEWS) != MODE_OUTLOOKNEWS); if (fMail) { if (0 == (g_dwIcwFlags & ICW_MAIL_DEF)) { if (!(g_dwAthenaMode & MODE_NEWSONLY)) { if (fShowUI) DoDefaultClientCheck(hwnd, DEFAULT_MAIL); } g_dwIcwFlags |= ICW_MAIL_DEF; } // if the wizard has already attempted to be run for mail // or it isn't needed, then we're done if (((!fForce && DwGetOption(OPT_CHECKEDMAILACCOUNTS)) || !FMailWizardNeeded())) { if (fShowUI) { DoMigration(hwnd); SetDwOption(OPT_CHECKEDMAILACCOUNTS, 1, NULL, 0); } return(S_OK); } } else { if (0 == (g_dwIcwFlags & ICW_NEWS_DEF)) { if ((g_dwAthenaMode & MODE_OUTLOOKNEWS) == MODE_OUTLOOKNEWS) DoDefaultClientCheck(hwnd, DEFAULT_NEWS | DEFAULT_OUTNEWS); else DoDefaultClientCheck(hwnd, DEFAULT_NEWS); g_dwIcwFlags |= ICW_NEWS_DEF; } // if the wizard has already attempted to be run for news // or it isn't needed, then we're done g_pAcctMan->GetAccountCount(ACCT_NEWS, &cNewsServers); if (cNewsServers || (!fForce && DwGetOption(OPT_CHECKEDNEWSACCOUNTS))) { SetDwOption(OPT_CHECKEDNEWSACCOUNTS, 1, NULL, 0); return(S_OK); } } Assert(g_pAcctMan != NULL); // We are missing information and need to bring up the ICW, // but only do so if we are allowed to show UI (some SMAPI codepaths prevent this) if (!fShowUI || !g_pAcctMan) { hr = E_FAIL; goto exit; } fBrowse = FALSE; id = FOLDERID_INVALID; hr = g_pAcctMan->CreateAccountObject(fMail ? ACCT_MAIL : ACCT_NEWS, &pAcct); if (SUCCEEDED(hr)) { hr = GetDefaultNameEmail(fMail, sz, ARRAYSIZE(sz), szT, ARRAYSIZE(szT)); if (SUCCEEDED(hr)) { if (*sz != 0) pAcct->SetPropSz(fMail ? AP_SMTP_DISPLAY_NAME : AP_NNTP_DISPLAY_NAME, sz); if (*szT != 0) pAcct->SetPropSz(fMail ? AP_SMTP_EMAIL_ADDRESS : AP_NNTP_EMAIL_ADDRESS, szT); } hr = pAcct->DoWizard(hwnd, ACCT_WIZ_MIGRATE | ACCT_WIZ_INTERNETCONNECTION | ACCT_WIZ_HTTPMAIL | ACCT_WIZ_OE); // Test g_pBrowser as no need to browse if got here via startup code if (g_pBrowser && hr == S_OK && SUCCEEDED(pAcct->GetServerTypes(&dwProp)) && 0 == (dwProp & SRV_POP3) && SUCCEEDED(pAcct->GetPropSz(AP_ACCOUNT_ID, szT, ARRAYSIZE(szT))) && SUCCEEDED(g_pStore->FindServerId(szT, &id))) { fBrowse = TRUE; } pAcct->Release(); } if (fMail) { SetDwOption(OPT_CHECKEDMAILACCOUNTS, 1, NULL, 0); DoMigration(hwnd); } else { SetDwOption(OPT_CHECKEDNEWSACCOUNTS, 1, NULL, 0); } if (fBrowse) { Assert(id != FOLDERID_INVALID); g_pBrowser->BrowseObject(id, 0); } exit: return(hr); } void ProcessIncompleteAccts(HWND hwnd) { if (0 == (g_dwIcwFlags & ICW_INCOMPLETE)) { HandleIncompleteAccts(hwnd, TRUE); HandleIncompleteAccts(hwnd, FALSE); g_dwIcwFlags |= ICW_INCOMPLETE; } } void HandleIncompleteAccts(HWND hwnd, BOOL fMail) { HRESULT hr; char sz[CCHMAX_ACCOUNT_NAME], szT[CCHMAX_ACCOUNT_NAME], szCurr[CCHMAX_ACCOUNT_NAME]; IImnAccount *pAcct; Assert(g_pAcctMan != NULL); hr = g_pAcctMan->GetIncompleteAccount(fMail ? ACCT_MAIL : ACCT_NEWS, sz, ARRAYSIZE(sz)); if (hr == S_OK) { if (SUCCEEDED(g_pAcctMan->FindAccount(AP_ACCOUNT_ID, sz, &pAcct))) { hr = GetDefaultNameEmail(fMail, sz, ARRAYSIZE(sz), szT, ARRAYSIZE(szT)); if (SUCCEEDED(hr)) { hr = pAcct->GetPropSz(fMail ? AP_SMTP_DISPLAY_NAME : AP_NNTP_DISPLAY_NAME, szCurr, ARRAYSIZE(szCurr)); if (FAILED(hr) && *sz != 0) pAcct->SetPropSz(fMail ? AP_SMTP_DISPLAY_NAME : AP_NNTP_DISPLAY_NAME, sz); hr = pAcct->GetPropSz(fMail ? AP_SMTP_EMAIL_ADDRESS : AP_NNTP_EMAIL_ADDRESS, szCurr, ARRAYSIZE(szCurr)); if (FAILED(hr) && *szT != 0) pAcct->SetPropSz(fMail ? AP_SMTP_EMAIL_ADDRESS : AP_NNTP_EMAIL_ADDRESS, szT); } pAcct->DoWizard(hwnd, ACCT_WIZ_INTERNETCONNECTION | ACCT_WIZ_HTTPMAIL | ACCT_WIZ_OE); pAcct->Release(); } g_pAcctMan->SetIncompleteAccount(fMail ? ACCT_MAIL : ACCT_NEWS, NULL); } } void DoAcctImport(HWND hwnd, BOOL fMail) { IImnAccount *pAcct; HRESULT hr; DWORD dwFlags = 0; hr = g_pAcctMan->CreateAccountObject(fMail ? ACCT_MAIL : ACCT_NEWS, &pAcct); if (SUCCEEDED(hr)) { dwFlags = fMail ? ACCT_WIZ_MAILIMPORT : ACCT_WIZ_NEWSIMPORT; dwFlags |= (ACCT_WIZ_INTERNETCONNECTION | ACCT_WIZ_HTTPMAIL | ACCT_WIZ_OE); hr = pAcct->DoWizard(hwnd, dwFlags); pAcct->Release(); if (hr == E_NoAccounts) AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW((fMail ? idsNoAccountsFound : idsNoNewsAccountsFound)), NULL, MB_ICONINFORMATION | MB_OK); } }