//========================================================================== // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright 1998 - 1999 Microsoft Corporation. All Rights Reserved. // //-------------------------------------------------------------------------- #include "precomp.h" #define HANDLERITEMSKEY TEXT("\\HandlerItems") #define HANDLERVALUE_DIR1 TEXT("Dir1") #define HANDLERVALUE_DIR2 TEXT("Dir2") #define HANDLERVALUE_DISPLAYNAME TEXT("DisplayName") #define HANDLERVALUE_FILETIME TEXT("TimeStamp") #define HANDLERVALUE_RECURSIVE TEXT("Recursive") //+--------------------------------------------------------------------------- // // Function: SetRegKeyValue, private // // Synopsis: Internal utility function to set a Key, Subkey, and value // in the system Registry under HKEY_CLASSES_ROOT. // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- BOOL SetRegKeyValue( HKEY hKeyTop, LPTSTR pszKey, LPTSTR pszSubkey, LPTSTR pszValue) { BOOL bOk = FALSE; LONG ec; HKEY hKey; TCHAR szKey[MAX_STRING_LENGTH]; lstrcpy(szKey, pszKey); if (NULL != pszSubkey) { lstrcat(szKey, TEXT("\\")); lstrcat(szKey, pszSubkey); } ec = RegCreateKeyEx( hKeyTop, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, NULL); if (NULL != pszValue && ERROR_SUCCESS == ec) { ec = RegSetValueEx( hKey, NULL, 0, REG_SZ, (BYTE *)pszValue, (lstrlen(pszValue)+1)*sizeof(TCHAR)); if (ERROR_SUCCESS == ec) bOk = TRUE; RegCloseKey(hKey); } return bOk; } //+--------------------------------------------------------------------------- // // Function: GetRegKeyValue, private // // Synopsis: Internal utility function to get a Key value // in the system Registry. // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- LRESULT GetRegKeyValue(HKEY hkeyParent, LPCTSTR pcszSubKey, LPCTSTR pcszValue, PDWORD pdwValueType, PBYTE pbyteBuf, PDWORD pdwcbBufLen) { LONG lResult; HKEY hkeySubKey; lResult = RegOpenKeyEx(hkeyParent, pcszSubKey, 0, KEY_QUERY_VALUE, &hkeySubKey); if (lResult == ERROR_SUCCESS) { LONG lResultClose; lResult = RegQueryValueEx(hkeySubKey, pcszValue, NULL, pdwValueType, pbyteBuf, pdwcbBufLen); lResultClose = RegCloseKey(hkeySubKey); if (lResult == ERROR_SUCCESS) lResult = lResultClose; } return(lResult); } //+--------------------------------------------------------------------------- // // Function: GetRegKeyValue, private // // Synopsis: Internal utility function to add a named data value to an // existing Key (with optional Subkey) in the system Registry // under HKEY_CLASSES_ROOT. // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- BOOL AddRegNamedValue( LPTSTR pszKey, LPTSTR pszSubkey, LPTSTR pszValueName, LPTSTR pszValue) { BOOL bOk = FALSE; LONG ec; HKEY hKey; TCHAR szKey[MAX_STRING_LENGTH]; lstrcpy(szKey, pszKey); if (NULL != pszSubkey) { lstrcat(szKey, TEXT("\\")); lstrcat(szKey, pszSubkey); } ec = RegOpenKeyEx( HKEY_CLASSES_ROOT, szKey, 0, KEY_READ | KEY_WRITE, &hKey); if (NULL != pszValue && ERROR_SUCCESS == ec) { ec = RegSetValueEx( hKey, pszValueName, 0, REG_SZ, (BYTE *)pszValue, (lstrlen(pszValue)+1)*sizeof(TCHAR)); if (ERROR_SUCCESS == ec) bOk = TRUE; RegCloseKey(hKey); } return bOk; } //+--------------------------------------------------------------------------- // // Function: RegGetTimeStamp, private // // Synopsis: Reads in TimeStamp Value under the specified HKEY // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- BOOL RegGetTimeStamp(HKEY hKey, FILETIME *pft) { DWORD dwType; FILETIME ft; LONG lr; DWORD dwSize = sizeof(FILETIME); Assert(pft); lr = RegQueryValueEx( hKey, HANDLERVALUE_FILETIME, NULL, &dwType, (BYTE *)&ft, &dwSize ); if ( lr == ERROR_SUCCESS ) { Assert( dwSize == sizeof(FILETIME) && dwType == REG_BINARY ); *pft = ft; } else { // set the filetime to way back when to // any compares will just say older instead // of having to check success code (*pft).dwLowDateTime = 0; (*pft).dwHighDateTime = 0; } return TRUE; } //+--------------------------------------------------------------------------- // // Function: RegWriteTimeStamp, private // // Synopsis: Writes out TimeStamp Value under the specified HKEY // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- BOOL RegWriteTimeStamp(HKEY hkey,FILETIME *pft) { LRESULT lr; lr = RegSetValueEx( hkey, HANDLERVALUE_FILETIME, NULL, REG_BINARY, (BYTE *) pft, sizeof(FILETIME) ); return (ERROR_SUCCESS == lr) ? TRUE : FALSE; } //+--------------------------------------------------------------------------- // // Function: CreateHandlerPrefKey, private // // Synopsis: given a server clsid does work of openning up the // handler perf key // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- HKEY CreateHandlerPrefKey(CLSID CLSIDServer) { TCHAR szFullKeyName[MAX_PATH]; TCHAR szGUID[GUID_SIZE+1]; LONG lResult = -1; HKEY hKey; #ifdef _UNICODE StringFromGUID2(CLSIDServer, szGUID, GUID_SIZE); #else BOOL fUsedDefaultChar; WCHAR wszID[GUID_SIZE+1]; // convert clsidServer StringFromGUID2(CLSIDServer, wszID, GUID_SIZE); WideCharToMultiByte(CP_ACP ,0, wszID,-1,szGUID,GUID_SIZE + 1, NULL,&fUsedDefaultChar); #endif // _UNICODE lstrcpy(szFullKeyName, TEXT("CLSID\\")); lstrcat(szFullKeyName, szGUID); lstrcat(szFullKeyName,HANDLERITEMSKEY); // try to open handler items keyfs lResult = RegCreateKeyEx( HKEY_CLASSES_ROOT, szFullKeyName, 0,NULL,REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE,NULL, &hKey,NULL); return (ERROR_SUCCESS == lResult) ? hKey : NULL; } //+--------------------------------------------------------------------------- // // Function: CreateHandlerItemPrefKey, private // // Synopsis: creates perf key for specified ItemID // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- HKEY CreateHandlerItemPrefKey(HKEY hkeyHandler,SYNCMGRITEMID ItemID) { TCHAR szGUID[GUID_SIZE+1]; LONG lResult = -1; HKEY hKeyItem; // try to open/create item key #ifdef _UNICODE StringFromGUID2(ItemID, szGUID, GUID_SIZE); #else BOOL fUsedDefaultChar; WCHAR wszID[GUID_SIZE+1]; // convert clsidServer StringFromGUID2(ItemID, wszID, GUID_SIZE); WideCharToMultiByte(CP_ACP ,0, wszID,-1,szGUID,GUID_SIZE + 1, NULL,&fUsedDefaultChar); #endif // _UNICODE // try to open handler items keyfs lResult = RegCreateKeyEx( hkeyHandler, szGUID, 0,NULL,REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE,NULL, &hKeyItem,NULL); return (ERROR_SUCCESS == lResult) ? hKeyItem : NULL; } //+--------------------------------------------------------------------------- // // Function: CreateHandlerItemPrefKey, private // // Synopsis: creates perf key for specified ItemID // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- HKEY CreateHandlerItemPrefKey(CLSID CLSIDServer,SYNCMGRITEMID ItemID) { HKEY hKeyHandler; HKEY hKeyItem; if (hKeyHandler = CreateHandlerPrefKey(CLSIDServer)) { hKeyItem = CreateHandlerItemPrefKey(hKeyHandler,ItemID); RegCloseKey(hKeyHandler); // close handler key. } return hKeyItem; } //+--------------------------------------------------------------------------- // // Function: Reg_GetItemSettingsForHandlerItem, public // // Synopsis: Returns settings for the specified Item. // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- STDMETHODIMP Reg_GetItemSettingsForHandlerItem(HKEY hKeyHandler,SYNCMGRITEMID ItemID, LPSAMPLEITEMSETTINGS pSampleItemSettings) { HKEY hKey; TCHAR *pDisplayName; DWORD dwType; DWORD dwSize; hKey = CreateHandlerItemPrefKey(hKeyHandler,ItemID); if (!hKey) { Assert(hKey); return E_UNEXPECTED; } pSampleItemSettings->syncmgrItem.ItemID = ItemID; // write out our info. #ifdef _UNICODE pDisplayName = pSampleItemSettings->syncmgrItem.wszItemName; #else char szDisplayName[MAX_SYNCMGRITEMNAME]; pDisplayName = szDisplayName; #endif // _UNICODE // read in the values, dwType = REG_SZ; dwSize = MAX_SYNCMGRITEMNAME*sizeof(TCHAR); RegQueryValueEx( hKey, HANDLERVALUE_DISPLAYNAME, NULL, &dwType, (BYTE *) pDisplayName, &dwSize); #ifndef _UNICODE MultiByteToWideChar(CP_ACP, 0, pDisplayName,-1, pSampleItemSettings->syncmgrItem.wszItemName, MAX_SYNCMGRITEMNAME); #endif dwType = REG_SZ; dwSize = MAX_PATH*sizeof(TCHAR); RegQueryValueEx( hKey, HANDLERVALUE_DIR1, NULL, &dwType, (BYTE *) pSampleItemSettings->dir1, &dwSize); dwType = REG_SZ; dwSize = MAX_PATH*sizeof(TCHAR); RegQueryValueEx( hKey, HANDLERVALUE_DIR2, NULL, &dwType, (BYTE *) pSampleItemSettings->dir2, &dwSize); dwType = REG_DWORD; dwSize = sizeof(DWORD); RegQueryValueEx( hKey, HANDLERVALUE_RECURSIVE, NULL, &dwType, (BYTE *) &(pSampleItemSettings->fRecursive), &dwSize); RegGetTimeStamp(hKey,&(pSampleItemSettings->syncmgrItem.ftLastUpdate)); RegCloseKey(hKey); return NOERROR; } //+--------------------------------------------------------------------------- // // Function: Reg_SetItemSettingsForHandlerItem, public // // Synopsis: Writes out settings for a handler item. // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- STDMETHODIMP Reg_SetItemSettingsForHandlerItem(CLSID CLSIDServer,SYNCMGRITEMID ItemID,LPSAMPLEITEMSETTINGS pSampleItemSettings) { HKEY hKey; TCHAR *pDisplayName; hKey = CreateHandlerItemPrefKey(CLSIDServer,ItemID); if (!hKey) { Assert(hKey); return E_UNEXPECTED; } // write out our info. #ifdef _UNICODE pDisplayName = pSampleItemSettings->syncmgrItem.wszItemName; #else BOOL fUsedDefaultChar; char szDisplayName[MAX_SYNCMGRITEMNAME]; WideCharToMultiByte(CP_ACP ,0, pSampleItemSettings->syncmgrItem.wszItemName,-1, szDisplayName,MAX_SYNCMGRITEMNAME, NULL,&fUsedDefaultChar); pDisplayName = szDisplayName; #endif // _UNICODE RegSetValueEx(hKey,HANDLERVALUE_DISPLAYNAME, 0, REG_SZ, (BYTE *) pDisplayName, (lstrlen(pDisplayName) + 1)*sizeof(TCHAR)); RegSetValueEx(hKey,HANDLERVALUE_DIR1, 0, REG_SZ, (BYTE *) pSampleItemSettings->dir1, (lstrlen(pSampleItemSettings->dir1) + 1)*sizeof(TCHAR)); RegSetValueEx(hKey,HANDLERVALUE_DIR2, 0, REG_SZ, (BYTE *) pSampleItemSettings->dir2, (lstrlen(pSampleItemSettings->dir2) + 1)*sizeof(TCHAR)); RegSetValueEx(hKey,HANDLERVALUE_RECURSIVE, 0, REG_DWORD, (BYTE *) &(pSampleItemSettings->fRecursive), sizeof(DWORD)); RegWriteTimeStamp(hKey,&(pSampleItemSettings->syncmgrItem.ftLastUpdate)); RegCloseKey(hKey); return NOERROR; } //+--------------------------------------------------------------------------- // // Function: Reg_DeleteItemIdForHandlerItem, public // // Synopsis: Deletes an Items preferences from the registry.. // // Arguments: // // Returns: // // Modifies: // //---------------------------------------------------------------------------- STDMETHODIMP Reg_DeleteItemIdForHandlerItem(CLSID CLSIDServer,SYNCMGRITEMID ItemID) { HKEY hKeyHandler; if (hKeyHandler = CreateHandlerPrefKey( CLSIDServer)) { TCHAR szGUID[GUID_SIZE+1]; #ifdef _UNICODE StringFromGUID2(ItemID, szGUID, GUID_SIZE); #else BOOL fUsedDefaultChar; WCHAR wszID[GUID_SIZE+1]; // convert clsidServer StringFromGUID2(ItemID, wszID, GUID_SIZE); WideCharToMultiByte(CP_ACP ,0, wszID,-1,szGUID,GUID_SIZE + 1, NULL,&fUsedDefaultChar); #endif // _UNICODE RegDeleteKey(hKeyHandler,szGUID); RegCloseKey(hKeyHandler); } return NOERROR; }