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

481 lines
13 KiB
C++

#include "pch.hxx"
#include <imnact.h>
#include <acctimp.h>
#include <dllmain.h>
#include <resource.h>
#include <AgntNews.h> // Forte Agent
#include "newimp.h"
ASSERTDATA
#define MEMCHUNK 512
CAgentAcctImport::CAgentAcctImport()
{
m_cRef = 1;
m_fIni = FALSE;
*m_szIni = 0;
m_cInfo = 0;
m_rgInfo = NULL;
}
CAgentAcctImport::~CAgentAcctImport()
{
if (m_rgInfo != NULL)
MemFree(m_rgInfo);
}
STDMETHODIMP CAgentAcctImport::QueryInterface(REFIID riid, LPVOID *ppv)
{
if (ppv == NULL)
return(E_INVALIDARG);
*ppv = NULL;
if ((IID_IUnknown == riid) || (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) CAgentAcctImport::AddRef()
{
return(++m_cRef);
}
STDMETHODIMP_(ULONG) CAgentAcctImport::Release()
{
if (--m_cRef == 0)
{
delete this;
return(0);
}
return(m_cRef);
}
const static char c_szRegAgnt[] = "Software\\Forte\\Agent\\Paths";
const static char c_szDefPath[] = "c:\\Agent\\Data\\Agent.ini";
const static char c_szRegIni[] = "IniFile";
const static char c_szRegUninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Forte Agent";
const static char c_szRegString[] = "UninstallString";
HRESULT STDMETHODCALLTYPE CAgentAcctImport::AutoDetect(DWORD *pcAcct, DWORD dwFlags)
{
HRESULT hr = S_OK;
DWORD cb = MAX_PATH, dwType;
char szUserName[MAX_PATH];
char szUserIniPath[MAX_PATH];
char szExpanded[MAX_PATH];
char szNewsServer[MAX_PATH];
char szIniPath[] = "Data\\Agent.ini";
char *psz;
int nCount = 0;
HKEY hkey;
Assert(m_cInfo == 0);
if (pcAcct == NULL)
return(E_INVALIDARG);
*pcAcct = 0;
// FIRST CHECK FOR FORTE AGENT
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, c_szRegAgnt, 0, KEY_ALL_ACCESS, &hkey))
{
cb = sizeof(szUserIniPath);
if(ERROR_SUCCESS == RegQueryValueEx(hkey, c_szRegIni, NULL, &dwType, (LPBYTE)szUserIniPath, &cb ))
{
if (REG_EXPAND_SZ == dwType)
{
DWORD nReturn = ExpandEnvironmentStrings(szUserIniPath, szExpanded, ARRAYSIZE(szExpanded));
if (nReturn && nReturn <= ARRAYSIZE(szExpanded))
psz = szExpanded;
else
psz = szUserIniPath;
}
else
psz = szUserIniPath;
GetPrivateProfileString("Profile", "FullName", "Default User", szUserName, MAX_PATH, psz);
if(GetPrivateProfileString("Servers", "NewsServer", "", szNewsServer, MAX_PATH, psz))
{
if (!MemAlloc((void **)&m_rgInfo, 1*sizeof(AGNTNEWSACCTINFO)))
{
hr = E_OUTOFMEMORY;
goto done;
}
m_rgInfo[m_cInfo].dwCookie = m_cInfo;
StrCpyN(m_rgInfo[m_cInfo].szUserPath, psz, ARRAYSIZE(m_rgInfo[m_cInfo].szUserPath));
StrCpyN(m_rgInfo[m_cInfo].szDisplay, szUserName, ARRAYSIZE(m_rgInfo[m_cInfo].szDisplay));
m_cInfo++;
}
}
}
// IF FORTE AGENT IS NOT FOUND, CHECK FOR FREE AGENT.
// CHECK THE DEFAULT PATH "C:\AGENT\DATA " FOR THE "AGENT.INI" FILE
else if(GetPrivateProfileString("Servers", "NewsServer", "", szNewsServer, MAX_PATH, c_szDefPath))
{
if (!MemAlloc((void **)&m_rgInfo, 1*sizeof(AGNTNEWSACCTINFO)))
{
hr = E_OUTOFMEMORY;
goto done;
}
GetPrivateProfileString("Profile", "FullName", "Default User", szUserName, MAX_PATH, c_szDefPath);
m_rgInfo[m_cInfo].dwCookie = m_cInfo;
StrCpyN(m_rgInfo[m_cInfo].szUserPath, c_szDefPath, ARRAYSIZE(m_rgInfo[m_cInfo].szUserPath));
StrCpyN(m_rgInfo[m_cInfo].szDisplay, szUserName, ARRAYSIZE(m_rgInfo[m_cInfo].szDisplay));
m_cInfo++;
}
// ELSE THE WORKAROUND FOR GETTING THE FREE AGENT INSTALL PATH i.e. RETRIEVE THE (UN)INSTALLATION PATH FOR (FREE?)-AGENT FROM THE REGISTRY.
else
{
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szRegUninstall, 0, KEY_ALL_ACCESS, &hkey))
{
cb = sizeof(szUserIniPath);
if(ERROR_SUCCESS == RegQueryValueEx(hkey, c_szRegString, NULL, &dwType, (LPBYTE)szUserIniPath, &cb ))
{
// $$$Review: [NAB] Seems like this would break if there were a space in the the dir name!
while(szUserIniPath[nCount] != ' ')
nCount++;
// Come back now.
while(szUserIniPath[nCount] != '\\')
nCount--;
nCount++;
szUserIniPath[nCount] = '\0';
StrCatBuff(szUserIniPath, szIniPath, ARRAYSIZE(szUserIniPath));
if (REG_EXPAND_SZ == dwType)
{
ExpandEnvironmentStrings(szUserIniPath, szExpanded, ARRAYSIZE(szExpanded));
psz = szExpanded;
}
else
psz = szUserIniPath;
GetPrivateProfileString("Profile", "FullName", "Default User", szUserName, MAX_PATH, psz);
if(GetPrivateProfileString("Servers", "NewsServer", "", szNewsServer, MAX_PATH, psz))
{
if (!MemAlloc((void **)&m_rgInfo, 1*sizeof(AGNTNEWSACCTINFO)))
{
hr = E_OUTOFMEMORY;
goto done;
}
m_rgInfo[m_cInfo].dwCookie = m_cInfo;
StrCpyN(m_rgInfo[m_cInfo].szUserPath, psz, ARRAYSIZE(m_rgInfo[m_cInfo].szUserPath));
StrCpyN(m_rgInfo[m_cInfo].szDisplay, szUserName, ARRAYSIZE(m_rgInfo[m_cInfo].szDisplay));
m_cInfo++;
}
}
}
}
if (hr == S_OK)
{
*pcAcct = m_cInfo;
}
done:
RegCloseKey(hkey);
return(hr);
}
HRESULT STDMETHODCALLTYPE CAgentAcctImport::InitializeImport(HWND hwnd, DWORD_PTR dwCookie)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAgentAcctImport::EnumerateAccounts(IEnumIMPACCOUNTS **ppEnum)
{
CEnumAGNTACCT *penum;
HRESULT hr;
if (ppEnum == NULL)
return(E_INVALIDARG);
*ppEnum = NULL;
if (m_cInfo == 0)
return(S_FALSE);
Assert(m_rgInfo != NULL);
penum = new CEnumAGNTACCT;
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 CAgentAcctImport::GetSettings(DWORD_PTR dwCookie, IImnAccount *pAcct)
{
HRESULT hr;
if (pAcct == NULL)
return(E_INVALIDARG);
hr = IGetSettings(dwCookie, pAcct, NULL);
return(hr);
}
HRESULT CAgentAcctImport::IGetSettings(DWORD_PTR dwCookie, IImnAccount *pAcct, IMPCONNINFO *pInfo)
{
HRESULT hr;
AGNTNEWSACCTINFO *pinfo;
char szUserPrefs[AGNTSUSERROWS][AGNTSUSERCOLS];
char sz[512];
DWORD cb, type;
DWORD dwNewsPort = 119;
ZeroMemory((void*)&szUserPrefs[0], AGNTSUSERCOLS*AGNTSUSERROWS*sizeof(char));
Assert(((int) dwCookie) >= 0 && dwCookie < (DWORD_PTR)m_cInfo);
pinfo = &m_rgInfo[dwCookie];
Assert(pinfo->dwCookie == dwCookie);
hr = GetUserPrefs(pinfo->szUserPath, szUserPrefs);
Assert(0 < lstrlen(szUserPrefs[0]));
hr = pAcct->SetPropSz(AP_ACCOUNT_NAME, szUserPrefs[0]);
if (FAILED(hr))
return(hr);
hr = pAcct->SetPropSz(AP_NNTP_SERVER, szUserPrefs[0]);
Assert(!FAILED(hr));
if(lstrcmp(szUserPrefs[1], "119"))
{
int Len = lstrlen(szUserPrefs[1]);
if(Len)
{
// Convert the string to a dw.
DWORD dwMult = 1;
dwNewsPort = 0;
while(Len)
{
Len--;
dwNewsPort += ((int)szUserPrefs[1][Len] - 48)*dwMult;
dwMult *= 10;
}
}
}
hr = pAcct->SetPropDw(AP_NNTP_PORT, dwNewsPort);
Assert(!FAILED(hr));
if(lstrlen(szUserPrefs[2]))
{
hr = pAcct->SetPropSz(AP_NNTP_DISPLAY_NAME, szUserPrefs[2]);
Assert(!FAILED(hr));
}
if(lstrlen(szUserPrefs[3]))
{
hr = pAcct->SetPropSz(AP_NNTP_EMAIL_ADDRESS, szUserPrefs[3]);
Assert(!FAILED(hr));
}
if (pInfo != NULL)
{
// TODO: can we do any better than this???
pInfo->dwConnect = CONN_USE_DEFAULT;
}
return(S_OK);
}
HRESULT CAgentAcctImport::GetUserPrefs(char *szUserPath, char szUserPrefs[][AGNTSUSERCOLS])
{
HRESULT hr = E_FAIL;
DWORD dwResult = 0;
if(!GetPrivateProfileString("Servers", "NewsServer", "News", szUserPrefs[0], AGNTSUSERCOLS, szUserPath))
hr = S_FALSE;
if(!GetPrivateProfileString("Servers", "NNTPPort", "119", szUserPrefs[1], AGNTSUSERCOLS, szUserPath))
hr = S_FALSE;
if(!GetPrivateProfileString("Profile", "FullName", "Default User", szUserPrefs[2], AGNTSUSERCOLS, szUserPath))
hr = S_FALSE;
if(!GetPrivateProfileString("Profile", "EMailAddress", "", szUserPrefs[3], AGNTSUSERCOLS, szUserPath))
hr = S_FALSE;
return hr;
}
HRESULT CAgentAcctImport::GetNewsGroup(INewsGroupImport *pImp, DWORD dwReserved)
{
// We can ignore the first parameter as we have only one server.
HRESULT hr = S_OK;
char *pListGroups = NULL;
char szFilePath[AGNTSUSERCOLS];
int nCounter;
Assert(pImp != NULL);
StrCpyNA(szFilePath, m_rgInfo[0].szUserPath, ARRAYSIZE(szFilePath));
nCounter = lstrlen(szFilePath);
if (nCounter)
{
while (nCounter)
{
if (szFilePath[nCounter] == '\\')
{
szFilePath[nCounter] = '\0';
break;
}
nCounter--;
}
}
else
{
return S_FALSE;
}
if (!FAILED(GetSubListGroups(szFilePath, &pListGroups)))
{
if (!SUCCEEDED(pImp->ImportSubList(pListGroups)))
hr = S_FALSE;
}
if (pListGroups != NULL)
MemFree(pListGroups);
return hr;
}
const static char c_szGroupFile[] = "Groups.dat";
const static char c_szBakupFile[] = "Grpdat.bak";
HRESULT CAgentAcctImport::GetSubListGroups(char *szHomeDir, char **ppListGroups)
{
return(E_FAIL);
}
STDMETHODIMP CAgentAcctImport::GetSettings2(DWORD_PTR dwCookie, IImnAccount *pAcct, IMPCONNINFO *pInfo)
{
if (pAcct == NULL ||
pInfo == NULL)
return(E_INVALIDARG);
return(IGetSettings(dwCookie, pAcct, pInfo));
}
CEnumAGNTACCT::CEnumAGNTACCT()
{
m_cRef = 1;
// m_iInfo
m_cInfo = 0;
m_rgInfo = NULL;
}
CEnumAGNTACCT::~CEnumAGNTACCT()
{
if (m_rgInfo != NULL)
MemFree(m_rgInfo);
}
STDMETHODIMP CEnumAGNTACCT::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) CEnumAGNTACCT::AddRef()
{
return(++m_cRef);
}
STDMETHODIMP_(ULONG) CEnumAGNTACCT::Release()
{
if (--m_cRef == 0)
{
delete this;
return(0);
}
return(m_cRef);
}
HRESULT STDMETHODCALLTYPE CEnumAGNTACCT::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;
StrCpyNA(pinfo->szDisplay, m_rgInfo[m_iInfo].szDisplay, ARRAYSIZE(pinfo->szDisplay));
return(S_OK);
}
HRESULT STDMETHODCALLTYPE CEnumAGNTACCT::Reset()
{
m_iInfo = -1;
return(S_OK);
}
HRESULT CEnumAGNTACCT::Init(AGNTNEWSACCTINFO *pinfo, int cinfo)
{
DWORD cb;
Assert(pinfo != NULL);
Assert(cinfo > 0);
cb = cinfo * sizeof(AGNTNEWSACCTINFO);
if (!MemAlloc((void **)&m_rgInfo, cb))
return(E_OUTOFMEMORY);
m_iInfo = -1;
m_cInfo = cinfo;
CopyMemory(m_rgInfo, pinfo, cb);
return(S_OK);
}