WindowsXP-SP1/admin/activec/conui/mscparser.cpp
2020-09-30 16:53:49 +02:00

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;
}