Windows2003-3790/inetcore/outlookexpress/msoeacct/eudora.cpp
2020-09-30 16:53:55 +02:00

491 lines
13 KiB
C++

#include "pch.hxx"
#include <imnact.h>
#include <acctimp.h>
#include <dllmain.h>
#include <resource.h>
#include "eudora.h"
#include "demand.h"
ASSERTDATA
CEudoraAcctImport::CEudoraAcctImport()
{
m_cRef = 1;
*m_szIni = 0;
m_cInfo = 0;
m_rgInfo = NULL;
}
CEudoraAcctImport::~CEudoraAcctImport()
{
if (m_rgInfo != NULL)
MemFree(m_rgInfo);
}
STDMETHODIMP CEudoraAcctImport::QueryInterface(REFIID riid, LPVOID *ppv)
{
if (ppv == NULL)
return(E_INVALIDARG);
*ppv = NULL;
if (IID_IUnknown == riid)
*ppv = (IAccountImport *)this;
else if (IID_IAccountImport == riid)
*ppv = (IAccountImport *)this;
else if (IID_IAccountImport2 == riid)
*ppv = (IAccountImport2 *)this;
else
return(E_NOINTERFACE);
((LPUNKNOWN)*ppv)->AddRef();
return(S_OK);
}
STDMETHODIMP_(ULONG) CEudoraAcctImport::AddRef()
{
return(++m_cRef);
}
STDMETHODIMP_(ULONG) CEudoraAcctImport::Release()
{
if (--m_cRef == 0)
{
delete this;
return(0);
}
return(m_cRef);
}
const static char c_szRegEudora[] = "Software\\Qualcomm\\Eudora\\CommandLine";
const static char c_szCmdValue[] = "Current";
HRESULT STDMETHODCALLTYPE CEudoraAcctImport::AutoDetect(DWORD *pcAcct, DWORD dwFlags)
{
HRESULT hr;
HKEY hkey;
char *szCmdLine, *sz, *psz, szExpanded[MAX_PATH];
DWORD type, cb;
if (pcAcct == NULL)
return(E_INVALIDARG);
hr = S_FALSE;
*pcAcct = 0;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, c_szRegEudora, 0, KEY_ALL_ACCESS, &hkey))
{
if (ERROR_SUCCESS == RegQueryValueEx(hkey, c_szCmdValue, NULL, &type, NULL, &cb) &&
cb > 0 &&
((type == REG_SZ) || (type == REG_EXPAND_SZ)))
{
if (MemAlloc((void **)&szCmdLine, cb))
{
if (ERROR_SUCCESS == RegQueryValueEx(hkey, c_szCmdValue, NULL, &type, (LPBYTE)szCmdLine, &cb))
{
sz = szCmdLine;
sz = PszSkipWhiteA(sz);
sz = PszScanToWhiteA(sz);
sz = PszSkipWhiteA(sz);
sz = PszScanToWhiteA(sz);
sz = PszSkipWhiteA(sz);
if (REG_EXPAND_SZ == type)
{
DWORD nReturn = ExpandEnvironmentStrings(sz, szExpanded, ARRAYSIZE(szExpanded));
if (nReturn && nReturn <= ARRAYSIZE(szExpanded))
psz = szExpanded;
else
psz = sz;
}
else
psz = sz;
if (*psz != 0 && 0xffffffff != GetFileAttributes(psz))
hr = InitAccounts(psz);
}
MemFree(szCmdLine);
}
else
{
hr = E_OUTOFMEMORY;
}
}
RegCloseKey(hkey);
}
// TODO: if we haven't found the ini file in the reg,
// let's search for it...
if (hr == S_OK)
*pcAcct = m_cInfo;
return(hr);
}
HRESULT STDMETHODCALLTYPE CEudoraAcctImport::EnumerateAccounts(IEnumIMPACCOUNTS **ppEnum)
{
CEnumEUDORAACCTS *penum;
HRESULT hr;
if (ppEnum == NULL)
return(E_INVALIDARG);
*ppEnum = NULL;
if (m_cInfo == 0)
return(S_FALSE);
Assert(m_rgInfo != NULL);
penum = new CEnumEUDORAACCTS;
if (penum == NULL)
return(E_OUTOFMEMORY);
hr = penum->Init(m_rgInfo, m_cInfo);
if (FAILED(hr))
{
penum->Release();
penum = NULL;
}
*ppEnum = penum;
return(hr);
}
HRESULT STDMETHODCALLTYPE CEudoraAcctImport::GetSettings(DWORD_PTR dwCookie, IImnAccount *pAcct)
{
if (pAcct == NULL)
return(E_INVALIDARG);
return(IGetSettings(dwCookie, pAcct, NULL));
}
HRESULT STDMETHODCALLTYPE CEudoraAcctImport::GetSettings2(DWORD_PTR dwCookie, IImnAccount *pAcct, IMPCONNINFO *pInfo)
{
if (pAcct == NULL ||
pInfo == NULL)
return(E_INVALIDARG);
return(IGetSettings(dwCookie, pAcct, pInfo));
}
const static char c_szEmpty[] = "";
const static char c_szRealName[] = "RealName";
const static char c_szSmtpServer[] = "SMTPServer";
const static char c_szReturnAddress[] = "ReturnAddress";
const static char c_szPopAccount[] = "POPAccount";
const static char c_szLeaveMailOnServer[] = "LeaveMailOnServer";
const static char c_szUsesIMAP[] = "UsesIMAP";
const static char c_szUsesPOP[] = "UsesPOP";
const static char c_sz1[] = "1";
const static char c_szConnName[] = "AutoConnectionName";
HRESULT CEudoraAcctImport::IGetSettings(DWORD_PTR dwCookie, IImnAccount *pAcct, IMPCONNINFO *pInfo)
{
BOOL fSMTP, fEmail, fPop;
EUDORAACCTINFO *pinfo;
char sz[512], *szT;
DWORD cb;
HRESULT hr;
Assert(pAcct != NULL);
fSMTP = FALSE;
fEmail = FALSE;
Assert(((int) dwCookie) >= 0 && dwCookie < (DWORD_PTR)m_cInfo);
pinfo = &m_rgInfo[dwCookie];
Assert(pinfo->dwCookie == dwCookie);
hr = pAcct->SetPropSz(AP_ACCOUNT_NAME, pinfo->szDisplay);
if (FAILED(hr))
return(hr);
cb = GetPrivateProfileString(pinfo->szSection, c_szRealName, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && !FIsEmpty(sz))
{
hr = pAcct->SetPropSz(AP_SMTP_DISPLAY_NAME, sz);
Assert(!FAILED(hr));
}
cb = GetPrivateProfileString(pinfo->szSection, c_szSmtpServer, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && !FIsEmpty(sz))
{
hr = pAcct->SetPropSz(AP_SMTP_SERVER, sz);
Assert(!FAILED(hr));
fSMTP = TRUE;
}
cb = GetPrivateProfileString(pinfo->szSection, c_szReturnAddress, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && !FIsEmpty(sz))
{
hr = pAcct->SetPropSz(AP_SMTP_EMAIL_ADDRESS, sz);
Assert(!FAILED(hr));
fEmail = TRUE;
}
fPop = TRUE;
cb = GetPrivateProfileString(pinfo->szSection, c_szUsesPOP, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb == 0 || 0 != lstrcmp(sz, c_sz1))
{
cb = GetPrivateProfileString(pinfo->szSection, c_szUsesIMAP, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && 0 == lstrcmp(sz, c_sz1))
fPop = FALSE;
}
cb = GetPrivateProfileString(pinfo->szSection, c_szPopAccount, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && !FIsEmpty(sz))
{
if (!fEmail)
{
hr = pAcct->SetPropSz(AP_SMTP_EMAIL_ADDRESS, sz);
Assert(!FAILED(hr));
}
szT = PszScanToCharA(sz, '@');
if (*szT)
{
*szT = 0;
szT++;
hr = pAcct->SetPropSz(fPop ? AP_POP3_USERNAME : AP_IMAP_USERNAME, sz);
Assert(!FAILED(hr));
hr = pAcct->SetPropSz(fPop ? AP_POP3_SERVER : AP_IMAP_SERVER, szT);
Assert(!FAILED(hr));
if (!fSMTP)
{
hr = pAcct->SetPropSz(AP_SMTP_SERVER, szT);
Assert(!FAILED(hr));
}
}
}
if (fPop)
{
cb = GetPrivateProfileString(pinfo->szSection, c_szLeaveMailOnServer, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && 0 == lstrcmp(sz, c_sz1))
{
hr = pAcct->SetPropDw(AP_POP3_LEAVE_ON_SERVER, 1);
Assert(!FAILED(hr));
}
}
if (pInfo != NULL)
{
cb = GetPrivateProfileString(pinfo->szSection, c_szConnName, c_szEmpty, sz, ARRAYSIZE(sz), m_szIni);
if (cb > 0 && !FIsEmpty(sz))
{
pInfo->dwConnect = CONN_USE_SETTINGS;
pInfo->dwConnectType = CONNECTION_TYPE_RAS;
StrCpyN(pInfo->szConnectoid, sz, ARRAYSIZE(pInfo->szConnectoid));
}
else
{
// TODO: determine if we need to create a connectoid
pInfo->dwConnect = CONN_USE_DEFAULT;
}
}
return(S_OK);
}
const static char c_szPersona[] = "Personalities";
const static char c_szSettings[] = "Settings";
#define CALLOCINFO 8
#define CALLOCSETTINGS 0x07fff
HRESULT CEudoraAcctImport::InitAccounts(char *szIni)
{
HRESULT hr;
DWORD cch, cInfoBuf;
char *szBuf, *szKey, *szVal;
Assert(m_cInfo == 0);
Assert(m_rgInfo == NULL);
if (!MemAlloc((void **)&szBuf, CALLOCSETTINGS))
return(E_OUTOFMEMORY);
hr = E_FAIL;
cch = GetPrivateProfileSection(c_szSettings, szBuf, 0x07fff, szIni);
if (cch != 0)
{
if (!MemAlloc((void **)&m_rgInfo, CALLOCINFO * sizeof(EUDORAACCTINFO)))
{
hr = E_OUTOFMEMORY;
goto done;
}
cInfoBuf = CALLOCINFO;
m_rgInfo[m_cInfo].dwCookie = m_cInfo;
StrCpyN(m_rgInfo[m_cInfo].szSection, c_szSettings, ARRAYSIZE(m_rgInfo[m_cInfo].szSection));
LoadString(g_hInstRes, idsDefaultAccount, m_rgInfo[m_cInfo].szDisplay, ARRAYSIZE(m_rgInfo[m_cInfo].szDisplay));
m_cInfo++;
cch = GetPrivateProfileSection(c_szPersona, szBuf, 0x07fff, szIni);
if ((cch != 0) && (cch != (0x07fff - 2)))
{
szKey = szBuf;
while (TRUE)
{
if (m_cInfo == cInfoBuf)
{
cInfoBuf += CALLOCINFO;
if (!MemRealloc((void **)&m_rgInfo, cInfoBuf * sizeof(EUDORAACCTINFO)))
{
hr = E_OUTOFMEMORY;
goto done;
}
}
szVal = PszScanToCharA(szKey, '=');
if (*szVal != 0)
{
szVal++;
m_rgInfo[m_cInfo].dwCookie = m_cInfo;
StrCpyN(m_rgInfo[m_cInfo].szSection, szVal, ARRAYSIZE(m_rgInfo[m_cInfo].szSection));
StrCpyN(m_rgInfo[m_cInfo].szDisplay, szVal, ARRAYSIZE(m_rgInfo[m_cInfo].szDisplay));
m_cInfo++;
}
szKey = szVal;
while (*szKey != 0)
szKey++;
szKey++;
if (*szKey == 0)
break;
}
}
StrCpyN(m_szIni, szIni, ARRAYSIZE(m_szIni));
hr = S_OK;
}
done:
MemFree(szBuf);
return(hr);
}
HRESULT STDMETHODCALLTYPE CEudoraAcctImport::InitializeImport(HWND hwnd, DWORD_PTR dwCookie)
{
return(E_NOTIMPL);
}
HRESULT STDMETHODCALLTYPE CEudoraAcctImport::GetNewsGroup(INewsGroupImport *pImp, DWORD dwReserved)
{
return(E_NOTIMPL);
}
CEnumEUDORAACCTS::CEnumEUDORAACCTS()
{
m_cRef = 1;
// m_iInfo
m_cInfo = 0;
m_rgInfo = NULL;
}
CEnumEUDORAACCTS::~CEnumEUDORAACCTS()
{
if (m_rgInfo != NULL)
MemFree(m_rgInfo);
}
STDMETHODIMP CEnumEUDORAACCTS::QueryInterface(REFIID riid, LPVOID *ppv)
{
if (ppv == NULL)
return(E_INVALIDARG);
*ppv = NULL;
if (IID_IUnknown == riid)
*ppv = (IUnknown *)this;
else if (IID_IEnumIMPACCOUNTS == riid)
*ppv = (IEnumIMPACCOUNTS *)this;
if (*ppv != NULL)
((LPUNKNOWN)*ppv)->AddRef();
else
return(E_NOINTERFACE);
return(S_OK);
}
STDMETHODIMP_(ULONG) CEnumEUDORAACCTS::AddRef()
{
return(++m_cRef);
}
STDMETHODIMP_(ULONG) CEnumEUDORAACCTS::Release()
{
if (--m_cRef == 0)
{
delete this;
return(0);
}
return(m_cRef);
}
HRESULT STDMETHODCALLTYPE CEnumEUDORAACCTS::Next(IMPACCOUNTINFO *pinfo)
{
if (pinfo == NULL)
return(E_INVALIDARG);
m_iInfo++;
if ((UINT)m_iInfo >= m_cInfo)
return(S_FALSE);
Assert(m_rgInfo != NULL);
pinfo->dwCookie = m_rgInfo[m_iInfo].dwCookie;
pinfo->dwReserved = 0;
StrCpyN(pinfo->szDisplay, m_rgInfo[m_iInfo].szDisplay, ARRAYSIZE(pinfo->szDisplay));
return(S_OK);
}
HRESULT STDMETHODCALLTYPE CEnumEUDORAACCTS::Reset()
{
m_iInfo = -1;
return(S_OK);
}
HRESULT CEnumEUDORAACCTS::Init(EUDORAACCTINFO *pinfo, int cinfo)
{
DWORD cb;
Assert(pinfo != NULL);
Assert(cinfo > 0);
cb = cinfo * sizeof(EUDORAACCTINFO);
if (!MemAlloc((void **)&m_rgInfo, cb))
return(E_OUTOFMEMORY);
m_iInfo = -1;
m_cInfo = cinfo;
CopyMemory(m_rgInfo, pinfo, cb);
return(S_OK);
}