Moved mciavi32 to the top-level dlls directory.
[wine] / dlls / atl / atl_main.c
1 /*
2  * Implementation of Active Template Library (atl.dll)
3  *
4  * Copyright 2004 Aric Stewart for CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winerror.h"
29 #include "winuser.h"
30 #include "wine/debug.h"
31 #include "objbase.h"
32 #include "objidl.h"
33 #include "ole2.h"
34 #include "atlbase.h"
35 #include "atliface.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(atl);
38
39 HINSTANCE hInst;
40
41 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
42 {
43     TRACE("(0x%p, %ld, %p)\n",hinstDLL,fdwReason,lpvReserved);
44
45     if (fdwReason == DLL_PROCESS_ATTACH) {
46         DisableThreadLibraryCalls(hinstDLL);
47         hInst = hinstDLL;
48     }
49     return TRUE;
50 }
51
52 HRESULT WINAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE h)
53 {
54     INT i;
55
56     FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
57
58     memset(pM,0,sizeof(_ATL_MODULEA));
59     pM->cbSize = sizeof(_ATL_MODULEA);
60     pM->m_hInst = h;
61     pM->m_hInstResource = h;
62     pM->m_hInstTypeLib = h;
63     pM->m_pObjMap = p;
64     pM->m_hHeap = GetProcessHeap();
65
66     /* call mains */
67     i = 0;
68     if (pM->m_pObjMap != NULL)
69     {
70         while (pM->m_pObjMap[i].pclsid != NULL)
71         {
72             TRACE("Initializing object %i %p\n",i,p[i].pfnObjectMain);
73             if (p[i].pfnObjectMain)
74                 p[i].pfnObjectMain(TRUE);
75             i++;
76         }
77     }
78
79     return S_OK;
80 }
81
82 HRESULT WINAPI AtlModuleTerm(_ATL_MODULEA* pM)
83 {
84     HeapFree(GetProcessHeap(), 0, pM);
85     return S_OK;
86 }
87
88 HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEA *pM, DWORD dwClsContext,
89                                              DWORD dwFlags)
90 {
91     HRESULT hRes = S_OK;
92     int i=0;
93
94     TRACE("(%p %li %li)\n",pM, dwClsContext, dwFlags);
95
96     if (pM == NULL)
97         return E_INVALIDARG;
98
99     while(pM->m_pObjMap[i].pclsid != NULL)
100     {
101         IUnknown* pUnknown;
102         _ATL_OBJMAP_ENTRYA *obj = &(pM->m_pObjMap[i]);
103         HRESULT rc;
104
105         TRACE("Registering object %i\n",i);
106         if (obj->pfnGetClassObject)
107         {
108             rc = obj->pfnGetClassObject(obj->pfnCreateInstance, &IID_IUnknown,
109                                    (LPVOID*)&pUnknown);
110             if (SUCCEEDED (rc) )
111             {
112                 CoRegisterClassObject(obj->pclsid, pUnknown, dwClsContext,
113                                       dwFlags, &obj->dwRegister);
114                 if (pUnknown)
115                     IUnknown_Release(pUnknown);
116             }
117         }
118         i++;
119     }
120
121    return hRes;
122 }
123
124 HRESULT WINAPI AtlModuleUnregisterServerEx(_ATL_MODULEA* pM, BOOL bUnRegTypeLib, const CLSID* pCLSID)
125 {
126     FIXME("(%p, %i, %p) stub\n", pM, bUnRegTypeLib, pCLSID);
127     return S_OK;
128 }
129
130 HRESULT WINAPI AtlInternalQueryInterface(LPVOID this, const _ATL_INTMAP_ENTRY* pEntries,  REFIID iid, LPVOID* ppvObject)
131 {
132     int i = 0;
133     HRESULT rc = E_NOINTERFACE;
134     TRACE("(%p, %p, %p, %p)\n",this, pEntries, iid, ppvObject);
135
136     if (IsEqualGUID(iid,&IID_IUnknown))
137     {
138         TRACE("Returning IUnknown\n");
139         *ppvObject = this;
140         IUnknown_AddRef((IUnknown*)this);
141         return S_OK;
142     }
143
144     while (pEntries[i].pFunc != 0)
145     {
146         TRACE("Trying entry %i (%p %li %p)\n",i,pEntries[i].piid,
147               pEntries[i].dw, pEntries[i].pFunc);
148
149         if (pEntries[i].piid && IsEqualGUID(iid,pEntries[i].piid))
150         {
151             TRACE("MATCH\n");
152             if (pEntries[i].pFunc == (_ATL_CREATORARGFUNC*)1)
153             {
154                 TRACE("Offset\n");
155                 *ppvObject = ((LPSTR)this+pEntries[i].dw);
156                 IUnknown_AddRef((IUnknown*)this);
157                 rc = S_OK;
158             }
159             else
160             {
161                 TRACE("Function\n");
162                 rc = pEntries[i].pFunc(this, iid, ppvObject,0);
163             }
164             break;
165         }
166         i++;
167     }
168     TRACE("Done returning (0x%lx)\n",rc);
169     return rc;
170 }
171
172 /***********************************************************************
173  *           AtlModuleRegisterServer         [ATL.@]
174  *
175  */
176 HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const CLSID* clsid) 
177 {
178     FIXME("%p %d %s\n", pM, bRegTypeLib, debugstr_guid(clsid));
179     return S_OK;
180 }
181
182 /***********************************************************************
183  *           AtlAdvise         [ATL.@]
184  */
185 HRESULT WINAPI AtlAdvise(IUnknown *pUnkCP, IUnknown *pUnk, const IID *iid, LPDWORD pdw)
186 {
187     FIXME("%p %p %p %p\n", pUnkCP, pUnk, iid, pdw);
188     return E_FAIL;
189 }
190
191 /***********************************************************************
192  *           AtlUnadvise         [ATL.@]
193  */
194 HRESULT WINAPI AtlUnadvise(IUnknown *pUnkCP, const IID *iid, DWORD dw)
195 {
196     FIXME("%p %p %ld\n", pUnkCP, iid, dw);
197     return S_OK;
198 }
199
200 /***********************************************************************
201  *           AtlFreeMarshalStream         [ATL.@]
202  */
203 HRESULT WINAPI AtlFreeMarshalStream(IStream *stm)
204 {
205     FIXME("%p\n", stm);
206     return S_OK;
207 }
208
209 /***********************************************************************
210  *           AtlMarshalPtrInProc         [ATL.@]
211  */
212 HRESULT WINAPI AtlMarshalPtrInProc(IUnknown *pUnk, const IID *iid, IStream **pstm)
213 {
214     FIXME("%p %p %p\n", pUnk, iid, pstm);
215     return E_FAIL;
216 }
217
218 /***********************************************************************
219  *           AtlUnmarshalPtr              [ATL.@]
220  */
221 HRESULT WINAPI AtlUnmarshalPtr(IStream *stm, const IID *iid, IUnknown **ppUnk)
222 {
223     FIXME("%p %p %p\n", stm, iid, ppUnk);
224     return E_FAIL;
225 }
226
227 /***********************************************************************
228  *           AtlModuleGetClassObject              [ATL.@]
229  */
230 HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid,
231                                        REFIID riid, LPVOID *ppv)
232 {
233     FIXME("%p %p %p %p\n", pm, rclsid, riid, ppv);
234     return E_FAIL;
235 }
236
237 /***********************************************************************
238  *           AtlModuleGetClassObject              [ATL.@]
239  */
240 HRESULT WINAPI AtlModuleRegisterTypeLib(_ATL_MODULEW *pm, LPCOLESTR lpszIndex)
241 {
242     FIXME("%p %s\n", pm, debugstr_w(lpszIndex));
243     return E_FAIL;
244 }
245
246 /***********************************************************************
247  *           AtlModuleRevokeClassObjects          [ATL.@]
248  */
249 HRESULT WINAPI AtlModuleRevokeClassObjects(_ATL_MODULEW *pm)
250 {
251     FIXME("%p\n", pm);
252     return E_FAIL;
253 }
254
255 /***********************************************************************
256  *           AtlModuleUnregisterServer           [ATL.@]
257  */
258 HRESULT WINAPI AtlModuleUnregisterServer(_ATL_MODULEW *pm, const CLSID *clsid)
259 {
260     FIXME("%p %s\n", pm, debugstr_guid(clsid));
261     return E_FAIL;
262 }