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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * FILE.C
  3.  *
  4.  * Functions for handling dirty files and processing File menu commands.
  5.  *
  6.  * Functions:
  7.  *  FDirtySet, FCleanVerify
  8.  *  FFileNew, FFileOpen, FFileSave, FFileSaveAs, FFileExit
  9.  *
  10.  * This file contains the only functions that manipulate the fDirty flag.
  11.  *
  12.  * Copyright(c) Microsoft Corp. 1992-1994 All Rights Reserved
  13.  * Win32 version, January 1994
  14.  */
  15. #include <windows.h>
  16. #include <ole.h>
  17. #include "cosmo.h"
  18. #include "oleglobl.h"
  19. /*
  20.  * FDirtySet
  21.  *
  22.  * Purpose:
  23.  *  Sets or clears the global 'dirty' flag returning the previous state
  24.  *  of that same flag.  Even though the non-OLE part of this function
  25.  *  is trivial, it isolates handling changes, providing a single point
  26.  *  to notify a client app with OLE_CHANGED.
  27.  *
  28.  *  This function does exits if pGlob->fNoDirty is set.
  29.  *
  30.  * Parameters:
  31.  *  fDirty          BOOL used to set the value of the pGLob->fDirty flag.
  32.  *                  This allows us to use this function to both set and
  33.  *                  clear the flag.  OLE_CHANGED is only sent if the
  34.  *                  flag is set to TRUE.
  35.  *
  36.  * Return Value:
  37.  *  BOOL            Previous value of the dirty flag.
  38.  */
  39. BOOL WINAPI FDirtySet(BOOL fDirty)
  40.     {
  41.     BOOL        fPrevious;
  42. #ifdef MAKEOLESERVER
  43.     /*
  44.      * If we are a hidden window, then there's nothing that could make
  45.      * us dirty since there cannot be any user interaction here.  Therefore
  46.      * ignore any changes to the dirty flag, leaving it FALSE.
  47.      */
  48.     if (!IsWindowVisible(pGlob->hWnd))
  49.         return pGlob->fDirty;
  50. #endif //MAKEOLESERVER
  51.     if (pGlob->fNoDirty)
  52.         return pGlob->fDirty;
  53.     fPrevious=pGlob->fDirty;
  54.     pGlob->fDirty=fDirty;
  55. #ifdef MAKEOLESERVER
  56.     if (fDirty)
  57.         //Fun indirection, huh?  That what you get with an OOP.
  58.         OLEClientNotify(pOLE->pSvr->pDoc->pObj, OLE_CHANGED);
  59. #endif //MAKEOLESERVER
  60.     return fPrevious;
  61.     }
  62. /*
  63.  * FCleanVerify
  64.  *
  65.  * Purpose:
  66.  *  Checks the pGLob->fDirty flag, and if set, displays a message
  67.  *  box informing the user that the file is dirty and asking if
  68.  *  the file should be saved or updated.  If YES is chosen, the file
  69.  *  is saved or updated.
  70.  *
  71.  * Parameters:
  72.  *  pGlob           LPGLOBALS to global variable block.
  73.  *
  74.  * Return Value:
  75.  *  BOOL            TRUE if it's safe to proceed with the operation (file
  76.  *                  is clean, user answered NO, or file was saved).
  77.  *                  FALSE if the user wants to cancel the operation or there
  78.  *                  was an error.
  79.  */
  80. BOOL WINAPI FCleanVerify(LPGLOBALS pGlob)
  81.     {
  82.     BOOL        fRet=TRUE;
  83.     UINT        uRet;
  84.     char       *psz;
  85. #ifdef MAKEOLESERVER
  86.     char        szClient[40];
  87. #endif //MAKEOLESERVER
  88.     //Nothing to do if we're clean.
  89.     if (!pGlob->fDirty)
  90.         return TRUE;
  91.     if (!pGlob->fOLE)
  92.         {
  93.         uRet=MessageBox(pGlob->hWnd, rgpsz[IDS_FILEDIRTY]
  94.             , rgpsz[IDS_CAPTION], MB_YESNOCANCEL | MB_ICONEXCLAMATION);
  95.         }
  96. #ifdef MAKEOLESERVER
  97.     if (pGlob->fOLE)
  98.         {
  99.         //Linking case, use the same message as before.
  100.         if (pOLE->pSvr->fLink)
  101.             {
  102.             uRet=MessageBox(pGlob->hWnd, rgpsz[IDS_FILEDIRTY],
  103.                             rgpsz[IDS_CAPTION], MB_YESNOCANCEL);
  104.             }
  105.         //Embedding: Ask the user about updating instead of saving.
  106.         if (pOLE->pSvr->fEmbed)
  107.             {
  108.             //Build the standard string for Updating.
  109.             psz=(PSTR)LocalAlloc(LPTR, 1024);
  110.             if (NULL==psz)
  111.                 return FALSE;
  112.             GetAtomName(pOLE->pSvr->pDoc->aClient, szClient, sizeof(szClient));
  113.             lstrcpy(psz, rgpsz[IDS_CLOSEALERT1]);
  114.             lstrcat(psz, szClient);
  115.             lstrcat(psz, rgpsz[IDS_CLOSEALERT2]);
  116.             uRet=MessageBox(pGlob->hWnd, psz, rgpsz[IDS_CAPTION],
  117.                             MB_YESNOCANCEL | MB_ICONEXCLAMATION);
  118.             LocalFree((HLOCAL)psz);
  119.             }
  120.         }
  121. #endif //MAKEOLESERVER
  122.     switch (uRet)
  123.         {
  124.         case IDCANCEL:
  125.             fRet=FALSE;
  126.             break;
  127.         case IDNO:
  128.             fRet=TRUE;
  129.             break;
  130.         case IDYES:
  131.             if (!pGlob->fOLE)
  132.                 fRet=FFileSave(pGlob);
  133. #ifdef MAKEOLESERVER
  134.             //Linking same as stand-alone.
  135.             if (pOLE->pSvr->fLink)
  136.                 fRet=FFileSave(pGlob);
  137.             if (pOLE->pSvr->fEmbed)
  138.                 OLEClientNotify(pOLE->pSvr->pDoc->pObj, OLE_CLOSED);
  139. #endif //MAKEOLESERVER
  140.             break;
  141.         }
  142.     return fRet;
  143.     }
  144. /*
  145.  * FFileNew
  146.  *
  147.  * Purpose:
  148.  *  Confirms the new file with the user and cleans out the Polyline
  149.  *  image.
  150.  *
  151.  * Parameters:
  152.  *  pGlob           LPGLOBALS to the global variable block.
  153.  *
  154.  * Return Value:
  155.  *  BOOL            TRUE if the function succeeded, FALSE otherwise.
  156.  *
  157.  */
  158. BOOL WINAPI FFileNew(LPGLOBALS pGlob)
  159.     {
  160.     if (!FCleanVerify(pGlob))
  161.         return FALSE;
  162. #ifdef MAKEOLESERVER
  163.     PDocRevokeAndCreate(pOLE);
  164. #endif //MAKEOLESERVER
  165.     pGlob->fOLE=FALSE;
  166.     SendMessage(pGlob->hWndPolyline, PLM_POLYLINENEW, 0, 0L);
  167.     pGlob->fDirty=FALSE;
  168.     pGlob->fOpenFile=FALSE;
  169.     WindowTitleSet(pGlob->hWnd, rgpsz[IDS_UNTITLED]);
  170.     return TRUE;
  171.     }
  172. /*
  173.  * FFileOpen
  174.  *
  175.  * Purpose:
  176.  *  Confirms that the user wants to open a new file and invokes the
  177.  *  common dialog file open to get the filename, then reads the
  178.  *  contents of the file.  If the fImport flag is TRUE, then we
  179.  *  import the contents of the file into the current document,
  180.  *  not changing the document name or any of the UI.
  181.  *
  182.  * Parameters:
  183.  *  pGlob           LPGLOBALS to the global variable block.
  184.  *  fImport         BOOL indicates if we're importing from a file,
  185.  *                  not affecting the current filename.
  186.  *
  187.  * Return Value:
  188.  *  BOOL            TRUE if the function succeeded, FALSE otherwise.
  189.  *
  190.  */
  191. BOOL WINAPI FFileOpen(LPGLOBALS pGlob, BOOL fImport)
  192.     {
  193.     POLYLINE        pl;
  194.     BOOL            fOK;
  195.     LPSTR           psz;
  196.     char            szTemp[CCHPATHMAX];
  197.     LPSTR           pszFile;
  198.     if (!fImport)
  199.         {
  200.         if (!FCleanVerify(pGlob))
  201.             return FALSE;
  202.         }
  203.     psz=(fImport) ? rgpsz[IDS_FILEIMPORT] : rgpsz[IDS_FILEOPEN];
  204.     //We have to use a temp for Import or else we'll wipe out a real filename.
  205.     pszFile=(fImport) ? (LPSTR)szTemp : (LPSTR)pGlob->szFile;
  206.     fOK=FSaveOpenDialog(pGlob->hWnd, pGlob->hInst, rgpsz[IDS_DEFEXT]
  207.         , rgpsz[IDS_FILEOPENFILTER], pszFile, psz, TRUE);
  208.     if (fOK)
  209.         {
  210.         //Attempt to read the file in and display it.
  211.         if (!FCosFileRead(pGlob, pszFile, &pl))
  212.             return FALSE;
  213. #ifdef MAKEOLESERVER
  214.         if (!fImport)
  215.             PDocRevokeAndCreate(pOLE);
  216. #endif //MAKEOLESERVER
  217.         SendMessage(pGlob->hWndPolyline, PLM_POLYLINESET,
  218.                     TRUE, (LONG)(LPSTR)&pl);
  219.         if (!fImport)
  220.             {
  221.             WindowTitleSet(pGlob->hWnd, pszFile);
  222.             pGlob->fOLE=FALSE;
  223.             pGlob->fOpenFile=TRUE;
  224.             pGlob->fDirty=FALSE;
  225.             }
  226.         else
  227.             pGlob->fDirty=TRUE;
  228.         }
  229.     return fOK;
  230.     }
  231. /*
  232.  * FFileSave
  233.  *
  234.  * Purpose:
  235.  *  Writes the file to a known filename, requiring that the user has
  236.  *  previously used FileOpen or FileSaveAs in order to have a filename.
  237.  *
  238.  * Parameters:
  239.  *  pGlob           LPGLOBALS to the global variable block.
  240.  *
  241.  * Return Value:
  242.  *  BOOL            TRUE if the function succeeded, FALSE otherwise.
  243.  *
  244.  */
  245. BOOL WINAPI FFileSave(LPGLOBALS pGlob)
  246.     {
  247.     POLYLINE        pl;
  248. #ifdef MAKEOLESERVER
  249.     OLESTATUS       os;
  250.     //In OLE cases, this may be Update; call OleSavedServerDoc
  251.     if (pGlob->fOLE)
  252.         {
  253.         if (pOLE->pSvr->fLink)
  254.             {
  255.             SendMessage(pGlob->hWndPolyline, PLM_POLYLINEGET, 0,
  256.                         (LONG)(LPSTR)&pl);
  257.             if (!FCosFileWrite(pGlob, pGlob->szFile, &pl))
  258.                 return FALSE;
  259.             }
  260.         //This notifies the client for us.
  261.         os=OleSavedServerDoc(pOLE->pSvr->pDoc->lh);
  262.         pGlob->fDirty=(BOOL)(OLE_OK!=os);
  263.         return !pGlob->fDirty;
  264.         }
  265. #endif //MAKEOLESERVER
  266.     if (!pGlob->fOpenFile)
  267.         return FFileSaveAs(pGlob);
  268.     SendMessage(pGlob->hWndPolyline, PLM_POLYLINEGET, 0, (LONG)(LPSTR)&pl);
  269.     if (!FCosFileWrite(pGlob, pGlob->szFile, &pl))
  270.         return FALSE;
  271.     pGlob->fOpenFile=TRUE;
  272.     pGlob->fDirty=FALSE;
  273.     return TRUE;
  274.     }
  275. /*
  276.  * FFileSaveAs
  277.  *
  278.  * Purpose:
  279.  *  Invokes the common dialog for Save As to get a filename then
  280.  *  writes the polyline data to that file, creating if necessary.
  281.  *
  282.  * Parameters:
  283.  *  pGlob           LPGLOBALS to the global variable block.
  284.  *
  285.  * Return Value:
  286.  *  BOOL            TRUE if the function succeeded, FALSE otherwise.
  287.  *
  288.  */
  289. BOOL WINAPI FFileSaveAs(LPGLOBALS pGlob)
  290.     {
  291.     POLYLINE        pl;
  292.     BOOL            fOK;
  293.     fOK=FSaveOpenDialog(pGlob->hWnd, pGlob->hInst, rgpsz[IDS_DEFEXT]
  294.         , rgpsz[IDS_FILEOPENFILTER], pGlob->szFile, rgpsz[IDS_FILESAVEAS]
  295.         , FALSE);
  296.     if (fOK)
  297.         {
  298.         SendMessage(pGlob->hWndPolyline, PLM_POLYLINEGET
  299.             , 0, (LONG)(LPSTR)&pl);
  300.         fOK=FCosFileWrite(pGlob, pGlob->szFile, &pl);
  301. #ifdef MAKEOLESERVER
  302.         /*
  303.          * In the Save Copy As case, when an object is embedded, we
  304.          * don't need to call Rename or Saved since we just saved a
  305.          * silent copy of the data.
  306.          */
  307.         if (pGlob->fOLE && pOLE->pSvr->fEmbed)
  308.             return fOK;
  309.         if (fOK && pGlob->fOLE && pOLE->pSvr->fLink)
  310.             {
  311.             OleRenameServerDoc(pOLE->pSvr->pDoc->lh, pGlob->szFile);
  312.             OleSavedServerDoc(pOLE->pSvr->pDoc->lh);
  313.             }
  314. #endif //MAKEOLESERVER
  315.         pGlob->fOpenFile=fOK;
  316.         WindowTitleSet(pGlob->hWnd, pGlob->szFile);
  317.         pGlob->fDirty=FALSE;
  318.         }
  319.     return fOK;
  320.     }
  321. /*
  322.  * FFileExit
  323.  *
  324.  * Purpose:
  325.  *  Handles the File/Exit menu command, verifying dirty files as necessary
  326.  *  and revoking the server.
  327.  *
  328.  * Parameters:
  329.  *  pGlob           LPGLOBALS to the global variable block.
  330.  *
  331.  * Return Value:
  332.  *  BOOL            TRUE if the application can exit, FALSE otherwise.
  333.  */
  334. BOOL WINAPI FFileExit(LPGLOBALS pGlob)
  335.     {
  336.     BOOL            fRet;
  337. #ifdef MAKEOLESERVER
  338.     OLESTATUS       os;
  339.     LHSERVER        lhT;
  340. #endif //MAKEOLESERVER
  341.     if (!FCleanVerify(pGlob))
  342.         return FALSE;
  343. #ifdef MAKEOLESERVER
  344.     lhT=pOLE->pSvr->lh;
  345.     pOLE->pSvr->lh=0L;
  346.     os=OleRevokeServer(lhT);
  347.     if (OLE_WAIT_FOR_RELEASE==os)
  348.         {
  349.         pOLE->pSvr->fRelease=FALSE;
  350.         FOLEReleaseWait(&pOLE->pSvr->fRelease, lhT);
  351.         fRet=TRUE;
  352.         }
  353.     else
  354.         fRet=(OLE_OK==os);
  355. #endif //MAKEOLESERVER
  356.     return fRet;
  357.     }