457 lines
11 KiB
C++
457 lines
11 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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 <stdafx.h>
|
|
#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;
|
|
}
|
|
|
|
|