//*************************************************************************** // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // // MOENGINE.CPP // // Purpose: Code-generation engine for HMM* providers // // Comments: // /************************************************************************** -- . Generates .CPP, .H, .MAK, .DEF, files for providers MOProviderOpen() : Provider initialization MOProviderCancel() : Cancels construction of current provider MOProviderClose() : Provider cleanup, writes provider files MOPropSetOpen() : Property set initialization MOPropSetCancel() : Cancels construction of target property set MOPropertyAdd() : Adds property to target property set MOPropertyAttribSet() : Sets attributes of pre-existing property MOGetLastError() : Returns code of last error encountered MOResetLastError() : Clears recorded error code Revisions: 09/17/96 a-jmoon created 1/22/98 a-brads updated to new framework String substitutions: Designator Description ========== ======================= %%1 Provider base file name %%2 Provider description %%3 HMMS type library path %%4 Library UUID %%5 Provider UUID %%6 System directory %%7 Property set base file name %%8 Property set description %%9 Property set name %%A Property set UUID %%B Property set class name %%C Property set parent class name %%D Property name definitions %%E Property enumerations (TPROP) %%F Property name extern definitions %%G Property template declarations %%H Property PUT methods %%I Property GET methods %%J Upper-cased property set base file name %%K Attribute assignments **************************************************************************/ #include "precomp.h" #include #include #include #include #define POLARITY #include #define MO_ENGINE_PROGRAM #include #include "resource.h" HINSTANCE hOurAFXResourceHandle ; PROVIDER_INFO *pProviderList = NULL ; CHString sSystemDirectory ; DWORD dwLastError ; /***************************************************************************** * * FUNCTION : DLLMain * * DESCRIPTION : DLL entry function * * INPUTS : * * OUTPUTS : * * RETURNS : TRUE * * COMMENTS : Saves our DLL's instance handle, gets system directory * *****************************************************************************/ BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReasonForCall, LPVOID pReserved) { WCHAR szTemp[_MAX_PATH] ; UNREFERENCED_PARAMETER(hInstance) ; UNREFERENCED_PARAMETER(dwReasonForCall) ; UNREFERENCED_PARAMETER(pReserved) ; hOurAFXResourceHandle = GetModuleHandle(_T("MOENGINE.DLL")) ; GetSystemDirectory(szTemp, sizeof(szTemp)/sizeof(WCHAR)) ; sSystemDirectory = szTemp ; sSystemDirectory += _T("\\") ; // This directory is quoted in the IDL file, so needs double backslashes //====================================================================== DoubleBackslash(sSystemDirectory) ; return TRUE; } /***************************************************************************** * * FUNCTION : MOProviderOpen * * DESCRIPTION : Initializes provider data * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ DllExport DWORD MOProviderOpen(LPCWSTR pszBaseName, LPCWSTR pszDescription, LPCWSTR pszOutputPath, LPCWSTR pszTLBPath, LPCWSTR pszLibraryUUID, LPCWSTR pszProviderUUID) { PROVIDER_INFO *pProvider, *pTemp ; // Base file name is the only rejection criterion //=============================================== if(!pszBaseName || !pszBaseName[0]) { // As odd as this looks, it's what the ui is expecting. dwLastError = MO_ERROR_INVALID_FILENAME ; return MO_INVALID_ID ; } // Create a new provider record //============================= pProvider = new PROVIDER_INFO ; if(pProvider == NULL) { // As odd as this looks, it's what the ui is expecting. dwLastError = MO_ERROR_MEMORY ; return MO_INVALID_ID ; } pProvider->dwProviderID = MONewProviderID() ; // Verify input data & construct provider record //============================================== pProvider->sBaseName = pszBaseName ; pProvider->sDescription = pszDescription ? CHString(pszDescription) : _T("") ; pProvider->sOutputPath = pszOutputPath && pszOutputPath[0] ? CHString(pszOutputPath) : _T(".") ; pProvider->sTLBPath = pszTLBPath && pszTLBPath[0] ? CHString(pszTLBPath) : _T(".") ; pProvider->sLibraryUUID = pszLibraryUUID ? CHString(pszLibraryUUID) : MOCreateUUID() ; pProvider->sProviderUUID = pszProviderUUID ? CHString(pszProviderUUID) : MOCreateUUID() ; pProvider->pPropSetList = NULL ; // Make sure there's a trailing backslash on the path specs //========================================================= if(pProvider->sOutputPath.Right(1) != _T("\\")) { pProvider->sOutputPath += _T("\\") ; } if(pProvider->sTLBPath.Right(1) != _T("\\")) { pProvider->sTLBPath += _T("\\") ; } // Type library path is quoted in source, so needs double backslashes //=================================================================== DoubleBackslash(pProvider->sTLBPath) ; // Assemble output file names //=========================== _stprintf(pProvider->szDEFFileSpec, _T("%s%s.DEF"), (LPCTSTR) pProvider->sOutputPath, (LPCTSTR) pProvider->sBaseName) ; // _stprintf(pProvider->szIDLFileSpec, _T("%s%s.IDL"), // (LPCTSTR) pProvider->sOutputPath, // (LPCTSTR) pProvider->sBaseName) ; _stprintf(pProvider->szMOFFileSpec, _T("%s%s.MOF"), (LPCTSTR) pProvider->sOutputPath, (LPCTSTR) pProvider->sBaseName) ; _stprintf(pProvider->szOLEFileSpec, _T("%sMAINDLL.CPP"), (LPCTSTR) pProvider->sOutputPath) ; _stprintf(pProvider->szMAKFileSpec, _T("%s%s.MAK"), (LPCTSTR) pProvider->sOutputPath, (LPCTSTR) pProvider->sBaseName) ; // Insert at end of provider list //=============================== pTemp = (PROVIDER_INFO *) &pProviderList ; while(pTemp->pNext != NULL) { pTemp = pTemp->pNext ; } pProvider->pNext = NULL ; pTemp->pNext = pProvider ; return pProvider->dwProviderID ; } /***************************************************************************** * * FUNCTION : MOProviderCancel * * DESCRIPTION : Simply kills provider-in-progress * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ DllExport void MOProviderCancel(DWORD dwProviderID) { MOProviderDestroy(dwProviderID) ; } /***************************************************************************** * * FUNCTION : MOProviderClose * * DESCRIPTION : Terminates construction of a provider & writes files * * INPUTS : dwProviderID : ID of provider to commit * bForceFlag : If TRUE, existing files are overwritten * If FALSE, no files are created (provider * must still be closed or cancelled) * * OUTPUTS : * * RETURNS : MO_SUCCESS if successful, error code otherwise * * COMMENTS : * *****************************************************************************/ DllExport DWORD MOProviderClose(DWORD dwProviderID, BOOL bForceFlag) { PROVIDER_INFO *pProvider ; PROPSET_INFO *pPropSet ; DWORD dwRetCode = MO_SUCCESS ; WCHAR szTemp[_MAX_PATH], *pSlash ; // Get the provider record //======================== pProvider = GetProviderFromID(dwProviderID) ; if(pProvider == NULL) { dwLastError = MO_ERROR_PROVIDER_NOT_FOUND ; return MO_ERROR_PROVIDER_NOT_FOUND ; } // Check directory/file existence if force flag set //================================================= _tcscpy(szTemp, (LPCTSTR) pProvider->sOutputPath.Left(pProvider->sOutputPath.GetLength()-1)) ; if(!bForceFlag) { if(_taccess(szTemp, 0) == -1) { dwLastError = MO_ERROR_DIRECTORY_NOT_FOUND ; return MO_ERROR_DIRECTORY_NOT_FOUND ; } if(_taccess(pProvider->szDEFFileSpec, 0) != -1 || // _taccess(pProvider->szIDLFileSpec, 0) != -1 || _taccess(pProvider->szOLEFileSpec, 0) != -1) { dwLastError = MO_ERROR_FILES_EXIST ; return MO_ERROR_FILES_EXIST ; } // We need to traverse provider's property sets for file names //============================================================ pPropSet = pProvider->pPropSetList ; while(pPropSet != NULL) { if(_taccess(pPropSet->szCPPFileSpec, 0) != -1 || _taccess(pPropSet->szHFileSpec, 0) != -1) { dwLastError = MO_ERROR_FILES_EXIST ; return MO_ERROR_FILES_EXIST ; } pPropSet = pPropSet->pNext ; } // end while loop } // Create output directory if necessary //===================================== if(_taccess(szTemp, 0) == -1) { pSlash = szTemp ; for( ; ; ) { pSlash = _tcschr(pSlash, _T('\\')) ; if(pSlash == NULL) { CreateDirectory(szTemp, NULL) ; break ; } if(*(pSlash-1) != _T(':')) { *pSlash = 0 ; CreateDirectory(szTemp, NULL) ; *pSlash = _T('\\') ; } pSlash++ ; } } if(_taccess(szTemp, 0) == -1) { dwLastError = MO_ERROR_DIRECTORY ; return MO_ERROR_DIRECTORY ; } pPropSet = pProvider->pPropSetList ; while(pPropSet != NULL) { pProvider->sObj += _T("\"$(OUTDIR)\\") + pPropSet->sBaseName + _T(".obj\" "); pProvider->sCpp += pPropSet->sBaseName + _T(".cpp "); pPropSet = pPropSet->pNext ; } // Create the output files //======================== dwRetCode = CreateProviderFile(pProvider, NULL, pProvider->szDEFFileSpec, IDR_TEMPLATE_DEF) ; if (dwRetCode == MO_SUCCESS) dwRetCode = CreateProviderFile(pProvider, NULL, pProvider->szMOFFileSpec, IDR_TEMPLATE_MOF) ; // if (dwRetCode == MO_SUCCESS) // dwRetCode = CreateProviderFile(pProvider, NULL, pProvider->szIDLFileSpec, IDR_TEMPLATE_ODL) ; // if (dwRetCode == MO_SUCCESS) // dwRetCode = CreateProviderFile(pProvider, NULL, pProvider->szOLEFileSpec, IDR_TEMPLATE_OLE) ; if (dwRetCode == MO_SUCCESS) dwRetCode = CreateProviderFile(pProvider, pPropSet, pProvider->szMAKFileSpec, IDR_TEMPLATE_MAK) ; pPropSet = pProvider->pPropSetList ; while(pPropSet != NULL) { if (dwRetCode == MO_SUCCESS) dwRetCode = CreateProviderFile(pProvider, pPropSet, pPropSet->szCPPFileSpec, IDR_TEMPLATE_CPP) ; if (dwRetCode == MO_SUCCESS) dwRetCode = CreateProviderFile(pProvider, pPropSet, pPropSet->szHFileSpec, IDR_TEMPLATE_H) ; if (dwRetCode == MO_SUCCESS) dwRetCode = CreateProviderFile(pProvider, pPropSet, pProvider->szOLEFileSpec, IDR_TEMPLATE_DLL) ; pPropSet = pPropSet->pNext ; } // Delete all the associated records //================================== MOProviderDestroy(dwProviderID) ; return dwRetCode ; } /***************************************************************************** * * FUNCTION : MOPropSetOpen * * DESCRIPTION : Opens property set * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ DllExport DWORD MOPropSetOpen(DWORD dwProviderID, LPCWSTR pszBaseName, LPCWSTR pszDescription, LPCWSTR pszPropSetName, LPCWSTR pszPropSetUUID, LPCWSTR pszClassName, LPCWSTR pszParentClassName) { PROVIDER_INFO *pProvider ; PROPSET_INFO *pPropSet, *pTemp ; // Validate our input //=================== if(!pszBaseName || !pszBaseName[0] || !pszPropSetName || !pszPropSetName[0] || !pszClassName || !pszClassName[0]) { // As odd as this looks, it's what the ui is expecting. dwLastError = MO_ERROR_INVALID_PARAMETER ; return MO_INVALID_ID ; } // Locate the provider //==================== pProvider = GetProviderFromID(dwProviderID) ; if(pProvider == NULL) { // As odd as this looks, it's what the ui is expecting. dwLastError = MO_ERROR_PROVIDER_NOT_FOUND ; return MO_INVALID_ID ; } // Create new property set record //=============================== pPropSet = new PROPSET_INFO ; if(pPropSet == NULL) { // As odd as this looks, it's what the ui is expecting. dwLastError = MO_ERROR_MEMORY ; return MO_INVALID_ID ; } pPropSet->dwPropSetID = MONewPropSetID(pProvider) ; pPropSet->sBaseName = pszBaseName ; pPropSet->sDescription = pszDescription ? CHString(pszDescription) : _T("") ; pPropSet->sPropSetName = pszPropSetName ; pPropSet->sPropSetUUID = pszPropSetUUID && pszPropSetUUID[0] ? CHString(pszPropSetUUID) : MOCreateUUID() ; pPropSet->sClassName = pszClassName ; pPropSet->sParentClassName = pszParentClassName && pszParentClassName[0] ? CHString(pszParentClassName) : _T("Provider") ; pPropSet->pPropertyList = NULL ; pPropSet->pPropertyAttribList = NULL ; pPropSet->sBaseUpcase = pszBaseName ; pPropSet->sBaseUpcase.MakeUpper() ; // Create output file names //========================= _stprintf(pPropSet->szCPPFileSpec, _T("%s%s.CPP"), (LPCTSTR) pProvider->sOutputPath, (LPCTSTR) pPropSet->sBaseName) ; _stprintf(pPropSet->szHFileSpec, _T("%s%s.H"), (LPCTSTR) pProvider->sOutputPath, (LPCTSTR) pPropSet->sBaseName) ; // Add to the provider's list //=========================== pTemp = (PROPSET_INFO *) &pProvider->pPropSetList ; while(pTemp->pNext != NULL) { pTemp = pTemp->pNext ; } pPropSet->pNext = NULL ; pTemp->pNext = pPropSet ; return pPropSet->dwPropSetID ; } /***************************************************************************** * * FUNCTION : MOPropertyAdd * * DESCRIPTION : Adds property to existing/open property set * * INPUTS : * * OUTPUTS : * * RETURNS : MO_SUCCESS or error code * * COMMENTS : * *****************************************************************************/ DllExport DWORD MOPropertyAdd(DWORD dwProviderID, DWORD dwPropSetID, LPCWSTR pszProperty, LPCWSTR pszName, LPCWSTR pszPutMethod, LPCWSTR pszGetMethod, DWORD dwType, DWORD dwFlags) { PROVIDER_INFO *pProvider ; PROPSET_INFO *pPropSet ; PROPERTY_INFO *pProperty, *pTemp ; // Validate //========= if(!pszProperty || !pszProperty[0] || !pszName || !pszName[0]) { dwLastError = MO_ERROR_INVALID_PARAMETER ; return MO_ERROR_INVALID_PARAMETER ; } // Locate the provider //==================== pProvider = GetProviderFromID(dwProviderID) ; if(pProvider == NULL) { dwLastError = MO_ERROR_PROVIDER_NOT_FOUND ; return MO_ERROR_PROVIDER_NOT_FOUND ; } // Locate the property set //======================== pPropSet = GetPropSetFromID(pProvider, dwPropSetID) ; if(pProvider == NULL) { dwLastError = MO_ERROR_PROPSET_NOT_FOUND ; return MO_ERROR_PROPSET_NOT_FOUND ; } // Create new property record //=========================== pProperty = new PROPERTY_INFO ; if(pProperty == NULL) { dwLastError = MO_ERROR_MEMORY ; return MO_ERROR_MEMORY ; } pProperty->sProperty = pszProperty ; pProperty->sName = pszName ; pProperty->sPutMethod = pszPutMethod && pszPutMethod[0] ? CHString(pszPutMethod) : _T("NULL") ; pProperty->sGetMethod = pszGetMethod && pszGetMethod[0] ? CHString(pszGetMethod) : _T("NULL") ; pProperty->dwType = dwType ; pProperty->dwFlags = dwFlags ; // Create property name pointer //============================= pProperty->sPropertyNamePtr.Format(L"p%s", pszProperty); // Add to the property set //======================== pTemp = (PROPERTY_INFO *) &pPropSet->pPropertyList ; while(pTemp->pNext != NULL) { pTemp = pTemp->pNext ; } pProperty->pNext = NULL ; pTemp->pNext = pProperty ; return MO_SUCCESS ; } /***************************************************************************** * * FUNCTION : MOPropertyAttribSet * * DESCRIPTION : Allows user to assign attributes to properties at run-time * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ DllExport DWORD MOPropertyAttribSet(DWORD dwProviderID, DWORD dwPropSetID, LPCWSTR pszProperty, DWORD dwFlags) { PROVIDER_INFO *pProvider ; PROPSET_INFO *pPropSet ; PROPERTY_ATTRIB_INFO *pPropAttrib ; // Validate //========= if(!pszProperty || !pszProperty[0]) { dwLastError = MO_ERROR_INVALID_PARAMETER ; return MO_ERROR_INVALID_PARAMETER ; } // Locate the provider //==================== pProvider = GetProviderFromID(dwProviderID) ; if(pProvider == NULL) { dwLastError = MO_ERROR_PROVIDER_NOT_FOUND ; return MO_ERROR_PROVIDER_NOT_FOUND ; } // Locate the property set //======================== pPropSet = GetPropSetFromID(pProvider, dwPropSetID) ; if(pProvider == NULL) { dwLastError = MO_ERROR_PROPSET_NOT_FOUND ; return MO_ERROR_PROPSET_NOT_FOUND ; } // Create new record for property //=============================== pPropAttrib = new PROPERTY_ATTRIB_INFO ; if(pPropAttrib == NULL) { dwLastError = MO_ERROR_MEMORY ; return MO_ERROR_MEMORY ; } pPropAttrib->sProperty = pszProperty ; pPropAttrib->dwFlags = dwFlags ; pPropAttrib->pNext = pPropSet->pPropertyAttribList ; pPropSet->pPropertyAttribList = pPropAttrib ; return MO_SUCCESS ; } /***************************************************************************** * * FUNCTION : MOGetLastError * * DESCRIPTION : Retrieves error code * * INPUTS : * * OUTPUTS : * * RETURNS : Numeric code of last error encountered * * COMMENTS : * *****************************************************************************/ DllExport DWORD MOGetLastError(void) { return dwLastError ; } /***************************************************************************** * * FUNCTION : MOPropertyAttribSet * * DESCRIPTION : Allows user to assign attributes to properties at run-time * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ DllExport void MOResetLastError(void) { dwLastError = MO_SUCCESS ; } //============================================================================= //============================================================================= // // // UTILITY ROUTINES // // //============================================================================= //============================================================================= /***************************************************************************** * * FUNCTION : MONewProviderID * * DESCRIPTION : Generates ID unique among open providers * * INPUTS : nothing * * OUTPUTS : nothing * * RETURNS : Unique ID * * COMMENTS : No error returned * *****************************************************************************/ DWORD MONewProviderID() { static DWORD dwNextID = MO_INVALID_ID ; while(++dwNextID == MO_INVALID_ID || GetProviderFromID(dwNextID) != NULL) ; return dwNextID ; } /***************************************************************************** * * FUNCTION : MONewPropSetID * * DESCRIPTION : Generates ID unique among open properties * * INPUTS : nothing * * OUTPUTS : nothing * * RETURNS : Unique ID * * COMMENTS : No error returned * *****************************************************************************/ DWORD MONewPropSetID(PROVIDER_INFO *pProvider) { static DWORD dwNextID = MO_INVALID_ID ; while(++dwNextID == MO_INVALID_ID || GetPropSetFromID(pProvider, dwNextID) != NULL) ; return dwNextID ; } /***************************************************************************** * * FUNCTION : GetProviderFromID * * DESCRIPTION : Lookup function for open providers * * INPUTS : ID of desired provider * * OUTPUTS : none * * RETURNS : Pointer to provider record if found, NULL if not * * COMMENTS : * *****************************************************************************/ PROVIDER_INFO *GetProviderFromID(DWORD dwProviderID) { PROVIDER_INFO *pProvider ; pProvider = pProviderList ; while(pProvider != NULL) { if(pProvider->dwProviderID == dwProviderID) { break ; } pProvider = pProvider->pNext ; } return pProvider ; } /***************************************************************************** * * FUNCTION : GetPropSetFromID * * DESCRIPTION : Lookup function for open property sets * * INPUTS : ID of desired property set * * OUTPUTS : none * * RETURNS : Pointer to provider record if found, NULL if not * * COMMENTS : * *****************************************************************************/ PROPSET_INFO *GetPropSetFromID(PROVIDER_INFO *pProvider, DWORD dwPropSetID) { PROPSET_INFO *pPropSet ; pPropSet = pProvider->pPropSetList ; while(pPropSet != NULL) { if(pPropSet->dwPropSetID == dwPropSetID) { break ; } pPropSet = pPropSet->pNext ; } return pPropSet ; } /***************************************************************************** * * FUNCTION : MOProviderDestroy * * DESCRIPTION : Destroys all structs associated with a provider * * INPUTS : * * OUTPUTS : * * RETURNS : MO_SUCCESS or error code * * COMMENTS : * *****************************************************************************/ DWORD MOProviderDestroy(DWORD dwProviderID) { PROVIDER_INFO *pProvider, *pPredecessor ; PROPSET_INFO *pPropSet ; PROPERTY_INFO *pProperty ; PROPERTY_ATTRIB_INFO *pPropAttrib ; // Locate the provider record & remove from list //============================================== pProvider = pProviderList ; pPredecessor = (PROVIDER_INFO *) &pProviderList ; while(pProvider != NULL) { if(pProvider->dwProviderID == dwProviderID) { pPredecessor->pNext = pProvider->pNext ; break ; } pPredecessor = pProvider ; pProvider = pProvider->pNext ; } // Was the provider record found? //=============================== if(pProvider == NULL) { return MO_ERROR_PROVIDER_NOT_FOUND ; } // Yep -- destroy everything //========================== while(pProvider->pPropSetList != NULL) { pPropSet = pProvider->pPropSetList ; pProvider->pPropSetList = pPropSet->pNext ; while(pPropSet->pPropertyList != NULL) { pProperty = pPropSet->pPropertyList ; pPropSet->pPropertyList = pProperty->pNext ; delete pProperty ; } while(pPropSet->pPropertyAttribList != NULL) { pPropAttrib = pPropSet->pPropertyAttribList ; pPropSet->pPropertyAttribList = pPropAttrib->pNext ; delete pPropAttrib ; } delete pPropSet ; } delete pProvider ; return MO_SUCCESS ; } /***************************************************************************** * * FUNCTION : MOCreateUUID * * DESCRIPTION : * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ WCHAR *MOCreateUUID(void) { static WCHAR szUUID[50] ; UUID RawUUID ; WCHAR *pszSysUUID ; // Make sure we don't return anything twice //========================================= _tcscpy(szUUID, _T("Unable to create UUID")) ; // Generate the new UUID //====================== if(UuidCreate(&RawUUID) == RPC_S_OK && UuidToString(&RawUUID, &pszSysUUID) == RPC_S_OK) { _tcscpy(szUUID, (LPCWSTR) pszSysUUID) ; RpcStringFree(&pszSysUUID) ; } return szUUID ; } /***************************************************************************** * * FUNCTION : CreateProviderFile * * DESCRIPTION : * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ DWORD CreateProviderFile(PROVIDER_INFO *pProvider, PROPSET_INFO *pPropSet, LPCWSTR pszFileSpec, DWORD dwTemplateID) { CHString sTemp, sTemp2, sOutput ; int iIndex ; WCHAR cDesignator ; HRSRC hResHandle ; HGLOBAL hTemplateHandle ; char *pFrom, *pTo ; DWORD dwBufferSize ; // Locate/load template file as resource //====================================== hResHandle = FindResource(hOurAFXResourceHandle, (LPCTSTR)(DWORD_PTR) dwTemplateID, _T("BINARY")) ; if(hResHandle == NULL) { return MO_ERROR_TEMPLATE_NOT_FOUND ; } hTemplateHandle = LoadResource(hOurAFXResourceHandle, hResHandle) ; if(hTemplateHandle == NULL) { return MO_ERROR_TEMPLATE_NOT_FOUND ; } // Put the resource into a CHString & find the closing // tilde string (~~~~~~) to place the terminating NULL // (the resource doesn't have the NULL in it...) MS is // supposedly considering making SizeofResource() // actually return the proper size of the resource, but // for now it only returns rounded up to the next alignment. //========================================================== dwBufferSize = SizeofResource(hOurAFXResourceHandle, hResHandle) ; if(dwBufferSize == 0) { return MO_ERROR_TEMPLATE_NOT_FOUND ; } pFrom = (char *) LockResource(hTemplateHandle) ; if(pFrom == NULL) { return MO_ERROR_MEMORY ; } pTo = new char[dwBufferSize]; if(pTo == NULL) { return MO_ERROR_MEMORY ; } memcpy(pTo, pFrom, dwBufferSize) ; pFrom = strstr(pTo, "~~~~~~") ; if(pFrom == NULL) { delete []pTo; return MO_ERROR_TEMPLATE_NOT_FOUND ; } *pFrom = 0 ; sTemp = pTo; delete []pTo; // Perform string substitutions //============================= sOutput = _T("") ; iIndex = sTemp.Find(_T("%%")) ; while(iIndex != -1) { cDesignator = sTemp.GetAt(iIndex + 2) ; if (_T('8') == cDesignator) { // check to see if the string in pPropSet->sDescription // is valid. i.e. no carriage returns. CHString chsCompString = pPropSet->sDescription; LONG len = chsCompString.GetLength(); if (len) { for (int i = 0;isDescription = chsCompString.GetBuffer(0); } // end if } // end if sOutput += sTemp.Left(iIndex) ; sTemp = sTemp.Right(sTemp.GetLength() - iIndex - 3) ; switch (cDesignator) { case _T('1'): sOutput += pProvider->sBaseName; break; case _T('2'): sOutput += pProvider->sDescription; break; case _T('3'): sOutput += pProvider->sTLBPath; break; case _T('4'): sOutput += pProvider->sLibraryUUID; break; case _T('5'): sOutput += pProvider->sProviderUUID; break; case _T('6'): sOutput += sSystemDirectory; break; case _T('7'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sBaseName; break; case _T('8'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sDescription; break; case _T('9'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sPropSetName; break; case _T('A'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sPropSetUUID; break; case _T('B'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sClassName; break; case _T('C'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sParentClassName; break; case _T('D'): sOutput +=pPropSet == NULL ? _T("") : GetPropNameDefs(pPropSet); break; // case _T('E'): // sOutput += pPropSet == NULL ? _T("") : GetPropEnums(pPropSet); // break; case _T('F'): sOutput += pPropSet == NULL ? _T("") : GetPropNameExterns(pPropSet); break; // case _T('G'): // sOutput += pPropSet == NULL ? _T("") : GetPropTemplates(pPropSet); // break; case _T('H'): sOutput += pPropSet == NULL ? _T("") : GetPropPuts(pPropSet); break; // cDesignator == _T('I') ? pPropSet == NULL ? _T("") : GetPropGets(pPropSet); case _T('J'): sOutput += pPropSet == NULL ? _T("") : pPropSet->sBaseUpcase; break; // case _T('K'): // sOutput += pPropSet == NULL ? _T("") : GetPropertyAttribs(pPropSet); // break; case _T('L'): sOutput += pProvider->sCpp; break; case _T('M'): sOutput += pProvider->sObj; break; default: // CHString(_T("")) ; break; } iIndex = sTemp.Find(_T("%%")) ; } sOutput += sTemp ; // Write the output file //====================== FILE *fOutFile = NULL; fOutFile = _tfopen(pszFileSpec, _T("wb")); if (fOutFile == NULL) { return MO_ERROR_FILE_OPEN ; } _bstr_t ToAnsi(sOutput); char *pAnsi = (char *)ToAnsi; if (fwrite(pAnsi, strlen(pAnsi), 1, fOutFile) != 1) { fclose(fOutFile); return MO_ERROR_FILE_WRITE_ERROR; } fclose(fOutFile); return MO_SUCCESS ; } /***************************************************************************** * * FUNCTION : MODoubleBackslash * * DESCRIPTION : Converts single backslashes to double backslashes * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ void DoubleBackslash(CHString &sTarget) { WCHAR szTemp[_MAX_PATH] = {0}; // Convert to string for easier manipulation //========================================== _tcscpy(szTemp, (LPCWSTR) sTarget) ; sTarget = _T("") ; WCHAR *pToken = _tcstok(szTemp, _T("\\")) ; while(pToken != NULL) { sTarget += pToken ; sTarget += _T("\\\\") ; pToken = _tcstok(NULL, _T("\\")) ; } } /***************************************************************************** * * FUNCTION : GetPropNameDefs * * DESCRIPTION : Returns CHString containing property set name definitions * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ CHString GetPropNameDefs(PROPSET_INFO *pPropSet) { PROPERTY_INFO *pProperty ; WCHAR szTemp[_MAX_PATH] ; CHString sTemp; if(pPropSet != NULL) { pProperty = pPropSet->pPropertyList ; while(pProperty != NULL) { _stprintf(szTemp, _T("const static WCHAR* %s = L\"%s\" ;\r\n"), (LPCWSTR) pProperty->sPropertyNamePtr, (LPCWSTR) pProperty->sName) ; sTemp += szTemp ; pProperty = pProperty->pNext ; } } return sTemp ; } /***************************************************************************** * * FUNCTION : GetPropEnums * * DESCRIPTION : Returns CHString containing property TPROP declarations * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ //CHString GetPropEnums(PROPSET_INFO *pPropSet) //{ // PROPERTY_INFO *pProperty ; // WCHAR szTemp[_MAX_PATH] ; // // CHString sTemp; // // if(pPropSet != NULL) // { // pProperty = pPropSet->pPropertyList ; // while(pProperty != NULL) // { // if(sTemp.IsEmpty()) // { // sTemp = _T(":") ; // } // else // { // _stprintf(szTemp, _T(",\r\n%*s"), pPropSet->sClassName.GetLength() * 2 + 5, _T("")) ; // sTemp += szTemp ; // } // // _stprintf(szTemp, _T("TPROP(%s)"), (const WCHAR *) pProperty->sProperty) ; // // sTemp += szTemp ; // // pProperty = pProperty->pNext ; // } // } // // return sTemp ; //} /***************************************************************************** * * FUNCTION : GetPropNameExterns * * DESCRIPTION : Returns CHString containing property name external declarations * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ CHString GetPropNameExterns(PROPSET_INFO *pPropSet) { PROPERTY_INFO *pProperty ; WCHAR szTemp[_MAX_PATH] ; CHString sTemp ; if(pPropSet != NULL) { pProperty = pPropSet->pPropertyList ; while(pProperty != NULL) { _stprintf(szTemp, _T("extern const WCHAR* %s ;\r\n"), LPCTSTR(pProperty->sPropertyNamePtr)) ; sTemp += szTemp ; pProperty = pProperty->pNext ; } } return sTemp ; } /***************************************************************************** * * FUNCTION : GetPropTemplates * * DESCRIPTION : Returns CHString containing property template declarations * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ //CHString GetPropTemplates(PROPSET_INFO *pPropSet) //{ // PROPERTY_INFO *pProperty ; // WCHAR szTemp[_MAX_PATH] ; // CHString sPropAttribs ; // // CHString sTemp ; // // if(pPropSet != NULL) // { // pProperty = pPropSet->pPropertyList ; // while(pProperty != NULL) // { // // This is easier if we construct the property section separately // //=============================================================== // // sPropAttribs = BuildPropAttribString(pProperty->dwFlags) ; // // _stprintf(szTemp, _T(" MOProperty <%s, %s, %s, %s, %s> %s ;\r\n"), // pProperty->dwType == MO_PROPTYPE_DWORD ? _T("DWORD") : // pProperty->dwType == MO_PROPTYPE_CHString ? _T("CHString") : // pProperty->dwType == MO_PROPTYPE_BOOL ? _T("bool") : // pProperty->dwType == MO_PROPTYPE_DATETIME ? _T("WBEMTime") : _T("Variant"), // (const WCHAR *) pProperty->sPropertyNamePtr, // (const WCHAR *) sPropAttribs, // (const WCHAR *) pProperty->sPutMethod, // (const WCHAR *) pProperty->sGetMethod, // (const WCHAR *) pProperty->sProperty) ; // // sTemp += szTemp ; // // pProperty = pProperty->pNext ; // } // } // // return sTemp ; //} /***************************************************************************** * * FUNCTION : GetPropertyAttribs * * DESCRIPTION : Returns CHString containing run-time property attribute * assignments * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ //CHString GetPropertyAttribs(PROPSET_INFO *pPropSet) //{ // PROPERTY_ATTRIB_INFO *pPropAttrib ; // WCHAR szTemp[_MAX_PATH] ; // CHString sPropAttribs ; // // CHString sTemp ; // // if(pPropSet != NULL) // { // pPropAttrib = pPropSet->pPropertyAttribList ; // while(pPropAttrib != NULL) // { // sPropAttribs = BuildPropAttribString(pPropAttrib->dwFlags) ; // _stprintf(szTemp, _T(" %s.SetAttributes(%s) ;\r\n"), // (const WCHAR *) pPropAttrib->sProperty, // (const WCHAR *) sPropAttribs) ; // // sTemp += szTemp ; // // pPropAttrib = pPropAttrib->pNext ; // } // } // // return sTemp ; //} /***************************************************************************** * * FUNCTION : BuildPropAttribString * * DESCRIPTION : Constructs textual representation of property attributes * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ //CHString BuildPropAttribString (DWORD dwFlags) //{ // CHString sAttribs ; // // if(dwFlags & MO_ATTRIB_READ) // { // if(!sAttribs.IsEmpty()) // { // sAttribs += _T(" | ") ; // } // sAttribs += _T("PROPERTY_READABLE") ; // } // // if(dwFlags & MO_ATTRIB_WRITE) // { // if(!sAttribs.IsEmpty()) // { // sAttribs += _T(" | ") ; // } // sAttribs += _T("PROPERTY_WRITEABLE") ; // } // // if(dwFlags & MO_ATTRIB_VOLATILE) // { // if(!sAttribs.IsEmpty()) // { // sAttribs += _T(" | ") ; // } // sAttribs += _T("PROPERTY_VOLATILE") ; // } // // if(dwFlags & MO_ATTRIB_EXPENSIVE) // { // if(!sAttribs.IsEmpty()) // { // sAttribs += _T(" | ") ; // } // sAttribs += _T("PROPERTY_EXPENSIVE") ; // } // // if(dwFlags & MO_ATTRIB_KEY) // { // if(!sAttribs.IsEmpty()) // { // sAttribs += _T(" | ") ; // } // sAttribs += _T("PROPERTY_KEY") ; // } // // if(sAttribs.IsEmpty()) // { // sAttribs = _T("0") ; // } // // return sAttribs ; //} /***************************************************************************** * * FUNCTION : GetPropPuts * * DESCRIPTION : Returns CHString containing run-time property attribute * assignments * * INPUTS : * * OUTPUTS : * * RETURNS : * * COMMENTS : * *****************************************************************************/ CHString GetPropPuts (PROPSET_INFO *pPropSet) { WCHAR szTemp[_MAX_PATH] ; CHString sPutType; PPROPERTY_INFO pProperty = NULL; CHString sTemp = _T(""); if (NULL != pPropSet) { pProperty = pPropSet->pPropertyList; while (NULL != pProperty) { _stprintf(szTemp, _T("// pInstance->Set%s(%s, );\r\n"), pProperty->dwType == MO_PROPTYPE_DWORD ? _T("DWORD") : pProperty->dwType == MO_PROPTYPE_CHString ? _T("CHString") : pProperty->dwType == MO_PROPTYPE_BOOL ? _T("bool") : pProperty->dwType == MO_PROPTYPE_DATETIME ? _T("WBEMTime") : _T("Variant"), (LPCTSTR)pProperty->sPropertyNamePtr); sTemp += szTemp ; pProperty = pProperty->pNext; } } return sTemp; }