Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1958 lines
45 KiB

// CerClient.cpp : Implementation of CCerClient
#include "stdafx.h"
#include "CERUpload.h"
#include "CerClient.h"
#include "ErrorCodes.h"
#include "Utilities.h"
#include <Wininet.h>
#include <shlobj.h>
#include <string.h>
#include <stdio.h>
char * CCerClient::_approvedDomains[] = { "ocatest",
"oca.microsoft.com",
"oca.microsoft.de",
"oca.microsoft.fr",
"ocadeviis",
"ocajapan.rte.microsoft.com"};
// Utility Functions
DWORD CCerClient::GetMachineName(wchar_t*Path, wchar_t*FileName, wchar_t*MachineName)
{
FILE *hMappingFile = NULL;
wchar_t *Buffer = NULL;
int ErrorCode = 0;
wchar_t TempMachineName[512];
wchar_t *pSource;
wchar_t *pDest;
wchar_t FilePath[512];
int TabCount;
wchar_t* Currpos = NULL;
ZeroMemory(TempMachineName, sizeof(TempMachineName));
if (Path)
{
if (sizeof Path < sizeof FilePath)
{
wcscpy (FilePath, Path);
wcscat(FilePath,L"\\hits.log");
}
else
{
ErrorCode = FILE_DOES_NOT_EXIST;
goto Done;
}
}
else
{
ErrorCode = FILE_DOES_NOT_EXIST;
goto Done;
}
if (!PathFileExistsW(FilePath))
{
wcscpy(MachineName,L"\0");
ErrorCode = FILE_DOES_NOT_EXIST;
}
else
{
hMappingFile = _wfopen(FilePath, L"r");
Buffer = (wchar_t *) malloc(1024 *sizeof(wchar_t));
if (!Buffer)
{
ErrorCode = 2;
}
else
{
if (hMappingFile == NULL)
{
ErrorCode = 1;
}
else
{
// Search the file for the last occurence of FileName and
// Retrieve the Computer Name
// We want the last occurence of the filename since there may
// be duplicates.
ZeroMemory(Buffer,1024 *sizeof(wchar_t));
while (fgetws(Buffer,1024,hMappingFile) != NULL)
{
if (wcscmp(Buffer,L"\0"))
{
// locate the file name.
TabCount = 0;
Currpos = Buffer;
while (TabCount < 3)
{
++Currpos;
if (*Currpos == L'\t')
++TabCount;
}
// Skip the tab
++Currpos;
Buffer[ wcslen(Buffer) - 1] = L'\0';
if (! wcscmp(FileName,Currpos))
{
// copy the machine name into a temp variable
// The file is tab formatted and the machine name is in the second position
pSource = Buffer;
pDest = TempMachineName;
while (*pSource != L'\t')
++pSource;
++pSource; // Skip the tab
while ( (*pSource != L'\t') && (*pSource != L'\0') && (*pSource != L' ') )
{
*pDest = *pSource;
++pSource;
++pDest;
}
// Null Terminate the Machine Name
*pDest = L'\0';
}
}
// Clear the buffer
ZeroMemory(Buffer, sizeof (Buffer));
}
}
if (Buffer)
{
free (Buffer);
Buffer = NULL;
}
// If we found a machine name convert it to unicode.
// and return it.
if (TempMachineName[0] == L'\0')
{
wcscpy(MachineName,L"\0");
ErrorCode = 3; // No Machine Name Found
}
else
{
ErrorCode = 0;
wcscpy (MachineName,TempMachineName);
}
}
}
// Close the File
if (Buffer != NULL)
free(Buffer);
if (hMappingFile != NULL)
fclose(hMappingFile);
Done:
return ErrorCode;
}
/////////////////////////////////////////////////////////////////////////////
// CCerClient
STDMETHODIMP
CCerClient::GetFileCount(
BSTR *bstrSharePath,
BSTR *bstrTransactID,
VARIANT *iMaxCount,
VARIANT *RetVal)
{
// TODO: Add your implementation code here
wchar_t *TranslogName = NULL; // Name of temperary transaction file
DWORD TranslogNameLength = 0;
int ErrorCode = 3000;
HANDLE hTransactLog = INVALID_HANDLE_VALUE;
WIN32_FIND_DATAW FindFile;
int FileCount = 0;
HANDLE hFindFile;
CComBSTR FileList = L"";
DWORD dwWritten;
wchar_t Msg[255];
WORD ByteOrderMark = 0xFEFF;
RetVal->vt = VT_INT;
int MaxCount = 0;
// ZeroMemory(FileList,sizeof (FileList));
switch(iMaxCount->vt)
{
case VT_INT:
MaxCount = iMaxCount->intVal;
break;
case VT_I2:
MaxCount = iMaxCount->iVal;
break;
default:
MaxCount = iMaxCount->iVal;
}
wsprintfW(Msg, L"MaxCount = %d",MaxCount);
if ( (MaxCount <= 0) || (MaxCount > 60000) )
{
ErrorCode = BAD_COUNT_VALUE;
}
else
{
//::MessageBoxW(NULL,Msg,L"MaxCount",MB_OK);
//::MessageBoxW(NULL,*bstrSharePath, L"Share Path",MB_OK);
if ( ( *bstrSharePath == NULL) || (!wcscmp ( *bstrSharePath, L"\0")) )
{
ErrorCode = NO_SHARE_PATH;
}
else
{
if (!PathIsDirectoryW(*bstrSharePath))
{
ErrorCode = NO_SHARE_PATH;
}
else
{
// Did we get a transaction id
if ( ( *bstrTransactID == NULL) || (!wcscmp ( *bstrTransactID, L"\0")) )
{
ErrorCode = NO_TRANS_ID;
}
else
{
DWORD transid = 0;
wchar_t *terminator = NULL;
TranslogNameLength = (wcslen (*bstrSharePath) +
wcslen(*bstrTransactID) +
17)
* sizeof (wchar_t);
TranslogName = (wchar_t *) malloc(TranslogNameLength);
if (TranslogName == NULL)
{
ErrorCode = OUT_OF_MEMORY;
}
else
{
// Create our transaction log file if it does not exist
wsprintfW(TranslogName, L"%s\\%s.txt",
*bstrSharePath,
*bstrTransactID);
// ::MessageBoxW(NULL, L"Createing Transaction log", L"TranslogName",MB_OK);
hTransactLog = CreateFileW(TranslogName,
GENERIC_WRITE,
NULL,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hTransactLog == INVALID_HANDLE_VALUE)
{
ErrorCode = FILE_CREATE_FAILED;
}
else
{
// Now we have the file open see if any entries already exist
// If yes how many more can we add
// Now add up to MaxCount cab files to the transaction log.
wchar_t SearchPath[MAX_PATH];
wsprintfW(SearchPath,L"%s\\*.cab",*bstrSharePath);
hFindFile = FindFirstFileW(SearchPath,&FindFile);
if (hFindFile != INVALID_HANDLE_VALUE)
{
do
{
if (! (FindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
// Check to see if the file has an extension like
// Cabbage etc..
if (FindFile.cFileName[wcslen(FindFile.cFileName) - 4] == L'.')
{
// we are ok keep going
++ FileCount;
FileList += FindFile.cFileName;
//wcscat(FileList,FindFile.cFileName);
FileList += L"\r\n";
}
}
}
while ( (FindNextFileW(hFindFile, &FindFile)) && (FileCount < (MaxCount) ));
// Write the file list to the transaction log
WriteFile(hTransactLog, &ByteOrderMark,2,&dwWritten,NULL);
WriteFile(hTransactLog,
FileList,
wcslen(FileList) * sizeof(wchar_t),
&dwWritten,
NULL);
CloseHandle(hTransactLog);
hTransactLog = INVALID_HANDLE_VALUE;
FindClose(hFindFile);
// return the count of added files.
ErrorCode = FileCount;
}
else
{
ErrorCode = 0;
}
}
}
}
}
}
}
RetVal->intVal = ErrorCode;
if (hTransactLog != INVALID_HANDLE_VALUE)
CloseHandle(hTransactLog);
if (TranslogName != NULL)
free (TranslogName);
return S_OK;
}
/*
Purpose: Upload a file that is part of a transaction via
The microsoft redirector through HTTP
*/
STDMETHODIMP
CCerClient::Upload(
BSTR *Path,
BSTR *TransID,
BSTR *FileName,
BSTR *IncidentID,
BSTR *RedirParam,
VARIANT *RetCode
)
{
return E_NOINTERFACE ;
}
STDMETHODIMP
CCerClient::RetryTransaction(
BSTR *Path,
BSTR *TransID,
BSTR *FileName,
VARIANT *RetVal
)
{
// TODO: Add your implementation code here
return E_NOINTERFACE ;
}
STDMETHODIMP
CCerClient::RetryFile(
BSTR *Path,
BSTR *TransID,
BSTR FileName,
VARIANT *RetCode
)
{
return E_NOINTERFACE ;
}
// Get Upload Server Name
int
CCerClient::
GetUploadServerName (
wchar_t* RedirectorParam,
wchar_t* Language,
wchar_t* ServerName
)
{
DWORD ErrorCode = 0;
HINTERNET hRedirUrl = NULL;
wchar_t* pUploadUrl = NULL;
HINTERNET hSession;
BOOL bRet = TRUE;
DWORD dwLastError = FALSE;
URL_COMPONENTSW urlComponents;
DWORD dwUrlLength = 0;
wchar_t ConnectString [255];
if (Language )
{
wsprintfW(ConnectString,L"http://go.microsoft.com/fwlink/?linkid=%s",RedirectorParam);
}
else
{
wsprintfW(ConnectString,L"http://go.microsoft.com/fwlink/?linkid=%s",RedirectorParam);
}
hSession = InternetOpenW(L"CerClient Control",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if (!hSession)
{
ErrorCode = GetLastError();
return ErrorCode;
}
hRedirUrl = InternetOpenUrlW(hSession, ConnectString, NULL, 0, 0, 0);
if(!hRedirUrl)
{
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
return ErrorCode;
}
// Get the URL returned from the MS Corporate IIS redir.dll isapi URL redirector
dwUrlLength = 512;
pUploadUrl = (wchar_t*)malloc(dwUrlLength);
if(!pUploadUrl)
{
//ReturnCode->intVal = GetLastError();
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
InternetCloseHandle(hRedirUrl);
return ErrorCode;
}
do
{
ZeroMemory(pUploadUrl, dwUrlLength);
bRet = InternetQueryOptionW(hRedirUrl, INTERNET_OPTION_URL, pUploadUrl, &dwUrlLength);
if(!bRet)
{
dwLastError = GetLastError();
// If last error was due to insufficient buffer size, create a new one the correct size.
if(dwLastError == ERROR_INSUFFICIENT_BUFFER)
{
free(pUploadUrl);
pUploadUrl = (wchar_t*)malloc(dwUrlLength);
if(!pUploadUrl)
{
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
InternetCloseHandle(hRedirUrl);
if (pUploadUrl)
free (pUploadUrl);
return ErrorCode;
}
}
else
{
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
InternetCloseHandle(hRedirUrl);
if (pUploadUrl)
free (pUploadUrl);
return ErrorCode;
}
}
}while(!bRet);
// Strip out the host name from the URL
ZeroMemory(&urlComponents, sizeof(URL_COMPONENTSW));
urlComponents.dwStructSize = sizeof(URL_COMPONENTSW);
urlComponents.lpszHostName = NULL;
urlComponents.dwHostNameLength = 512;
urlComponents.lpszHostName = (wchar_t*)malloc(urlComponents.dwHostNameLength );
if(!urlComponents.lpszHostName)
{
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
InternetCloseHandle(hRedirUrl);
if (pUploadUrl)
free (pUploadUrl);
return ErrorCode;
}
do
{
ZeroMemory(urlComponents.lpszHostName, urlComponents.dwHostNameLength);
bRet = InternetCrackUrlW(pUploadUrl, dwUrlLength, 0, &urlComponents);
if(!bRet)
{
dwLastError = GetLastError();
// If last error was due to insufficient buffer size, create a new one the correct size.
if(dwLastError == ERROR_INSUFFICIENT_BUFFER)
{
if (urlComponents.lpszHostName != NULL)
free(urlComponents.lpszHostName);
if ( (urlComponents.lpszHostName = (wchar_t*)malloc(urlComponents.dwHostNameLength) )!= NULL)
{
ZeroMemory(urlComponents.lpszHostName,urlComponents.dwHostNameLength);
}
else
{
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
InternetCloseHandle(hRedirUrl);
if (pUploadUrl)
free (pUploadUrl);
return ErrorCode;
}
}
else
{
ErrorCode = GetLastError();
InternetCloseHandle(hSession);
InternetCloseHandle(hRedirUrl);
if (pUploadUrl)
free (pUploadUrl);
return ErrorCode;
}
}
}while(!bRet);
if (hRedirUrl)
InternetCloseHandle(hRedirUrl);
if (hSession)
InternetCloseHandle(hSession);
if (pUploadUrl)
free (pUploadUrl);
wcscpy (ServerName, (wchar_t *)urlComponents.lpszHostName);
if (urlComponents.lpszHostName)
free (urlComponents.lpszHostName);
return 0;
}
STDMETHODIMP
CCerClient::GetFileNames(
BSTR *Path,
BSTR *TransID,
VARIANT *Count,
VARIANT *FileList
)
{
wchar_t *OldFileList= NULL; // Files contained in Transid.Queue.log
wchar_t *NewFileList= NULL; // Files to be re-written to Transid.Queue.log
CComBSTR RetFileList = L""; // List of files to return.
HANDLE hTransIDLog = INVALID_HANDLE_VALUE; // Handle to original Transid.Queue.Log file
wchar_t LogFilePath[MAX_PATH]; // Path to Transid.queue.log file
wchar_t *Temp;
DWORD dwFileSize;
DWORD dwBytesRead;
DWORD dwBytesWritten;
int ErrorCode = 0;
WORD ByteOrderMark = 0xFEFF;
int MaxCount;
switch (Count->vt)
{
case VT_INT:
MaxCount = Count->intVal;
break;
case VT_I2:
MaxCount = Count->iVal;
break;
default:
MaxCount = Count->iVal;
}
// WCHAR Msg[255];
// wsprintfW(Msg,L"Path: %s, TransID: %s, Count: %d, MaxCount: %d",*Path, *TransID, Count->iVal, MaxCount);
// ::MessageBoxW(NULL,Msg,L"Getting File Names",MB_OK);
if ( ( *Path == NULL) || (!wcscmp ( *Path, L"\0")) )
{
ErrorCode = NO_SHARE_PATH;
}
else
{
// Build path to original TransID.queue.log file.
wsprintfW (LogFilePath,L"%s\\%s.txt",*Path, *TransID);
// Open the List of queued files.
hTransIDLog = CreateFileW(LogFilePath,
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
// Find out where we left off.
if (hTransIDLog == (INVALID_HANDLE_VALUE))
{
ErrorCode = FILE_OPEN_FAILED;
}
else
{
dwFileSize = GetFileSize(hTransIDLog,NULL);
OldFileList = (wchar_t*) malloc (dwFileSize * 3);
NewFileList = (wchar_t*) malloc (dwFileSize * 3);
if ( (!OldFileList) || (!NewFileList))
{
ErrorCode = OUT_OF_MEMORY;
if (NewFileList) free (NewFileList);
if (OldFileList) free (OldFileList);
}
else
{
ZeroMemory (OldFileList, dwFileSize * 2);
ZeroMemory (NewFileList, dwFileSize * 2);
if (!
ReadFile(hTransIDLog, OldFileList,
dwFileSize,&dwBytesRead,NULL))
{
CloseHandle(hTransIDLog);
goto Done;
}
CloseHandle (hTransIDLog);
hTransIDLog = INVALID_HANDLE_VALUE;
if (dwBytesRead == 0)
{
ErrorCode = FILE_READ_FAILED;
}
else
{
// read through the file buffer until we find a filename that
// does not start with a -
Temp = OldFileList;
wchar_t* pNewFileList=NULL;
wchar_t FileName[MAX_PATH];
DWORD CharCount = dwFileSize;
++Temp;
--CharCount;
pNewFileList = NewFileList;
if (*Temp == L'-')
{
BOOL Done = FALSE;
// Lets find our starting position
do
{
while( (*Temp != L'\n') && ((CharCount > 0) && (CharCount <= dwFileSize) ))
{
*pNewFileList = *Temp;
++Temp;
--CharCount;
++pNewFileList;
}
*pNewFileList = *Temp;
++pNewFileList;
++Temp; // Skip over the newline
--CharCount;
if (*Temp != L'-')
Done = TRUE;
*pNewFileList = L'\0';
} while ( (!Done) && ( (CharCount > 0) && (CharCount <= dwFileSize) ));
}
if ( (CharCount > 0) && (CharCount <= dwFileSize) )
{
// Now build the lists....
int dwFileCount = 0;
wchar_t *NewFL;
// wsprintfW(Msg, L"MaxCount = %d", MaxCount);
// ::MessageBoxW(NULL,Msg,L"MAX_COUNT",MB_OK);
while ( (dwFileCount < MaxCount) &&
(CharCount > 0) && (CharCount < dwFileSize) )
{
ZeroMemory (FileName, sizeof(FileName));
NewFL = FileName;
*NewFL = *Temp;
++NewFL;
++Temp;
-- CharCount;
// Copy characters until we hit a carriage return
while ( (*Temp != L'\r') && ( (CharCount > 0) && (CharCount <= dwFileSize) ))
{
*NewFL = *Temp;
++ NewFL;
++ Temp;
-- CharCount;
*NewFL = L'\0';
}
// Add the new file name to the Return File List string
if (wcslen (FileName) > 0)
{
RetFileList += FileName;
RetFileList += L";";
dwFileCount++;
// only add the cr and lf codes to the NewFileList string.
*NewFL = *Temp;
++NewFL;
++Temp;
--CharCount;
*NewFL = *Temp;
++ Temp;
--CharCount;
wcscat(NewFileList,L"-");
wcscat(NewFileList,FileName);
}
}
// Delete the Current transaction queue file
if (!DeleteFileW(LogFilePath) )
{
//::MessageBoxW(NULL,L"Failed to delete .txt file",NULL,MB_OK);
;
}
hTransIDLog = CreateFileW( LogFilePath,
GENERIC_WRITE,
NULL,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hTransIDLog != INVALID_HANDLE_VALUE)
{
WriteFile(hTransIDLog, &ByteOrderMark,2,&dwBytesWritten,NULL);
WriteFile(hTransIDLog,
NewFileList,
wcslen(NewFileList) * sizeof(wchar_t),
&dwBytesWritten,
NULL);
WriteFile(hTransIDLog,
Temp,
wcslen(Temp) * sizeof(wchar_t),
&dwBytesWritten,
NULL);
CloseHandle(hTransIDLog);
hTransIDLog = INVALID_HANDLE_VALUE;
}
}
if (NewFileList)
free (NewFileList);
if (OldFileList)
free (OldFileList);
}
}
}
}
if (hTransIDLog != INVALID_HANDLE_VALUE)
CloseHandle(hTransIDLog);
// ::MessageBoxW(NULL,RetFileList,L"Returning these files after Write",MB_OK);
// wsprintfW(Msg, L"Error code = %d", ErrorCode);
// ::MessageBoxW(NULL,Msg,L"Current Error Status",MB_OK);
Done:
FileList->vt = VT_BSTR;
FileList->bstrVal = RetFileList.Detach();
if(NewFileList)
free(NewFileList);
if(OldFileList)
free(OldFileList);
return S_OK;
}
STDMETHODIMP CCerClient::Browse(BSTR *WindowTitle, VARIANT *Path)
{
BROWSEINFOW BrowseInfo;
CComBSTR SharePath = L"";
LPMALLOC lpMalloc;
HWND hParent;
LPITEMIDLIST pidlSelected = NULL;
wchar_t TempPath[MAX_PATH];
CComBSTR WindowText = *WindowTitle;
WindowText += L" - Microsoft Internet Explorer";
hParent = FindWindowExW(NULL,NULL,L"IEFrame",WindowText);
ZeroMemory (&BrowseInfo,sizeof(BROWSEINFO));
BrowseInfo.hwndOwner = hParent;
BrowseInfo.ulFlags = BIF_USENEWUI | BIF_EDITBOX;
if(::SHGetMalloc(&lpMalloc) == NOERROR)
{
pidlSelected = SHBrowseForFolderW(&BrowseInfo);
if (::SHGetPathFromIDListW(pidlSelected, TempPath))
lpMalloc->Release();
SharePath+=TempPath;
}
Path->vt = VT_BSTR;
Path->bstrVal = SharePath.Detach();
return S_OK;
}
DWORD
CCerClient::GetComputerNameFromCSV(
wchar_t* CsvFileName,
wchar_t* FileName,
wchar_t* ComputerName
)
{
wchar_t *Buffer = NULL;
BOOL Done = FALSE;
HANDLE hCsv = INVALID_HANDLE_VALUE;
wchar_t TempFileName[MAX_PATH];
wchar_t *Source = NULL;
wchar_t *Dest = NULL;
DWORD FileSize = 0;
DWORD dwBytesRead = 0;
// Move to the beginning of the file.
//::MessageBoxW(NULL,L"Getting the ComputerName from the CSV file",NULL,MB_OK);
hCsv = CreateFileW(CsvFileName,
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hCsv != INVALID_HANDLE_VALUE)
{
FileSize = GetFileSize(hCsv,NULL);
if (FileSize > 0)
{
if ((Buffer = ( (wchar_t *) malloc (FileSize * 2))) == NULL)
{
CloseHandle(hCsv);
return 0;
}
}
else
{
CloseHandle(hCsv);
return 0;
}
// Now look for the Filename
ZeroMemory(TempFileName,MAX_PATH * sizeof(wchar_t));
ZeroMemory(Buffer,FileSize * 2);
if (!ReadFile(hCsv,
Buffer,
FileSize * 2,
&dwBytesRead,
NULL))
{
CloseHandle (hCsv);
goto Done;
}
Source = Buffer;
int Testing = IS_TEXT_UNICODE_SIGNATURE;
// If the unicode header bytes appear remove skip past them
if (IsTextUnicode(Buffer,FileSize * 2,&Testing))
{
++Source;
}
while (! Done)
{
Dest = TempFileName;
while ( (*Source != L'\r') &&
(*Source != L'\0') &&
(*Source != L',') )
{
*Dest = *Source;
++Source;
++Dest;
}
// Null Terminate the destination string.
*Dest = L'\0';
if (!wcscmp(TempFileName, FileName))
{
++Source; // Skip the Comma
// Now copy the computer name into ComputerName
Dest = ComputerName;
while ( *Source != L',' )
{
*Dest = *Source;
++Dest;
++Source;
}
// Null Terminate the ComputerName
*Dest = L'\0';
Done = TRUE;
}
else
{
ZeroMemory(TempFileName,MAX_PATH * sizeof(wchar_t));
while ((*Source != L'\n') && (*Source != L'\0'))
++ Source;
if (*Source != L'\0')
++Source; // skip the newline
else
Done = TRUE;
}
}
CloseHandle(hCsv);
}
Done:
if (Buffer)
free (Buffer);
return 1;
}
// Purpose: Given a list of comma seperated file names
// Return the list as filename,computername; etc...
STDMETHODIMP CCerClient::GetCompuerNames(BSTR *Path, BSTR *TransID, BSTR *FileList, VARIANT *RetFileList)
{
return E_NOINTERFACE ;
}
STDMETHODIMP CCerClient::GetAllComputerNames(BSTR *Path, BSTR *TransID, BSTR *FileList, VARIANT *ReturnList)
{
wchar_t CsvFileName[MAX_PATH];
// BOOL Done = FALSE;
CComBSTR FinalList = L"";
// FILE *hCsv = NULL;
wchar_t FileName[MAX_PATH];
wchar_t *Source = NULL;
wchar_t *Dest = NULL;
wchar_t ComputerName[MAX_PATH];
BOOL Done2 = FALSE;
//::MessageBoxW(NULL,*Path,L"Path to files",MB_OK);
//::MessageBoxW(NULL,*TransID,L"TransID",MB_OK);
//::MessageBoxW(NULL,*FileList,L"File List",MB_OK);
ZeroMemory (ComputerName, MAX_PATH *sizeof(wchar_t));
if (PathIsDirectoryW(*Path))
{
// Build csv file name
wsprintfW(CsvFileName, L"%s\\%s.csv",*Path,*TransID);
//::MessageBoxW(NULL,CsvFileName,L"Looking for CSV File: ",MB_OK);
if (PathFileExistsW(CsvFileName))
{
// now go through the file list and get the machine names
Source = *FileList;
while(!Done2)
{
//::MessageBoxW(NULL,L"Inside the while loop",NULL,MB_OK);
ZeroMemory(FileName, MAX_PATH );
Dest = FileName;
while ((*Source != L'\r') &&
(*Source != L'\0') && (*Source != L',') )
{
*Dest = *Source;
++Source;
++Dest;
}
// Null Terminate the destination string.
*Dest = L'\0';
Dest = FileName;
if (!wcscmp(Dest, L"\0"))
Done2 = TRUE;
else
{
// Get the ComputerName;
//::MessageBoxW(NULL,FileName, L"Getting computer name for file: ",MB_OK);
if (GetComputerNameFromCSV(CsvFileName, FileName, ComputerName))
{
//::MessageBoxW(NULL,ComputerName,L"Computer Name Found: ",MB_OK);
// add the file Name and computer name to the return list
FinalList+= FileName;
FinalList += L",";
FinalList += ComputerName;
FinalList += L";";
}
}
if (*Source == L'\0')
Done2 = TRUE;
else
++Source;
}
}
else
{
//MessageBoxW(NULL,L"Failed to locate CSV File",CsvFileName,MB_OK)
ReturnList->vt = VT_INT;
ReturnList->intVal = FILE_DOES_NOT_EXIST;
return S_OK;
}
}
ReturnList->vt = VT_BSTR;
ReturnList->bstrVal = FinalList.Detach();
return S_OK;
}
int
CCerClient::GetNewFileNameFromCSV(wchar_t *Path, wchar_t *transid, wchar_t *FileName,wchar_t *NewFileName)
{
wchar_t CsvFileName[MAX_PATH];
wchar_t *Buffer = NULL;
BOOL Done = FALSE;
HANDLE hCsv = INVALID_HANDLE_VALUE;
wchar_t TempFileName[MAX_PATH];
wchar_t *Source = NULL;
wchar_t *Dest = NULL;
DWORD FileSize = 0;
DWORD dwBytesRead = 0;
// Move to the beginning of the file.
wsprintfW(CsvFileName,L"%s\\%s.csv",Path,transid);
wcscpy (NewFileName,L"\0");
hCsv = CreateFileW(CsvFileName,
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hCsv != INVALID_HANDLE_VALUE)
{
FileSize = GetFileSize(hCsv,NULL);
if (FileSize > 0)
{
if ( (Buffer = (wchar_t *) malloc (FileSize * 2)) ==NULL)
{
CloseHandle(hCsv);
return 0;
}
}
else
{
CloseHandle(hCsv);
return 0;
}
// Now look for the Filename
ZeroMemory(TempFileName,MAX_PATH * sizeof(wchar_t));
ZeroMemory(Buffer,FileSize * 2);
if (!ReadFile(hCsv,
Buffer,
FileSize * 2,
&dwBytesRead,
NULL))
{
CloseHandle(hCsv);
goto Done;
}
Source = Buffer;
int Testing = IS_TEXT_UNICODE_SIGNATURE;
// If the unicode header bytes appear remove skip past them
if (IsTextUnicode(Buffer,FileSize * 2,&Testing))
{
++Source;
}
while (! Done)
{
Dest = TempFileName;
while ( (*Source != L'\r') &&
(*Source != L'\0') &&
(*Source != L',') )
{
*Dest = *Source;
++Source;
++Dest;
}
// Null Terminate the destination string.
*Dest = L'\0';
if (!wcscmp(TempFileName, FileName))
{
// We found the original file name now retrieve the new file name
++Source; // Skip the Comma
while (*Source != L',') // The new file name is in field 3
++Source;
++Source; // Skip the comma
// Now copy the computer name into ComputerName
Dest = NewFileName;
while ( (*Source != L'\r') &&
(*Source != L'\0') )
{
*Dest = *Source;
++Dest;
++Source;
}
// Null Terminate the ComputerName
*Dest = L'\0';
Done = TRUE;
}
else
{
ZeroMemory(TempFileName,MAX_PATH * sizeof(wchar_t));
while (*Source != L'\n')
++ Source;
++Source; // skip the newline
}
}
CloseHandle(hCsv);
}
Done:
if (Buffer)
free (Buffer);
if (wcscmp(NewFileName,L"\0"))
return 1;
else
return 0;
}
STDMETHODIMP CCerClient::RetryFile1(BSTR *Path, BSTR *TransID, BSTR *FileName, BSTR *IncidentID, BSTR *RedirParam, VARIANT *RetCode)
{
// Get the Name we renamed the file to
// Build the source path to the renamed file
wchar_t DestFileName[MAX_PATH];
wchar_t SourceFileName[MAX_PATH];
wchar_t ServerName[MAX_PATH];
int ErrorCode = 0;
HINTERNET hSession = NULL;
HINTERNET hRequest = NULL;
HINTERNET hConnect = NULL;
INTERNET_BUFFERS BufferIn = {0};
DWORD ResponseCode = 0;
BOOL UploadSuccess = FALSE;
DWORD NumRetries = 0;
HANDLE hSourceFile = INVALID_HANDLE_VALUE;
BYTE *pSourceBuffer = NULL;
DWORD dwBytesRead = 0;
DWORD dwBytesWritten = 0;
BOOL bRet = FALSE;
DWORD ResLength = 255;
DWORD index = 0;
DWORD MaxRetries = 5;
// wchar_t MachineName[512];
// wchar_t CSVBuffer[512];
// HANDLE hCsvFile = INVALID_HANDLE_VALUE;
wchar_t CSVFileName[255];
// WORD ByteOrderMark = 0xFEFF;
wchar_t NewFileName[MAX_PATH];
static const wchar_t *pszAccept[] = {L"*.*", 0};
// Build the destination FileName
if (!GetNewFileNameFromCSV(*Path,*TransID,*FileName,NewFileName))
{
RetCode->vt = VT_INT;
RetCode->intVal = -10;
}
// Build Source File Name
wsprintfW(SourceFileName, L"%s\\%s", *Path, NewFileName);
// Get the ServerName from the redirector
ErrorCode = GetUploadServerName(*RedirParam,NULL,ServerName);
wsprintfW(CSVFileName,L"%s\\%s.csv",*Path,*TransID);
if (!PathFileExistsW(SourceFileName))
ErrorCode = FILE_DOES_NOT_EXIST;
if ( (!wcscmp(*TransID,L"")) || ((*TransID)[0] == L' ') )
ErrorCode = NO_TRANS_ID;
wsprintfW(DestFileName, L"CerInqueue\\U_%s.%s.%s",*TransID,*IncidentID,*FileName);
if ( (pSourceBuffer = (BYTE *) malloc (10000)) == NULL)
{
ErrorCode = GetLastError();
goto Done;
}
if (!ErrorCode)
{
// Open the internet session
while ((NumRetries < MaxRetries) && (!UploadSuccess))
{
// ::MessageBoxW(NULL,L"Opening the session",NULL,MB_OK);
hSession = InternetOpenW(L"CerClientControl",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if (!hSession)
{
free (pSourceBuffer);
ErrorCode = GetLastError();
return ErrorCode;
}
// ::MessageBoxW(NULL,L"We have a session",NULL,MB_OK);
hConnect = InternetConnectW(hSession,
ServerName,
INTERNET_DEFAULT_HTTP_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL);
if (hConnect)
{
// ::MessageBoxW(NULL,L"We have a connection",NULL,MB_OK);
hRequest = HttpOpenRequestW (hConnect,
L"PUT",
DestFileName,
NULL,
NULL,
pszAccept,
INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_NO_CACHE_WRITE,
0);
if (hRequest)
{
hSourceFile = CreateFileW( SourceFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//::MessageBoxW(NULL,L"Request has been opened",NULL,MB_OK);
if (hSourceFile != INVALID_HANDLE_VALUE)
{
// Clear the buffer
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERSW );
BufferIn.Next = NULL;
BufferIn.lpcszHeader = NULL;
BufferIn.dwHeadersLength = 0;
BufferIn.dwHeadersTotal = 0;
BufferIn.lpvBuffer = NULL;
BufferIn.dwBufferLength = 0;
BufferIn.dwOffsetLow = 0;
BufferIn.dwOffsetHigh = 0;
BufferIn.dwBufferTotal = GetFileSize (hSourceFile, NULL);
ZeroMemory(pSourceBuffer, 10000); // Fill buffer with data
if(HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
{
// ::MessageBoxW(NULL,L"Sending Request",NULL,MB_OK);
do
{
dwBytesRead = 0;
if(! ReadFile(hSourceFile, pSourceBuffer, 10000, &dwBytesRead, NULL) )
{
ErrorCode = GetLastError();
}
else
{
bRet = InternetWriteFile(hRequest, pSourceBuffer, dwBytesRead, &dwBytesWritten);
if ( (!bRet) || (dwBytesWritten==0) )
{
ErrorCode = GetLastError();
}
}
} while ((dwBytesRead == 10000) && (!ErrorCode) );
if (!ErrorCode)
{
bRet = HttpEndRequest(hRequest, NULL, 0, 0);
if (!bRet)
{
ErrorCode = GetLastError();
}
else
{
// ::MessageBoxW(NULL,L"Ending Request",NULL,MB_OK);
ResponseCode = 0;
HttpQueryInfo(hRequest,
HTTP_QUERY_STATUS_CODE |HTTP_QUERY_FLAG_NUMBER ,
&ResponseCode,
&ResLength,
&index);
if ( (ResponseCode == 200) || (ResponseCode == 201))
{
ErrorCode = 0;
UploadSuccess = TRUE;
// ::MessageBoxW(NULL,L"Upload was successfull",NULL,MB_OK);
}
else
{
ErrorCode= ResponseCode;
++NumRetries;
}
}
}
}
}
}
}
// ::MessageBoxW(NULL,L"Cleaning Up",NULL,MB_OK);
if (!UploadSuccess)
{
++NumRetries;
}
if (hSourceFile != INVALID_HANDLE_VALUE)
CloseHandle (hSourceFile);
if (hRequest)
InternetCloseHandle(hRequest);
if (hConnect)
InternetCloseHandle(hConnect);
if (hSession)
InternetCloseHandle(hSession);
}
// ::MessageBoxW(NULL,L"freeing source buffer",NULL,MB_OK);
if (pSourceBuffer)
{
free (pSourceBuffer);
pSourceBuffer = NULL;
}
}
Done:
if (pSourceBuffer)
free(pSourceBuffer);
RetCode->vt = VT_INT;
RetCode->intVal = ErrorCode;
return S_OK;
}
STDMETHODIMP CCerClient::EndTransaction(BSTR *SharePath, BSTR *TransID, VARIANT *RetCode)
{
wchar_t TransfileName[MAX_PATH];
RetCode->vt = VT_INT;
RetCode->intVal = 0;
wsprintfW(TransfileName,L"%s\\%s.txt",*SharePath,*TransID);
if (PathFileExistsW(TransfileName))
DeleteFileW(TransfileName);
else
{
RetCode->intVal = 1;
}
return S_OK;
}
STDMETHODIMP CCerClient::Upload1(BSTR *Path, BSTR *TransID, BSTR *FileName, BSTR *IncidentID, BSTR *RedirParam, BSTR *Type, VARIANT *RetCode)
{
// TODO: Add your implementation code here
wchar_t DestFileName[MAX_PATH];
wchar_t SourceFileName[MAX_PATH];
wchar_t ServerName[MAX_PATH];
int ErrorCode = 0;
HINTERNET hSession = NULL;
HINTERNET hRequest = NULL;
HINTERNET hConnect = NULL;
INTERNET_BUFFERS BufferIn = {0};
DWORD ResponseCode = 0;
BOOL UploadSuccess = FALSE;
DWORD NumRetries = 0;
HANDLE hSourceFile = INVALID_HANDLE_VALUE;
BYTE *pSourceBuffer = NULL;
DWORD dwBytesRead = 0;
DWORD dwBytesWritten = 0;
BOOL bRet = FALSE;
DWORD ResLength = 255;
DWORD index = 0;
DWORD MaxRetries = 5;
wchar_t MachineName[512];
wchar_t CSVBuffer[512];
HANDLE hCsvFile = INVALID_HANDLE_VALUE;
wchar_t CSVFileName[255];
WORD ByteOrderMark = 0xFEFF;
static const wchar_t *pszAccept[] = {L"*.*", 0};
if ((!Path) || (!TransID) ||(!FileName) || (!IncidentID) || (!RedirParam) || (!Type))
{
RetCode->vt = VT_INT;
RetCode->intVal = -1;
return S_OK;
}
// Build Source File Name
if (!wcscmp(*FileName,L"\0"))
{
RetCode->vt = VT_INT;
RetCode->intVal = -1;
return S_OK;
}
wsprintfW(SourceFileName, L"%s\\%s", *Path, *FileName);
// Get the ServerName from the redirector
ErrorCode = GetUploadServerName(*RedirParam,NULL,ServerName);
if (!ErrorCode)
{
wsprintfW(CSVFileName,L"%s\\%s.csv",*Path,*TransID);
if ( (!PathFileExistsW(SourceFileName) ) || (wcslen(*FileName) < 4 ))
ErrorCode = FILE_DOES_NOT_EXIST;
if ( (!wcscmp(*TransID,L"")) || ((*TransID)[0] == L' ') )
ErrorCode = NO_TRANS_ID;
// Build the destination FileName
// First see which Virtual directory to use.
if ( !_wcsicmp(*Type,L"bluescreen"))
{
wsprintfW(DestFileName, L"CerBluescreen\\U_%s.%s.%s",*IncidentID,*TransID,*FileName);
}
else
{
if (!_wcsicmp(*Type,L"appcompat"))
{
wsprintfW(DestFileName, L"CerAppCompat\\U_%s.%s.%s",*IncidentID,*TransID,*FileName);
}
else
{
if (!_wcsicmp(*Type,L"shutdown"))
{
wsprintfW(DestFileName, L"CerShutdown\\U_%s.%s.%s",*IncidentID,*TransID,*FileName);
}
else
{
ErrorCode = UNKNOWN_UPLOAD_TYPE;
}
}
}
}
if (!ErrorCode)
{
pSourceBuffer = (BYTE *) malloc (10000);
if (!pSourceBuffer)
{
if (! pSourceBuffer)
{
ErrorCode = GetLastError();
}
}
}
if (!ErrorCode)
{
// Open the internet session
while ((NumRetries < MaxRetries) && (!UploadSuccess))
{
// ::MessageBoxW(NULL,L"Opening the session",NULL,MB_OK);
hSession = InternetOpenW(L"CerClientControl",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if (!hSession)
{
free (pSourceBuffer);
ErrorCode = GetLastError();
return ErrorCode;
}
// ::MessageBoxW(NULL,L"We have a session",NULL,MB_OK);
hConnect = InternetConnectW(hSession,
ServerName,
INTERNET_DEFAULT_HTTP_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL);
if (hConnect)
{
// ::MessageBoxW(NULL,L"We have a connection",NULL,MB_OK);
hRequest = HttpOpenRequestW (hConnect,
L"PUT",
DestFileName,
NULL,
NULL,
pszAccept,
INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_NO_CACHE_WRITE,
0);
if (hRequest)
{
hSourceFile = CreateFileW( SourceFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//::MessageBoxW(NULL,L"Request has been opened",NULL,MB_OK);
if (hSourceFile != INVALID_HANDLE_VALUE)
{
// Clear the buffer
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERSW );
BufferIn.Next = NULL;
BufferIn.lpcszHeader = NULL;
BufferIn.dwHeadersLength = 0;
BufferIn.dwHeadersTotal = 0;
BufferIn.lpvBuffer = NULL;
BufferIn.dwBufferLength = 0;
BufferIn.dwOffsetLow = 0;
BufferIn.dwOffsetHigh = 0;
BufferIn.dwBufferTotal = GetFileSize (hSourceFile, NULL);
ZeroMemory(pSourceBuffer, 10000); // Fill buffer with data
if(HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
{
// ::MessageBoxW(NULL,L"Sending Request",NULL,MB_OK);
do
{
dwBytesRead = 0;
if(! ReadFile(hSourceFile, pSourceBuffer, 10000, &dwBytesRead, NULL) )
{
ErrorCode = GetLastError();
}
else
{
bRet = InternetWriteFile(hRequest, pSourceBuffer, dwBytesRead, &dwBytesWritten);
if ( (!bRet) || (dwBytesWritten==0) )
{
ErrorCode = GetLastError();
}
}
} while ((dwBytesRead == 10000) && (!ErrorCode) );
if (!ErrorCode)
{
bRet = HttpEndRequest(hRequest, NULL, 0, 0);
if (!bRet)
{
ErrorCode = GetLastError();
}
else
{
// ::MessageBoxW(NULL,L"Ending Request",NULL,MB_OK);
ResponseCode = 0;
HttpQueryInfo(hRequest,
HTTP_QUERY_STATUS_CODE |HTTP_QUERY_FLAG_NUMBER ,
&ResponseCode,
&ResLength,
&index);
if ( (ResponseCode == 200) || (ResponseCode == 201))
{
ErrorCode = 0;
UploadSuccess = TRUE;
// ::MessageBoxW(NULL,L"Upload was successfull",NULL,MB_OK);
}
else
{
ErrorCode= ResponseCode;
++NumRetries;
}
}
}
}
}
}
}
// ::MessageBoxW(NULL,L"Cleaning Up",NULL,MB_OK);
if (!UploadSuccess)
{
++NumRetries;
}
if (hSourceFile != INVALID_HANDLE_VALUE)
CloseHandle (hSourceFile);
if (hRequest)
InternetCloseHandle(hRequest);
if (hConnect)
InternetCloseHandle(hConnect);
if (hSession)
InternetCloseHandle(hSession);
}
if (pSourceBuffer)
{
free (pSourceBuffer);
pSourceBuffer = NULL;
}
}
if ( !ErrorCode)
{
// Get the Computer Name
// if there are no errors rename the file just uploaded.
wchar_t NewFileName[MAX_PATH];
wchar_t FullPath[MAX_PATH];
wcscpy (NewFileName, *FileName);
int x = 0;
BOOL DONE = FALSE;
NewFileName[wcslen(NewFileName)] = L'\0';
// First try just .old
DWORD NameLength = 0;
NameLength = wcslen(FullPath)+ wcslen(L"\\.old");
if (NameLength > MAX_PATH) // nope it won't fit. Reduce the file name length by the difference.
{
NewFileName[wcslen(NewFileName) - (MAX_PATH - NameLength)] = L'\0';
}
wsprintfW(FullPath,L"%s\\%s.old",*Path,NewFileName);
if (!PathFileExistsW(FullPath))
{
MoveFileW(SourceFileName, FullPath);
DONE = TRUE;
}
else
{ // if that fails then we have to try another method.
while (!DONE)
{
wcscpy (NewFileName, *FileName);
NewFileName[wcslen(NewFileName)] = L'\0';
wsprintfW(NewFileName, L"%s.old%d",*FileName,x);
if ( (wcslen(*Path) + wcslen(L"\\") + wcslen(NewFileName)) > MAX_PATH)
{
// Reduce file name by Diff of MAX_PATH and Total name Length
NameLength = wcslen(*Path) + wcslen(L"\\") + wcslen(NewFileName);
wcscpy(NewFileName,*FileName);
NewFileName[wcslen(NewFileName - NameLength)]=L'\0';
wsprintfW(FullPath, L"%s\\%s.old%d", *Path, NewFileName, x);
}
else
{
wsprintfW(FullPath,L"%s\\%s.old%d",*Path,NewFileName,x);
}
if (!PathFileExistsW(FullPath))
{
MoveFileW(SourceFileName, FullPath);
DONE = TRUE;
}
else
++x;
}
}
// Update the Upload CSV File
if (!ErrorCode)
{
// ::MessageBoxW(NULL,L"Updateing the csv",NULL,MB_OK);
wcscpy(MachineName,L"\0");
GetMachineName(*Path, *FileName, MachineName);
ZeroMemory(CSVBuffer, 512);
if (!wcscmp(MachineName,L"\0"))
{
wsprintfW(CSVBuffer, L"%s,,%s\r\n",*FileName,PathFindFileNameW(FullPath));
}
else
{
wsprintfW(CSVBuffer, L"%s,%s,%s\r\n", *FileName,MachineName,PathFindFileNameW(FullPath));
}
hCsvFile = CreateFileW(CSVFileName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hCsvFile == INVALID_HANDLE_VALUE)
{
// Ok We Need to create a new one. Don't forget the Unicode Signature.
hCsvFile = CreateFileW(CSVFileName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
// Write the Unicode Signature
if (hCsvFile != INVALID_HANDLE_VALUE)
{
WriteFile(hCsvFile, &ByteOrderMark,2,&dwBytesWritten,NULL);
}
}
if (hCsvFile != INVALID_HANDLE_VALUE)
{
// continue as if the file was created before
wchar_t* TempBuffer = (wchar_t*) malloc (10000);
if (TempBuffer != NULL)
{
do
{
if (!ReadFile(hCsvFile,TempBuffer,10000,&dwBytesRead,NULL))
{
; // we catch this below.
}
}
while(dwBytesRead == 10000);
free (TempBuffer);
WriteFile( hCsvFile, CSVBuffer,wcslen(CSVBuffer) *sizeof(wchar_t), &dwBytesWritten,NULL);
CloseHandle(hCsvFile);
}
}
else
ErrorCode = FAILED_TO_UPDATE_CSV;
}
}
// Return Upload Status
// ::MessageBoxW(NULL,L"Returning from the upload function",NULL,MB_OK);
RetCode->vt = VT_INT;
RetCode->intVal = ErrorCode;
return S_OK;
}
STDMETHODIMP CCerClient::GetSuccessCount(BSTR *Path, BSTR *TransID, VARIANT *RetVal)
{
wchar_t CsvFileName[MAX_PATH];
DWORD FileCount = 0;
FILE *hFile;
wchar_t *Buffer = NULL;
BOOL Done = FALSE;
HANDLE hCsv = INVALID_HANDLE_VALUE;
wchar_t TempFileName[MAX_PATH];
wchar_t *Source = NULL;
wchar_t *Dest = NULL;
DWORD FileSize = 0;
DWORD dwBytesRead = 0;
RetVal->vt = VT_INT;
// Move to the beginning of the file.
//::MessageBoxW(NULL,L"Getting the ComputerName from the CSV file",NULL,MB_OK);
wsprintfW(CsvFileName,L"%s\\%s.csv",*Path,*TransID);
hCsv = CreateFileW(CsvFileName,
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hCsv != INVALID_HANDLE_VALUE)
{
FileSize = GetFileSize(hCsv,NULL);
if (FileSize > 0)
{
if ( (Buffer = (wchar_t *) malloc (FileSize * 2)) == NULL)
{
RetVal->intVal = -4;
CloseHandle(hCsv);
return S_OK;
}
}
else
{
RetVal->intVal = -4;
CloseHandle(hCsv);
return S_OK;
}
// Now look for the Filename
ZeroMemory(TempFileName,MAX_PATH * sizeof(wchar_t));
ZeroMemory(Buffer,FileSize * 2);
if (!ReadFile(hCsv,
Buffer,
FileSize * 2,
&dwBytesRead,
NULL))
{
RetVal->intVal = -4;
CloseHandle(hCsv);
if (Buffer)
free(Buffer);
return S_OK;
}
Source = Buffer;
int Testing = IS_TEXT_UNICODE_SIGNATURE;
// If the unicode header bytes appear remove skip past them
if (IsTextUnicode(Buffer,FileSize * 2,&Testing))
{
++Source;
}
while (! Done)
{
Dest = TempFileName;
while ( (*Source != L'\r') &&
(*Source != L'\0') &&
(*Source != L',') )
{
*Dest = *Source;
++Source;
++Dest;
}
// Null Terminate the destination string.
*Dest = L'\0';
if (wcscmp(TempFileName, L"\0"))
{
// ::MessageBoxW(NULL,TempFileName,L"Read file name from CSV",MB_OK);
++FileCount;
}
ZeroMemory(TempFileName,sizeof(TempFileName));
// Move to the next line
while ( (*Source != L'\r') && (*Source != L'\0'))
{
++Source;
}
if (*Source == L'\r')
{
++Source;
++Source;
}
if (*Source == L'\0')
Done = TRUE;
}
if (FileCount > 0)
{
RetVal->intVal = FileCount;
}
else
{
RetVal->intVal = 0;
}
CloseHandle(hCsv);
}
else
{
RetVal->intVal = -4;
}
if (Buffer)
free (Buffer);
return S_OK;
}