|
|
/******************************************************************************
* Temp conversion utility to take registry entries and populate the class store with those entries. *****************************************************************************/
/******************************************************************************
includes ******************************************************************************/ #include "precomp.hxx"
#include "..\appmgr\resource.h"
extern HINSTANCE ghInstance;
/******************************************************************************
defines and prototypes ******************************************************************************/
extern CLSID CLSID_ClassStore; extern const IID IID_IClassStore; extern const IID IID_IClassAdmin;
LONG UpdatePackage( MESSAGE * pMessage, BOOL fUsageFlag, DWORD Context, char * pClsidString, char * pAppid, char * ServerName, DWORD * pMajorVersion, DWORD * pMinorVersion, DWORD * pLocale );
LONG FindCLSIDFromFileExtension( MESSAGE * pMessage, BasicRegistry * pFileExtKey, char * ClsidBuffer, DWORD * SizeofClsidBuffer, char * szExt );
LONG UpdateDatabaseFromFileExt( MESSAGE * pMessage ) { BasicRegistry * pHKCR = new BasicRegistry( pMessage->hRoot ); BasicRegistry * pFileKey; LONG Error; int Index;
//
// Get the file extension entries one by one. A file extension entry
// is one whose name starts with a ".". So we enumerate the keys
// looking for file extensions and add to the class dictionary.
// Note that this step is carried out AFTER the class dictionary is
// already populated, so we can assume that the class dictionary is
// present.
//
pHKCR->InitForEnumeration(0);
for ( Index = 0;Error != ERROR_NO_MORE_ITEMS;++Index ) { char FileExtBuffer[ 256 ]; DWORD SizeOfFileExtBuffer = 256; Error = pHKCR->NextKey( FileExtBuffer, &SizeOfFileExtBuffer, &pFileKey, pMessage->ftLow, pMessage->ftHigh );
if( (Error == ERROR_SUCCESS ) && (FileExtBuffer[0] == '.') ) { LONG Error2; char ClsidBuffer[256]; DWORD SizeofClsidBuffer = 256;
// this is a file extension key.
// Given a file extension key, figure out the CLSID.
/*****
if(_stricmp(FileExtBuffer, ".doc" ) == 0 ) printf("Hello1"); ******/
Error2 = FindCLSIDFromFileExtension( pMessage, pFileKey, ClsidBuffer, &SizeofClsidBuffer, FileExtBuffer ); if( Error2 != ERROR_NO_MORE_ITEMS ) { CLASS_ENTRY * pClsEntry;
// Enter into the Clsid dictionary.
if( (pClsEntry = pMessage->pClsDict->Search( &ClsidBuffer[0] ) ) != 0 ) { int len = strlen( FileExtBuffer ); char * p = new char[ len + 1]; strcpy( p, FileExtBuffer ); pClsEntry->FileExtList.Add( p ); } }
}
// close the key if we opened it.
if( Error == ERROR_SUCCESS ) delete pFileKey; } return ERROR_SUCCESS; } LONG FindCLSIDFromFileExtension( MESSAGE * pMessage, BasicRegistry * pFileExtKey, char * ClsidBuffer, DWORD * pSizeofClsidBuffer, char * szExt ) { char Buffer[256]; DWORD SizeofBuffer; BasicRegistry * pClsidKey; HKEY pTempKey; BasicRegistry * pProgIDKey; LONG Error = ERROR_NO_MORE_ITEMS; int fFound = 0;
// Find the unnamed value. This is the progid value. Under this, a CLSID key should be present.
SizeofBuffer = 256; Error = pFileExtKey->QueryValue("", &Buffer[0], &SizeofBuffer );
// Get the key named in the Buffer.
Error = RegOpenKeyEx( pMessage->hRoot, &Buffer[0], 0, KEY_ALL_ACCESS, &pTempKey );
pProgIDKey = new BasicRegistry( pTempKey );
if( Error == ERROR_SUCCESS ) { // Now get the CLSID subkey under this prog id key.
Error = pProgIDKey->Find( "CLSID", &pClsidKey );
if( Error == ERROR_SUCCESS ) { // Find the unnamed value in this
Error = pClsidKey->QueryValue( "", &ClsidBuffer[0], pSizeofClsidBuffer );
delete pClsidKey; } else { CLSID TempClsid;
// uuid create on TempClsid here
UuidCreate(&TempClsid);
// Convert that to a string.
CLSIDToString( &TempClsid, &ClsidBuffer[0] );
CLASS_ENTRY * pClassEntry = new CLASS_ENTRY;
memcpy( pClassEntry->ClsidString, &ClsidBuffer[0], SIZEOF_STRINGIZED_CLSID );
pMessage->pClsDict->Insert( pClassEntry );
char * pT = new char [SIZEOF_STRINGIZED_CLSID];
memcpy( pT, &ClsidBuffer[0], SIZEOF_STRINGIZED_CLSID );
UpdatePackage( pMessage, 0, // clsid update
CTX_LOCAL_SERVER, pT, 0, pMessage->pPackagePath, 0, 0, 0 );
Error = ERROR_SUCCESS; } delete pProgIDKey; } else { // Message that the file extension couldn't be mapped to a prog ID
char szCaption [256]; char szBuffer[256];
::LoadString(ghInstance, IDS_BOGUS_EXTENSION, szBuffer, 256); strcat(szBuffer, szExt); strncpy(szCaption, pMessage->pPackagePath, 256); int iReturn = ::MessageBox(pMessage->hwnd, szBuffer, szCaption, MB_OK); }
return Error == ERROR_SUCCESS ? Error: ERROR_NO_MORE_ITEMS; }
|