IPERFILE.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * IPERFILE.CPP
  3.  * Patron Chapter 22
  4.  *
  5.  * Implementation of the IPersistFile interface for Patron's
  6.  * documents.
  7.  *
  8.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  9.  *
  10.  * Kraig Brockschmidt, Microsoft
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14. #include "patron.h"
  15. /*
  16.  * CImpIPersistFile:CImpIPersistFile
  17.  * CImpIPersistFile::~CImpIPersistFile
  18.  *
  19.  * Constructor Parameters:
  20.  *  pDoc            PCPatronDoc associated with this interface
  21.  *  pUnkOuter       LPUNKNOWN of the controlling unknown.
  22.  */
  23. CImpIPersistFile::CImpIPersistFile(PCPatronDoc pDoc
  24.     , LPUNKNOWN pUnkOuter)
  25.     {
  26.     m_cRef=0;
  27.     m_pDoc=pDoc;
  28.     m_pUnkOuter=pUnkOuter;
  29.     return;
  30.     }
  31. CImpIPersistFile::~CImpIPersistFile(void)
  32.     {
  33.     return;
  34.     }
  35. /*
  36.  * CImpIPersistFile::QueryInterface
  37.  * CImpIPersistFile::AddRef
  38.  * CImpIPersistFile::Release
  39.  *
  40.  * Purpose:
  41.  *  Standard set of IUnknown members for this interface
  42.  */
  43. STDMETHODIMP CImpIPersistFile::QueryInterface(REFIID riid
  44.     , PPVOID ppv)
  45.     {
  46.     return m_pUnkOuter->QueryInterface(riid, ppv);
  47.     }
  48. STDMETHODIMP_(ULONG) CImpIPersistFile::AddRef(void)
  49.     {
  50.     ++m_cRef;
  51.     return m_pUnkOuter->AddRef();
  52.     }
  53. STDMETHODIMP_(ULONG) CImpIPersistFile::Release(void)
  54.     {
  55.     --m_cRef;
  56.     return m_pUnkOuter->Release();
  57.     }
  58. /*
  59.  * CImpIPersistFile::GetClassID
  60.  *
  61.  * Purpose:
  62.  *  Returns the CLSID of the file represented by this interface.
  63.  *
  64.  * Parameters:
  65.  *  pClsID          LPCLSID in which to store our CLSID.
  66.  *
  67.  * Return Value:
  68.  *  HRESULT         NOERROR or a general error value.
  69.  */
  70. STDMETHODIMP CImpIPersistFile::GetClassID(LPCLSID pClsID)
  71.     {
  72.     *pClsID=CLSID_PatronPages;
  73.     return NOERROR;
  74.     }
  75. /*
  76.  * CImpIPersistFile::IsDirty
  77.  *
  78.  * Purpose:
  79.  *  Tells the caller if we have made changes to this file since
  80.  *  it was loaded or initialized new.
  81.  *
  82.  * Parameters:
  83.  *  None
  84.  *
  85.  * Return Value:
  86.  *  HRESULT         Contains S_OK if we ARE dirty, S_FALSE if
  87.  *                  NOT dirty.
  88.  */
  89. STDMETHODIMP CImpIPersistFile::IsDirty(void)
  90.     {
  91.     return ResultFromScode(m_pDoc->FDirtyGet() ? S_OK : S_FALSE);
  92.     }
  93. /*
  94.  * IPersistFile::Load
  95.  *
  96.  * Purpose:
  97.  *  Asks the server to load the document for the given filename.
  98.  *
  99.  * Parameters:
  100.  *  pszFile         LPCOLESTR to the filename to load.
  101.  *  grfMode         DWORD containing open flags requested from the
  102.  *                  caller.  Currently these are safely ignored.
  103.  *
  104.  * Return Value:
  105.  *  HRESULT         NOERROR or a general error value.
  106.  */
  107. STDMETHODIMP CImpIPersistFile::Load(LPCOLESTR pszFile, DWORD grfMode)
  108.     {
  109.     UINT        uRet;
  110.    #ifdef WIN32ANSI
  111.     char        szTemp[CCHPATHMAX];
  112.     WideCharToMultiByte(CP_ACP, 0, pszFile, -1, szTemp, CCHPATHMAX
  113.        , NULL, NULL);
  114.     uRet=m_pDoc->Load(TRUE, szTemp);
  115.    #else
  116.     uRet=m_pDoc->Load(TRUE, (LPTSTR)pszFile);
  117.    #endif
  118.     return (DOCERR_NONE==uRet) ? NOERROR
  119.         : ResultFromScode(STG_E_READFAULT);
  120.     }
  121. /*
  122.  * IPersistFile::Save
  123.  *
  124.  * Purpose:
  125.  *  Instructs the server to write the current file into a new
  126.  *  filename, possibly then using that filename as the current one.
  127.  *
  128.  * Parameters:
  129.  *  pszFile         LPCOLESTR of the file into which we save.  If NULL,
  130.  *                  this means save the current file.
  131.  *  fRemember       BOOL indicating if we're to use this filename as
  132.  *                  the current file now (Save As instead of Save
  133.  *                  Copy As).
  134.  *
  135.  * Return Value:
  136.  *  HRESULT         NOERROR or a general error value.
  137.  */
  138. STDMETHODIMP CImpIPersistFile::Save(LPCOLESTR pszFile, BOOL fRemember)
  139.     {
  140.     UINT        uRet;
  141.     /*
  142.      * Since we don't want to mess with changing Save (which would
  143.      * require changes to CLASSLIB, urk) we instead save fRemember
  144.      * in the document before calling Save which supresses the call
  145.      * to CPatronDoc::Rename if FALSE.
  146.      */
  147.     m_pDoc->m_fRename=fRemember;
  148.    #ifdef WIN32ANSI
  149.     char        szTemp[CCHPATHMAX];
  150.     WideCharToMultiByte(CP_ACP, 0, pszFile, -1, szTemp, CCHPATHMAX
  151.        , NULL, NULL);
  152.     uRet=m_pDoc->Save(0, szTemp);
  153.    #else
  154.     uRet=m_pDoc->Save(0, (LPTSTR)pszFile);
  155.    #endif
  156.     m_pDoc->m_fRename=TRUE;
  157.     return (DOCERR_NONE==uRet) ? NOERROR
  158.         : ResultFromScode(STG_E_WRITEFAULT);
  159.     }
  160. /*
  161.  * IPersistFile::SaveCompleted
  162.  *
  163.  * Purpose:
  164.  *  Informs us that the operation that called Save is now finished
  165.  *  and we can access the file again.
  166.  *
  167.  * Parameters:
  168.  *  pszFile         LPCOLESTR of the file in which we can start
  169.  *                  writing again.
  170.  *
  171.  * Return Value:
  172.  *  HRESULT         NOERROR or a general error value.
  173.  */
  174. STDMETHODIMP CImpIPersistFile::SaveCompleted(LPCOLESTR pszFile)
  175.     {
  176.     return NOERROR;
  177.     }
  178. /*
  179.  * IPersistFile::GetCurFile
  180.  *
  181.  * Purpose:
  182.  *  Retrieves the name of the current file.
  183.  *
  184.  * Parameters:
  185.  *  ppszFile        LPOLESTR * into which we store a pointer to
  186.  *                  the filename that should be allocated with the
  187.  *                  shared IMalloc.
  188.  *
  189.  * Return Value:
  190.  *  HRESULT         NOERROR or a general error value.
  191.  */
  192. STDMETHODIMP CImpIPersistFile::GetCurFile(LPOLESTR *ppszFile)
  193.     {
  194.     LPMALLOC    pIMalloc;
  195.     LPOLESTR    psz;
  196.     UINT        uRet;
  197.     *ppszFile=NULL;
  198.     if (FAILED(CoGetMalloc(MEMCTX_TASK, &pIMalloc)))
  199.         return ResultFromScode(E_FAIL);
  200.     psz=(LPOLESTR)pIMalloc->Alloc(CCHPATHMAX*sizeof(OLECHAR));
  201.     pIMalloc->Release();
  202.    #ifdef WIN32ANSI
  203.     char    szTemp[CCHPATHMAX];
  204.     uRet=m_pDoc->FilenameGet(szTemp, CCHPATHMAX);
  205.     MultiByteToWideChar(CP_ACP, 0, szTemp, -1, psz, CCHPATHMAX);
  206.    #else
  207.     uRet=m_pDoc->FilenameGet(psz, CCHPATHMAX);
  208.    #endif
  209.     //If we have no filename, return the prompt for File Open/Save.
  210.     if (0==uRet)
  211.        #ifdef WIN32ANSI
  212.         MultiByteToWideChar(CP_ACP, 0
  213.             , (*m_pDoc->m_pST)[IDS_EXTENSION], -1, psz, CCHPATHMAX);
  214.        #else
  215.         lstrcpy(psz, (*m_pDoc->m_pST)[IDS_EXTENSION]);
  216.        #endif
  217.     *ppszFile=psz;
  218.     return (0==uRet) ? ResultFromScode(S_FALSE) : NOERROR;
  219.     }