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.
616 lines
22 KiB
616 lines
22 KiB
//*********************************************************************
|
|
//* Microsoft Windows **
|
|
//* Copyright(c) Microsoft Corp., 1994 **
|
|
//*********************************************************************
|
|
|
|
#include "pre.h"
|
|
#include "perhist.h"
|
|
#include "shlobj.h"
|
|
|
|
const VARIANT c_vaEmpty = {0};
|
|
const LARGE_INTEGER c_li0 = { 0, 0 };
|
|
|
|
|
|
CHAR szTempBuffer[TEMP_BUFFER_LENGTH];
|
|
|
|
#define ReadVerifyDW(x) if (!ReadDW(&(x),pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid DWORD in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
#define ReadVerifyW(x) if (!ReadW(&(x),pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid WORD in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
//Accepts -1 as a valid number. currently this is used for LCID, since all langs has a LDID == -1
|
|
#define ReadVerifyWEx(x) if (!ReadWEx(&(x),pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid WORD in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
#define ReadVerifyB(x) if (!ReadB(&(x),pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid BYTE in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
#define ReadVerifyBOOL(x) if (!ReadBOOL(&(x),pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid BOOL in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
#define ReadVerifySPECIAL(x, y, z) if (!ReadSPECIAL(&(x), &(y), &(z), pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid SPECIAL in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
#define ReadVerifySZ(x,y) if (!ReadSZ(&x[0],y+sizeof('\0'),pcCSVFile)) \
|
|
{ \
|
|
AssertMsg(0,"Invalid STRING in CSV file"); \
|
|
goto ReadOneLineError; \
|
|
}
|
|
|
|
CISPCSV::~CISPCSV(void)
|
|
{
|
|
if(m_lpStgHistory)
|
|
{
|
|
// Release the storage
|
|
m_lpStgHistory->Release();
|
|
m_lpStgHistory = NULL;
|
|
}
|
|
|
|
if (hbmTierIcon)
|
|
DeleteObject(hbmTierIcon);
|
|
|
|
CleanupISPPageCache(TRUE);
|
|
}
|
|
|
|
// Do an strip of Single Quotes from a source string. The source is formatted as:
|
|
// 'some text', and the dest string ends up being
|
|
// some text
|
|
void CISPCSV::StripQuotes
|
|
(
|
|
LPSTR lpszDst,
|
|
LPSTR lpszSrc
|
|
)
|
|
{
|
|
//strcpy(lpszDst, lpszSrc + 1, strlen(lpszSrc) - 1);
|
|
strcpy(lpszDst, lpszSrc + 1);
|
|
lpszDst[strlen(lpszDst) - 1] = '\0';
|
|
}
|
|
|
|
|
|
BOOL CISPCSV::ValidateFile(TCHAR* pszFile)
|
|
{
|
|
ASSERT(pszFile);
|
|
|
|
if (!lstrlen(pszFile))
|
|
return FALSE;
|
|
|
|
if (GetFileAttributes(pszFile) == 0xFFFFFFFF)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CISPCSV::ReadDW(DWORD far *pdw, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(szTempBuffer,TEMP_BUFFER_LENGTH))
|
|
return FALSE;
|
|
return (FSz2Dw(szTempBuffer,pdw));
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CISPCSV::ReadW(WORD far *pw, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(szTempBuffer,TEMP_BUFFER_LENGTH))
|
|
return FALSE;
|
|
return (FSz2W(szTempBuffer,pw));
|
|
}
|
|
|
|
// ############################################################################
|
|
//Accepts -1 as a valid number. currently this is used for LCID, since all langs has a LDID == -1
|
|
BOOL CISPCSV::ReadWEx(WORD far *pw, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(szTempBuffer,TEMP_BUFFER_LENGTH))
|
|
return FALSE;
|
|
return (FSz2WEx(szTempBuffer,pw));
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CISPCSV::ReadB(BYTE far *pb, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(szTempBuffer,TEMP_BUFFER_LENGTH))
|
|
return FALSE;
|
|
return (FSz2B(szTempBuffer,pb));
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CISPCSV::ReadBOOL(BOOL far *pbool, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(szTempBuffer,TEMP_BUFFER_LENGTH))
|
|
return FALSE;
|
|
return (FSz2BOOL(szTempBuffer,pbool));
|
|
}
|
|
|
|
// ############################################################################
|
|
// A special int can be either a BOOL (TRUE,FALSE) or a int, 0 or -1
|
|
// if the value is 0 or -1, then the pbIsSpecial bool is set to TRUE
|
|
BOOL CISPCSV::ReadSPECIAL(BOOL far *pbool, BOOL far *pbIsSpecial, int far *pInt, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(szTempBuffer,TEMP_BUFFER_LENGTH))
|
|
return FALSE;
|
|
return (FSz2SPECIAL(szTempBuffer,pbool, pbIsSpecial, pInt));
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CISPCSV::ReadSZ(LPSTR psz, DWORD dwSize, CCSVFile far *pcCSVFile)
|
|
{
|
|
if (!pcCSVFile->ReadToken(psz,dwSize))
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CISPCSV::ReadToEOL(CCSVFile far *pcCSVFile)
|
|
{
|
|
return pcCSVFile->SkipTillEOL();
|
|
}
|
|
|
|
HRESULT CISPCSV::ReadOneLine
|
|
(
|
|
CCSVFile far *pcCSVFile
|
|
)
|
|
{
|
|
HRESULT hr = ERROR_SUCCESS;
|
|
CHAR szTemp [MAX_ISP_NAME];
|
|
CHAR szISPLogoPath [MAX_PATH] = "\0";
|
|
CHAR szISPTierLogoPath [MAX_PATH];
|
|
CHAR szISPTeaserPath [MAX_PATH];
|
|
CHAR szISPMarketingHTMPath [MAX_PATH];
|
|
CHAR szISPFilePath [MAX_PATH];
|
|
CHAR szISPName [MAX_ISP_NAME];
|
|
//CHAR szCNSIconPath [MAX_PATH];
|
|
CHAR szBillingFormPath [MAX_PATH];
|
|
CHAR szPayCSVPath [MAX_PATH];
|
|
CHAR szOfferGUID [MAX_GUID];
|
|
CHAR szMir [MAX_ISP_NAME];
|
|
|
|
if (!ReadSZ(szTemp, sizeof(szTemp), pcCSVFile))
|
|
{
|
|
hr = ERROR_NO_MORE_ITEMS; // no more enteries
|
|
goto ReadOneLineExit;
|
|
}
|
|
// Strip the single quotes from the isp Name
|
|
StripQuotes(szISPName, szTemp);
|
|
|
|
ReadVerifyW(wOfferID);
|
|
ReadVerifySZ(szISPLogoPath, sizeof(szISPLogoPath));
|
|
ReadVerifySZ(szISPMarketingHTMPath, sizeof(szISPMarketingHTMPath));
|
|
ReadVerifySZ(szISPTierLogoPath, sizeof(szISPTierLogoPath));
|
|
ReadVerifySZ(szISPTeaserPath, sizeof(szISPTeaserPath));
|
|
ReadVerifySZ(szISPFilePath, sizeof(szISPFilePath));
|
|
ReadVerifyDW(dwCfgFlag);
|
|
ReadVerifyDW(dwRequiredUserInputFlags);
|
|
ReadVerifySZ(szBillingFormPath, sizeof(szBillingFormPath));
|
|
ReadVerifySZ(szPayCSVPath, sizeof(szPayCSVPath));
|
|
ReadVerifySZ(szOfferGUID, sizeof(szOfferGUID));
|
|
ReadVerifySZ(szMir, sizeof(szMir));
|
|
ReadVerifyWEx(wLCID); //Accepts -1 as a valid number. currently this is used for LCID, since all langs has a LDID == -1
|
|
ReadToEOL(pcCSVFile);
|
|
|
|
#ifdef UNICODE
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szISPName, MAX_ISP_NAME, m_szISPName, MAX_ISP_NAME);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szISPLogoPath, MAX_PATH, m_szISPLogoPath, MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szISPMarketingHTMPath, MAX_PATH, m_szISPMarketingHTMPath,MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szISPTierLogoPath, MAX_PATH, m_szISPTierLogoPath, MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szISPTeaserPath, MAX_PATH, m_szISPTeaserPath, MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szISPFilePath, MAX_PATH, m_szISPFilePath, MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szBillingFormPath, MAX_PATH, m_szBillingFormPath, MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szPayCSVPath, MAX_PATH, m_szPayCSVPath, MAX_PATH);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szOfferGUID, MAX_GUID, m_szOfferGUID, MAX_GUID);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szMir, MAX_ISP_NAME, m_szMir, MAX_ISP_NAME);
|
|
#else
|
|
|
|
lstrcpy(m_szISPName, szISPName);
|
|
lstrcpy(m_szISPLogoPath, szISPLogoPath);
|
|
lstrcpy(m_szISPMarketingHTMPath, szISPMarketingHTMPath);
|
|
lstrcpy(m_szISPTierLogoPath, szISPTierLogoPath);
|
|
lstrcpy(m_szISPTeaserPath, szISPTeaserPath);
|
|
lstrcpy(m_szISPFilePath, szISPFilePath);
|
|
lstrcpy(m_szBillingFormPath, szBillingFormPath);
|
|
lstrcpy(m_szPayCSVPath, szPayCSVPath);
|
|
lstrcpy(m_szOfferGUID, szOfferGUID);
|
|
lstrcpy(m_szMir, szMir);
|
|
#endif
|
|
|
|
|
|
bCNS = (ICW_CFGFLAG_CNS & dwCfgFlag) ? TRUE : FALSE;
|
|
bSecureConnection = (ICW_CFGFLAG_SECURE & dwCfgFlag) ? TRUE : FALSE;
|
|
|
|
//If this is nooffer we won't try to validate
|
|
if (!(dwCfgFlag & ICW_CFGFLAG_OFFERS))
|
|
{
|
|
if (!ValidateFile(m_szISPMarketingHTMPath))
|
|
hr = ERROR_FILE_NOT_FOUND;
|
|
return hr;
|
|
}
|
|
|
|
if (!(dwCfgFlag & ICW_CFGFLAG_AUTOCONFIG))
|
|
{
|
|
if (!ValidateFile(m_szISPMarketingHTMPath))
|
|
return ERROR_FILE_NOT_FOUND;
|
|
}
|
|
|
|
if (dwCfgFlag & ICW_CFGFLAG_OEM_SPECIAL)
|
|
{
|
|
if (!ValidateFile(m_szISPTierLogoPath) || !ValidateFile(m_szISPTeaserPath))
|
|
dwCfgFlag &= ~ICW_CFGFLAG_OEM_SPECIAL ;
|
|
}
|
|
|
|
//Try and validate the integrity of various offers
|
|
//based on type.
|
|
|
|
//OLS, CNS, NO-CNS
|
|
if (!ValidateFile(m_szISPLogoPath))
|
|
return ERROR_FILE_NOT_FOUND;
|
|
if (!ValidateFile(m_szISPFilePath))
|
|
return ERROR_FILE_NOT_FOUND;
|
|
|
|
// Validate the billing path only when billing option is set
|
|
if (dwCfgFlag & ICW_CFGFLAG_BILL)
|
|
{
|
|
if(!ValidateFile(m_szBillingFormPath))
|
|
return ERROR_FILE_NOT_FOUND;
|
|
}
|
|
|
|
// Validate the payment path only when payment option is set
|
|
if (dwCfgFlag & ICW_CFGFLAG_PAYMENT)
|
|
{
|
|
if(!ValidateFile(m_szPayCSVPath))
|
|
return ERROR_FILE_NOT_FOUND;
|
|
}
|
|
ReadOneLineExit:
|
|
return hr;
|
|
|
|
ReadOneLineError:
|
|
hr = ERROR_INVALID_DATA;
|
|
goto ReadOneLineExit;
|
|
}
|
|
|
|
HRESULT CISPCSV::ReadFirstLine
|
|
(
|
|
CCSVFile far *pcCSVFile
|
|
)
|
|
{
|
|
CHAR szTemp[TEMP_BUFFER_LENGTH];
|
|
|
|
for (int i = 0; i < NUM_ISPCSV_FIELDS; i++)
|
|
{
|
|
if (!ReadSZ(szTemp, sizeof(szTemp), pcCSVFile))
|
|
{
|
|
return(ERROR_INVALID_DATA);
|
|
}
|
|
}
|
|
ReadToEOL(pcCSVFile);
|
|
return (ERROR_SUCCESS);
|
|
}
|
|
|
|
void CISPCSV::MakeCompleteURL(LPTSTR lpszURL, LPTSTR lpszSRC)
|
|
{
|
|
TCHAR szCurrentDir[MAX_PATH] = TEXT("\0");
|
|
|
|
// Form the URL
|
|
GetCurrentDirectory(ARRAYSIZE(szCurrentDir), szCurrentDir);
|
|
wsprintf (lpszURL, TEXT("FILE://%s\\%s"), szCurrentDir, lpszSRC);
|
|
|
|
}
|
|
|
|
// Display this object's HTML page
|
|
HRESULT CISPCSV::DisplayHTML(LPTSTR szFile)
|
|
{
|
|
TCHAR szURL[INTERNET_MAX_URL_LENGTH];
|
|
HRESULT hr;
|
|
|
|
// Make the URL
|
|
MakeCompleteURL(szURL, szFile);
|
|
hr = gpWizardState->pICWWebView->DisplayHTML(szURL);
|
|
|
|
return (hr);
|
|
}
|
|
|
|
//Takes RES ID
|
|
HRESULT CISPCSV::DisplayTextWithISPName
|
|
(
|
|
HWND hDlgCtrl,
|
|
int iMsgString,
|
|
TCHAR* pszExtra //sticks something on the very end of the string if needed.
|
|
)
|
|
{
|
|
TCHAR szFinal [MAX_MESSAGE_LEN*3] = TEXT("\0");
|
|
TCHAR szFmt [MAX_MESSAGE_LEN];
|
|
TCHAR *args [1];
|
|
LPVOID pszIntro = NULL;
|
|
|
|
args[0] = (LPTSTR) m_szISPName;
|
|
|
|
// BUGBUG should probably check for error return from LoadString
|
|
LoadString(ghInstanceResDll, iMsgString, szFmt, ARRAYSIZE(szFmt));
|
|
|
|
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
|
szFmt,
|
|
0,
|
|
0,
|
|
(LPTSTR)&pszIntro,
|
|
0,
|
|
(va_list*)args))
|
|
{
|
|
|
|
lstrcpy(szFinal, (LPTSTR)pszIntro);
|
|
if (pszExtra)
|
|
lstrcat(szFinal, pszExtra);
|
|
|
|
SetWindowText(hDlgCtrl, szFinal);
|
|
}
|
|
|
|
if (pszIntro)
|
|
{
|
|
LocalFree(pszIntro);
|
|
}
|
|
|
|
return(S_OK);
|
|
}
|
|
|
|
#if 0
|
|
// Delete a Persisted History stream
|
|
HRESULT CISPCSV::DeleteHistory
|
|
(
|
|
BSTR bstrStreamName
|
|
)
|
|
{
|
|
// No persistence if we don't have a storage object
|
|
ASSERT(m_lpStgHistory);
|
|
if (!m_lpStgHistory)
|
|
return E_FAIL;
|
|
|
|
// Delete the stream
|
|
return (m_lpStgHistory->DestroyElement(bstrStreamName));
|
|
}
|
|
#endif
|
|
|
|
// Save the history of current lpBrowser using the provided name
|
|
HRESULT CISPCSV::SaveHistory
|
|
(
|
|
BSTR bstrStreamName
|
|
)
|
|
{
|
|
IStream *lpStream;
|
|
IPersistHistory *pHist;
|
|
IWebBrowser2 *lpWebBrowser;
|
|
HRESULT hr = S_OK;
|
|
|
|
// No persistence if we don't have a storage object
|
|
ASSERT(m_lpStgHistory);
|
|
if (!m_lpStgHistory)
|
|
return E_FAIL;
|
|
|
|
// Create a new Stream
|
|
if (SUCCEEDED(hr = m_lpStgHistory->CreateStream(bstrStreamName,
|
|
STGM_DIRECT |
|
|
STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE |
|
|
STGM_CREATE,
|
|
0,
|
|
0,
|
|
&lpStream)))
|
|
{
|
|
// Get an IPersistHistory interface pointer on the current WebBrowser object
|
|
gpWizardState->pICWWebView->get_BrowserObject(&lpWebBrowser);
|
|
if ( SUCCEEDED(lpWebBrowser->QueryInterface(IID_IPersistHistory, (LPVOID*) &pHist)))
|
|
{
|
|
// Save the history
|
|
pHist->SaveHistory(lpStream);
|
|
pHist->Release();
|
|
|
|
// Reset the stream pointer to the beginning
|
|
lpStream->Seek(c_li0, STREAM_SEEK_SET, NULL);
|
|
}
|
|
lpStream->Release();
|
|
}
|
|
|
|
return (hr);
|
|
}
|
|
|
|
HRESULT CISPCSV::LoadHistory
|
|
(
|
|
BSTR bstrStreamName
|
|
)
|
|
{
|
|
IStream *lpStream;
|
|
IPersistHistory *pHist;
|
|
IWebBrowser2 *lpWebBrowser;
|
|
HRESULT hr = S_OK;
|
|
|
|
// No persistence if we don't have a storage object
|
|
ASSERT(m_lpStgHistory);
|
|
if (!m_lpStgHistory)
|
|
return E_FAIL;
|
|
|
|
// Open the Stream
|
|
if (SUCCEEDED(hr = m_lpStgHistory->OpenStream(bstrStreamName,
|
|
NULL,
|
|
STGM_DIRECT |
|
|
STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
&lpStream)))
|
|
{
|
|
// Get an IPersistHistory interface pointer on the current WebBrowser object
|
|
gpWizardState->pICWWebView->get_BrowserObject(&lpWebBrowser);
|
|
if ( SUCCEEDED(lpWebBrowser->QueryInterface(IID_IPersistHistory, (LPVOID*) &pHist)))
|
|
{
|
|
// Save the history
|
|
pHist->LoadHistory(lpStream, NULL);
|
|
pHist->Release();
|
|
|
|
// Reset the stream pointer to the beginning
|
|
lpStream->Seek(c_li0, STREAM_SEEK_SET, NULL);
|
|
}
|
|
lpStream->Release();
|
|
}
|
|
return (hr);
|
|
}
|
|
|
|
|
|
// This funtion will get the name of a ISP page cache filen from the page's ID
|
|
HRESULT CISPCSV::GetCacheFileNameFromPageID
|
|
(
|
|
BSTR bstrPageID,
|
|
LPTSTR lpszCacheFile,
|
|
ULONG cbszCacheFile
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IStream *lpStream;
|
|
ULONG cbRead;
|
|
|
|
if (!m_lpStgIspPages)
|
|
return E_FAIL;
|
|
|
|
// Open the stream
|
|
if (SUCCEEDED(hr = m_lpStgIspPages->OpenStream(bstrPageID,
|
|
NULL,
|
|
STGM_DIRECT |
|
|
STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
&lpStream)))
|
|
{
|
|
// Read the file name
|
|
lpStream->Read(lpszCacheFile, cbszCacheFile, &cbRead);
|
|
|
|
// release the stream
|
|
lpStream->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// This function will cleanup the ISP Page cache. This means deleting all temp files created
|
|
// and cleaning up the structured storage object used to store the file names
|
|
void CISPCSV::CleanupISPPageCache(BOOL bReleaseStorage)
|
|
{
|
|
IEnumSTATSTG *pEnum;
|
|
STATSTG StreamInfo;
|
|
IMalloc *pMalloc = NULL;
|
|
|
|
// If we have a storage object already created, then enumerate the streams
|
|
// in it, and free the underlying cache files.
|
|
if (m_lpStgIspPages)
|
|
{
|
|
if (SUCCEEDED (SHGetMalloc (&pMalloc)))
|
|
{
|
|
if (SUCCEEDED(m_lpStgIspPages->EnumElements(0, NULL, 0, &pEnum)))
|
|
{
|
|
while(S_OK == pEnum->Next(1, &StreamInfo, NULL))
|
|
{
|
|
if (StreamInfo.pwcsName)
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
if (SUCCEEDED(GetCacheFileNameFromPageID(StreamInfo.pwcsName,
|
|
szPath,
|
|
sizeof(szPath))))
|
|
{
|
|
// delete the file
|
|
DeleteFile(szPath);
|
|
|
|
m_lpStgIspPages->DestroyElement(StreamInfo.pwcsName);
|
|
if(m_lpStgHistory)
|
|
m_lpStgHistory->DestroyElement(StreamInfo.pwcsName);
|
|
|
|
// Free the memory allocated by the enumerator
|
|
pMalloc->Free (StreamInfo.pwcsName);
|
|
}
|
|
}
|
|
}
|
|
// Release the enumerator
|
|
pEnum->Release();
|
|
}
|
|
// release the Shell Memory allocator
|
|
pMalloc->Release ();
|
|
}
|
|
|
|
if (bReleaseStorage)
|
|
{
|
|
// Release the storage
|
|
m_lpStgIspPages->Release();
|
|
m_lpStgIspPages= NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
// This function will create a new page cache entry if necessary using the PageID as an
|
|
// index. If an entry does not exists, and temp file will be create, then name stored,
|
|
// and the data in lpszTempFile will be copied into the new file.
|
|
// If the page already exists, this function will just return.
|
|
HRESULT CISPCSV::CopyFiletoISPPageCache
|
|
(
|
|
BSTR bstrPageID,
|
|
LPTSTR lpszTempFile
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
TCHAR szTempPath[MAX_PATH];
|
|
TCHAR szISPCacheFile[MAX_PATH];
|
|
IStream *lpStream;
|
|
ULONG cbWritten;
|
|
|
|
if (!m_lpStgIspPages)
|
|
return E_FAIL;
|
|
|
|
if (SUCCEEDED(GetCacheFileNameFromPageID(bstrPageID,
|
|
szISPCacheFile,
|
|
sizeof(szISPCacheFile))))
|
|
{
|
|
// The pageID already has a file in the cache, so we can just return success
|
|
return S_OK;
|
|
}
|
|
|
|
if (!GetTempPath(ARRAYSIZE(szTempPath), szTempPath))
|
|
return E_FAIL;
|
|
|
|
// No file yet, so we have to create one
|
|
if (!GetTempFileName(szTempPath, TEXT("ICW"), 0, szISPCacheFile))
|
|
return E_FAIL;
|
|
|
|
// Create a stream using the passed in page ID
|
|
if (SUCCEEDED(hr = m_lpStgIspPages->CreateStream(bstrPageID,
|
|
STGM_DIRECT |
|
|
STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE |
|
|
STGM_CREATE,
|
|
0,
|
|
0,
|
|
&lpStream)))
|
|
{
|
|
// Write the file name to the stream, including the NULL terminator
|
|
#ifdef UNICODE
|
|
DWORD dwSize = (lstrlen(szISPCacheFile)+1) * sizeof(TCHAR);
|
|
if (SUCCEEDED(hr = lpStream->Write(szISPCacheFile, dwSize, &cbWritten)))
|
|
#else
|
|
|
|
if (SUCCEEDED(hr = lpStream->Write(szISPCacheFile, lstrlen(szISPCacheFile)+1, &cbWritten)))
|
|
#endif
|
|
{
|
|
// Copy the passed in temp file
|
|
if (!CopyFile(lpszTempFile, szISPCacheFile, FALSE))
|
|
hr = E_FAIL;
|
|
}
|
|
// Release the stream
|
|
lpStream->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|