home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / chap21 / cosmo / iperfile.cpp < prev    next >
C/C++ Source or Header  |  1995-05-03  |  6KB  |  279 lines

  1. /*
  2.  * IPERFILE.CPP
  3.  * Cosmo Chapter 21
  4.  *
  5.  * Implementation of the IPersistFile interface for Cosmo
  6.  *
  7.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Microsoft
  10.  * Internet  :  kraigb@microsoft.com
  11.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  12.  */
  13.  
  14.  
  15. #include "cosmo.h"
  16.  
  17.  
  18. /*
  19.  * CImpIPersistFile:CImpIPersistFile
  20.  * CImpIPersistFile::~CImpIPersistFile
  21.  *
  22.  * Constructor Parameters:
  23.  *  pObj            PCFigure associated with this object.
  24.  *  pUnkOuter       LPUNKNOWN of the controlling unknown.
  25.  */
  26.  
  27. CImpIPersistFile::CImpIPersistFile(PCFigure pObj
  28.     , LPUNKNOWN pUnkOuter)
  29.     {
  30.     m_cRef=0;
  31.     m_pObj=pObj;
  32.     m_pUnkOuter=pUnkOuter;
  33.     return;
  34.     }
  35.  
  36.  
  37. CImpIPersistFile::~CImpIPersistFile(void)
  38.     {
  39.     return;
  40.     }
  41.  
  42.  
  43.  
  44.  
  45. /*
  46.  * CImpIPersistFile::QueryInterface
  47.  * CImpIPersistFile::AddRef
  48.  * CImpIPersistFile::Release
  49.  */
  50.  
  51. STDMETHODIMP CImpIPersistFile::QueryInterface(REFIID riid
  52.     , PPVOID ppv)
  53.     {
  54.     return m_pUnkOuter->QueryInterface(riid, ppv);
  55.     }
  56.  
  57. STDMETHODIMP_(ULONG) CImpIPersistFile::AddRef(void)
  58.     {
  59.     ++m_cRef;
  60.     return m_pUnkOuter->AddRef();
  61.     }
  62.  
  63. STDMETHODIMP_(ULONG) CImpIPersistFile::Release(void)
  64.     {
  65.     --m_cRef;
  66.     return m_pUnkOuter->Release();
  67.     }
  68.  
  69.  
  70.  
  71.  
  72. /*
  73.  * CImpIPersistFile::GetClassID
  74.  *
  75.  * Purpose:
  76.  *  Returns the CLSID of the file represented by this interface.
  77.  *
  78.  * Parameters:
  79.  *  pClsID          LPCLSID in which to store our CLSID.
  80.  *
  81.  * Return Value:
  82.  *  HRESULT         NOERROR or a general error value.
  83.  */
  84.  
  85. STDMETHODIMP CImpIPersistFile::GetClassID(LPCLSID pClsID)
  86.     {
  87.     *pClsID=CLSID_CosmoFigure;
  88.     return NOERROR;
  89.     }
  90.  
  91.  
  92.  
  93.  
  94.  
  95. /*
  96.  * CImpIPersistFile::IsDirty
  97.  *
  98.  * Purpose:
  99.  *  Tells the caller if we have made changes to this file since
  100.  *  it was loaded or initialized new.
  101.  *
  102.  * Parameters:
  103.  *  None
  104.  *
  105.  * Return Value:
  106.  *  HRESULT         Contains S_OK if we ARE dirty, S_FALSE if
  107.  *                  NOT dirty.
  108.  */
  109.  
  110. STDMETHODIMP CImpIPersistFile::IsDirty(void)
  111.     {
  112.     return ResultFromScode(m_pObj->FIsDirty() ? S_OK : S_FALSE);
  113.     }
  114.  
  115.  
  116.  
  117.  
  118.  
  119. /*
  120.  * IPersistFile::Load
  121.  *
  122.  * Purpose:
  123.  *  Asks the server to load the document for the given filename.
  124.  *
  125.  * Parameters:
  126.  *  pszFile         LPCOLESTR to the filename to load.
  127.  *  grfMode         DWORD containing open flags requested from the
  128.  *                  caller.  Currently these are safely ignored.
  129.  *
  130.  * Return Value:
  131.  *  HRESULT         NOERROR or a general error value.
  132.  */
  133.  
  134. STDMETHODIMP CImpIPersistFile::Load(LPCOLESTR pszFile, DWORD grfMode)
  135.     {
  136.     UINT        uRet;
  137.  
  138.    #ifdef WIN32ANSI
  139.     TCHAR       szTemp[CCHPATHMAX];
  140.     WideCharToMultiByte(CP_ACP, 0, pszFile, -1, szTemp, CCHPATHMAX
  141.         , NULL, NULL);
  142.     uRet=m_pObj->m_pDoc->Load(TRUE, (LPTSTR)szTemp);
  143.    #else
  144.     uRet=m_pObj->m_pDoc->Load(TRUE, (LPTSTR)pszFile);
  145.    #endif
  146.     return (DOCERR_NONE==uRet) ? NOERROR
  147.         : ResultFromScode(STG_E_READFAULT);
  148.     }
  149.  
  150.  
  151.  
  152.  
  153.  
  154. /*
  155.  * IPersistFile::Save
  156.  *
  157.  * Purpose:
  158.  * Purpose:
  159.  *  Instructs the server to write the current file into a new
  160.  *  filename, possibly then using that filename as the current one.
  161.  *
  162.  * Parameters:
  163.  *  pszFile         LPCOLESTR of the file into which we save.  If NULL,
  164.  *                  this means save the current file.
  165.  *  fRemember       BOOL indicating if we're to use this filename as
  166.  *                  the current file now (Save As instead of Save
  167.  *                  Copy As).
  168.  *
  169.  * Return Value:
  170.  *  HRESULT         NOERROR or a general error value.
  171.  */
  172.  
  173. STDMETHODIMP CImpIPersistFile::Save(LPCOLESTR pszFile, BOOL fRemember)
  174.     {
  175.     UINT        uRet;
  176.     BOOL        fTemp;
  177.  
  178.     /*
  179.      * We set CFigure::m_fEmbedding here to TRUE if we don't want to
  180.      * remember this file, as that cons Save into ignoring this
  181.      * filename.  This is not something you have to do in your own
  182.      * code the same way, but be sure to pay attention to fRemember.
  183.      */
  184.     fTemp=m_pObj->m_fEmbedded;
  185.     m_pObj->m_fEmbedded=!fRemember;
  186.    #ifdef WIN32ANSI
  187.     char        szTemp[CCHPATHMAX];
  188.  
  189.     WideCharToMultiByte(CP_ACP, 0, pszFile, -1, szTemp, CCHPATHMAX
  190.        , NULL, NULL);
  191.     uRet=m_pObj->m_pDoc->Save(0, szTemp);
  192.    #else
  193.     uRet=m_pObj->m_pDoc->Save(0, (LPTSTR)pszFile);
  194.    #endif
  195.  
  196.     m_pObj->m_fEmbedded=fTemp;
  197.  
  198.     return (DOCERR_NONE==uRet) ? NOERROR
  199.         : ResultFromScode(STG_E_WRITEFAULT);
  200.     }
  201.  
  202.  
  203.  
  204.  
  205.  
  206. /*
  207.  * IPersistFile::SaveCompleted
  208.  *
  209.  * Purpose:
  210.  *  Informs us that the operation that called Save is now finished
  211.  *  and we can access the file again.
  212.  *
  213.  * Parameters:
  214.  *  pszFile         LPCOLESTR of the file in which we can start
  215.  *                  writing again.
  216.  *
  217.  * Return Value:
  218.  *  HRESULT         NOERROR or a general error value.
  219.  */
  220.  
  221. STDMETHODIMP CImpIPersistFile::SaveCompleted(LPCOLESTR pszFile)
  222.     {
  223.     return NOERROR;
  224.     }
  225.  
  226.  
  227.  
  228.  
  229. /*
  230.  * IPersistFile::GetCurFile
  231.  *
  232.  * Purpose:
  233.  *  Retrieves the name of the current file.
  234.  *
  235.  * Parameters:
  236.  *  ppszFile        LPOLESTR * into which we store a pointer to
  237.  *                  the filename that should be allocated with the
  238.  *                  shared IMalloc.
  239.  *
  240.  * Return Value:
  241.  *  HRESULT         NOERROR or a general error value.
  242.  */
  243.  
  244. STDMETHODIMP CImpIPersistFile::GetCurFile(LPOLESTR *ppszFile)
  245.     {
  246.     LPMALLOC    pIMalloc;
  247.     LPOLESTR    psz;
  248.     UINT        uRet;
  249.  
  250.     *ppszFile=NULL;
  251.  
  252.     if (FAILED(CoGetMalloc(MEMCTX_TASK, &pIMalloc)))
  253.         return ResultFromScode(E_FAIL);
  254.  
  255.     psz=(LPOLESTR)pIMalloc->Alloc(CCHPATHMAX*sizeof(OLECHAR));
  256.     pIMalloc->Release();
  257.  
  258.    #ifdef WIN32ANSI
  259.     char    szTemp[CCHPATHMAX];
  260.  
  261.     uRet=m_pObj->m_pDoc->FilenameGet(szTemp, CCHPATHMAX);
  262.     MultiByteToWideChar(CP_ACP, 0, szTemp, -1, psz, CCHPATHMAX);
  263.    #else
  264.     uRet=m_pObj->m_pDoc->FilenameGet(psz, CCHPATHMAX);
  265.    #endif
  266.  
  267.     //If we have no filename, return the prompt for File Open/Save.
  268.     if (0==uRet)
  269.        #ifdef WIN32ANSI
  270.         MultiByteToWideChar(CP_ACP, 0
  271.             , (*m_pObj->m_pST)[IDS_EXTENSION], -1, psz, CCHPATHMAX);
  272.        #else
  273.         lstrcpy(psz, (*m_pObj->m_pST)[IDS_EXTENSION]);
  274.        #endif
  275.  
  276.     *ppszFile=psz;
  277.     return (0==uRet) ? ResultFromScode(S_FALSE) : NOERROR;
  278.     }
  279.