You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
490 lines
13 KiB
490 lines
13 KiB
#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);
|
|
}
|