|
|
//
// Profwiz.cpp doesn't use cmutoa but does include this function. Thus we want the W versions instead of the
// U versions for profwiz.
//
#ifndef _CMUTOA
#define CharNextU CharNextW
#define CharPrevU CharPrevW
#define lstrlenU lstrlenW
#define lstrcpyU lstrcpyW
#define lstrcpynU lstrcpynW
#endif
/*
//+----------------------------------------------------------------------------
//
// Function: HrParseCustomActionString
//
// Synopsis: This function takes a custom action string retrieved from a
// cms file and parses it into the various parts of a custom
// action (program, parameters, function name)
//
// Arguments: LPTSTR pszStringToParse - custom action buffer to be parsed into
// the various parts of a custom action
// LPTSTR pszProgram - output buffer to hold the program string
// LPTSTR pszParameters - output buffer to hold the parameters string
// LPTSTR pszFunctionName - output buffer to hold the function name, if any
//
// Returns: HRESULT - standard COM error codes
//
// History: quintinb Created Header 02/26/00
//
//+----------------------------------------------------------------------------
HRESULT HrParseCustomActionString(LPTSTR pszStringToParse, LPTSTR pszProgram, LPTSTR pszParameters, LPTSTR pszFunctionName) { if ((NULL == pszStringToParse) || (TEXT('\0') == pszStringToParse[0]) || (NULL == pszProgram) || (NULL == pszParameters) || (NULL == pszFunctionName)) { return E_INVALIDARG; }
//
// Make sure the strings are blank in case we don't touch them (szFunctionName and szParameters especially)
//
pszProgram[0] = TEXT('\0'); pszParameters[0] = TEXT('\0'); pszFunctionName[0] = TEXT('\0');
//
// Here are the cases we need to handle:
// 1) +longfilename+
// 2) +longfilename+ params
// 3) +longfilename+,dllfuncname
// 4) +longfilename+,dllfuncname params
// 5) filename
// 6) filename params
// 7) filename,dllfuncname
// 8) filename,dllfuncname params
//
// Walk the string to find the seperator chars
//
LPTSTR pszCurrent = pszStringToParse; LPTSTR pszFirstPlus = NULL; LPTSTR pszSecondPlus = NULL; LPTSTR pszFirstSpace = NULL; LPTSTR pszFirstComma = NULL;
while (pszCurrent && (TEXT('\0') != *pszCurrent)) { if ((TEXT('+') == *pszCurrent) && (NULL == pszFirstComma) && (NULL == pszFirstSpace)) { //
// Keep track of the plus signs, unless we have already seen a space
// or a comma. In which case these chars are in the parameters and
// meaningless to us.
//
if (NULL == pszFirstPlus) { pszFirstPlus = pszCurrent; } else if (NULL == pszSecondPlus) { pszSecondPlus = pszCurrent; } } else if ((TEXT(',') == *pszCurrent) && (NULL == pszFirstSpace)) { //
// If we have already seen a space, then the comma is part of
// the parameters and meaningless to us.
//
pszFirstComma = pszCurrent;
} else if ((TEXT(' ') == *pszCurrent)) { if ((NULL == pszFirstPlus) && (NULL == pszFirstSpace)) { //
// Then we have no plus signs and no previous space, save the space as
// it is the start of the parameters.
//
pszFirstSpace = pszCurrent; } else if (pszFirstPlus && pszSecondPlus && (NULL == pszFirstSpace)) { //
// Then we have both plus signs but no space yet, grab it
// because this is the start of the parameters
//
pszFirstSpace = pszCurrent; } } pszCurrent = CharNextU(pszCurrent);
}
//
// From the markers we have, figure out the beginning and end of the program string
//
LPTSTR pszStartOfProgram = NULL; LPTSTR pszEndOfProgram = NULL;
if (pszFirstPlus) { if (pszSecondPlus) { pszStartOfProgram = CharNextU(pszFirstPlus); pszEndOfProgram = CharPrevU(pszStringToParse, pszSecondPlus); } else { //
// We have a string with the first char as a plus sign but no second +.
// The format isn't correct.
//
CMASSERTMSG(FALSE, TEXT("CustomActionList::ParseCustomActionString - Incorrect format in the passed in string to parse, missing + sign.")); return E_UNEXPECTED; } } else { pszStartOfProgram = pszStringToParse;
if (pszFirstComma) { pszEndOfProgram = CharPrevU(pszStringToParse, pszFirstComma); } else if (pszFirstSpace) { pszEndOfProgram = CharPrevU(pszStringToParse, pszFirstSpace); } else { //
// Nothing in the string but the program
//
pszEndOfProgram = pszStringToParse + lstrlenU(pszStringToParse) - 1; } }
//
// Now copy out the necessary parts
//
int iSize = (int)(pszEndOfProgram - pszStartOfProgram + 2);
lstrcpynU(pszProgram, pszStartOfProgram, iSize);
if (pszFirstComma) { if (pszFirstSpace) { iSize = (int)(pszFirstSpace - pszFirstComma); lstrcpynU(pszFunctionName, CharNextU(pszFirstComma), iSize); } else { lstrcpyU(pszFunctionName, CharNextU(pszFirstComma)); } } if (pszFirstSpace) { lstrcpyU(pszParameters, CharNextU(pszFirstSpace)); }
return S_OK; } */
//+----------------------------------------------------------------------------
//
// Function: HrParseCustomActionString
//
// Synopsis: This function takes a custom action string retrieved from a
// cms file and parses it into the various parts of a custom
// action (program, parameters, function name)
//
// Arguments: LPTSTR pszStringToParse - custom action buffer to be parsed into
// the various parts of a custom action
// LPTSTR pszProgram - output buffer to hold the program string
// LPTSTR pszParameters - output buffer to hold the parameters string
// LPTSTR pszFunctionName - output buffer to hold the function name, if any
//
// Returns: HRESULT - standard COM error codes
//
// History: quintinb Created Header 02/26/00
//
//+----------------------------------------------------------------------------
HRESULT HrParseCustomActionString(LPTSTR pszStringToParse, LPTSTR* ppszProgram, LPTSTR* ppszParameters, LPTSTR* ppszFunctionName) { if ((NULL == pszStringToParse) || (TEXT('\0') == pszStringToParse[0]) || (NULL == ppszProgram) || (NULL == ppszParameters) || (NULL == ppszFunctionName)) { return E_INVALIDARG; }
//
// NULL out the string pointers to start with
//
*ppszProgram = NULL; *ppszParameters = NULL; *ppszFunctionName = NULL;
//
// Here are the cases we need to handle:
// 1) +longfilename+
// 2) +longfilename+ params
// 3) +longfilename+,dllfuncname
// 4) +longfilename+,dllfuncname params
// 5) filename
// 6) filename params
// 7) filename,dllfuncname
// 8) filename,dllfuncname params
//
// Walk the string to find the seperator chars
//
LPTSTR pszCurrent = pszStringToParse; LPTSTR pszFirstPlus = NULL; LPTSTR pszSecondPlus = NULL; LPTSTR pszFirstSpace = NULL; LPTSTR pszFirstComma = NULL;
while (pszCurrent && (TEXT('\0') != *pszCurrent)) { if ((TEXT('+') == *pszCurrent) && (NULL == pszFirstComma) && (NULL == pszFirstSpace)) { //
// Keep track of the plus signs, unless we have already seen a space
// or a comma. In which case these chars are in the parameters and
// meaningless to us.
//
if (NULL == pszFirstPlus) { pszFirstPlus = pszCurrent; } else if (NULL == pszSecondPlus) { pszSecondPlus = pszCurrent; } } else if ((TEXT(',') == *pszCurrent) && (NULL == pszFirstSpace)) { //
// If we have already seen a space, then the comma is part of
// the parameters and meaningless to us.
//
pszFirstComma = pszCurrent;
} else if ((TEXT(' ') == *pszCurrent)) { if ((NULL == pszFirstPlus) && (NULL == pszFirstSpace)) { //
// Then we have no plus signs and no previous space, save the space as
// it is the start of the parameters.
//
pszFirstSpace = pszCurrent; } else if (pszFirstPlus && pszSecondPlus && (NULL == pszFirstSpace)) { //
// Then we have both plus signs but no space yet, grab it
// because this is the start of the parameters
//
pszFirstSpace = pszCurrent; } } pszCurrent = CharNextU(pszCurrent);
}
//
// From the markers we have, figure out the beginning and end of the program string
//
LPTSTR pszStartOfProgram = NULL; LPTSTR pszEndOfProgram = NULL;
if (pszFirstPlus) { if (pszSecondPlus) { pszStartOfProgram = CharNextU(pszFirstPlus); pszEndOfProgram = CharPrevU(pszStringToParse, pszSecondPlus); } else { //
// We have a string with the first char as a plus sign but no second +.
// The format isn't correct.
//
CMASSERTMSG(FALSE, TEXT("CustomActionList::ParseCustomActionString - Incorrect format in the passed in string to parse, missing + sign.")); return E_UNEXPECTED; } } else { pszStartOfProgram = pszStringToParse;
if (pszFirstComma) { pszEndOfProgram = CharPrevU(pszStringToParse, pszFirstComma); } else if (pszFirstSpace) { pszEndOfProgram = CharPrevU(pszStringToParse, pszFirstSpace); } else { //
// Nothing in the string but the program
//
pszEndOfProgram = pszStringToParse + lstrlenU(pszStringToParse) - 1; } }
//
// Now copy out the necessary parts
//
HRESULT hr = E_OUTOFMEMORY; int iSize = (int)(pszEndOfProgram - pszStartOfProgram + 2);
*ppszProgram = (LPTSTR)CmMalloc(sizeof(TCHAR)*iSize);
if (*ppszProgram) { lstrcpynU(*ppszProgram, pszStartOfProgram, iSize);
if (pszFirstComma) { if (pszFirstSpace) { iSize = (int)(pszFirstSpace - pszFirstComma); *ppszFunctionName = (LPTSTR)CmMalloc(sizeof(TCHAR)*iSize);
if (*ppszFunctionName) { lstrcpynU(*ppszFunctionName, CharNextU(pszFirstComma), iSize); } else { goto exit; } } else { iSize = lstrlen(CharNextU(pszFirstComma)) + 1; *ppszFunctionName = (LPTSTR)CmMalloc(sizeof(TCHAR)*iSize);
if (*ppszFunctionName) { lstrcpyU(*ppszFunctionName, CharNextU(pszFirstComma)); } else { goto exit; } } } else { *ppszFunctionName = CmStrCpyAlloc(TEXT("")); } if (pszFirstSpace) { iSize = lstrlen(CharNextU(pszFirstSpace)) + 1; *ppszParameters = (LPTSTR)CmMalloc(sizeof(TCHAR)*iSize);
if (*ppszParameters) { lstrcpyU(*ppszParameters, CharNextU(pszFirstSpace)); } else { goto exit; } } else { *ppszParameters = CmStrCpyAlloc(TEXT("")); }
if (*ppszParameters && *ppszFunctionName && *ppszProgram) { hr = S_OK; } } else { goto exit; }
exit: MYDBGASSERT(SUCCEEDED(hr));
if (FAILED(hr)) { CMTRACE1(TEXT("HrParseCustomActionString failed, hr = 0x%x"), hr); CmFree(*ppszFunctionName); CmFree(*ppszProgram); CmFree(*ppszParameters); *ppszProgram = NULL; *ppszParameters = NULL; *ppszFunctionName = NULL; }
return hr; }
|