1*161f4cd1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*161f4cd1SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*161f4cd1SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*161f4cd1SAndrew Rist  * distributed with this work for additional information
6*161f4cd1SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*161f4cd1SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*161f4cd1SAndrew Rist  * "License"); you may not use this file except in compliance
9*161f4cd1SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*161f4cd1SAndrew Rist  *
11*161f4cd1SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*161f4cd1SAndrew Rist  *
13*161f4cd1SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*161f4cd1SAndrew Rist  * software distributed under the License is distributed on an
15*161f4cd1SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*161f4cd1SAndrew Rist  * KIND, either express or implied.  See the License for the
17*161f4cd1SAndrew Rist  * specific language governing permissions and limitations
18*161f4cd1SAndrew Rist  * under the License.
19*161f4cd1SAndrew Rist  *
20*161f4cd1SAndrew Rist  *************************************************************/
21*161f4cd1SAndrew Rist 
22*161f4cd1SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _INPROCEMBOBJ_HXX_
25cdf0e10cSrcweir #define _INPROCEMBOBJ_HXX_
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #pragma warning(disable : 4668)
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <windows.h>
30cdf0e10cSrcweir #include <oleidl.h>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "smartpointer.hxx"
33cdf0e10cSrcweir #include "advisesink.hxx"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #define DEFAULT_ARRAY_LEN 256
36cdf0e10cSrcweir 
37cdf0e10cSrcweir namespace inprocserv {
38cdf0e10cSrcweir 
39cdf0e10cSrcweir enum InitModes {
40cdf0e10cSrcweir     NOINIT,
41cdf0e10cSrcweir     INIT_FROM_STORAGE,
42cdf0e10cSrcweir     LOAD_FROM_STORAGE,
43cdf0e10cSrcweir     LOAD_FROM_FILE
44cdf0e10cSrcweir };
45cdf0e10cSrcweir 
46cdf0e10cSrcweir // ==================================
47cdf0e10cSrcweir // this is a common baseclass that is used to count the objects
48cdf0e10cSrcweir // ==================================
49cdf0e10cSrcweir class InprocCountedObject_Impl
50cdf0e10cSrcweir {
51cdf0e10cSrcweir public:
52cdf0e10cSrcweir     InprocCountedObject_Impl();
53cdf0e10cSrcweir     ~InprocCountedObject_Impl();
54cdf0e10cSrcweir };
55cdf0e10cSrcweir 
56cdf0e10cSrcweir // ==================================
57cdf0e10cSrcweir // this is the inprocess embedded object implementation class
58cdf0e10cSrcweir // ==================================
59cdf0e10cSrcweir class InprocEmbedDocument_Impl : public InprocCountedObject_Impl
60cdf0e10cSrcweir                                , public IOleObject
61cdf0e10cSrcweir                                , public IDataObject
62cdf0e10cSrcweir                                , public IPersistStorage
63cdf0e10cSrcweir                                , public IPersistFile
64cdf0e10cSrcweir                                , public IRunnableObject
65cdf0e10cSrcweir                                , public IViewObject2
66cdf0e10cSrcweir                                // , public IExternalConnection
67cdf0e10cSrcweir                                , public IOleInPlaceObject
68cdf0e10cSrcweir                                , public IDispatch
69cdf0e10cSrcweir {
70cdf0e10cSrcweir     ULONG m_refCount;
71cdf0e10cSrcweir     BOOLEAN m_bDeleted;
72cdf0e10cSrcweir 
73cdf0e10cSrcweir     GUID  m_guid;
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     ComSmart< IUnknown > m_pDefHandler;
76cdf0e10cSrcweir     InitModes m_nInitMode;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     DWORD m_nFileOpenMode;
79cdf0e10cSrcweir     wchar_t* m_pFileName;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir     ComSmart< IStorage > m_pStorage;
82cdf0e10cSrcweir 
83cdf0e10cSrcweir     ComSmart< IOleClientSite > m_pClientSite;
84cdf0e10cSrcweir     ComSmart< IOleContainer >  m_pOleContainer;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir     ULONG m_nCallsOnStack;
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     // the listeners have wrappers that are directly connected to the object and call the listeners,
89cdf0e10cSrcweir     // the wrappers will be reconnected correctly to the new default inprocess holder object
90cdf0e10cSrcweir     ComSmart< OleWrapperAdviseSink > m_pOleAdvises[DEFAULT_ARRAY_LEN];
91cdf0e10cSrcweir     ComSmart< OleWrapperAdviseSink > m_pDataAdvises[DEFAULT_ARRAY_LEN];
92cdf0e10cSrcweir     ComSmart< OleWrapperAdviseSink > m_pViewAdvise;
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     class InternalCacheWrapper : public IOleCache2
95cdf0e10cSrcweir     {
96cdf0e10cSrcweir         InprocEmbedDocument_Impl& m_rOwnDocument;
97cdf0e10cSrcweir 
98cdf0e10cSrcweir         public:
InternalCacheWrapper(InprocEmbedDocument_Impl & rOwnDocument)99cdf0e10cSrcweir         InternalCacheWrapper( InprocEmbedDocument_Impl& rOwnDocument )
100cdf0e10cSrcweir         : m_rOwnDocument( rOwnDocument )
101cdf0e10cSrcweir         {}
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 	    /* IUnknown methods */
104cdf0e10cSrcweir 	    STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj);
105cdf0e10cSrcweir 	    STDMETHOD_(ULONG, AddRef)();
106cdf0e10cSrcweir 	    STDMETHOD_(ULONG, Release)();
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 	    /* IOleCache2 methods */
109cdf0e10cSrcweir         STDMETHOD(Cache)( FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection);
110cdf0e10cSrcweir         STDMETHOD(Uncache)( DWORD dwConnection);
111cdf0e10cSrcweir         STDMETHOD(EnumCache)( IEnumSTATDATA **ppenumSTATDATA);
112cdf0e10cSrcweir         STDMETHOD(InitCache)( IDataObject *pDataObject);
113cdf0e10cSrcweir         STDMETHOD(SetData)( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease);
114cdf0e10cSrcweir         STDMETHOD(UpdateCache)( LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved);
115cdf0e10cSrcweir         STDMETHOD(DiscardCache)( DWORD dwDiscardOptions);
116cdf0e10cSrcweir     } m_aInternalCache;
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     DWORD InsertAdviseLinkToList( const ComSmart<OleWrapperAdviseSink>& pOwnAdvise, ComSmart<  OleWrapperAdviseSink > pAdvises[] );
120cdf0e10cSrcweir     void Clean();
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 
123cdf0e10cSrcweir public:
124cdf0e10cSrcweir 
InprocEmbedDocument_Impl(const GUID & guid)125cdf0e10cSrcweir     InprocEmbedDocument_Impl( const GUID& guid )
126cdf0e10cSrcweir     : m_refCount( 0 )
127cdf0e10cSrcweir     , m_bDeleted( FALSE )
128cdf0e10cSrcweir     , m_guid( guid )
129cdf0e10cSrcweir     , m_nInitMode( NOINIT )
130cdf0e10cSrcweir     , m_nFileOpenMode( 0 )
131cdf0e10cSrcweir     , m_pFileName( NULL )
132cdf0e10cSrcweir     , m_nCallsOnStack( 0 )
133cdf0e10cSrcweir     , m_aInternalCache( *this )
134cdf0e10cSrcweir     {}
135cdf0e10cSrcweir 
~InprocEmbedDocument_Impl()136cdf0e10cSrcweir     virtual ~InprocEmbedDocument_Impl()
137cdf0e10cSrcweir     {}
138cdf0e10cSrcweir 
139cdf0e10cSrcweir     HRESULT Init();
140cdf0e10cSrcweir     void SetName( LPCOLESTR pszNameFromOutside, wchar_t*& pOwnName );
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     BOOL CheckDefHandler();
GetDefHandler()143cdf0e10cSrcweir     ComSmart< IUnknown >& GetDefHandler() { return m_pDefHandler; }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	/* IUnknown methods */
146cdf0e10cSrcweir 	STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj);
147cdf0e10cSrcweir 	STDMETHOD_(ULONG, AddRef)();
148cdf0e10cSrcweir 	STDMETHOD_(ULONG, Release)();
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	/* IOleObject methods */
151cdf0e10cSrcweir 	STDMETHOD(SetClientSite) ( IOleClientSite* pSite );
152cdf0e10cSrcweir 	STDMETHOD(GetClientSite) ( IOleClientSite** pSite );
153cdf0e10cSrcweir     STDMETHOD(SetHostNames) ( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj );
154cdf0e10cSrcweir     STDMETHOD(Close) ( DWORD dwSaveOption);
155cdf0e10cSrcweir     STDMETHOD(SetMoniker) ( DWORD dwWhichMoniker, IMoniker *pmk );
156cdf0e10cSrcweir     STDMETHOD(GetMoniker) ( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk );
157cdf0e10cSrcweir     STDMETHOD(InitFromData) ( IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved );
158cdf0e10cSrcweir     STDMETHOD(GetClipboardData) ( DWORD dwReserved, IDataObject **ppDataObject );
159cdf0e10cSrcweir     STDMETHOD(DoVerb) ( LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect );
160cdf0e10cSrcweir     STDMETHOD(EnumVerbs) ( IEnumOLEVERB **ppEnumOleVerb );
161cdf0e10cSrcweir     STDMETHOD(Update) ();
162cdf0e10cSrcweir     STDMETHOD(IsUpToDate) ();
163cdf0e10cSrcweir     STDMETHOD(GetUserClassID) ( CLSID *pClsid );
164cdf0e10cSrcweir     STDMETHOD(GetUserType) ( DWORD dwFormOfType, LPOLESTR *pszUserType );
165cdf0e10cSrcweir     STDMETHOD(SetExtent) ( DWORD dwDrawAspect, SIZEL *psizel );
166cdf0e10cSrcweir     STDMETHOD(GetExtent) ( DWORD dwDrawAspect, SIZEL *psizel );
167cdf0e10cSrcweir     STDMETHOD(Advise) ( IAdviseSink *pAdvSink, DWORD *pdwConnection );
168cdf0e10cSrcweir     STDMETHOD(Unadvise) ( DWORD dwConnection );
169cdf0e10cSrcweir     STDMETHOD(EnumAdvise) ( IEnumSTATDATA **ppenumAdvise );
170cdf0e10cSrcweir     STDMETHOD(GetMiscStatus) ( DWORD dwAspect, DWORD *pdwStatus );
171cdf0e10cSrcweir     STDMETHOD(SetColorScheme) ( LOGPALETTE *pLogpal );
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 	/* IDataObject methods */
174cdf0e10cSrcweir 	STDMETHOD(GetData) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium );
175cdf0e10cSrcweir 	STDMETHOD(GetDataHere) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium );
176cdf0e10cSrcweir 	STDMETHOD(QueryGetData) ( FORMATETC * pFormatetc );
177cdf0e10cSrcweir 	STDMETHOD(GetCanonicalFormatEtc) ( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut );
178cdf0e10cSrcweir 	STDMETHOD(SetData) ( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease );
179cdf0e10cSrcweir 	STDMETHOD(EnumFormatEtc) ( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc );
180cdf0e10cSrcweir 	STDMETHOD(DAdvise) ( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection );
181cdf0e10cSrcweir 	STDMETHOD(DUnadvise) ( DWORD dwConnection );
182cdf0e10cSrcweir 	STDMETHOD(EnumDAdvise) ( IEnumSTATDATA ** ppenumAdvise );
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 	/* IPersistMethod */
185cdf0e10cSrcweir 	STDMETHOD(GetClassID)(CLSID *pClassID);
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 	/* IPersistStorage methods */
188cdf0e10cSrcweir 	STDMETHOD(IsDirty) ();
189cdf0e10cSrcweir 	STDMETHOD(InitNew) ( IStorage *pStg );
190cdf0e10cSrcweir 	STDMETHOD(Load) ( IStorage* pStr );
191cdf0e10cSrcweir 	STDMETHOD(Save) ( IStorage *pStgSave, BOOL fSameAsLoad );
192cdf0e10cSrcweir 	STDMETHOD(SaveCompleted) ( IStorage *pStgNew );
193cdf0e10cSrcweir 	STDMETHOD(HandsOffStorage) (void);
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	/* IPersistFile methods */
196cdf0e10cSrcweir 	STDMETHOD(Load) ( LPCOLESTR pszFileName, DWORD dwMode );
197cdf0e10cSrcweir 	STDMETHOD(Save) ( LPCOLESTR pszFileName, BOOL fRemember );
198cdf0e10cSrcweir 	STDMETHOD(SaveCompleted) ( LPCOLESTR pszFileName );
199cdf0e10cSrcweir 	STDMETHOD(GetCurFile) ( LPOLESTR *ppszFileName );
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 	/* IRunnableObject methods */
202cdf0e10cSrcweir     STDMETHOD(GetRunningClass) ( LPCLSID lpClsid);
203cdf0e10cSrcweir     STDMETHOD(Run) ( LPBINDCTX pbc);
204cdf0e10cSrcweir     virtual BOOL STDMETHODCALLTYPE IsRunning( void);
205cdf0e10cSrcweir     STDMETHOD(LockRunning) ( BOOL fLock, BOOL fLastUnlockCloses );
206cdf0e10cSrcweir     STDMETHOD(SetContainedObject) ( BOOL fContained);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	/* IViewObject2 methods */
209cdf0e10cSrcweir     STDMETHOD(Draw)( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL ( STDMETHODCALLTYPE *pfnContinue )( ULONG_PTR dwContinue ), ULONG_PTR dwContinue);
210cdf0e10cSrcweir     STDMETHOD(GetColorSet)( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet);
211cdf0e10cSrcweir     STDMETHOD(Freeze)( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze);
212cdf0e10cSrcweir     STDMETHOD(Unfreeze)( DWORD dwFreeze);
213cdf0e10cSrcweir     STDMETHOD(SetAdvise)( DWORD aspects, DWORD advf, IAdviseSink *pAdvSink);
214cdf0e10cSrcweir     STDMETHOD(GetAdvise)( DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink);
215cdf0e10cSrcweir     STDMETHOD(GetExtent)( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel);
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 	/* IOleWindow methods */
218cdf0e10cSrcweir     STDMETHOD(GetWindow)( HWND *phwnd);
219cdf0e10cSrcweir     STDMETHOD(ContextSensitiveHelp)( BOOL fEnterMode);
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	/* IOleInPlaceObject methods */
222cdf0e10cSrcweir     STDMETHOD(InPlaceDeactivate)( void);
223cdf0e10cSrcweir     STDMETHOD(UIDeactivate)( void);
224cdf0e10cSrcweir     STDMETHOD(SetObjectRects)( LPCRECT lprcPosRect, LPCRECT lprcClipRect);
225cdf0e10cSrcweir     STDMETHOD(ReactivateAndUndo)( void);
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     /*IDispatch methods*/
228cdf0e10cSrcweir     STDMETHOD(GetTypeInfoCount)( UINT *pctinfo);
229cdf0e10cSrcweir     STDMETHOD(GetTypeInfo)( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
230cdf0e10cSrcweir     STDMETHOD(GetIDsOfNames)( REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
231cdf0e10cSrcweir     STDMETHOD(Invoke)( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
232cdf0e10cSrcweir 
233cdf0e10cSrcweir };
234cdf0e10cSrcweir 
235cdf0e10cSrcweir } // namespace inprocserv
236cdf0e10cSrcweir 
237cdf0e10cSrcweir #endif
238cdf0e10cSrcweir 
239