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
Wrap
C/C++ Source or Header
|
1994-08-03
|
8KB
|
335 lines
/* sampapp.cpp - Application class for ODMA sample DMS.
*
* COPYRIGHT (C) 1994
* SoftSolutions Technology Corporation
* Orem, Utah USA
* All Rights Reserved
*/
#include <windows.h>
#include "odmasamp.h"
Application::Application( LPUNKNOWN pUnkOuter, DWORD dwEnvData )
: m_Unknown( this ), m_ODMDocMan( this )
{
m_dwRefs = 1;
if (pUnkOuter == NULL) {
m_pUnkOuter = &m_Unknown;
}else{
m_pUnkOuter = pUnkOuter;
}
m_clientWind = (HWND) dwEnvData;
}
Application::~Application()
{
DocList.SaveList(); // save list of documents to disk
}
/* Application::GetInterface - This function allows a holder of an Application
object to get a pointer to one of its COM interfaces. */
HRESULT Application::GetInterface( REFIID riid, LPVOID FAR *ppvObj )
{
return m_Unknown.QueryInterface( riid, ppvObj );
}
/*********************** IUnknown Interface ****************************/
STDMETHODIMP NC(Application, CUnknown)::
QueryInterface(REFIID riid, LPVOID FAR* ppobj)
{
HRESULT hRes=NOERROR;
*ppobj = NULL;
if (riid == IID_IUnknown) {
*ppobj = (LPVOID)&m_pObject->m_Unknown;
} else if (riid == IID_IODMDocMan) {
*ppobj = (LPVOID)&m_pObject->m_ODMDocMan;
}
if (*ppobj == NULL) {
hRes = ResultFromScode(E_NOINTERFACE);
}else{
((LPUNKNOWN)*ppobj)->AddRef();
}
return hRes;
}
STDMETHODIMP_(ULONG) NC(Application, CUnknown)::
AddRef(VOID)
{
ULONG dwRefs = ++m_pObject->m_dwRefs;
return dwRefs;
}
STDMETHODIMP_(ULONG) NC(Application, CUnknown)::
Release(VOID)
{
ULONG dwRefs = --m_pObject->m_dwRefs;
if (dwRefs == 0) {
delete m_pObject;
}
return dwRefs;
}
/***************************** IODMDocMan Interface *****************/
STDMETHODIMP NC(Application, CODMDocMan)::
QueryInterface(REFIID riid, LPVOID FAR* ppobj)
{
return m_pObject->m_pUnkOuter->QueryInterface(riid, ppobj);
}
STDMETHODIMP_(ULONG) NC(Application, CODMDocMan)::
AddRef(VOID)
{
return m_pObject->m_pUnkOuter->AddRef();
}
STDMETHODIMP_(ULONG) NC(Application, CODMDocMan)::
Release(VOID)
{
return m_pObject->m_pUnkOuter->Release();
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
SelectDoc( LPSTR lpszDocId, LPDWORD pdwFlags )
{
ODMSTATUS err;
if (*pdwFlags & ODM_SILENT)
return ODM_E_USERINT; // This DMS can't make a selection without user input.
err = DialogBoxParam( hInst, MAKEINTRESOURCE(SELECT_DIALOG), m_pObject->m_clientWind,
(DLGPROC)SelectDocProc, (LPARAM)lpszDocId );
if (err == IDOK) {
err = 0;
} else if (err == IDAPPSELECT)
err = ODM_E_APPSELECT;
else
err = ODM_E_CANCEL;
return err;
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
OpenDoc( DWORD flags, LPSTR lpszDocId, LPSTR lpszDocLocation )
{
Document *pDoc;
pDoc = DocList.GetDocumentById( lpszDocId );
if (pDoc == NULL)
return ODM_E_DOCID;
// Don't allow the document to be opened in write mode if it's already open.
if ((flags & ODM_MODIFYMODE) && pDoc->GetOpenCount() > 0)
return ODM_E_INUSE;
return pDoc->Open( lpszDocLocation );
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
SaveDoc( LPSTR lpszDocId, LPSTR lpszNewDocId )
{
Document *pDoc;
pDoc = DocList.GetDocumentById( lpszDocId );
if (pDoc == NULL)
return ODM_E_DOCID;
strcpy( lpszNewDocId, lpszDocId );
return pDoc->Save();
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
CloseDoc( LPSTR lpszDocId, DWORD activeTime, DWORD pagesPrinted,
LPVOID sessionData, WORD dataLen )
{
Document *pDoc;
pDoc = DocList.GetDocumentById( lpszDocId );
if (pDoc == NULL)
return ODM_E_DOCID;
return pDoc->Close( activeTime, pagesPrinted, sessionData, dataLen );
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
NewDoc( LPSTR lpszDocId, DWORD dwFlags, LPSTR lpszFormat, LPSTR lpszDocLocation )
{
Document *pDoc;
LPSTR lp;
ODMSTATUS err;
err = DocList.NewDocument( lpszFormat, lpszDocLocation, &pDoc, dwFlags,
m_pObject->m_clientWind );
if (err)
return err;
lp = pDoc->GetId();
wsprintf( lpszDocId, "::ODMA\\%s\\%s", (LPSTR) DMSID, lp );
return 0;
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
SaveAs( LPSTR lpszDocId, LPSTR lpszNewDocId, LPSTR lpszFormat,
ODMSAVEASCALLBACK pcbCallBack, LPVOID pInstanceData )
{
ODMSTATUS err;
SaveAsData saData;
Document *pDoc;
LPSTR lp;
pDoc = DocList.GetDocumentById( lpszDocId );
if (! pDoc)
return ODM_E_DOCID;
if (pDoc->HasBeenAccessed()) {
saData.pcbCallBack = pcbCallBack;
saData.pInstanceData = pInstanceData;
strncpy( saData.Format, lpszFormat, sizeof(saData.Format) );
saData.Format[sizeof(saData.Format)-1] = '\0';
err = DialogBoxParam( hInst, MAKEINTRESOURCE(SAVEAS_DIALOG),
m_pObject->m_clientWind, (DLGPROC)SaveAsProc, (LPARAM)&saData );
} else { /* Document has never been accessed, so the Save as new document
and Save as new version options don't make a lot of sense.
Just present the application's options if any. */
if (pcbCallBack) {
lp = pcbCallBack( (DWORD) m_pObject->m_clientWind, lpszFormat, pInstanceData );
strncpy( saData.Format, lp, sizeof(saData.Format) );
saData.Format[sizeof(saData.Format)-1] = '\0';
err = IDOK;
} else {
err = IDOK;
}
}
if (err == IDOK) {
err = 0;
lpszNewDocId[0] = '\0';
pDoc->SetInfo( ODM_CONTENTFORMAT, saData.Format );
} else if (err == IDCOPY) {
err = DocList.CopyDocument( lpszDocId, &pDoc, m_pObject->m_clientWind );
if (! err) {
lp = pDoc->GetId();
pDoc->SetInfo( ODM_CONTENTFORMAT, saData.Format );
wsprintf( lpszNewDocId, "::ODMA\\%s\\%s", (LPSTR) DMSID, lp );
}
} else
err = ODM_E_CANCEL;
return err;
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
Activate( WORD action, LPSTR lpszDocId )
{
Document *pDoc;
ODMSTATUS err;
if (lpszDocId == NULL) {
if (action != ODM_NONE)
return ODM_E_DOCID;
} else {
pDoc = DocList.GetDocumentById( lpszDocId );
if (pDoc == NULL)
return ODM_E_DOCID;
}
switch( action ) {
case ODM_NONE:
MessageBox( NULL, "A real DMS would typically display menus or"
" other user interface elements allowing the user to interact"
" with the DMS at this point.",
DMSNAME, MB_OK | MB_ICONINFORMATION | MB_TASKMODAL );
err = 0;
break;
case ODM_DELETE:
err = DocList.DeleteDocument( lpszDocId );
break;
case ODM_SHOWATTRIBUTES:
err = pDoc->ShowAttributes( m_pObject->m_clientWind );
break;
case ODM_EDITATTRIBUTES:
err = pDoc->EditAttributes( m_pObject->m_clientWind );
break;
case ODM_VIEWDOC:
MessageBox( NULL, "A real DMS would open the document into a viewer"
" window at this point. This sample doesn't include a file viewer,"
" so this is all you get.", DMSNAME,
MB_OK | MB_ICONINFORMATION | MB_TASKMODAL );
err = 0;
break;
case ODM_OPENDOC:
MessageBox( NULL, "A real DMS would open the document into its native"
" application at this point. This sample doesn't include application"
" integrations, so this is all you get.", DMSNAME,
MB_OK | MB_ICONINFORMATION | MB_TASKMODAL );
err = 0;
break;
default:
err = ODM_E_ITEM;
}
return err;
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
GetDocInfo( LPSTR lpszDocId, WORD item, LPSTR lpszData, WORD dataLen )
{
Document *pDoc;
pDoc = DocList.GetDocumentById( lpszDocId );
if (pDoc == NULL)
return ODM_E_DOCID;
return pDoc->GetInfo( item, lpszData, dataLen );
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
SetDocInfo( LPSTR lpszDocId, WORD item, LPSTR lpszData )
{
Document *pDoc;
pDoc = DocList.GetDocumentById( lpszDocId );
if (pDoc == NULL)
return ODM_E_DOCID;
return pDoc->SetInfo( item, lpszData );
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
GetDMSInfo( LPSTR lpszDmsId, LPWORD pwVerNo, LPDWORD pdwExtensions )
{
strcpy( lpszDmsId, DMSID );
*pwVerNo = ODM_API_VERSION;
*pdwExtensions = 0;
return 0;
}
STDMETHODIMP_(ODMSTATUS) NC(Application, CODMDocMan)::
GetLeadMoniker( LPSTR lpszDocId, LPMONIKER FAR *ppMoniker )
{
// This sample doesn't support OLE 2.
*ppMoniker = NULL;
return ODM_E_FAIL;
}