home *** CD-ROM | disk | FTP | other *** search
/ Network Support Encyclopedia 96-1 / novell-nsepro-1996-1-cd2.iso / download / gw / oddev.exe / SAMPAPP.CPP < prev   
C/C++ Source or Header  |  1994-08-03  |  8KB  |  335 lines

  1. /* sampapp.cpp - Application class for ODMA     sample DMS.
  2.  *
  3.  * COPYRIGHT (C) 1994
  4.  * SoftSolutions Technology Corporation
  5.  * Orem, Utah  USA
  6.  * All Rights Reserved
  7.  */
  8.  
  9. #include <windows.h>
  10. #include "odmasamp.h"
  11.  
  12.  
  13. Application::Application( LPUNKNOWN pUnkOuter, DWORD dwEnvData )
  14.   : m_Unknown( this ), m_ODMDocMan( this )
  15. {
  16.     m_dwRefs = 1;
  17.      if (pUnkOuter == NULL) {
  18.     m_pUnkOuter = &m_Unknown;
  19.     }else{
  20.     m_pUnkOuter = pUnkOuter;
  21.     }
  22.     m_clientWind = (HWND) dwEnvData;
  23. }
  24.  
  25. Application::~Application()
  26. {
  27.     DocList.SaveList();             // save list of documents to disk
  28. }
  29.  
  30. /* Application::GetInterface - This function allows a holder of an Application
  31.    object to get a pointer to one of its COM interfaces. */
  32. HRESULT Application::GetInterface( REFIID riid, LPVOID FAR *ppvObj )
  33. {
  34.     return m_Unknown.QueryInterface( riid, ppvObj );
  35. }
  36.  
  37. /*********************** IUnknown Interface ****************************/
  38. STDMETHODIMP NC(Application, CUnknown)::
  39.   QueryInterface(REFIID riid, LPVOID FAR* ppobj)
  40. {
  41.     HRESULT hRes=NOERROR;
  42.  
  43.     *ppobj = NULL;
  44.  
  45.     if (riid == IID_IUnknown) {
  46.     *ppobj = (LPVOID)&m_pObject->m_Unknown;
  47.     } else if (riid == IID_IODMDocMan) {
  48.         *ppobj = (LPVOID)&m_pObject->m_ODMDocMan;
  49.     }
  50.  
  51.     if (*ppobj == NULL) {
  52.         hRes = ResultFromScode(E_NOINTERFACE);
  53.     }else{
  54.     ((LPUNKNOWN)*ppobj)->AddRef();
  55.     }
  56.  
  57.     return hRes;
  58. }
  59.  
  60. STDMETHODIMP_(ULONG) NC(Application, CUnknown)::
  61.   AddRef(VOID)
  62. {
  63.     ULONG dwRefs = ++m_pObject->m_dwRefs;
  64.  
  65.     return dwRefs;
  66. }
  67.  
  68. STDMETHODIMP_(ULONG) NC(Application, CUnknown)::
  69.   Release(VOID)
  70. {
  71.     ULONG dwRefs = --m_pObject->m_dwRefs;
  72.  
  73.     if (dwRefs == 0) {
  74.     delete m_pObject;
  75.     }
  76.  
  77. return dwRefs;
  78. }
  79.  
  80. /***************************** IODMDocMan Interface *****************/
  81.  
  82. STDMETHODIMP NC(Application, CODMDocMan)::
  83.   QueryInterface(REFIID riid, LPVOID FAR* ppobj)
  84. {
  85.     return m_pObject->m_pUnkOuter->QueryInterface(riid, ppobj);
  86. }
  87.  
  88. STDMETHODIMP_(ULONG) NC(Application, CODMDocMan)::
  89.   AddRef(VOID)
  90. {
  91.     return m_pObject->m_pUnkOuter->AddRef();
  92. }
  93.  
  94. STDMETHODIMP_(ULONG) NC(Application, CODMDocMan)::
  95.   Release(VOID)
  96. {
  97.     return m_pObject->m_pUnkOuter->Release();
  98. }
  99.  
  100. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  101.   SelectDoc( LPSTR lpszDocId, LPDWORD pdwFlags )
  102. {
  103.      ODMSTATUS err;
  104.  
  105.      if (*pdwFlags & ODM_SILENT)
  106.           return ODM_E_USERINT;   // This DMS can't make a selection without user input.
  107.  
  108.      err = DialogBoxParam( hInst, MAKEINTRESOURCE(SELECT_DIALOG), m_pObject->m_clientWind,
  109.         (DLGPROC)SelectDocProc, (LPARAM)lpszDocId );
  110.     if (err == IDOK) {
  111.         err = 0;
  112.      } else if (err == IDAPPSELECT)
  113.         err = ODM_E_APPSELECT;
  114.     else
  115.           err = ODM_E_CANCEL;
  116.  
  117.     return err;
  118. }
  119.  
  120. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  121.   OpenDoc( DWORD flags, LPSTR lpszDocId, LPSTR lpszDocLocation )
  122. {
  123.      Document *pDoc;
  124.  
  125.      pDoc = DocList.GetDocumentById( lpszDocId );
  126.      if (pDoc == NULL)
  127.         return ODM_E_DOCID;
  128.  
  129.      // Don't allow the document to be opened in write mode if it's already open.
  130.      if ((flags & ODM_MODIFYMODE) && pDoc->GetOpenCount() > 0)
  131.         return ODM_E_INUSE;
  132.  
  133.      return pDoc->Open( lpszDocLocation );
  134. }
  135.  
  136. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  137.   SaveDoc( LPSTR lpszDocId, LPSTR lpszNewDocId )
  138. {
  139.      Document *pDoc;
  140.  
  141.      pDoc = DocList.GetDocumentById( lpszDocId );
  142.      if (pDoc == NULL)
  143.         return ODM_E_DOCID;
  144.  
  145.      strcpy( lpszNewDocId, lpszDocId );
  146.      return pDoc->Save();
  147. }
  148.  
  149. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  150.   CloseDoc( LPSTR lpszDocId, DWORD activeTime, DWORD pagesPrinted,
  151.     LPVOID sessionData, WORD dataLen )
  152. {
  153.     Document *pDoc;
  154.  
  155.      pDoc = DocList.GetDocumentById( lpszDocId );
  156.      if (pDoc == NULL)
  157.         return ODM_E_DOCID;
  158.  
  159.      return pDoc->Close( activeTime, pagesPrinted, sessionData, dataLen );
  160. }
  161.  
  162. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  163.   NewDoc( LPSTR lpszDocId, DWORD dwFlags, LPSTR lpszFormat, LPSTR lpszDocLocation  )
  164. {
  165.     Document *pDoc;
  166.     LPSTR lp;
  167.     ODMSTATUS err;
  168.  
  169.     err = DocList.NewDocument( lpszFormat, lpszDocLocation, &pDoc, dwFlags,
  170.         m_pObject->m_clientWind );
  171.     if (err)
  172.         return err;
  173.  
  174.     lp = pDoc->GetId();
  175.     wsprintf( lpszDocId, "::ODMA\\%s\\%s", (LPSTR) DMSID, lp );
  176.     return 0;
  177. }
  178.  
  179. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  180.   SaveAs( LPSTR lpszDocId, LPSTR lpszNewDocId, LPSTR lpszFormat,
  181.     ODMSAVEASCALLBACK pcbCallBack, LPVOID pInstanceData )
  182. {
  183.     ODMSTATUS err;
  184.     SaveAsData saData;
  185.     Document *pDoc;
  186.     LPSTR lp;
  187.  
  188.     pDoc = DocList.GetDocumentById( lpszDocId );
  189.     if (! pDoc)
  190.         return ODM_E_DOCID;
  191.  
  192.     if (pDoc->HasBeenAccessed()) {
  193.         saData.pcbCallBack = pcbCallBack;
  194.         saData.pInstanceData = pInstanceData;
  195.         strncpy( saData.Format, lpszFormat, sizeof(saData.Format) );
  196.         saData.Format[sizeof(saData.Format)-1] = '\0';
  197.  
  198.         err = DialogBoxParam( hInst, MAKEINTRESOURCE(SAVEAS_DIALOG),
  199.             m_pObject->m_clientWind, (DLGPROC)SaveAsProc, (LPARAM)&saData );
  200.     } else {        /* Document has never been accessed, so the Save as new document
  201.                    and Save as new version options don't make a lot of sense.
  202.                    Just present the application's options if any. */
  203.         if (pcbCallBack) {
  204.             lp = pcbCallBack( (DWORD) m_pObject->m_clientWind, lpszFormat, pInstanceData );
  205.             strncpy( saData.Format, lp, sizeof(saData.Format) );
  206.             saData.Format[sizeof(saData.Format)-1] = '\0';
  207.             err = IDOK;
  208.         } else {
  209.             err = IDOK;
  210.         }
  211.     }
  212.  
  213.     if (err == IDOK) {
  214.         err = 0;
  215.         lpszNewDocId[0] = '\0';
  216.         pDoc->SetInfo( ODM_CONTENTFORMAT, saData.Format );
  217.     } else if (err == IDCOPY) {
  218.         err = DocList.CopyDocument( lpszDocId, &pDoc, m_pObject->m_clientWind );
  219.         if (! err) {
  220.             lp = pDoc->GetId();
  221.             pDoc->SetInfo( ODM_CONTENTFORMAT, saData.Format );
  222.             wsprintf( lpszNewDocId, "::ODMA\\%s\\%s", (LPSTR) DMSID, lp );
  223.         }
  224.     } else
  225.         err = ODM_E_CANCEL;
  226.  
  227.     return err;
  228. }
  229.  
  230. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  231.   Activate( WORD action, LPSTR lpszDocId )
  232. {
  233.     Document *pDoc;
  234.     ODMSTATUS err;
  235.  
  236.     if (lpszDocId == NULL) {
  237.         if (action != ODM_NONE)
  238.             return ODM_E_DOCID;
  239.     } else {
  240.         pDoc = DocList.GetDocumentById( lpszDocId );
  241.         if (pDoc == NULL)
  242.             return ODM_E_DOCID;
  243.     }
  244.  
  245.     switch( action ) {
  246.         case ODM_NONE:
  247.             MessageBox( NULL, "A real DMS would typically display menus or"
  248.                 " other user interface elements allowing the user to interact"
  249.                 " with the DMS at this point.",
  250.                 DMSNAME, MB_OK | MB_ICONINFORMATION | MB_TASKMODAL );
  251.             err = 0;
  252.             break;
  253.  
  254.         case ODM_DELETE:
  255.             err = DocList.DeleteDocument( lpszDocId );
  256.             break;
  257.  
  258.         case ODM_SHOWATTRIBUTES:
  259.             err = pDoc->ShowAttributes( m_pObject->m_clientWind );
  260.             break;
  261.  
  262.         case ODM_EDITATTRIBUTES:
  263.             err = pDoc->EditAttributes( m_pObject->m_clientWind );
  264.             break;
  265.  
  266.         case ODM_VIEWDOC:
  267.             MessageBox( NULL, "A real DMS would open the document into a viewer"
  268.                 " window at this point.  This sample doesn't include a file viewer,"
  269.                 " so this is all you get.", DMSNAME,
  270.                 MB_OK  | MB_ICONINFORMATION | MB_TASKMODAL );
  271.             err = 0;
  272.             break;
  273.  
  274.         case ODM_OPENDOC:
  275.             MessageBox( NULL, "A real DMS would open the document into its native"
  276.                 " application at this point.  This sample doesn't include application"
  277.                 " integrations, so this is all you get.", DMSNAME,
  278.                 MB_OK  | MB_ICONINFORMATION | MB_TASKMODAL );
  279.             err = 0;
  280.             break;
  281.  
  282.         default:
  283.             err = ODM_E_ITEM;
  284.  
  285.     }
  286.  
  287.     return err;
  288. }
  289.  
  290. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  291.   GetDocInfo( LPSTR lpszDocId, WORD item, LPSTR lpszData, WORD dataLen )
  292. {
  293.      Document *pDoc;
  294.  
  295.      pDoc = DocList.GetDocumentById( lpszDocId );
  296.      if (pDoc == NULL)
  297.         return ODM_E_DOCID;
  298.  
  299.      return pDoc->GetInfo( item, lpszData, dataLen );
  300. }
  301.  
  302. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  303.   SetDocInfo( LPSTR lpszDocId, WORD item, LPSTR lpszData )
  304. {
  305.      Document *pDoc;
  306.  
  307.      pDoc = DocList.GetDocumentById( lpszDocId );
  308.      if (pDoc == NULL)
  309.         return ODM_E_DOCID;
  310.  
  311.      return pDoc->SetInfo( item, lpszData );
  312. }
  313.  
  314. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  315.   GetDMSInfo( LPSTR lpszDmsId, LPWORD pwVerNo, LPDWORD pdwExtensions )
  316. {
  317.     strcpy( lpszDmsId, DMSID );
  318.     *pwVerNo = ODM_API_VERSION;
  319.     *pdwExtensions = 0;
  320.  
  321.     return 0;
  322. }
  323.  
  324. STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
  325.   GetLeadMoniker( LPSTR lpszDocId, LPMONIKER FAR *ppMoniker )
  326. {
  327.     // This sample doesn't support OLE 2.
  328.     *ppMoniker = NULL;
  329.     return ODM_E_FAIL;
  330. }
  331.  
  332.  
  333.  
  334.  
  335.