|
|
//+---------------------------------------------------------------------
//
// File: srs.hxx
//
// Contents: Class Definitions
//
// Classes: SRFactory
// SRCtrl
// SRInPlace
// SRDV
//
//------------------------------------------------------------------------
#ifndef __SRS_HXX
#define __SRS_HXX
//
// Resource Identifiers:
//
// Our base id is 0, so our Class Descriptor resource IDs
// are identical to the offsets
//
#define IDS_CLASSID IDOFF_CLASSID
#define IDS_USERTYPEFULL IDOFF_USERTYPEFULL
#define IDS_USERTYPESHORT IDOFF_USERTYPESHORT
#define IDS_USERTYPEAPP IDOFF_USERTYPEAPP
#define IDS_DOCFEXT IDOFF_DOCFEXT
#define IDR_ICON IDOFF_ICON
#define IDR_ACCELS IDOFF_ACCELS
#define IDR_MENU IDOFF_MENU
#define IDR_MGW IDOFF_MGW
#define IDR_MISCSTATUS IDOFF_MISCSTATUS
//
// resource compiler not interested in the rest...
//
#ifndef RC_INVOKED
#include "oleglue.h" // interface with soundrec C code
//OLE2 clsid.
DEFINE_OLEGUID(CLSID_SoundRec, 0x00020C01, 0, 0); #define CLSID_SOUNDREC CLSID_SoundRec
//OLE1 clsid.
DEFINE_OLEGUID(CLSID_Ole1SoundRec, 0x0003000D, 0, 0); #define CLSID_OLE1SOUNDREC CLSID_Ole1SoundRec
//+---------------------------------------------------------------
//
// Class: SRFactory
//
// Purpose: Creates new objects
//
// Notes: This factory creates SRCtrl objects, which in turn
// create the SRDV and SRInPlace subobjects.
//
//---------------------------------------------------------------
class SRFactory: public StdClassFactory { public: STDMETHOD(CreateInstance) (LPUNKNOWN, REFIID, LPVOID FAR*); STDMETHOD(LockServer) (BOOL fLock); static BOOL Create(HINSTANCE hinst); BOOL Init(HINSTANCE hinst); ~SRFactory() { delete _pClass; } LPCLASSDESCRIPTOR _pClass; };
//
// forward declaration of classes
//
class SRCtrl; typedef SRCtrl FAR* LPSRCTRL;
class SRInPlace; typedef SRInPlace FAR* LPSRINPLACE;
class SRDV; typedef SRDV FAR* LPSRDV;
class CXBag; typedef CXBag FAR* LPXBAG;
//+---------------------------------------------------------------
//
// Class: SRCtrl
//
// Purpose: Manages the control aspect of server
//
// Notes: Our objects are composed of three subobjects:
// a SRCtrl subobject, a SRDV subobject, and an
// SRInPlace subobject. Each of these is derived from
// a corresponding Srvr base class.
//
//---------------------------------------------------------------
class SRCtrl: public SrvrCtrl { public: static BOOL ClassInit(LPCLASSDESCRIPTOR pClass); static HRESULT Create(LPUNKNOWN pUnkOuter, LPCLASSDESCRIPTOR pClass, LPUNKNOWN FAR* ppUnkCtrl, LPSRCTRL FAR* ppObj); static HRESULT DoPlay(LPVOID, LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT); static HRESULT DoShow(LPVOID, LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT); static HRESULT DoOpen(LPVOID, LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT); // we are an aggregatable object so we use a delegating IUnknown
DECLARE_DELEGATING_IUNKNOWN(SRCtrl);
STDMETHOD(GetMoniker) (DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER FAR* ppmk);
STDMETHOD(IsUpToDate) (void);
void GetHostNames(LPTSTR FAR* plpstrCntrApp, LPTSTR FAR* plpstrCntrObj); void Lock(void); void UnLock(void); void MarkAsLoaded(void); BOOL IsLoaded(void);
//
// base-class virtuals overridden to do additional,
// server-specific processing
//
virtual HRESULT RunningToOpened(); virtual HRESULT OpenedToRunning(); virtual HRESULT PassiveToLoaded(); virtual HRESULT LoadedToPassive();
#ifdef WE_SUPPORT_INPLACE
virtual HRESULT RunningToInPlace(); virtual HRESULT InPlaceToRunning(); virtual HRESULT UIActiveToInPlace(); #endif //WE_SUPPORT_INPLACE
protected:
// constructors, initializers, and destructors
SRCtrl(LPUNKNOWN pUnkOuter); HRESULT Init(LPCLASSDESCRIPTOR pClass); virtual ~SRCtrl(void);
DECLARE_PRIVATE_IUNKNOWN(SRCtrl);
LPUNKNOWN _pDVCtrlUnk; // controlling unknown for DV subobj
LPUNKNOWN _pIPCtrlUnk; // controlling unknown for InPlace subobj
int _cLock; BOOL _fLoaded; // loaded.
};
//+---------------------------------------------------------------
//
// Class: SRHeader
//
// Purpose: Document information placed at the head of the
// documents contents stream
//
//---------------------------------------------------------------
class SRHeader { public: SRHeader(); HRESULT Read(LPSTREAM pStrm); HRESULT Write(LPSTREAM pStrm);
SIZEL _sizel; // our size (HIMETRIC)
DWORD _dwNative; // size of native data
//
// Our native data follows the header...
//
};
//+---------------------------------------------------------------
//
// Member: SRHeader::SRHeader
//
// Synopsis: Constructor for SRHeader class
//
//----------------------------------------------------------------
inline SRHeader::SRHeader() { _sizel.cx = HimetricFromHPix(GetSystemMetrics(SM_CXICON)); _sizel.cy = HimetricFromVPix(GetSystemMetrics(SM_CYICON)); _dwNative = 0; }
//+---------------------------------------------------------------
//
// Member: SRHeader::Read, public
//
// Synopsis: Reads a self-delimited header from a stream
//
// Arguments: [pStrm] -- stream to read from
//
// Returns: SUCCESS if the item could be read from the stream
//
// Notes: This also checks the version number in the header
// and will fail if the version number is incorrect.
//
//----------------------------------------------------------------
inline HRESULT SRHeader::Read(LPSTREAM pStrm) { return pStrm->Read(this, sizeof(SRHeader), NULL); }
//+---------------------------------------------------------------
//
// Member: SRHeader::Write, public
//
// Synopsis: Writes a self-delimited header to a stream
//
// Arguments: [pStrm] -- stream to write to
//
// Returns: SUCCESS if the item could be written to the stream
//
//----------------------------------------------------------------
inline HRESULT SRHeader::Write(LPSTREAM pStrm) { return pStrm->Write(this, sizeof(SRHeader), NULL); }
//+---------------------------------------------------------------
//
// Class: SRDV
//
// Purpose: The data/view subobject of a compound document object
//
//---------------------------------------------------------------
class SRDV: public SrvrDV { public: static BOOL ClassInit(LPCLASSDESCRIPTOR pClass);
static HRESULT Create(LPSRCTRL pCtrl, LPCLASSDESCRIPTOR pClass, LPUNKNOWN FAR* ppUnkCtrl, LPSRDV FAR* ppObj); static HRESULT GetDIB(LPSRVRDV, LPFORMATETC, LPSTGMEDIUM, BOOL);
// we use standard aggregation for delegation to the control subobject
DECLARE_DELEGATING_IUNKNOWN(SRDV);
// base-class virtuals overridden to do additional,
// server-specific processing
virtual HRESULT RenderContent(DWORD dwDrawAspect, LONG lindex, void FAR* pvAspect, DVTARGETDEVICE FAR * ptd, HDC hicTargetDev, HDC hdcDraw, LPCRECTL lprectl, LPCRECTL lprcWBounds, BOOL (CALLBACK *pfnContinue) (ULONG_PTR), ULONG_PTR dwContinue); virtual HRESULT GetClipboardCopy(LPSRVRDV FAR* ppDV) { *ppDV = NULL; return E_FAIL; };
STDMETHOD(Load) (LPCOLESTR lpszFileName, DWORD grfMode); protected:
// base-class virtuals overridden to do additional,
// server-specific processing
virtual HRESULT LoadFromStorage(LPSTORAGE pStg); virtual HRESULT SaveToStorage(LPSTORAGE pStg, BOOL fSameAsLoad);
// constructors, initializers, and destructors
SRDV(LPUNKNOWN pUnkOuter); HRESULT Init(LPSRCTRL pCtrl, LPCLASSDESCRIPTOR pClass); virtual ~SRDV(void);
DECLARE_PRIVATE_IUNKNOWN(SRDV);
//
// native data
//
SRHeader _header; // global properties for the document
};
//+---------------------------------------------------------------
//
// Class: SRInPlace
//
// Purpose: InPlace aspect of OLE compound document
//
// Notes: This class supports SrvrInPlace
//
//---------------------------------------------------------------
class SRInPlace: public SrvrInPlace { public: static BOOL ClassInit(LPCLASSDESCRIPTOR pClass);
static HRESULT Create(LPSRCTRL pSRCtrl, LPCLASSDESCRIPTOR pClass, LPUNKNOWN FAR* ppUnkCtrl, LPSRINPLACE FAR* ppObj);
DECLARE_DELEGATING_IUNKNOWN(SRInPlace);
protected: SRInPlace(LPUNKNOWN pUnkOuter); HRESULT Init(LPSRCTRL pSRCtrl, LPCLASSDESCRIPTOR pClass); ~SRInPlace(void);
DECLARE_PRIVATE_IUNKNOWN(SRInPlace);
// private helpers
virtual HWND AttachWin(HWND hwndParent); };
//
// Data transfer object
//
class CXBag: public IDataObject { public: static HRESULT Create(LPXBAG *ppXBag, LPSRCTRL pHost, LPPOINT pptSelect);
DECLARE_STANDARD_IUNKNOWN(CXBag);
//
//IDataObject
//
STDMETHODIMP DAdvise( FORMATETC FAR* pFormatetc, DWORD advf, LPADVISESINK pAdvSink, DWORD FAR* pdwConnection) { return OLE_E_ADVISENOTSUPPORTED; }
STDMETHODIMP DUnadvise( DWORD dwConnection) { return OLE_E_ADVISENOTSUPPORTED; }
STDMETHODIMP EnumDAdvise( LPENUMSTATDATA FAR* ppenumAdvise) { return OLE_E_ADVISENOTSUPPORTED; }
STDMETHODIMP EnumFormatEtc( DWORD dwDirection, LPENUMFORMATETC FAR* ppenumFormatEtc);
STDMETHODIMP GetCanonicalFormatEtc( LPFORMATETC pformatetc, LPFORMATETC pformatetcOut) { pformatetcOut->ptd = NULL; return E_NOTIMPL; }
STDMETHODIMP GetData(LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium ); STDMETHODIMP GetDataHere(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium); STDMETHODIMP QueryGetData(LPFORMATETC pformatetc ); STDMETHODIMP SetData(LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium, BOOL fRelease) { return E_NOTIMPL; }
//
//Public Helpers
//
HRESULT SnapShotAndDetach(void);
void Detach(void) { _pHost = NULL; }; private: CXBag(LPSRCTRL pHost); ~CXBag();
HRESULT BagItInStorage(LPSTGMEDIUM pmedium, BOOL fStgProvided);
LPSRCTRL _pHost; // ptr back to host
LPSTORAGE _pStgBag; // snapshot storage (or NULL)
};
#endif //!RC_INVOKED
#endif //__SRS_HXX
|