/*++ Copyright (C) Microsoft Corporation, 1996 - 1999 Module Name: ClbMisc Abstract: This header file describes the miscellaneous services of the Calais Library. Author: Doug Barlow (dbarlow) 7/16/1996 Environment: Win32, C++ w/ Exceptions Notes: --*/ #ifndef _CLBMISC_H_ #define _CLBMISC_H_ #include #include // // Miscellaneous definitions. // extern int MemCompare( // Non CRTL memory compare routine. IN LPCBYTE pbOne, IN LPCBYTE pbTwo, IN DWORD cbLength); extern DWORD MStrAdd( // Add an ANSI string to a multistring. IN OUT CBuffer &bfMsz, IN LPCSTR szAdd); extern DWORD MStrAdd( // Add a wide string to a multistring. IN OUT CBuffer &bfMsz, IN LPCWSTR szAdd); extern DWORD MStrLen( // Return the length of an ANSI Multistring, in chars. LPCSTR mszString); extern DWORD MStrLen( // Return the length of a wide Multistring, in chars. LPCWSTR mszString); extern LPCTSTR FirstString( // Return first string segment in a multistring. IN LPCTSTR szMultiString); extern LPCTSTR NextString( // Return next string segment in a multistring. IN LPCTSTR szMultiString); extern LPCTSTR StringIndex( // Return n'th string segment in a multistring. IN LPCTSTR szMultiString, IN DWORD dwIndex); extern DWORD MStringCount( LPCTSTR mszInString); // count strings in multistring extern DWORD MStringSort( // Sort multistring, removing duplicates. LPCTSTR mszInString, CBuffer &bfOutString); extern DWORD MStringMerge( // Merge two multistrings, eliminating duplicates. LPCTSTR mszOne, LPCTSTR mszTwo, CBuffer &bfOutString); extern DWORD MStringCommon( // Get the intersection of two multistrings. LPCTSTR mszOne, LPCTSTR mszTwo, CBuffer &bfOutString); extern DWORD MStringRemove( // Remove 2nd string entries from 1st string. LPCTSTR mszOne, LPCTSTR mszTwo, CBuffer &bfOutString); extern BOOL ParseAtr( // Parse a smartcard ATR string. LPCBYTE pbAtr, LPDWORD pdwAtrLen = NULL, LPDWORD pdwHistOffset = NULL, LPDWORD pcbHistory = NULL, DWORD cbMaxLen = 33); extern BOOL AtrCompare( // Compare an ATR to an ATR/Mask pair. LPCBYTE pbAtr1, LPCBYTE pbAtr2, LPCBYTE pbMask, // = NULL DWORD cbAtr2); // = 0 extern DWORD MoveString( // Move an ANSI string into a buffer, converting to CBuffer &bfDst, // TCHARs. LPCSTR szSrc, DWORD dwLength = (DWORD)(-1)); extern DWORD MoveString( // Move a UNICODE string into a buffer, converting to CBuffer &bfDst, // TCHARs. LPCWSTR szSrc, DWORD dwLength = (DWORD)(-1)); extern DWORD MoveToAnsiString( // Move a string into a UNICODE buffer, converting from LPSTR szDst, // TCHARs. LPCTSTR szSrc, DWORD cchLength); extern DWORD MoveToUnicodeString( // Move a string into an ANSI buffer, converting from LPWSTR szDst, // TCHARs. LPCTSTR szSrc, DWORD cchLength); extern DWORD MoveToAnsiMultiString( // Move a multistring into an ANSI buffer, converting LPSTR mszDst, // from TCHARs. LPCTSTR mszSrc, DWORD cchLength); extern DWORD MoveToUnicodeMultiString( // Move a multistring into a UNICODE buffer, LPWSTR mszDst, // converting from TCHARs. LPCTSTR mszSrc, DWORD cchLength); extern LPCTSTR ErrorString( // Convert an error code into a string. DWORD dwErrorCode); extern void FreeErrorString( // Free the string returned from ErrorString. LPCTSTR szErrorString); extern DWORD SelectString( // Index a given string against a list of possible LPCTSTR szSource, // strings. Last parameter is NULL. ...); extern void StringFromGuid( IN LPCGUID pguidResult, // GUID to convert to text OUT LPTSTR szGuid); // 39+ character buffer to receive GUID as text. // //============================================================================== // // CErrorString // // A trivial class to simplify the use of the ErrorString service. // class CErrorString { public: // Constructors & Destructor CErrorString(DWORD dwError = 0) { m_szErrorString = NULL; SetError(dwError); }; ~CErrorString() { if (m_szErrorString != m_szHexError) FreeErrorString(m_szErrorString); }; // Properties // Methods void SetError(DWORD dwError) { m_dwError = dwError; }; LPCTSTR Value(void) { LPCTSTR szErr = NULL; if (m_szErrorString != m_szHexError) FreeErrorString(m_szErrorString); try { szErr = ErrorString(m_dwError); } catch (...) {} if (NULL == szErr) { _stprintf(m_szHexError, _T("0x%08x"), m_dwError); m_szErrorString = m_szHexError; } else m_szErrorString = szErr; return m_szErrorString; }; // Operators operator LPCTSTR(void) { return Value(); }; protected: // Properties DWORD m_dwError; LPCTSTR m_szErrorString; TCHAR m_szHexError[11]; // Big enough to hold 0x%08x\0 // Methods }; #endif // _CLBMISC_H_