//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: mscparser.cpp // // Contents: Implementation of the code to upgrade legacy (MMC1.0, MMC1.1 and // MMC1.2) .msc files to the new XML format // // History: 04-Aug-99 VivekJ Created // //-------------------------------------------------------------------------- #include #include "strtable.h" #include "stgio.h" #include "comdbg.h" #include "mmcdata.h" #include "mscparser.h" /*+-------------------------------------------------------------------------* * * CConsoleFile::ScUpgrade * * PURPOSE: * * PARAMETERS: * LPCTSTR lpszPathName : * * RETURNS: * SC * *+-------------------------------------------------------------------------*/ SC CConsoleFile::ScUpgrade(LPCTSTR lpszPathName) { SC sc; IStoragePtr spStorage; TCHAR szTempFile[MAX_PATH]; DWORD dwRet = 0; USES_CONVERSION; // short circuit return sc; ASSERT(lpszPathName != NULL && *lpszPathName != 0); if (lpszPathName == NULL || *lpszPathName == 0) { sc = ScFromMMC(IDS_UnableToOpenDocumentMessage); goto Error; } // Open the specified file sc = OpenDebugStorage(T2OLE((LPTSTR)lpszPathName), STGM_READ|STGM_SHARE_DENY_WRITE, &spStorage); if(sc.IsError() || spStorage==NULL) { sc = ScFromMMC(IDS_UnableToOpenDocumentMessage); goto Error; } // get the console file's version sc = ScGetFileVersion(spStorage); if(sc) goto Error; // Load the string table. sc = ScLoadStringTable(spStorage); if(sc) goto Error; // Load column settings. sc = ScLoadColumnSettings(spStorage); if(sc) goto Error; // load the view settings sc = ScLoadViewSettings(spStorage); if(sc) goto Error; // load the tree sc = ScLoadTree(spStorage); if(sc) goto Error; // load the favorites sc = ScLoadFavorites(spStorage); if(sc) goto Error; // load custom data (including the icon) sc = ScLoadCustomData(spStorage); if(sc) goto Error; // The LoadAppMode, LoadViews and LoadFrame should be called in that order // load the app mode sc = ScLoadAppMode(spStorage); if(sc) goto Error; // load the views sc = ScLoadViews(spStorage); if(sc) goto Error; // load the frame sc = ScLoadFrame(spStorage); if(sc) goto Error; Cleanup: return sc; Error: //TraceError(TEXT("CConsoleFile::ScUpgrade"), sc); goto Cleanup; } /*+-------------------------------------------------------------------------* * * CConsoleFile::ScGetFileVersion * * PURPOSE: * * PARAMETERS: * IStorage* pstgRoot : * * RETURNS: * SC * *+-------------------------------------------------------------------------*/ SC CConsoleFile::ScGetFileVersion(IStorage* pstgRoot) { static const wchar_t* AMCSignatureStreamName = L"signature"; static const long double dOldVersion10 = 0.00000015; // MMC version 1.0 static const long double dOldVersion11 = 1.1; // MMC version 1.1 static const BYTE byStreamVersionMagic = 0xFF; SC sc; ConsoleFileVersion eFileVer = FileVer_0100; IStreamPtr spStream; int nVersion = 0; IStoragePtr spStorage; ASSERT (sizeof(eFileVer) == sizeof(int)); ASSERT(pstgRoot != NULL); // check for a valid pointer if (pstgRoot == NULL) { sc = ScFromMMC(IDS_INVALIDFILE); // TODO: add this IDS. goto Error; } // Open the stream containing the signature sc = OpenDebugStream(pstgRoot, AMCSignatureStreamName, STGM_SHARE_EXCLUSIVE | STGM_READ, L"\\signature", &spStream); if(sc.IsError() || spStream==NULL) { sc = ScFromMMC(IDS_UnableToOpenDocumentMessage); goto Error; } // read the signature (stream extraction operators will throw // _com_error's, so we need an exception block here) try { // MMC v1.2 and later write a marker as the first // byte of the signature stream. BYTE byMagic; *spStream >> byMagic; // if this file was written by v1.2, // read the console file version (int) if (byMagic == byStreamVersionMagic) { *spStream >> nVersion; ASSERT (nVersion == FileVer_0120); } // Otherwise, the file was written by v1.0 or v1.1. // Back up to re-read the marker byte, and read the old-style // file version (long double), then map it to a new-style version else { LARGE_INTEGER pos = {0, 0}; spStream->Seek (pos, STREAM_SEEK_SET, NULL); long double dVersion; *spStream >> dVersion; // v1.1? if (dVersion == dOldVersion11) nVersion = FileVer_0110; // v1.0? else if (dVersion == dOldVersion10) { // If we got a v1.0 signature, we still may have a v1.1 file. // There was a period of time where MMC v1.1 wrote a v1.0 // signature, but the file format had in fact changed. We // can determine this by checking the \FrameData stream in // the file. If the first DWORD in the \FrameData stream is // sizeof(WINDOWPLACEMENT), we have a true v1.0 file, otherwise // it's a funky v1.1 file. IStreamPtr spFrameDataStm; sc = OpenDebugStream (pstgRoot, L"FrameData", STGM_SHARE_EXCLUSIVE | STGM_READ, &spFrameDataStm); if(sc) goto Error; DWORD dw; *spFrameDataStm >> dw; if (dw == sizeof (WINDOWPLACEMENT)) nVersion = FileVer_0100; else nVersion = FileVer_0110; } // unexpected version else { ASSERT (false && "Unexpected old-style signature"); sc = E_UNEXPECTED; goto Error; } } } catch (_com_error& err) { sc = err.Error(); goto Error; } // make sure the version number is valid. if(IsValidFileVersion(eFileVer)) { sc = ScFromMMC(IDS_InvalidVersion); // TODO: add this IDS goto Error; } Cleanup: return sc; Error: TraceError(TEXT("CConsoleFile::ScGetFileVersion"), sc); goto Cleanup; } /*+-------------------------------------------------------------------------* * * CConsoleFile::ScLoadStringTable * * PURPOSE: Reads in the string table for an .msc file. * * PARAMETERS: * IStorage* pstgRoot : * * RETURNS: * SC * *+-------------------------------------------------------------------------*/ SC CConsoleFile::ScLoadStringTable(IStorage* pstgRoot) { SC sc; static const wchar_t* AMCStringTableStorageName = L"String Table"; /* * open the string table storage */ IStoragePtr spStringTableStg; sc = OpenDebugStorage (pstgRoot, AMCStringTableStorageName, STGM_SHARE_EXCLUSIVE | STGM_READ, &spStringTableStg); /* * If there's no string table, things are OK. We allow this so * we can continue to open older console files. */ if (sc == SC(STG_E_FILENOTFOUND) ) return (true); if(sc) goto Error; /* * read the string table from the storage */ try { *spStringTableStg >> *m_pStringTable; } catch (_com_error& err) { sc = err.Error(); ASSERT (false && "Caught _com_error"); goto Error; } Cleanup: return sc; Error: TraceError(TEXT("CConsoleFile::ScLoadStringTable"), sc); goto Cleanup; } SC CConsoleFile::ScLoadFrame(IStorage* pstgRoot) { SC sc; return sc; } SC CConsoleFile::ScLoadViews(IStorage* pstgRoot) { SC sc; return sc; } SC CConsoleFile::ScLoadAppMode(IStorage* pstgRoot) { SC sc; return sc; } /*+-------------------------------------------------------------------------* * * CConsoleFile::ScLoadColumnSettings * * PURPOSE: * * PARAMETERS: * IStorage* pstgRoot : * * RETURNS: * SC * *+-------------------------------------------------------------------------*/ SC CConsoleFile::ScLoadColumnSettings(IStorage* pstgRoot) { static const wchar_t* AMCColumnDataStreamName = L"ColumnData"; SC sc; IPersistStreamPtr spPersistStreamColumnData; // TODO: create this object! IStreamPtr spStream; sc = OpenDebugStream (pstgRoot, AMCColumnDataStreamName, STGM_SHARE_EXCLUSIVE | STGM_READ, &spStream); if (sc) goto Error; if (NULL == spPersistStreamColumnData) { sc = E_POINTER; goto Error; } sc = spPersistStreamColumnData->Load(spStream); // $CHANGE to use Load(spColumnData, spStream). if(sc) { sc = ScFromMMC(IDS_UnableToOpenDocumentMessage); goto Error; } Cleanup: return sc; Error: TraceError(TEXT("CConsoleFile::ScLoadColumnSettings"), sc); goto Cleanup; } /*+-------------------------------------------------------------------------* * * CConsoleFile::ScLoadViewSettings * * PURPOSE: * * PARAMETERS: * IStorage* pstgRoot : * * RETURNS: * SC * *+-------------------------------------------------------------------------*/ SC CConsoleFile::ScLoadViewSettings(IStorage* pstgRoot) { static const wchar_t* AMCViewSettingDataStreamName = L"ViewSettingData"; // View settings data stream SC sc; IPersistStreamPtr spPersistStreamViewSettingData; // TODO: create this object! IStreamPtr spStream; sc = OpenDebugStream (pstgRoot, AMCViewSettingDataStreamName, STGM_SHARE_EXCLUSIVE | STGM_READ, &spStream); if (sc) goto Error; if (NULL == spPersistStreamViewSettingData) { sc = E_POINTER; goto Error; } sc = spPersistStreamViewSettingData->Load(spStream); // $CHANGE to use Load(spPersistStreamViewSettingData, spStream). if(sc) { sc = ScFromMMC(IDS_UnableToOpenDocumentMessage); goto Error; } Cleanup: return sc; Error: TraceError(TEXT("CConsoleFile::ScLoadViewSettings"), sc); goto Cleanup; } SC CConsoleFile::ScLoadTree(IStorage* pstgRoot) { SC sc; return sc; } SC CConsoleFile::ScLoadFavorites(IStorage* pstgRoot) { SC sc; return sc; } SC CConsoleFile::ScLoadCustomData(IStorage* pstgRoot) { SC sc; return sc; }