xref: /reactos/dll/win32/inetcomm/inetcomm_main.c (revision 02e84521)
1 /*
2  * Internet Messaging APIs
3  *
4  * Copyright 2006 Robert Shearman 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #define COBJMACROS
22 
23 #include <stdarg.h>
24 
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winnt.h"
28 #include "winuser.h"
29 #include "ole2.h"
30 #include "ocidl.h"
31 #include "rpcproxy.h"
32 #include "initguid.h"
33 #include "mimeole.h"
34 
35 #include "inetcomm_private.h"
36 
37 #include "wine/debug.h"
38 
39 WINE_DEFAULT_DEBUG_CHANNEL(inetcomm);
40 
41 static HINSTANCE instance;
42 
43 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
44 {
45     static IMimeInternational *international;
46 
47     TRACE("(%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
48 
49     switch (fdwReason)
50     {
51     case DLL_WINE_PREATTACH:
52         return FALSE;
53     case DLL_PROCESS_ATTACH:
54         DisableThreadLibraryCalls(hinstDLL);
55         instance = hinstDLL;
56         if (!InternetTransport_RegisterClass(hinstDLL))
57             return FALSE;
58         MimeInternational_Construct(&international);
59         break;
60     case DLL_PROCESS_DETACH:
61         if (lpvReserved) break;
62         IMimeInternational_Release(international);
63         InternetTransport_UnregisterClass(hinstDLL);
64         break;
65     }
66     return TRUE;
67 }
68 
69 /******************************************************************************
70  * ClassFactory
71  */
72 typedef struct
73 {
74     IClassFactory IClassFactory_iface;
75     HRESULT (*create_object)(IUnknown *, void **);
76 } cf;
77 
78 static inline cf *impl_from_IClassFactory( IClassFactory *iface )
79 {
80     return CONTAINING_RECORD(iface, cf, IClassFactory_iface);
81 }
82 
83 static HRESULT WINAPI cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj )
84 {
85     if (IsEqualGUID(riid, &IID_IUnknown) ||
86         IsEqualGUID(riid, &IID_IClassFactory))
87     {
88         IClassFactory_AddRef( iface );
89         *ppobj = iface;
90         return S_OK;
91     }
92 
93     if (!IsEqualGUID(riid, &IID_IInternetProtocolInfo))
94         FIXME("interface %s not implemented\n", debugstr_guid(riid));
95     *ppobj = NULL;
96     return E_NOINTERFACE;
97 }
98 
99 static ULONG WINAPI cf_AddRef( IClassFactory *iface )
100 {
101     return 2;
102 }
103 
104 static ULONG WINAPI cf_Release( IClassFactory *iface )
105 {
106     return 1;
107 }
108 
109 static HRESULT WINAPI cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter,
110                                          REFIID riid, LPVOID *ppobj )
111 {
112     cf *This = impl_from_IClassFactory( iface );
113     HRESULT r;
114     IUnknown *punk;
115 
116     TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
117 
118     *ppobj = NULL;
119 
120     if (pOuter && !IsEqualGUID(&IID_IUnknown, riid))
121         return CLASS_E_NOAGGREGATION;
122 
123     r = This->create_object( pOuter, (LPVOID*) &punk );
124     if (FAILED(r))
125         return r;
126 
127     if (IsEqualGUID(&IID_IUnknown, riid)) {
128         *ppobj = punk;
129         return S_OK;
130     }
131 
132     r = IUnknown_QueryInterface( punk, riid, ppobj );
133     IUnknown_Release( punk );
134     return r;
135 }
136 
137 static HRESULT WINAPI cf_LockServer( IClassFactory *iface, BOOL dolock)
138 {
139     FIXME("(%p)->(%d),stub!\n",iface,dolock);
140     return S_OK;
141 }
142 
143 static const struct IClassFactoryVtbl cf_vtbl =
144 {
145     cf_QueryInterface,
146     cf_AddRef,
147     cf_Release,
148     cf_CreateInstance,
149     cf_LockServer
150 };
151 
152 static cf mime_body_cf      = { { &cf_vtbl }, MimeBody_create };
153 static cf mime_allocator_cf = { { &cf_vtbl }, MimeAllocator_create };
154 static cf mime_message_cf   = { { &cf_vtbl }, MimeMessage_create };
155 static cf mime_security_cf  = { { &cf_vtbl }, MimeSecurity_create };
156 static cf virtual_stream_cf = { { &cf_vtbl }, VirtualStream_create };
157 static cf mhtml_protocol_cf = { { &cf_vtbl }, MimeHtmlProtocol_create };
158 
159 /***********************************************************************
160  *              DllGetClassObject (INETCOMM.@)
161  */
162 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
163 {
164     IClassFactory *cf = NULL;
165 
166     TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv );
167 
168     if (IsEqualCLSID(rclsid, &CLSID_ISMTPTransport))
169         return SMTPTransportCF_Create(iid, ppv);
170 
171     if (IsEqualCLSID(rclsid, &CLSID_ISMTPTransport2))
172         return SMTPTransportCF_Create(iid, ppv);
173 
174     if (IsEqualCLSID(rclsid, &CLSID_IIMAPTransport))
175         return IMAPTransportCF_Create(iid, ppv);
176 
177     if (IsEqualCLSID(rclsid, &CLSID_IPOP3Transport))
178         return POP3TransportCF_Create(iid, ppv);
179 
180     if ( IsEqualCLSID( rclsid, &CLSID_IMimeSecurity ))
181     {
182         cf = &mime_security_cf.IClassFactory_iface;
183     }
184     else if( IsEqualCLSID( rclsid, &CLSID_IMimeMessage ))
185     {
186         cf = &mime_message_cf.IClassFactory_iface;
187     }
188     else if( IsEqualCLSID( rclsid, &CLSID_IMimeBody ))
189     {
190         cf = &mime_body_cf.IClassFactory_iface;
191     }
192     else if( IsEqualCLSID( rclsid, &CLSID_IMimeAllocator ))
193     {
194         cf = &mime_allocator_cf.IClassFactory_iface;
195     }
196     else if( IsEqualCLSID( rclsid, &CLSID_IVirtualStream ))
197     {
198         cf = &virtual_stream_cf.IClassFactory_iface;
199     }
200     else if( IsEqualCLSID( rclsid, &CLSID_IMimeHtmlProtocol ))
201     {
202         cf = &mhtml_protocol_cf.IClassFactory_iface;
203     }
204 
205     if ( !cf )
206     {
207         FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid));
208         return CLASS_E_CLASSNOTAVAILABLE;
209     }
210 
211     return IClassFactory_QueryInterface( cf, iid, ppv );
212 }
213 
214 /***********************************************************************
215  *              DllCanUnloadNow (INETCOMM.@)
216  */
217 HRESULT WINAPI DllCanUnloadNow(void)
218 {
219     return S_FALSE;
220 }
221 
222 /***********************************************************************
223  *		DllRegisterServer (INETCOMM.@)
224  */
225 HRESULT WINAPI DllRegisterServer(void)
226 {
227     return __wine_register_resources( instance );
228 }
229 
230 /***********************************************************************
231  *		DllUnregisterServer (INETCOMM.@)
232  */
233 HRESULT WINAPI DllUnregisterServer(void)
234 {
235     return __wine_unregister_resources( instance );
236 }
237