Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 1995 Martin von Loewis |
| 3 | * Copyright 1998 Justin Bradford |
| 4 | * Copyright 1999 Francis Beaudet |
| 5 | * Copyright 1999 Sylvain St-Germain |
| 6 | * Copyright 2002 Marcus Meissner |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 7 | * Copyright 2003 Ove Kåven, TransGaming Technologies |
Alexandre Julliard | 2a46702 | 2005-02-08 12:55:26 +0000 | [diff] [blame] | 8 | * Copyright 2004 Mike Hearn, Rob Shearman, CodeWeavers Inc |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 9 | * |
| 10 | * This library is free software; you can redistribute it and/or |
| 11 | * modify it under the terms of the GNU Lesser General Public |
| 12 | * License as published by the Free Software Foundation; either |
| 13 | * version 2.1 of the License, or (at your option) any later version. |
| 14 | * |
| 15 | * This library is distributed in the hope that it will be useful, |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 | * Lesser General Public License for more details. |
| 19 | * |
| 20 | * You should have received a copy of the GNU Lesser General Public |
| 21 | * License along with this library; if not, write to the Free Software |
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 23 | */ |
| 24 | |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 25 | #ifndef __WINE_OLE_COMPOBJ_H |
| 26 | #define __WINE_OLE_COMPOBJ_H |
| 27 | |
| 28 | /* All private prototype functions used by OLE will be added to this header file */ |
| 29 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 30 | #include <stdarg.h> |
| 31 | |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 32 | #include "wine/list.h" |
| 33 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 34 | #include "windef.h" |
| 35 | #include "winbase.h" |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 36 | #include "wtypes.h" |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 37 | #include "dcom.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 38 | #include "winreg.h" |
Alexandre Julliard | 7df1b9e | 2003-08-28 19:57:35 +0000 | [diff] [blame] | 39 | #include "winternl.h" |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 40 | |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 41 | struct apartment; |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 42 | typedef struct apartment APARTMENT; |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 43 | |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 44 | /* Thread-safety Annotation Legend: |
| 45 | * |
| 46 | * RO - The value is read only. It never changes after creation, so no |
| 47 | * locking is required. |
| 48 | * LOCK - The value is written to only using Interlocked* functions. |
| 49 | * CS - The value is read or written to with a critical section held. |
| 50 | * The identifier following "CS" is the specific critical section that |
| 51 | * must be used. |
| 52 | */ |
| 53 | |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 54 | typedef enum ifstub_state |
| 55 | { |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 56 | STUBSTATE_NORMAL_MARSHALED, |
| 57 | STUBSTATE_NORMAL_UNMARSHALED, |
| 58 | STUBSTATE_TABLE_WEAK_MARSHALED, |
| 59 | STUBSTATE_TABLE_WEAK_UNMARSHALED, |
| 60 | STUBSTATE_TABLE_STRONG, |
| 61 | } STUB_STATE; |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 62 | |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 63 | /* an interface stub */ |
| 64 | struct ifstub |
| 65 | { |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 66 | struct list entry; /* entry in stub_manager->ifstubs list (CS stub_manager->lock) */ |
| 67 | IRpcStubBuffer *stubbuffer; /* RO */ |
| 68 | IID iid; /* RO */ |
| 69 | IPID ipid; /* RO */ |
| 70 | IUnknown *iface; /* RO */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 71 | }; |
| 72 | |
| 73 | |
| 74 | /* stub managers hold refs on the object and each interface stub */ |
| 75 | struct stub_manager |
| 76 | { |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 77 | struct list entry; /* entry in apartment stubmgr list (CS apt->cs) */ |
| 78 | struct list ifstubs; /* list of active ifstubs for the object (CS lock) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 79 | CRITICAL_SECTION lock; |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 80 | APARTMENT *apt; /* owning apt (RO) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 81 | |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 82 | ULONG extrefs; /* number of 'external' references (CS lock) */ |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 83 | ULONG refs; /* internal reference count (CS apt->cs) */ |
| 84 | OID oid; /* apartment-scoped unique identifier (RO) */ |
| 85 | IUnknown *object; /* the object we are managing the stub for (RO) */ |
| 86 | ULONG next_ipid; /* currently unused (LOCK) */ |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 87 | STUB_STATE state; /* state machine (CS lock) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 88 | }; |
| 89 | |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 90 | /* imported interface proxy */ |
| 91 | struct ifproxy |
| 92 | { |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 93 | struct list entry; /* entry in proxy_manager list (CS parent->cs) */ |
| 94 | struct proxy_manager *parent; /* owning proxy_manager (RO) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 95 | LPVOID iface; /* interface pointer (RO) */ |
| 96 | IID iid; /* interface ID (RO) */ |
| 97 | IPID ipid; /* imported interface ID (RO) */ |
| 98 | LPRPCPROXYBUFFER proxy; /* interface proxy (RO) */ |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 99 | DWORD refs; /* imported (public) references (CS parent->cs) */ |
Robert Shearman | 527ef47 | 2005-03-07 17:14:11 +0000 | [diff] [blame] | 100 | IRpcChannelBuffer *chan; /* channel to object (CS parent->cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 101 | }; |
| 102 | |
| 103 | /* imported object / proxy manager */ |
| 104 | struct proxy_manager |
| 105 | { |
Robert Shearman | 3018974 | 2005-01-26 21:07:05 +0000 | [diff] [blame] | 106 | const IMultiQIVtbl *lpVtbl; |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 107 | struct apartment *parent; /* owning apartment (RO) */ |
| 108 | struct list entry; /* entry in apartment (CS parent->cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 109 | OXID oxid; /* object exported ID (RO) */ |
| 110 | OID oid; /* object ID (RO) */ |
| 111 | struct list interfaces; /* imported interfaces (CS cs) */ |
| 112 | DWORD refs; /* proxy reference count (LOCK) */ |
| 113 | CRITICAL_SECTION cs; /* thread safety for this object and children */ |
Robert Shearman | 6b89a92 | 2005-01-24 11:24:08 +0000 | [diff] [blame] | 114 | ULONG sorflags; /* STDOBJREF flags (RO) */ |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 115 | IRemUnknown *remunk; /* proxy to IRemUnknown used for lifecycle management (CS cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 116 | }; |
| 117 | |
| 118 | /* this needs to become a COM object that implements IRemUnknown */ |
| 119 | struct apartment |
| 120 | { |
| 121 | struct list entry; |
| 122 | |
| 123 | DWORD refs; /* refcount of the apartment (LOCK) */ |
| 124 | DWORD model; /* threading model (RO) */ |
| 125 | DWORD tid; /* thread id (RO) */ |
| 126 | HANDLE thread; /* thread handle (RO) */ |
| 127 | OXID oxid; /* object exporter ID (RO) */ |
Robert Shearman | cbbf08a | 2005-01-26 20:53:06 +0000 | [diff] [blame] | 128 | DWORD ipidc; /* interface pointer ID counter, starts at 1 (LOCK) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 129 | HWND win; /* message window (RO) */ |
| 130 | CRITICAL_SECTION cs; /* thread safety */ |
| 131 | LPMESSAGEFILTER filter; /* message filter (CS cs) */ |
| 132 | struct list proxies; /* imported objects (CS cs) */ |
| 133 | struct list stubmgrs; /* stub managers for exported objects (CS cs) */ |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 134 | BOOL remunk_exported; /* has the IRemUnknown interface for this apartment been created yet? (CS cs) */ |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 135 | LONG remoting_started; /* has the RPC system been started for this apartment? (LOCK) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 136 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 137 | /* FIXME: OID's should be given out by RPCSS */ |
Alexandre Julliard | 2a46702 | 2005-02-08 12:55:26 +0000 | [diff] [blame] | 138 | OID oidc; /* object ID counter, starts at 1, zero is invalid OID (CS cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 139 | }; |
| 140 | |
| 141 | /* this is what is stored in TEB->ReservedForOle */ |
| 142 | struct oletls |
| 143 | { |
| 144 | struct apartment *apt; |
| 145 | IErrorInfo *errorinfo; /* see errorinfo.c */ |
| 146 | IUnknown *state; /* see CoSetState */ |
| 147 | DWORD inits; /* number of times CoInitializeEx called */ |
| 148 | }; |
| 149 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 150 | |
| 151 | /* Global Interface Table Functions */ |
| 152 | |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 153 | extern void* StdGlobalInterfaceTable_Construct(void); |
| 154 | extern void StdGlobalInterfaceTable_Destroy(void* self); |
| 155 | extern HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv); |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 156 | extern void* StdGlobalInterfaceTableInstance; |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 157 | |
| 158 | /* FIXME: these shouldn't be needed, except for 16-bit functions */ |
| 159 | extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr); |
| 160 | HRESULT WINAPI __CLSIDFromStringA(LPCSTR idstr, CLSID *id); |
| 161 | |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 162 | HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv); |
| 163 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 164 | /* Stub Manager */ |
| 165 | |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 166 | ULONG stub_manager_int_addref(struct stub_manager *This); |
| 167 | ULONG stub_manager_int_release(struct stub_manager *This); |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 168 | struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object, MSHLFLAGS mshlflags); |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 169 | ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs); |
| 170 | ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs); |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 171 | struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid); |
Robert Shearman | 6036a77 | 2005-01-14 16:48:34 +0000 | [diff] [blame] | 172 | struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid); |
| 173 | struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, void *object); |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 174 | BOOL stub_manager_notify_unmarshal(struct stub_manager *m); |
| 175 | BOOL stub_manager_is_table_marshaled(struct stub_manager *m); |
| 176 | void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs); |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 177 | HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret); |
Robert Shearman | 2ff1711 | 2005-02-14 11:50:51 +0000 | [diff] [blame] | 178 | IRpcStubBuffer *ipid_to_apt_and_stubbuffer(const IPID *ipid, APARTMENT **stub_apt); |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 179 | HRESULT start_apartment_remote_unknown(void); |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 180 | |
Robert Shearman | 8971f06 | 2005-03-11 10:19:10 +0000 | [diff] [blame^] | 181 | HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnknown *obj, MSHLFLAGS mshlflags); |
| 182 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 183 | /* RPC Backend */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 184 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 185 | void RPC_StartRemoting(struct apartment *apt); |
| 186 | HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, IRpcChannelBuffer **pipebuf); |
Robert Shearman | 2ff1711 | 2005-02-14 11:50:51 +0000 | [diff] [blame] | 187 | HRESULT RPC_ExecuteCall(RPCOLEMESSAGE *msg, IRpcStubBuffer *stub); |
Robert Shearman | db6db7c | 2005-02-15 15:02:49 +0000 | [diff] [blame] | 188 | HRESULT RPC_RegisterInterface(REFIID riid); |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 189 | void RPC_UnregisterInterface(REFIID riid); |
| 190 | void RPC_StartLocalServer(REFCLSID clsid, IStream *stream); |
| 191 | HRESULT RPC_GetLocalClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv); |
Marcus Meissner | 0749fc2 | 2002-02-05 18:11:17 +0000 | [diff] [blame] | 192 | |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 193 | /* This function initialize the Running Object Table */ |
Eric Pouech | 4056d7e | 2004-12-13 21:19:01 +0000 | [diff] [blame] | 194 | HRESULT WINAPI RunningObjectTableImpl_Initialize(void); |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 195 | |
| 196 | /* This function uninitialize the Running Object Table */ |
Eric Pouech | 4056d7e | 2004-12-13 21:19:01 +0000 | [diff] [blame] | 197 | HRESULT WINAPI RunningObjectTableImpl_UnInitialize(void); |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 198 | |
| 199 | /* This function decomposes a String path to a String Table containing all the elements ("\" or "subDirectory" or "Directory" or "FileName") of the path */ |
Patrik Stridvall | bc38d6b | 2001-07-20 18:00:00 +0000 | [diff] [blame] | 200 | int WINAPI FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable); |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 201 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 202 | |
| 203 | /* Apartment Functions */ |
| 204 | |
Robert Shearman | 8971f06 | 2005-03-11 10:19:10 +0000 | [diff] [blame^] | 205 | APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref); |
| 206 | APARTMENT *apartment_findfromtid(DWORD tid); |
| 207 | DWORD apartment_addref(struct apartment *apt); |
| 208 | DWORD apartment_release(struct apartment *apt); |
| 209 | HRESULT apartment_disconnectproxies(struct apartment *apt); |
| 210 | void apartment_disconnectobject(struct apartment *apt, void *object); |
| 211 | static inline HRESULT apartment_getoxid(struct apartment *apt, OXID *oxid) |
| 212 | { |
| 213 | *oxid = apt->oxid; |
| 214 | return S_OK; |
| 215 | } |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 216 | |
Robert Shearman | 2ff1711 | 2005-02-14 11:50:51 +0000 | [diff] [blame] | 217 | /* messages used by the apartment window (not compatible with native) */ |
| 218 | #define DM_EXECUTERPC (WM_USER + 0) /* WPARAM = (RPCOLEMESSAGE *), LPARAM = (IRpcStubBuffer *) */ |
| 219 | |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 220 | /* |
| 221 | * Per-thread values are stored in the TEB on offset 0xF80, |
| 222 | * see http://www.microsoft.com/msj/1099/bugslayer/bugslayer1099.htm |
| 223 | */ |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 224 | |
| 225 | /* will create if necessary */ |
| 226 | static inline struct oletls *COM_CurrentInfo(void) |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 227 | { |
Robert Shearman | 452491b | 2005-01-12 19:48:39 +0000 | [diff] [blame] | 228 | if (!NtCurrentTeb()->ReservedForOle) |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 229 | NtCurrentTeb()->ReservedForOle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct oletls)); |
Robert Shearman | 452491b | 2005-01-12 19:48:39 +0000 | [diff] [blame] | 230 | |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 231 | return NtCurrentTeb()->ReservedForOle; |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 232 | } |
| 233 | |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 234 | static inline APARTMENT* COM_CurrentApt(void) |
| 235 | { |
| 236 | return COM_CurrentInfo()->apt; |
| 237 | } |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 238 | |
Alexandre Julliard | 936198c | 2004-08-13 00:44:22 +0000 | [diff] [blame] | 239 | #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) |
| 240 | |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 241 | #endif /* __WINE_OLE_COMPOBJ_H */ |