233 lines
6.6 KiB
C++
233 lines
6.6 KiB
C++
//+--------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
|
//
|
|
// File: rpubdf.cxx
|
|
//
|
|
// Contents: CRootPubDocFile implementation
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
#include "dfhead.cxx"
|
|
|
|
#include "h/header.hxx"
|
|
#include "h/rexpdf.hxx"
|
|
#include "dfbasis.hxx"
|
|
#include "h/tchar.h"
|
|
|
|
// Priority mode lock permissions
|
|
#define PRIORITY_PERMS DF_READ
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CRootExposedDocFile::CRootExposedDocFile, public
|
|
//
|
|
// Synopsis: Ctor - Initializes empty object
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
CRootExposedDocFile::CRootExposedDocFile(CDFBasis *pdfb) :
|
|
CExposedDocFile(NULL, NULL, 0, ROOT_LUID, NULL, NULL, NULL, pdfb)
|
|
{
|
|
olDebugOut((DEB_ITRACE, "CRootExposedDocFile constructor called\n"));
|
|
}
|
|
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CRootExposedDocFile::Init, private
|
|
//
|
|
// Synopsis: Dependent root initialization
|
|
//
|
|
// Arguments: [plstBase] - Base
|
|
// [snbExclude] - Limited instantiation exclusions
|
|
// [dwStartFlags] - Startup flags
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE CRootExposedDocFile::Init( ILockBytes *plstBase,
|
|
SNBW snbExclude,
|
|
DWORD const dwStartFlags)
|
|
{
|
|
CDocFile *pdf;
|
|
SCODE sc;
|
|
CMStream *pms;
|
|
|
|
olDebugOut((DEB_ITRACE, "In CRootExposedDocFile::Init()\n"));
|
|
if (snbExclude)
|
|
{
|
|
olChk(DllMultiStreamFromStream(&pms, &plstBase, dwStartFlags));
|
|
olMemTo(EH_pms,
|
|
pdf = new CDocFile(pms, SIDROOT, ROOT_LUID, _pilbBase));
|
|
pdf->AddRef();
|
|
olChkTo(EH_pdf, pdf->ExcludeEntries(pdf, snbExclude));
|
|
olChkTo(EH_pdf, pms->Flush(0));
|
|
pdf->Release();
|
|
}
|
|
plstBase->AddRef();
|
|
_pilbBase = plstBase;
|
|
olDebugOut((DEB_ITRACE, "Out CRootExposedDocFile::Init()\n"));
|
|
return S_OK;
|
|
|
|
EH_pdf:
|
|
pdf->Release();
|
|
EH_pms:
|
|
DllReleaseMultiStream(pms);
|
|
EH_Err:
|
|
return sc;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CRootExposedDocFile::InitRoot, public
|
|
//
|
|
// Synopsis: Initialising a root storage
|
|
//
|
|
// Arguments: [plstBase] - Base LStream
|
|
// [dwStartFlags] - How to start things
|
|
// [df] - Transactioning flags
|
|
// [snbExclude] - Parital instantiation list
|
|
// [ppdfb] - Basis pointer return
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
// Modifies: [ppdfb]
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE CRootExposedDocFile::InitRoot( ILockBytes *plstBase,
|
|
DWORD const dwStartFlags,
|
|
DFLAGS const df,
|
|
SNBW snbExclude)
|
|
{
|
|
CDocFile *pdfBase;
|
|
SCODE sc, scConv = S_OK;
|
|
STATSTG statstg;
|
|
|
|
olDebugOut((DEB_ITRACE, "In CRootExposedDocFile::InitRoot("
|
|
"%p, %lX, %lX, %p)\n",
|
|
plstBase, dwStartFlags, df, snbExclude));
|
|
|
|
// Exclusion only works with a plain open
|
|
olAssert(snbExclude == NULL ||
|
|
(dwStartFlags & (RSF_CREATEFLAGS | RSF_CONVERT)) == 0);
|
|
|
|
olHChk(plstBase->Stat(&statstg, STATFLAG_NONAME));
|
|
|
|
olChkTo(EH_GetPriority,
|
|
Init(plstBase, snbExclude, dwStartFlags));
|
|
|
|
scConv = DllMultiStreamFromStream(&_pmsBase, &_pilbBase,
|
|
dwStartFlags);
|
|
if (scConv == STG_E_INVALIDHEADER)
|
|
scConv = STG_E_FILEALREADYEXISTS;
|
|
olChkTo(EH_pfstScratchInit, scConv);
|
|
|
|
olMemTo(EH_pmsBase,
|
|
pdfBase = new CDocFile(_pmsBase, SIDROOT, ROOT_LUID, _pilbBase));
|
|
|
|
pdfBase->AddRef();
|
|
|
|
_pdf = pdfBase;
|
|
_df = df;
|
|
olDebugOut((DEB_ITRACE, "Out CRootExposedDocFile::InitRoot\n"));
|
|
return scConv;
|
|
|
|
EH_pmsBase:
|
|
DllReleaseMultiStream(_pmsBase);
|
|
|
|
EH_pfstScratchInit:
|
|
EH_GetPriority:
|
|
EH_Err:
|
|
return sc;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CRootExposedDocFile::~CRootExposedDocFile,
|
|
// public virutal
|
|
//
|
|
// Synopsis: dtor (virtual)
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
CRootExposedDocFile::~CRootExposedDocFile(void)
|
|
{
|
|
olDebugOut((DEB_TRACE, "In CRootExposedDocFile::~CRootExposedDocFile\n"));
|
|
|
|
olAssert(_cReferences == 0);
|
|
|
|
if (SUCCEEDED(CheckReverted()))
|
|
{
|
|
if (_pilbBase) {
|
|
_pilbBase->Release();
|
|
_pilbBase = NULL;
|
|
}
|
|
}
|
|
olDebugOut((DEB_TRACE, "Out CRootExposedDocFile::~CRootExposedDocFile\n"));
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CRootExposedDocFile::Stat, public
|
|
// virtual fr. CExposedDocFile
|
|
//
|
|
// Synopsis: Fills in a stat buffer from the base LStream
|
|
//
|
|
// Arguments: [pstatstg] - Stat buffer
|
|
// [grfStatFlag] - Stat flags
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
// Modifies: [pstatstg]
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
SCODE CRootExposedDocFile::Stat(STATSTGW *pstatstgw, DWORD grfStatFlag)
|
|
{
|
|
SCODE sc;
|
|
STATSTG *pstatstg= (STATSTG*)pstatstgw;
|
|
|
|
olDebugOut((DEB_ITRACE, "In CRootExposedDocFile::Stat(%p, %lu)\n",
|
|
pstatstg, grfStatFlag));
|
|
olChk(ValidateOutBuffer(pstatstg, sizeof(STATSTGW)));
|
|
olChk(VerifyStatFlag(grfStatFlag));
|
|
olChk(CheckReverted());
|
|
olHChk(_pilbBase->Stat(pstatstg, grfStatFlag));
|
|
pstatstg->type = STGTY_STORAGE;
|
|
ULISet32(pstatstg->cbSize, 0); // size undefined for storage obj
|
|
pstatstg->grfLocksSupported = 0;
|
|
pstatstg->reserved = 0;
|
|
if (pstatstg->pwcsName)
|
|
{
|
|
// pilbBase returns either wide or ansi names depending on
|
|
// system type, so we have to convert to ANSI char if neccessay
|
|
WCHAR *pwcs;
|
|
olChkTo(EH_pwcsName,
|
|
DfAllocWC(_tcslen(pstatstg->pwcsName)+1, &pwcs));
|
|
TTOW(pstatstg->pwcsName, pwcs, _tcslen(pstatstg->pwcsName)+1);
|
|
delete[] pstatstg->pwcsName;
|
|
pstatstgw->pwcsName = pwcs;
|
|
}
|
|
pstatstg->grfMode = DFlagsToMode(_df);
|
|
olChkTo(EH_pwcsName, _pdf->GetClass(&pstatstg->clsid));
|
|
olChkTo(EH_pwcsName, _pdf->GetStateBits(&pstatstg->grfStateBits));
|
|
olDebugOut((DEB_ITRACE, "Out CRootExposedDocFile::Stat\n"));
|
|
return S_OK;
|
|
|
|
EH_pwcsName:
|
|
if (pstatstg->pwcsName)
|
|
delete[] pstatstg->pwcsName;
|
|
EH_Err:
|
|
return sc;
|
|
}
|
|
|
|
|
|
|