Windows2003-3790/inetcore/connectionwizard/icwphbk/icwsupport.cpp
2020-09-30 16:53:55 +02:00

354 lines
9.4 KiB
C++

//#--------------------------------------------------------------
//
// File: icwsupport.cpp
//
// Synopsis: holds the function which gets the list of
// support phone numbers for ICW
//
// History: 5/8/97 MKarki Created
//
// Copyright (C) 1996-97 Microsoft Corporation
// All rights reserved.
//
//----------------------------------------------------------------
#include "pch.hpp"
#include <windows.h>
#ifdef WIN16
#include <win16def.h>
#include <win32fn.h>
#include <rasc.h>
#include <raserr.h>
#include <ietapi.h>
extern "C" {
#include "bmp.h"
}
#endif
#include "phbk.h"
#include "misc.h"
#include "phbkrc.h"
#include "suapi.h"
#include "icwsupport.h"
#include "ccsv.h"
const TCHAR SUPPORT_FILE[] = TEXT("support.icw");
const DWORD ALLOCATION_SIZE = 256;
//++--------------------------------------------------------------
//
// Function: GetSupportNumsFromFile
//
// Synopsis: This is the function used to get the support
// numbers
//
// Returns: HRESULT - success or error info
//
// Called By: by the GetSupportNumbers API
//
// History: MKarki Created 5/8/97
//
//----------------------------------------------------------------
HRESULT
GetSupportNumsFromFile (
PSUPPORTNUM pSupportNumList,
PDWORD pdwSize
)
{
BOOL bReturnMemNeeded = FALSE;
LPTSTR pszTemp = NULL;
TCHAR szFilePath[MAX_PATH];
BOOL bStatus = FALSE;
CCSVFile *pcCSVFile = NULL;
DWORD dwMemNeeded = 0;
HRESULT hRetVal = ERROR_SUCCESS;
DWORD dwCurrentIndex = 0;
DWORD dwIndexAllocated = 0;
const DWORD INFOSIZE = sizeof (SUPPORTNUM);
PSUPPORTNUM pPhbkArray = NULL;
PSUPPORTNUM pTemp = NULL;
TraceMsg(TF_GENERAL, "Entering GetSupportNumsFromFile function\r\n");
//
// atleast a place where the size can be returned
// should be provided
//
if (NULL == pdwSize)
{
TraceMsg (TF_GENERAL, "pdwSize == NULL\r\n");
hRetVal = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
//
// check if the user has provided the buffers
//
if (NULL == pSupportNumList)
{
TraceMsg (TF_GENERAL, "User justs wants the buffer size\r\n");
bReturnMemNeeded = TRUE;
}
//
// get the full path of the support.icw file
//
bStatus = SearchPath (
NULL,
(PTCHAR)SUPPORT_FILE,
NULL,
MAX_PATH,
(PTCHAR)&szFilePath,
(PTCHAR*)&pszTemp
);
if (FALSE == bStatus)
{
TraceMsg (TF_GENERAL,
"Failed on SearchPath API call with error:%d\r\n",
GetLastError ()
);
hRetVal = ERROR_FILE_NOT_FOUND;
goto Cleanup;
}
//
// now we can start processing the file
//
pcCSVFile = new CCSVFile;
if (NULL == pcCSVFile)
{
TraceMsg (TF_GENERAL, "Could not allocate mem for CCSVFile\r\n");
hRetVal = ERROR_OUTOFMEMORY;
goto Cleanup;
}
//
// open the file here
//
bStatus = pcCSVFile->Open (szFilePath);
if (FALSE == bStatus)
{
TraceMsg (TF_GENERAL, "Filed on CCSVFile :: Open call\r\n");
hRetVal = GetLastError ();
goto Cleanup;
}
//
// now we are ready to get the phone number out of the
// file
//
dwCurrentIndex = 0;
dwIndexAllocated = 0;
do
{
//
// check if we ned to allocate memory
//
if (dwIndexAllocated == dwCurrentIndex)
{
//
// need to allocate memory
//
pTemp = (PSUPPORTNUM) GlobalAlloc (
GPTR,
(int)((dwIndexAllocated + ALLOCATION_SIZE)*INFOSIZE)
);
if (NULL == pTemp)
{
TraceMsg (TF_GENERAL,
"Failed on GlobalAlloc API call with error:%d\r\n",
GetLastError ()
);
hRetVal = ERROR_OUTOFMEMORY;
goto Cleanup;
}
//
// now copy over already allocated memory to this buffer
//
if (NULL != pPhbkArray)
{
CopyMemory (
pTemp,
pPhbkArray,
(int)(dwIndexAllocated)*INFOSIZE
);
//
// free the earlier memory
//
GlobalFree(pPhbkArray);
}
pPhbkArray = pTemp;
dwIndexAllocated += ALLOCATION_SIZE;
}
//
// get the phone number info
//
hRetVal = ReadOneLine (&pPhbkArray[dwCurrentIndex], pcCSVFile);
if (ERROR_NO_MORE_ITEMS == hRetVal)
{
TraceMsg (TF_GENERAL, "we have read all the items from the file\r\n");
break;
}
else if (ERROR_SUCCESS != hRetVal)
{
goto Cleanup;
}
dwCurrentIndex++;
}
while (TRUE);
//
// get the memory needed by the user
//
dwMemNeeded = (DWORD)(dwCurrentIndex)*INFOSIZE;
//
// check if the user wants the info, or just the size
//
if (FALSE == bReturnMemNeeded)
{
if (*pdwSize >= dwMemNeeded)
{
//
// user wants us to copy over stuff to the memory
// and there is enough space in user buffers.
//
CopyMemory (
pSupportNumList,
pPhbkArray,
(int)dwMemNeeded
);
}
else
{
TraceMsg (TF_GENERAL, "Caller did not allocate enough memory\r\n");
hRetVal = ERROR_NOT_ENOUGH_MEMORY;
goto Cleanup;
}
}
//
// if we reached here, then successfully got the info
//
hRetVal = ERROR_SUCCESS;
Cleanup:
//
// copy the memory used/required to the user size param
//
*pdwSize = dwMemNeeded;
if (NULL != pPhbkArray)
GlobalFree (pPhbkArray);
if (NULL != pcCSVFile)
{
pcCSVFile->Close ();
delete pcCSVFile;
}
TraceMsg (TF_GENERAL, "Leaving GetSupportNumsFromFile function call\r\n");
return (hRetVal);
} // end of GetSupportNumsFromFile function
//++--------------------------------------------------------------
//
// Function: ReadOneLine
//
// Synopsis: This is the function used to put the info
// into the buffer, line by line
//
// Returns: HRESULT - success or error info
//
// Called By: GetSupportNumsFromFile function
//
// History: MKarki Created 5/8/97
//
//----------------------------------------------------------------
HRESULT
ReadOneLine (
PSUPPORTNUM pPhbk,
CCSVFile *pcCSVFile
)
{
TCHAR szTempBuffer[PHONE_NUM_SIZE + 4];
HRESULT hResult = ERROR_SUCCESS;
BOOL bRetVal = FALSE;
if ((NULL == pcCSVFile) || (NULL == pPhbk))
{
TraceMsg (TF_GENERAL, "ReadOneLine: Did not correctly pass args\r\n");
hResult = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
//
// get the country code first
//
bRetVal = pcCSVFile->ReadToken (szTempBuffer, PHONE_NUM_SIZE);
if (FALSE == bRetVal)
{
hResult = ERROR_NO_MORE_ITEMS;
goto Cleanup;
}
//
// Convert the string obtained into a number
//
bRetVal = FSz2Dw (szTempBuffer, (PDWORD)&pPhbk->dwCountryCode);
if (FALSE == bRetVal)
{
hResult = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
//
// now get the phone number
//
bRetVal = pcCSVFile->ReadToken (szTempBuffer, PHONE_NUM_SIZE);
if (FALSE == bRetVal)
{
hResult = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
//
// copy this string into our struct
//
CopyMemory (
pPhbk->szPhoneNumber,
szTempBuffer,
(int)PHONE_NUM_SIZE
);
//
// if we have reached here then success
//
hResult = ERROR_SUCCESS;
Cleanup:
return (hResult);
} // end of ReadOneLine function