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