1585 lines
38 KiB
C++
1585 lines
38 KiB
C++
|
//***************************************************************************
|
||
|
|
||
|
//
|
||
|
|
||
|
// 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 <stdio.h>
|
||
|
#include <conio.h>
|
||
|
#include <io.h>
|
||
|
#include <comdef.h>
|
||
|
|
||
|
#define POLARITY
|
||
|
#include <chstring.h>
|
||
|
|
||
|
#define MO_ENGINE_PROGRAM
|
||
|
#include <moengine.h>
|
||
|
|
||
|
#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;i<len ;i++ )
|
||
|
{
|
||
|
if ((_T('\n') == chsCompString[i]) || (_T('\r') == chsCompString[i]))
|
||
|
{
|
||
|
chsCompString.SetAt(i, _T(' '));
|
||
|
} // end if
|
||
|
} // end for
|
||
|
pPropSet->sDescription = 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, <Property Value>);\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;
|
||
|
}
|