|
|
//
// File : DCONV.CPP
// Date : 04/25/97
// Author : Suresh Krishnan
// This file has modules responsible for making the buffer data to be transmitted to the IIS
//
// MDF 1 : 05/07/97 Modified the Table as per StevBush modifications in the BackEnd
// MFD 2 : 03/03/97 Added Division Name and UserID for FE screens
// Phone number will be prefixed with Area Code
// MFD3 : 04/29/98 Added additional 4 fileds to be sent to the backend as a part of
// Taxanomy Screen changes.
// Fields risen from 60 to 64. Fileds added
// SoftwareRole,InfluenceLevel,EngagementLevel,SkillLevel
// MFD4 : 07/21/98 Additional 2 fields to be sent to the backend SCSIAdapter
// and ComputerManufacturer & Model of SystemInventory
// MFD5 : 08/1/98 The MathCoprocessor and Color Depth are no longer necessary to be sent to the back end
// so the items that are sent to the back end are 66-2 = 64
// MFD6 : 08/21/98 Added AreaCode and MiddleName( Middle Initial) fo posting
// So number of Fields for posting 64+2 = 66
// From now on Area code will be sent as a seperate field to the backend
// the logic involved in prefixing with phone number will be removed
//
// MFD7 : 03/10/99 HWID no longer will be Transmitted to the Backend
// Total Entries to Backend 65
//
//
#include <mbstring.h>
#include "RW_Common.h"
#include "resource.h"
#include <tchar.h>
#include "dconv.h"
#include "cntryinf.h"
#include "RegWizMain.h"
extern BOOL bOemDllLoaded; extern HINSTANCE hOemDll;
#define NAME_VALUE_SEPERATOR _T("=") // Seperator between name and its value
#define NAME_SEPERATOR _T("&") // Seperator between the names
#define RW_BLANK _T(' ') // The padding character
#define RW_WITH_URL 1
#define PHONE_NUMBER_SEPERATOR _T("-")
#define MAX_NAME_LENGTH 64 // The Max size of the of the name field
#define VARIABLE_LEN -2
#define REG_SEPERATOR TEXT("\\")
#define MAX_TBL_ENTRIES 65 // No of name fields to be sent to the IIS
#define MAX_REG_VAL_BUF_SZ 300 // The Maximum size of a value associated with name field
#define STRCONVERT_MAXLEN 1024
static TCHAR * GetNameString ( TCHAR **pRet,UINT iId,HINSTANCE hIns) ; int GetRootOfRegWizRegistry(HINSTANCE hInstance , PHKEY phKey); #ifdef _UNICODE
char* ConvertToMB (TCHAR * szW) { static char achA[STRCONVERT_MAXLEN]; WideCharToMultiByte(CP_ACP, 0, szW, -1, achA, STRCONVERT_MAXLEN, NULL, NULL); return achA; } #else
char* ConvertToMB (TCHAR * szW) { return szW; } #endif
// Information processig functions
void RW_Dummy (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { };
void RW_LanguageTranslate (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { LANGID langID = GetSystemDefaultLangID(); VerLanguageName(langID,tcDes,MAX_REG_VAL_BUF_SZ); }
void RW_CreateDateProcess (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { };
void RW_RegisterDateProcess (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { };
void RW_MailingAddressProcess (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { size_t iSrcLen = _tcslen(tcSrc); if(iSrcLen) { _tcscpy(tcDes,TEXT("1")); } else { _tcscpy(tcDes,TEXT("2")); } }
void RW_ValidateTapiCountryCode (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { DWORD dwTapiCntryId; DWORD dwCode = _ttol(tcSrc); dwTapiCntryId = gTapiCountryTable.GetTapiIDForTheCountryIndex(dwCode); _stprintf(tcDes,_T("%d"),dwTapiCntryId);
};
void RW_TranslateCountryCode(_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { DWORD dwCode = _ttol(tcSrc); // Convert the Current code in string to long
_tcscpy(tcDes, gTapiCountryTable.GetCountryName(dwCode));
}
void RW_ParsePhoneNumber(_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { HKEY hKey; DWORD infoSize; TCHAR szR[48]; TCHAR szParam[256]; LONG lRegStatus; TCHAR szInBuf[256]; //
// As a part of FE screen changes it is necessary to Prefix the Area code
// before the phone number
hKey = NULL; if(GetRootOfRegWizRegistry(hIns, &hKey) ) { return; // Not able to open the Registry Tree for Area Code
// so simply return ...
} infoSize = 48; LoadString( hIns, IDS_AREACODE_KEY, szR, sizeof(szR)/ sizeof (TCHAR)); lRegStatus = RegQueryValueEx(hKey,&szR[1],NULL,0,(LPBYTE)szParam,&infoSize); if(tcSrc[0] != _T('\0')){ _tcscpy(szInBuf,tcSrc); }else { szInBuf[0] = _T('\0'); }
if (lRegStatus != ERROR_SUCCESS){ return; // RWZ_INVALID_INFORMATION;
}else { if(szParam[0] != _T('\0')) { _tcscpy(tcDes,szParam); // Area Code
_tcscat(tcDes,PHONE_NUMBER_SEPERATOR); // Separator
_tcscat(tcDes,szInBuf); }else { //No need to do any thing
; } if(hKey) RegCloseKey(hKey); }
}
void RW_PrcsProductId (LPTSTR tcSrc, LPTSTR tcDes , HINSTANCE hIns ) { _TCHAR seps[] = _T("-"); LPTSTR token; LPTSTR buf; if (*tcSrc == 0 ) { *tcDes=0; return; }
buf = new _TCHAR[_tcslen(tcSrc) * sizeof(_TCHAR) +sizeof(_TCHAR)]; if (buf) { token = _tcstok( tcSrc, seps ); _tcscpy(buf,token);
token = _tcstok( NULL, seps ); while( token != NULL ) { /* Get next token: */ _tcscat(buf,token); token = _tcstok( NULL, seps ); } _tcscpy(tcDes,buf);
delete[] buf; } };
//
// void RW_ParseTotalSize (_TCHAR * tcSrc, _TCHAR * tcDes )
// This function retrives the the Size wich is founs as the first token in tcSrc
// After the end of this function the tcDes will be assiged with the Size
//
void RW_ParseTotalSize (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { int isBlankPassed=0; TCHAR tcSteps[] = TEXT(" ,\t\n"); if(*tcSrc == 0 ) { *tcDes=0; return; }
// since the value in tcSrc is "RAM UNIT" so it is encouh if is pass only the first word
TCHAR *tcToken; tcToken =_tcstok(tcSrc, tcSteps); _tcscpy(tcDes,tcToken);
}
//
// void RW_ParseUnits (_TCHAR * tcSrc, _TCHAR * tcDes )
// This function retrives the the unit name wich is founs as the second token in tcSrc
// After the end of this function the tcDes will be assiged with the Units
//
void RW_ParseUnits (_TCHAR * tcSrc, _TCHAR * tcDes , HINSTANCE hIns ) { int isBlankPassed=0; TCHAR tcSteps[] = TEXT(" ,\t\n\0"); if(*tcSrc == 0 ) { *tcDes=0; return; } // since the value in tcSrc is "RAM UNIT" so it is encouh if is pass only the first word
TCHAR *tcToken; tcToken =_tcstok(tcSrc, tcSteps); // get the size
tcToken = _tcstok( NULL, tcSteps); // get the units
_tcscpy(tcDes,tcToken);
}
//
// RegWizInfoDetails
// This structure is used to create a table which has the Namefiled,
// the value reference in the Resource which is to be used to retrive from registry
// and Function to process the value
//
typedef struct RegWizInfoDetails { int m_iIndex; TCHAR m_czName[MAX_NAME_LENGTH]; int m_iLen; int m_ResourceIndex; int m_iParam; void (*m_fp)(_TCHAR * tcSrc, _TCHAR * tcDes, HINSTANCE hIns); } _RegWizInfoDetails ;
static RegWizInfoDetails sRegWizInfoTbl[MAX_TBL_ENTRIES] = { { 1, _T("RegWizVer") ,8, IDS_INFOKEY30, 0, RW_Dummy }, { 2, _T("CodePage") ,5, -1 , 0, RW_Dummy }, { 3, _T("LangCode") ,5, IDS_INFOKEY34 , 0, RW_Dummy }, { 4, _T("LangName") ,30, IDS_INFOKEY34 , 0, RW_LanguageTranslate }, { 5, _T("CreatedDate") ,10, -1 , 0, RW_CreateDateProcess }, { 6, _T("RegDate") ,10, IDS_INFOKEY33, 0, RW_RegisterDateProcess }, { 7, _T("FName") ,VARIABLE_LEN, IDS_INFOKEY1 , 0, RW_Dummy }, { 8, _T("LName") ,VARIABLE_LEN, IDS_INFOKEY2 , 0, RW_Dummy }, { 9, _T("CompanyName") ,VARIABLE_LEN, IDS_INFOKEY3, 0, RW_Dummy }, { 10, _T("AddrType") ,1, IDS_INFOKEY3, 0, RW_MailingAddressProcess }, { 11, _T("Addr1") ,VARIABLE_LEN , IDS_INFOKEY4, 0, RW_Dummy }, { 12, _T("Addr2") ,VARIABLE_LEN, IDS_INFOKEY5, 0, RW_Dummy }, { 13, _T("City") ,VARIABLE_LEN, IDS_INFOKEY6, 0, RW_Dummy }, { 14, _T("State") ,VARIABLE_LEN , IDS_INFOKEY7, 0, RW_Dummy }, { 15, _T("Zip") ,VARIABLE_LEN , IDS_INFOKEY8, 0, RW_Dummy }, { 16, _T("CountryCode") ,4 , IDS_INFOKEY9 , 0, RW_ValidateTapiCountryCode }, { 17, _T("Country") ,60, IDS_INFOKEY9 , 0, RW_TranslateCountryCode }, { 18, _T("Phone") ,VARIABLE_LEN , IDS_INFOKEY10, 0, RW_Dummy }, { 19, _T("NoOther") ,1 , IDS_INFOKEY11, 0, RW_Dummy }, { 20, _T("Product") ,255, IDS_INFOKEY28, 0, RW_Dummy }, { 21, _T("PID") ,20, IDS_INFOKEY12, 0, RW_PrcsProductId }, { 22, _T("OEM") ,255 , IDS_INFOKEY29, 0, RW_Dummy }, { 23, _T("SysInv") ,1, IDS_INFOKEY26, 0, RW_Dummy }, { 24, _T("OS") ,40, IDS_INFOKEY25, 0, RW_Dummy }, { 25, _T("CPU") ,20 , IDS_INFOKEY13, 0, RW_Dummy }, //{ 26, _T("MathCo") ,1 , IDS_INFOKEY14, 0, RW_Dummy },
{ 27, _T("TotalRAM") ,8 , IDS_INFOKEY15, 0, RW_ParseTotalSize}, { 28, _T("RAMUnits") ,2 , IDS_INFOKEY15, 0, RW_ParseUnits}, { 29, _T("TotalDisk") ,8 , IDS_INFOKEY16, 0, RW_ParseTotalSize}, { 30, _T("DiskUnits") ,2 , IDS_INFOKEY16, 0, RW_ParseUnits}, { 31, _T("RemoveableMedia") ,60 , IDS_INFOKEY17, 0, RW_Dummy }, //{ 32, _T("DisplayRes") ,16 , IDS_INFOKEY18 , 0, RW_Dummy },
{ 33, _T("DisplayColorDepth") ,8 , IDS_INFOKEY19 , 0, RW_Dummy }, { 34, _T("PointingDevice") ,75, IDS_INFOKEY20 , 0, RW_Dummy }, { 35, _T("Network") ,75 , IDS_INFOKEY21 , 0, RW_Dummy }, { 36, _T("Modem") ,75 , IDS_INFOKEY22 , 0, RW_Dummy }, { 37, _T("Sound") ,60 , IDS_INFOKEY23 , 0, RW_Dummy }, { 38, _T("CDROM") ,40 , IDS_INFOKEY24 , 0, RW_Dummy }, { 39, _T("ProdInv") ,1 , IDS_INFOKEY27 , 0, RW_Dummy }, { 40, _T("InvProd1") ,75, IDS_PRODUCTBASEKEY, 1, RW_Dummy }, { 41, _T("InvProd2") ,75, IDS_PRODUCTBASEKEY, 2, RW_Dummy }, { 42, _T("InvProd3") ,75, IDS_PRODUCTBASEKEY, 3, RW_Dummy }, { 43, _T("InvProd4") ,75, IDS_PRODUCTBASEKEY, 4, RW_Dummy }, { 44, _T("InvProd5") ,75, IDS_PRODUCTBASEKEY, 5, RW_Dummy }, { 45, _T("InvProd6") ,75, IDS_PRODUCTBASEKEY, 6, RW_Dummy }, { 46, _T("InvProd7") ,75, IDS_PRODUCTBASEKEY, 7, RW_Dummy }, { 47, _T("InvProd8") ,75, IDS_PRODUCTBASEKEY, 8, RW_Dummy }, { 48, _T("InvProd9") ,75, IDS_PRODUCTBASEKEY, 9, RW_Dummy }, { 49, _T("InvProd10") ,75, IDS_PRODUCTBASEKEY, 10,RW_Dummy }, { 50, _T("InvProd11") ,75, IDS_PRODUCTBASEKEY, 11,RW_Dummy }, { 51, _T("InvProd12") ,75, IDS_PRODUCTBASEKEY, 12,RW_Dummy }, { 52, _T("EmailName") ,50, IDS_INFOKEY35, 0, RW_Dummy }, { 53, _T("Reseller") ,30, IDS_INFOKEY36, 0, RW_Dummy }, { 54, _T("ResellerCity") ,20, IDS_INFOKEY37, 0, RW_Dummy }, { 55, _T("ResellerState") ,3, IDS_INFOKEY38, 0, RW_Dummy }, //{ 56, _T("HWID") ,32, IDS_INFOKEY39, 0, RW_Dummy },
{ 57, _T("MSID") ,32, IDS_INFOKEY40, 0, RW_Dummy }, { 58, _T("Extension") ,32, IDS_INFOKEY41, 0, RW_Dummy }, { 59, _T("DivisionName") ,50, IDS_DIVISIONNAME_KEY, 0, RW_Dummy }, { 60, _T("UserID") ,50, IDS_USERID_KEY, 0, RW_Dummy }, { 61, _T("SoftwareRole") ,2, IDS_BUSINESSQ1, 0, RW_Dummy }, { 62, _T("InfluenceLevel") ,2, IDS_HOMEQ1, 0, RW_Dummy }, { 63, _T("EngagementLevel") ,2, IDS_HOMEQ2, 0, RW_Dummy }, { 64, _T("SkillLevel") ,2, IDS_HOMEQ3, 0, RW_Dummy }, { 65, _T("SCSIAdapter") ,75, IDS_SCSI_ADAPTER, 0, RW_Dummy }, { 66, _T("ComputerManf") ,256, IDS_COMPUTER_MODEL, 0, RW_Dummy }, { 67, _T("AreaCode") ,30, IDS_AREACODE_KEY, 0, RW_Dummy }, { 68, _T("Mname") ,75, IDS_MIDDLE_NAME, 0, RW_Dummy } };
//
// PadWithBlanks(TCHAR **pSrc, TCHAR ** pDes,int iLen)
//
// This function adds space to the soiurce string so the resultant string is of the length
// specified by iLen
//
//
//
void PadWithBlanks(TCHAR *pSrc, TCHAR * pDes,int iLen) { int iSrcLen;
iSrcLen = _tcslen(pSrc) * sizeof(_TCHAR); if(iLen < 0) { // if it is variable length then copy the string and return
_tcscpy(pDes,pSrc); return; } //
// Try to copy till iLen
// the extra +1 is added to add a null terminator after copy
_tcsnccpy(pDes,pSrc,iLen+ sizeof(_TCHAR));
if(iSrcLen < iLen ) { // the source string is less than the expected maximum length
for(int iIndex = iSrcLen;iIndex < iLen;iIndex++) { pDes[iIndex] = RW_BLANK; // Adds blank
} pDes[iIndex] = _T('\0'); } }
// int GetRootOfRegWizRegistry(HINSTANCE hInstance , PHKEY phKey)
//
// Description :
// This function Opens the User Information value in the registry for
// regWizard configured values to be read
//
// Return Information:
// This function return the HANDLE of the registry in phKey and returns 0
// If the Key is not found the function returns 1
//
//
int GetRootOfRegWizRegistry(HINSTANCE hInstance , PHKEY phKey) { TCHAR uszPartialKey[128]; TCHAR uszRegKey[128]; uszRegKey[0] = _T('\0'); int resSize = LoadString(hInstance,IDS_KEY2,uszRegKey,128); _tcscat(uszRegKey,REG_SEPERATOR); resSize = LoadString(hInstance,IDS_KEY3,uszPartialKey,128); _tcscat(uszRegKey,uszPartialKey); _tcscat(uszRegKey,REG_SEPERATOR); resSize = LoadString(hInstance,IDS_KEY4,uszPartialKey,128); _tcscat(uszRegKey,uszPartialKey); #ifdef USE_INFO_SUBKEYS
_tcscat(uszRegKey,REG_SEPERATOR); #endif
LONG regStatus =RegOpenKeyEx(HKEY_LOCAL_MACHINE, uszRegKey, 0, KEY_ALL_ACCESS, phKey);
if (regStatus != ERROR_SUCCESS) { return 1; // error
} else { return 0; // Success
} }
//
// TCHAR * GetNameString ( TCHAR **pRet,UINT uId,HINSTANCE hIns)
//
// Description :
//
// This function retrives the Name field for Transmission from the Resource
// Some names in the resouce is prefixed with '_' so this function removes the
// prefix character.
//
// Return Information:
// This function returns NULL if the string is not found in the resource
// It accepts the address of a TCHAR pointer ,the string address is assigned in the
// pointer. It also returns the same address as a return Status
//
// Note :
// It is not required to delete the pointer returned by this function as it is static
//
TCHAR * GetNameString ( TCHAR **pRet,UINT uId,HINSTANCE hIns) { static TCHAR tczRetValue[MAX_NAME_LENGTH ]; int iLoad = LoadString( hIns, uId, tczRetValue, sizeof(tczRetValue)/ sizeof (TCHAR)); if(!iLoad ) { pRet = NULL; return NULL; }
if( tczRetValue[0] == _T('_') ) { *pRet = &tczRetValue[1]; return &tczRetValue[1]; } else { *pRet = &tczRetValue[0]; return &tczRetValue[0]; }
}
//
//
// URL Encoding
/*===================================================================
URLEncodeLen
Return the storage requirements for a URL-Encoded string
Parameters: szSrc - Pointer to the string to URL Encode
Returns: the number of bytes required to encode the string ===================================================================*/
int URLEncodeLen(const char *szSrc) { int cbURL = 1; // add terminator now
while (*szSrc) { if (*szSrc & 0x80) // encode foreign characters
cbURL += 3; else if (*szSrc == ' ') // encoded space requires only one character
++cbURL; else if (! isalnum(*szSrc)) // encode non-alphabetic characters
cbURL += 3; else ++cbURL;
++szSrc; } return cbURL; }
/*===================================================================
URLEncode
URL Encode a string by changing space characters to '+' and escaping non-alphanumeric characters in hex.
Parameters: szDest - Pointer to the buffer to store the URLEncoded string szSrc - Pointer to the source buffer
Returns: A pointer to the NUL terminator is returned. ===================================================================*/
char *URLEncode(char *szDest, const char *szSrc) { char hex[] = "0123456789ABCDEF";
while (*szSrc) { if (*szSrc == ' ') { *szDest++ = '+'; ++szSrc; } else if (!isalnum(*szSrc) || (*szSrc & 0x80)) { *szDest++ = '%'; *szDest++ = hex[BYTE(*szSrc) >> 4]; *szDest++ = hex[*szSrc++ & 0x0F]; } else *szDest++ = *szSrc++; }
*szDest = '\0'; return szDest; }
//
// This class is used to store the RegWiz Info in URL encode format
// This class is construected with the TxBuffer pointer
// The AppendToBuffer converts the string to URL encoded form and adds to the TxBuffer
// if the TxBuffer size is less then it only computesthe size and does not transfer
// the buffer contents
//
class RegWizTxBuffer {
public :
char *m_pBuf; int m_iSizeExceeded; // set
DWORD *m_pdInitialSize; DWORD m_dCurrentIndex;
RegWizTxBuffer(char *tcTxBuf, DWORD * pRetLen) { m_pBuf = tcTxBuf; // Initial Pointer of the Destination Buffer
m_pdInitialSize = pRetLen; // The Destination Buffer Size
m_dCurrentIndex = 0; // Current Index of the number of bytes of information transmitted
m_iSizeExceeded = 0; m_pBuf[0] = '\0'; }
void AppendToBuffer(TCHAR *tcTxBuf, int iIsUrl=0) { int iLen=0; #ifdef _UNICODE
unsigned char *mbpTxBuf; #endif
// The TxBuffer has to be converted to MultiByte in case
// Convert to MultByte
#ifdef _UNICODE
mbpTxBuf = (unsigned char *)ConvertToMB (tcTxBuf); // Convert to MultiByte
iLen = _mbslen (mbpTxBuf); #else
iLen = _tcsclen(tcTxBuf); #endif
if(iIsUrl) { #ifdef _UNICODE
iLen= URLEncodeLen((const char *)mbpTxBuf); #else
iLen = URLEncodeLen(tcTxBuf); #endif
}
if( m_dCurrentIndex + iLen >= *m_pdInitialSize ) { // continue counting the lengthn required
m_iSizeExceeded = 1; } else { if( iIsUrl) { #ifdef _UNICODE
URLEncode(m_pBuf+m_dCurrentIndex,(const char *)mbpTxBuf); #else
// for MBCS and SBCS
URLEncode(m_pBuf+m_dCurrentIndex,tcTxBuf); #endif
} else { #ifdef _UNICODE
strcat(m_pBuf,(const char *)mbpTxBuf); #else
_tcscat(m_pBuf,tcTxBuf); #endif
} ;
} if(iIsUrl) m_dCurrentIndex += iLen-1; else m_dCurrentIndex += iLen;
}
int IsValidBuffer() { m_pBuf[m_dCurrentIndex] = '\0'; *m_pdInitialSize = m_dCurrentIndex; return m_iSizeExceeded ; }
};
int PrepareRegWizTxbuffer(HINSTANCE hIns, char *tcTxBuf, DWORD * pRetLen) { int iRetValue; HKEY hKey; LONG lRegStatus; TCHAR *szR; TCHAR tczTmp[10]; TCHAR szParam[MAX_REG_VAL_BUF_SZ]; // ?? chk in case of Unicode
unsigned long infoSize; RegWizTxBuffer TxferBuf(tcTxBuf,pRetLen);
iRetValue = RWZ_NOERROR; infoSize = MAX_REG_VAL_BUF_SZ;
if(GetRootOfRegWizRegistry(hIns, &hKey) ) { iRetValue = RWZ_NO_INFO_AVAILABLE; // No User Information is Available So Abort the program
} else { // Process for all the information entries
for(int i =0;i < MAX_TBL_ENTRIES ;i++) { infoSize = MAX_REG_VAL_BUF_SZ; szParam[0] = '\0'; #ifdef _LOG_IN_FILE
RW_DEBUG << "\n" << i+1 << "\t" << ConvertToMB (sRegWizInfoTbl[i].m_czName) << "\t" << flush; #endif
TxferBuf.AppendToBuffer(sRegWizInfoTbl[i].m_czName,RW_WITH_URL); TxferBuf.AppendToBuffer(NAME_VALUE_SEPERATOR);
if( sRegWizInfoTbl[i].m_ResourceIndex < 1) { // continue processing
} else { if( GetNameString(&szR,sRegWizInfoTbl[i].m_ResourceIndex,hIns ) ) {
if( sRegWizInfoTbl[i].m_iParam ) { // This block is for appending Product name index
_itot(sRegWizInfoTbl[i].m_iParam,tczTmp,10); _tcscat(szR,_T(" ")); // add a single blank
_tcscat(szR,tczTmp); #ifdef _LOG_IN_FILE
RW_DEBUG << ConvertToMB (szR) << "\t"; #endif
} lRegStatus = RegQueryValueEx(hKey,szR,NULL,0,( LPBYTE ) szParam,&infoSize);
if (lRegStatus != ERROR_SUCCESS) { return RWZ_INVALID_INFORMATION; }
#ifdef _LOG_IN_FILE
RW_DEBUG << "[" <<ConvertToMB (szParam )<< "]\t" << flush; #endif
} else { //
// This condition can happen if information is not found in the Resource
// If the function entres this block the it is necessary to verify the
// the resource string in the table mapping
//
return RWZ_INTERNAL_ERROR;
} }
if(szParam) { (*sRegWizInfoTbl[i].m_fp)(szParam,szParam,hIns); // Invoke processing Function
//PadWithBlanks(szParam,szRet,sRegWizInfoTbl[i].m_iLen); // Add balnks
}
//TxferBuf.AppendToBuffer(szRet,RW_WITH_URL); with padded
TxferBuf.AppendToBuffer(szParam,RW_WITH_URL); //
//
// Skip Name key seperator for the last entry
if(i!= MAX_TBL_ENTRIES-1) TxferBuf.AppendToBuffer(NAME_SEPERATOR);
}// end of for loop
}
if(TxferBuf.IsValidBuffer()) {
iRetValue=RWZ_BUFFER_SIZE_INSUFFICIENT; } return iRetValue;
}
DWORD OemTransmitBuffer(HINSTANCE hIns,char *sztxBuffer,DWORD *nInitialSize) { BOOL bValueExceeded = FALSE; if(bOemDllLoaded == TRUE) { DWORD nCount,nLen,nCurrentLen = 0; HKEY hOemKey; #ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM: Inside OemTransmitBuffer" << flush; #endif
GetRootOfRegWizRegistry(hIns, &hOemKey);
OEMDataCount pOEMDataCount;
pOEMDataCount = (OEMDataCount) GetProcAddress(hOemDll, "OEMDataCount"); if (pOEMDataCount == NULL) { #ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM: OEMDataCount Getproc Error" << flush; #endif
return RWZ_INTERNAL_ERROR; } nCount = (DWORD)pOEMDataCount(); if(nCount > 25) { nCount = 25; }
for( DWORD index = 1; index <= nCount; index++ ) { _TCHAR szOEMValueName[64]; _TCHAR szOEMBase[64]; char szBuffer[1024]; BOOL bIsUnicode; BYTE lpValue[256] ; _TCHAR szValue[256]; LoadString(hIns,IDS_OEMBASEKEY,szOEMBase,64); _stprintf(szOEMValueName,_T("%s_%i"),szOEMBase,index);
#ifdef _UNICODE
strcpy(szBuffer,ConvertToMB(szOEMValueName)); #else
_tcscpy(szBuffer,szOEMValueName); #endif
OEMGetData pOEMGetData;
pOEMGetData = (OEMGetData) GetProcAddress(hOemDll, "OEMGetData"); if (pOEMGetData == NULL) { #ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM: OEMGetData Getproc Error"<< flush; #endif
return RWZ_INTERNAL_ERROR; }
nLen = sizeof(lpValue);
pOEMGetData((WORD)index,&bIsUnicode,lpValue,(WORD)nLen);
#ifdef _UNICODE
if(!bIsUnicode) { MultiByteToWideChar(CP_ACP, 0, (LPCSTR)lpValue, -1, (LPTSTR)szValue, 256); } else { _tcscpy((LPTSTR)szValue,(LPCTSTR)lpValue); } #else
if(bIsUnicode) { WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)lpValue, -1, (LPTSTR)szValue, 256, NULL, NULL); } else { _tcscpy((LPTSTR)szValue,(LPCTSTR)lpValue); } #endif
if( _tcscmp((LPCTSTR)szValue,_T(""))) { nLen = strlen("&"); if( nCurrentLen + nLen >= *nInitialSize ) { bValueExceeded = TRUE; } else { strcat(sztxBuffer,"&"); } nCurrentLen += nLen;
nLen = URLEncodeLen(szBuffer); if( nCurrentLen + nLen >= *nInitialSize ) { bValueExceeded = TRUE; } else { URLEncode(sztxBuffer+nCurrentLen,szBuffer); }
nCurrentLen += nLen-1; RegSetValueEx(hOemKey,szOEMValueName,NULL,REG_SZ,(CONST BYTE *)szValue,_tcslen((LPCTSTR)szValue)); if(bIsUnicode) { strcpy(szBuffer,ConvertToMB((TCHAR *)lpValue)); } else { strcpy(szBuffer,(char *)lpValue); }
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM " << index << "\t"<< ConvertToMB(szOEMValueName)<< "\t" << szBuffer <<flush; #endif
nLen = strlen("="); if( nCurrentLen + nLen >= *nInitialSize ) { bValueExceeded = TRUE; } else { strcat(sztxBuffer,"="); } nCurrentLen += nLen;
nLen = URLEncodeLen(szBuffer); if( nCurrentLen + nLen >= *nInitialSize ) { #ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM:Buffer value Exceeded" << flush; RW_DEBUG << "\n OEM:Current Length:" << nCurrentLen << flush; RW_DEBUG << "\n OEM:Length of present value:" << nLen << flush; RW_DEBUG << "\n OEM:Initial Size:" << *nInitialSize << flush; #endif
bValueExceeded = TRUE; } else { URLEncode(sztxBuffer+nCurrentLen,szBuffer); }
nCurrentLen += nLen-1; } } *nInitialSize = nCurrentLen; if(bValueExceeded ) { return RWZ_BUFFER_SIZE_INSUFFICIENT; } else { #ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM: OemTransmitBuffer Successful" << flush; #endif
return RWZ_NOERROR; } } else { *nInitialSize = 0; }
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n OEM: OemTransmitBuffer Successful" << flush; #endif
return RWZ_NOERROR; }
|