home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / activedocument / doserver / perfile.cpp < prev    next >
C/C++ Source or Header  |  1997-05-28  |  7KB  |  288 lines

  1. /**************************************************************************
  2.    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3.    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4.    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5.    PARTICULAR PURPOSE.
  6.  
  7.    Copyright 1997 Microsoft Corporation.  All Rights Reserved.
  8. **************************************************************************/
  9.  
  10. /**************************************************************************
  11.  
  12.    File:          PerFile.cpp
  13.    
  14.    Description:   CPersistFile implementation.
  15.  
  16. **************************************************************************/
  17.  
  18. /**************************************************************************
  19.    #include statements
  20. **************************************************************************/
  21.  
  22. #include "PerFile.h"
  23.  
  24. /**************************************************************************
  25.  
  26.    CPersistFile::CPersistFile()
  27.    
  28. **************************************************************************/
  29.  
  30. CPersistFile::CPersistFile(COleDocument *pOleDoc, CPersistStorage *pPersistStorage)
  31. {
  32. OutputDebugString(TEXT("CPersistFile's constructor\n"));
  33.  
  34. m_pOleDoc = pOleDoc;
  35.    
  36. m_pPersistStorage = pPersistStorage;
  37.  
  38. m_pStorage = NULL;
  39.  
  40. m_pwszFile = new OLECHAR[MAX_PATH];
  41. }
  42.  
  43. /**************************************************************************
  44.  
  45.    CPersistFile::~CPersistFile()
  46.    
  47. **************************************************************************/
  48.  
  49. CPersistFile::~CPersistFile() 
  50. {
  51. OutputDebugString(TEXT("CPersistFile's destructor\n"));
  52.  
  53. if(m_pStorage)
  54.    m_pStorage->Release();
  55.  
  56. delete m_pwszFile;
  57. }
  58.  
  59. /**************************************************************************
  60.  
  61.    CPersistFile::QueryInterface()
  62.    
  63. **************************************************************************/
  64.  
  65. STDMETHODIMP CPersistFile::QueryInterface(REFIID riid, LPVOID *ppReturn)
  66. {
  67. OutputDebugString(TEXT("CPersistFile::QueryInterface\n"));
  68.  
  69. return m_pOleDoc->QueryInterface(riid, ppReturn);
  70. }
  71.  
  72. /**************************************************************************
  73.  
  74.    CPersistFile::AddRef()
  75.    
  76. **************************************************************************/
  77.  
  78. STDMETHODIMP_(ULONG) CPersistFile::AddRef()
  79. {
  80. OutputDebugString(TEXT("CPersistFile::AddRef\n"));
  81.  
  82. return m_pOleDoc->AddRef();
  83. }
  84.  
  85. /**************************************************************************
  86.  
  87.    CPersistFile::Release()
  88.    
  89. **************************************************************************/
  90.  
  91. STDMETHODIMP_(ULONG) CPersistFile::Release()
  92. {
  93. OutputDebugString(TEXT("CPersistFile::Release\n"));
  94.  
  95. return m_pOleDoc->Release();
  96. }
  97.  
  98. /**************************************************************************
  99.  
  100.    CPersistFile::GetClassID()
  101.    
  102. **************************************************************************/
  103.  
  104. STDMETHODIMP CPersistFile::GetClassID(LPCLSID pClassID)
  105. {
  106. OutputDebugString(TEXT("CPersistFile::GetClassID\n"));
  107.  
  108. return m_pPersistStorage->GetClassID(pClassID);
  109. }
  110.  
  111. /**************************************************************************
  112.  
  113.    CPersistFile::Save()
  114.    
  115. **************************************************************************/
  116.  
  117. STDMETHODIMP CPersistFile::Save(LPCOLESTR pwszFile, BOOL fRemember)
  118. {
  119. OutputDebugString(TEXT("CPersistFile::Save\n"));
  120.  
  121. if(!pwszFile)
  122.    return E_INVALIDARG;
  123.  
  124. HRESULT     hr;
  125.  
  126. /*
  127. Only create a new storage if we don't already have a storage or the file name 
  128. has changed.
  129. */
  130. if(!m_pStorage || (0 != lstrcmpiW(pwszFile, m_pwszFile)))
  131.    {
  132.    //if we have a storage, release it
  133.    if(m_pStorage)
  134.       {
  135.       m_pPersistStorage->ReleaseStreamsAndStorage();
  136.       m_pStorage->Release();
  137.       m_pStorage = NULL;
  138.       *m_pwszFile = 0;
  139.       }
  140.  
  141.    //open the file as storage
  142.    hr = StgCreateDocfile(  pwszFile,
  143.                            STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
  144.                            0,
  145.                            &m_pStorage);
  146.  
  147.    }
  148.  
  149.  
  150.  
  151. if(m_pStorage)
  152.    {
  153.    hr = m_pPersistStorage->Save(m_pStorage, FALSE);
  154.    }
  155.  
  156.  
  157. if(fRemember)
  158.    {
  159.    lstrcpyW(m_pwszFile, pwszFile);
  160.    }
  161. else
  162.    {
  163.    m_pPersistStorage->ReleaseStreamsAndStorage();
  164.    m_pStorage->Release();
  165.    m_pStorage = NULL;
  166.    *m_pwszFile = 0;
  167.    }
  168.  
  169. return hr;
  170. }
  171.  
  172. /**************************************************************************
  173.  
  174.    CPersistFile::SaveCompleted()
  175.    
  176. **************************************************************************/
  177.  
  178. STDMETHODIMP CPersistFile::SaveCompleted(LPCOLESTR pwszFile)
  179. {
  180. OutputDebugString(TEXT("CPersistFile::SaveCompleted\n"));
  181.  
  182. return m_pPersistStorage->SaveCompleted(NULL);
  183. }
  184.  
  185. /**************************************************************************
  186.  
  187.    CPersistFile::Load()
  188.    
  189. **************************************************************************/
  190.  
  191. STDMETHODIMP CPersistFile::Load(LPCOLESTR pwszFile, DWORD dwMode)
  192. {
  193. OutputDebugString(TEXT("CPersistFile::Load\n"));
  194.  
  195. HRESULT     hr;
  196.  
  197. if(!pwszFile)
  198.    return E_INVALIDARG;
  199.  
  200. //close any existing storage we might have
  201. if(m_pStorage)
  202.    {
  203.    m_pPersistStorage->ReleaseStreamsAndStorage();
  204.    m_pStorage->Release();
  205.    m_pStorage = NULL;
  206.    *m_pwszFile = 0;
  207.    }
  208.  
  209. //open the file as storage and load it
  210. hr = StgOpenStorage(    pwszFile,
  211.                         NULL,
  212.                         dwMode | STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE,
  213.                         NULL,
  214.                         0,
  215.                         &m_pStorage);
  216.  
  217. if(m_pStorage)
  218.    {
  219.    hr = m_pPersistStorage->Load(m_pStorage);
  220.    }
  221. else
  222.    {
  223.    hr = E_FAIL;
  224.    }
  225.  
  226. if(SUCCEEDED(hr))
  227.    lstrcpyW(m_pwszFile, pwszFile);
  228.  
  229. return hr;
  230. }
  231.  
  232. /**************************************************************************
  233.  
  234.    CPersistFile::IsDirty()
  235.    
  236. **************************************************************************/
  237.  
  238. STDMETHODIMP CPersistFile::IsDirty()
  239. {
  240. OutputDebugString(TEXT("CPersistFile::IsDirty\n"));
  241.  
  242. return m_pPersistStorage->IsDirty();
  243. }
  244.  
  245. /**************************************************************************
  246.  
  247.    CPersistFile::GetCurFile()
  248.    
  249. **************************************************************************/
  250.  
  251. STDMETHODIMP CPersistFile::GetCurFile(LPOLESTR *ppwszOut)
  252. {
  253. OutputDebugString(TEXT("CPersistFile::GetCurFile\n"));
  254.  
  255. HRESULT  hr = E_FAIL;
  256.  
  257. *ppwszOut = NULL;
  258.  
  259. LPMALLOC pMalloc;
  260. CoGetMalloc(1, &pMalloc);
  261. if(pMalloc)
  262.    {
  263.    if(*m_pwszFile)
  264.       {
  265.       *ppwszOut = (LPOLESTR)pMalloc->Alloc(lstrlenW(m_pwszFile) + sizeof(OLECHAR));
  266.       if(*ppwszOut)
  267.          {
  268.          lstrcpyW(*ppwszOut, m_pwszFile);
  269.          hr = S_OK;
  270.          }
  271.       }
  272.    else
  273.       {
  274.       *ppwszOut = (LPOLESTR)pMalloc->Alloc(lstrlenW(DEFAULT_PROMPT) + sizeof(OLECHAR));
  275.       if(*ppwszOut)
  276.          {
  277.          lstrcpyW(*ppwszOut, DEFAULT_PROMPT);
  278.          hr = S_FALSE;
  279.          }
  280.       }
  281.    
  282.    pMalloc->Release();
  283.    }
  284.  
  285. return hr;
  286. }
  287.  
  288.