|
|
//+--------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1996.
//
// File: docfile.c
//
// Contents: DocFile root functions (Stg* functions)
//
//---------------------------------------------------------------
#include "exphead.cxx"
#include "expst.hxx"
#include "h/rexpdf.hxx"
#include "h/docfile.hxx"
#include "ascii.hxx"
#include "logfile.hxx"
#include "h/refilb.hxx"
//+--------------------------------------------------------------
//
// Function: DfFromLB, private
//
// Synopsis: Starts a root Docfile on an ILockBytes
//
// Arguments: [plst] - LStream to start on
// [df] - Permissions
// [dwStartFlags] - Startup flags
// [snbExclude] - Partial instantiation list
// [ppdfExp] - DocFile return
// [pcid] - Class ID return for opens
//
// Returns: Appropriate status code
//
// Modifies: [ppdfExp]
// [pcid]
//
//---------------------------------------------------------------
SCODE DfFromLB(ILockBytes *plst, DFLAGS df, DWORD dwStartFlags, SNBW snbExclude, CExposedDocFile **ppdfExp, CLSID *pcid) { SCODE sc, scConv; CRootExposedDocFile *prpdf; CDFBasis *pdfb=NULL;
UNREFERENCED_PARM(pcid); olDebugOut((DEB_ITRACE, "In DfFromLB(%p, %X, %lX, %p, %p, %p)\n", plst, df, dwStartFlags, snbExclude, ppdfExp, pcid));
// If we're not creating or converting, do a quick check
// to make sure that the ILockBytes contains a storage
if ((dwStartFlags & (RSF_CREATEFLAGS | RSF_CONVERT)) == 0) olHChk(StgIsStorageILockBytes(plst));
if (dwStartFlags & RSF_SECTORSIZE4K) df |= DF_LARGE;
// Make root
olMem(pdfb = new CDFBasis); olMemTo(EH_pdfb, prpdf = new CRootExposedDocFile(pdfb)); olChkTo(EH_ppcInit, scConv = prpdf->InitRoot(plst, dwStartFlags, df, snbExclude)); *ppdfExp = prpdf;
olDebugOut((DEB_ITRACE, "Out DfFromLB => %p\n", SAFE_DREF(ppdfExp))); return scConv;
EH_ppcInit: prpdf->Release(); EH_pdfb: delete pdfb; EH_Err: return sc; }
//+--------------------------------------------------------------
//
// Function: StgCreateDocfile, public
//
// Synopsis: char version
//
//---------------------------------------------------------------
STDAPI StgCreateDocfile(TCHAR const *pszName, DWORD grfMode, DWORD reserved, IStorage **ppstgOpen) { SCODE sc; CFileILB *pilb = NULL; int i;
olDebugOut((DEB_ITRACE, "In StgCreateDocfile(%p, %lX, %lu, %p)\n", pszName, grfMode, reserved, ppstgOpen));
olChk(ValidatePtrBuffer(ppstgOpen)); *ppstgOpen = NULL;
olChk(VerifyPerms(grfMode)); if ((grfMode & STGM_RDWR) == STGM_READ || (grfMode & (STGM_DELETEONRELEASE | STGM_CONVERT)) == (STGM_DELETEONRELEASE | STGM_CONVERT)) olErr(EH_Err, STG_E_INVALIDFLAG);
pilb = new CFileILB(pszName, grfMode, FALSE); if (!pilb) olErr(EH_Err, STG_E_INSUFFICIENTMEMORY);
olChk( pilb->Create(grfMode) );
if ( (grfMode & (STGM_CREATE|STGM_CONVERT)) == STGM_FAILIFTHERE) grfMode |= STGM_CREATE; // no file exists, we will 'overwrite' the new
// file
grfMode &= (~STGM_DELETEONRELEASE); // remove the flag
sc=GetScode(StgCreateDocfileOnILockBytes(pilb, grfMode, reserved, ppstgOpen));
EH_Err: if (pilb) { if (FAILED(sc)) i=pilb->ReleaseOnError(); else i=pilb->Release(); olAssert(SUCCEEDED(sc) ? i==1 : i==0); } olDebugOut((DEB_ITRACE, "Out StgCreateDocfile: *ppstgOpen=%p ret=>%l\n", ppstgOpen?(*ppstgOpen):NULL, sc)); return ResultFromScode(sc); }
//+--------------------------------------------------------------
//
// Function: StgCreateDocfileOnILockBytes, public
//
// Synopsis: Creates a root Docfile on an lstream
//
// Arguments: [plkbyt] - LStream
// [grfMode] - Permissions
// [reserved] - Unused
// [ppstgOpen] - Docfile return
//
// Returns: Appropriate status code
//
// Modifies: [ppstgOpen]
//
//---------------------------------------------------------------
STDAPI StgCreateDocfileOnILockBytes(ILockBytes *plkbyt, DWORD grfMode, DWORD reserved, IStorage **ppstgOpen) { CExposedDocFile *pdfExp; SCODE sc; DFLAGS df;
olLog(("--------::In StgCreateDocFileOnILockBytes(%p, %lX, %lu, %p)\n", plkbyt, grfMode, reserved, ppstgOpen));
olDebugOut((DEB_ITRACE, "In StgCreateDocfileOnILockBytes(" "%p, %lX, %lu, %p)\n", plkbyt, grfMode, reserved, ppstgOpen)); TRY { olChk(ValidatePtrBuffer(ppstgOpen)); *ppstgOpen = NULL; olChk(ValidateInterface(plkbyt, IID_ILockBytes)); if (reserved != 0) olErr(EH_Err, STG_E_INVALIDPARAMETER); if ((grfMode & (STGM_CREATE | STGM_CONVERT)) == 0) olErr(EH_Err, STG_E_FILEALREADYEXISTS); olChk(VerifyPerms(grfMode)); if (grfMode & STGM_DELETEONRELEASE) olErr(EH_Err, STG_E_INVALIDFUNCTION); df = ModeToDFlags(grfMode); if ((grfMode & (STGM_TRANSACTED | STGM_CONVERT)) == (STGM_TRANSACTED | STGM_CONVERT)) df |= DF_INDEPENDENT; olChkTo(EH_Truncate, sc = DfFromLB(plkbyt, df, RSF_CREATE | ((grfMode & STGM_CREATE) ? RSF_TRUNCATE : 0) | ((grfMode & STGM_CONVERT) ? RSF_CONVERT : 0), NULL, &pdfExp, NULL));
*ppstgOpen = pdfExp; } CATCH(CException, e) { sc = e.GetErrorCode(); } END_CATCH olDebugOut((DEB_ITRACE, "Out StgCreateDocfileOnILockBytes => %p\n", ppstgOpen?(*ppstgOpen):NULL)); EH_Err: olLog(("--------::Out StgCreateDocFileOnILockBytes(). *ppstgOpen == %p, ret == %lx\n", *ppstgOpen, sc)); FreeLogFile(); return ResultFromScode(sc);
EH_Truncate: if ((grfMode & STGM_CREATE) && (grfMode & STGM_TRANSACTED) == 0) { ULARGE_INTEGER ulSize;
ULISet32(ulSize, 0); olHChk(plkbyt->SetSize(ulSize)); } goto EH_Err; }
//+--------------------------------------------------------------
//
// Function: DfOpenStorageOnILockBytes, public
//
// Synopsis: Instantiates a root Docfile from an LStream,
// converting if necessary
//
// Arguments: [plkbyt] - Source LStream
// [pstgPriority] - For priority reopens
// [grfMode] - Permissions
// [snbExclude] - For priority reopens
// [reserved]
// [ppstgOpen] - Docfile return
// [pcid] - Class ID return
//
// Returns: Appropriate status code
//
// Modifies: [ppstgOpen]
// [pcid]
//
//---------------------------------------------------------------
HRESULT DfOpenStorageOnILockBytesW(ILockBytes *plkbyt, IStorage *pstgPriority, DWORD grfMode, SNBW snbExclude, DWORD reserved, IStorage **ppstgOpen, CLSID *pcid) { SCODE sc; CExposedDocFile *pdfExp;
olLog(("--------::In DfOpenStorageOnILockBytes(" "%p, %p, %lX, %p, %lu, %p, %p)\n", plkbyt, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen, pcid)); olDebugOut((DEB_ITRACE, "In DfOpenStorageOnILockBytes(" "%p, %p, %lX, %p, %lu, %p, %p)\n", plkbyt, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen, pcid)); TRY { #ifdef _UNICODE // do checking if there is an ANSI layer
olChk(ValidatePtrBuffer(ppstgOpen)); *ppstgOpen = NULL; if (snbExclude) olChk(ValidateSNBW(snbExclude)); #endif /!UNICODE
olChk(ValidateInterface(plkbyt, IID_ILockBytes)); if (pstgPriority) olChk(ValidateInterface(pstgPriority, IID_IStorage)); olChk(VerifyPerms(grfMode)); if (grfMode & STGM_DELETEONRELEASE) olErr(EH_Err, STG_E_INVALIDFUNCTION); if (snbExclude) { if ((grfMode & STGM_RDWR) != STGM_READWRITE) olErr(EH_Err, STG_E_ACCESSDENIED); } if (reserved != 0) olErr(EH_Err, STG_E_INVALIDPARAMETER); if (FAILED(DllIsMultiStream(plkbyt))) olErr(EH_Err, STG_E_FILEALREADYEXISTS); //file is not storage obj
if (pstgPriority) olChk(pstgPriority->Release()); olChk(DfFromLB(plkbyt, ModeToDFlags(grfMode), RSF_OPEN, snbExclude, &pdfExp, pcid));
*ppstgOpen = pdfExp; } CATCH(CException, e) { sc = e.GetErrorCode(); } END_CATCH olDebugOut((DEB_ITRACE, "Out DfOpenStorageOnILockBytes => %p\n", ppstgOpen?(*ppstgOpen):NULL)); EH_Err: olLog(("--------::Out DfOpenStorageOnILockBytes(). *ppstgOpen == %p" ", ret == %lx\n", *ppstgOpen, sc)); FreeLogFile(); return sc; }
//+---------------------------------------------------------------------------
//
// Function: StgCreateStorageEx, public
//
// Synopsis: Creates a storage or stream object
//
// Arguments: [pwcsName] - pathname of file
// [grfMode] - open mode flags
// [stgfmt] - storage format
// [grfAttrs] - reserved
// [pSecurity] - reserved
// [pTransaction] - reserved
// [riid] - GUID of interface pointer to return
// [ppObjectOpen] - interface pointer to return
//
// Returns: Appropriate status code
//
//----------------------------------------------------------------------------
STDAPI StgCreateStorageEx (const WCHAR* pwcsName, DWORD grfMode, DWORD stgfmt, // enum
DWORD grfAttrs, // reserved
STGOPTIONS * pStgOptions, void * reserved, REFIID riid, void ** ppObjectOpen) { CExposedDocFile *pdfExp; CFileILB *pilb = NULL; SCODE sc = S_OK; DFLAGS df; BOOL fLarge = FALSE;
olDebugOut((DEB_TRACE, "In StgCreateStorageEx(%ws, %p, %p, %p, %p)\n", pwcsName, grfMode, stgfmt, riid, ppObjectOpen));
olChk(ValidatePtrBuffer(ppObjectOpen)); *ppObjectOpen = NULL;
if (reserved != NULL) olErr (EH_Err, STG_E_INVALIDPARAMETER);
if (grfAttrs != 0) olErr (EH_Err, STG_E_INVALIDPARAMETER);
olChk(VerifyPerms(grfMode));
if (riid != IID_IStorage) olErr (EH_Err, STG_E_INVALIDPARAMETER);
if (pStgOptions != NULL) { if (pStgOptions->usVersion > STGOPTIONS_VERSION || pStgOptions->usVersion == 0 || pStgOptions->reserved != 0 || (pStgOptions->ulSectorSize != 512 && pStgOptions->ulSectorSize != 4096) ) { olErr (EH_Err, STG_E_INVALIDPARAMETER); } if (pStgOptions->ulSectorSize == 4096) fLarge = TRUE; }
if (stgfmt != STGFMT_DOCFILE) olErr (EH_Err, STG_E_INVALIDPARAMETER);
olChk(VerifyPerms(grfMode)); if ((grfMode & STGM_RDWR) == STGM_READ || (grfMode & (STGM_DELETEONRELEASE | STGM_CONVERT)) == (STGM_DELETEONRELEASE | STGM_CONVERT)) olErr(EH_Err, STG_E_INVALIDFLAG);
pilb = new CFileILB(pwcsName, grfMode, FALSE); if (!pilb) olErr(EH_Err, STG_E_INSUFFICIENTMEMORY);
olChk( pilb->Create(grfMode) );
grfMode &= (~STGM_DELETEONRELEASE); // remove the flag
df = ModeToDFlags(grfMode);
olChk(DfFromLB(pilb, df, RSF_CREATE | ((grfMode & STGM_CREATE) ? RSF_TRUNCATE : 0) | ((grfMode & STGM_CONVERT) ? RSF_CONVERT : 0) | (fLarge ? RSF_SECTORSIZE4K : 0), NULL, &pdfExp, NULL));
*ppObjectOpen = pdfExp;
EH_Err: if (pilb) { int i; if (FAILED(sc)) i=pilb->ReleaseOnError(); else i=pilb->Release(); olAssert(SUCCEEDED(sc) ? i==1 : i==0); } return sc; }
|