~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/windowscodecs/clsfactory.c

Version: ~ [ wine-1.5.30 ] ~ [ wine-1.5.29 ] ~ [ wine-1.5.28 ] ~ [ wine-1.5.27 ] ~ [ wine-1.5.26 ] ~ [ wine-1.5.25 ] ~ [ wine-1.5.24 ] ~ [ wine-1.5.23 ] ~ [ wine-1.5.22 ] ~ [ wine-1.5.21 ] ~ [ wine-1.5.20 ] ~ [ wine-1.5.19 ] ~ [ wine-1.5.18 ] ~ [ wine-1.5.17 ] ~ [ wine-1.5.16 ] ~ [ wine-1.5.15 ] ~ [ wine-1.5.14 ] ~ [ wine-1.5.13 ] ~ [ wine-1.5.12 ] ~ [ wine-1.5.11 ] ~ [ wine-1.5.10 ] ~ [ wine-1.5.9 ] ~ [ wine-1.5.8 ] ~ [ wine-1.5.7 ] ~ [ wine-1.4.1 ] ~ [ wine-1.5.6 ] ~ [ wine-1.5.5 ] ~ [ wine-1.5.4 ] ~ [ wine-1.5.3 ] ~ [ wine-1.5.2 ] ~ [ wine-1.5.1 ] ~ [ wine-1.5.0 ] ~ [ wine-1.4 ] ~ [ wine-1.4-rc6 ] ~ [ wine-1.4-rc5 ] ~ [ wine-1.4-rc4 ] ~ [ wine-1.4-rc3 ] ~ [ wine-1.4-rc2 ] ~ [ wine-1.4-rc1 ] ~ [ wine-1.3.37 ] ~ [ wine-1.3.36 ] ~ [ wine-1.3.35 ] ~ [ wine-1.3.34 ] ~ [ wine-1.3.33 ] ~ [ wine-1.3.32 ] ~ [ wine-1.3.31 ] ~ [ wine-1.3.30 ] ~ [ wine-1.3.29 ] ~ [ wine-1.3.28 ] ~ [ wine-1.3.27 ] ~ [ wine-1.3.26 ] ~ [ wine-1.3.25 ] ~ [ wine-1.3.24 ] ~ [ wine-1.3.23 ] ~ [ wine-1.3.22 ] ~ [ wine-1.3.21 ] ~ [ wine-1.3.20 ] ~ [ wine-1.3.19 ] ~ [ wine-1.3.18 ] ~ [ wine-1.2.3 ] ~ [ wine-1.3.17 ] ~ [ wine-1.3.16 ] ~ [ wine-1.3.15 ] ~ [ wine-1.3.14 ] ~ [ wine-1.3.13 ] ~ [ wine-1.3.12 ] ~ [ wine-1.3.11 ] ~ [ wine-1.3.10 ] ~ [ wine-1.3.9 ] ~ [ wine-1.2.2 ] ~ [ wine-1.3.8 ] ~ [ wine-1.3.7 ] ~ [ wine-1.3.6 ] ~ [ wine-1.3.5 ] ~ [ wine-1.2.1 ] ~ [ wine-1.3.4 ] ~ [ wine-1.3.3 ] ~ [ wine-1.3.2 ] ~ [ wine-1.3.1 ] ~ [ wine-1.3.0 ] ~ [ wine-1.2 ] ~ [ wine-1.2-rc7 ] ~ [ wine-1.2-rc6 ] ~ [ wine-1.2-rc5 ] ~ [ wine-1.2-rc4 ] ~ [ wine-1.2-rc3 ] ~ [ wine-1.2-rc2 ] ~ [ wine-1.2-rc1 ] ~ [ wine-1.1.44 ] ~ [ wine-1.1.43 ] ~ [ wine-1.1.42 ] ~ [ wine-1.1.41 ] ~ [ wine-1.1.40 ] ~ [ wine-1.1.39 ] ~ [ wine-1.1.38 ] ~ [ wine-1.1.37 ] ~ [ wine-1.1.36 ] ~ [ wine-1.1.35 ] ~ [ wine-1.1.34 ] ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  1 /*
  2  * Copyright 2009 Vincent Povirk for CodeWeavers
  3  *
  4  * This library is free software; you can redistribute it and/or
  5  * modify it under the terms of the GNU Lesser General Public
  6  * License as published by the Free Software Foundation; either
  7  * version 2.1 of the License, or (at your option) any later version.
  8  *
  9  * This library is distributed in the hope that it will be useful,
 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 12  * Lesser General Public License for more details.
 13  *
 14  * You should have received a copy of the GNU Lesser General Public
 15  * License along with this library; if not, write to the Free Software
 16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 17  */
 18 
 19 #include "config.h"
 20 
 21 #include <stdarg.h>
 22 
 23 #define COBJMACROS
 24 
 25 #include "windef.h"
 26 #include "winbase.h"
 27 #include "winreg.h"
 28 #include "objbase.h"
 29 #include "ocidl.h"
 30 #include "initguid.h"
 31 #include "wincodec.h"
 32 
 33 #include "wincodecs_private.h"
 34 
 35 #include "wine/debug.h"
 36 
 37 WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
 38 
 39 extern HRESULT WINAPI WIC_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC_HIDDEN;
 40 
 41 typedef struct {
 42     REFCLSID classid;
 43     HRESULT (*constructor)(IUnknown*,REFIID,void**);
 44 } classinfo;
 45 
 46 static classinfo wic_classes[] = {
 47     {&CLSID_WICImagingFactory, ImagingFactory_CreateInstance},
 48     {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance},
 49     {&CLSID_WICPngDecoder, PngDecoder_CreateInstance},
 50     {&CLSID_WICPngEncoder, PngEncoder_CreateInstance},
 51     {&CLSID_WICBmpEncoder, BmpEncoder_CreateInstance},
 52     {&CLSID_WICGifDecoder, GifDecoder_CreateInstance},
 53     {&CLSID_WICIcoDecoder, IcoDecoder_CreateInstance},
 54     {&CLSID_WICJpegDecoder, JpegDecoder_CreateInstance},
 55     {&CLSID_WICTiffDecoder, TiffDecoder_CreateInstance},
 56     {&CLSID_WICIcnsEncoder, IcnsEncoder_CreateInstance},
 57     {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance},
 58     {&CLSID_WineTgaDecoder, TgaDecoder_CreateInstance},
 59     {0}};
 60 
 61 typedef struct {
 62     IClassFactory           IClassFactory_iface;
 63     LONG                    ref;
 64     classinfo               *info;
 65 } ClassFactoryImpl;
 66 
 67 static inline ClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
 68 {
 69     return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface);
 70 }
 71 
 72 static HRESULT WINAPI ClassFactoryImpl_QueryInterface(IClassFactory *iface,
 73     REFIID iid, void **ppv)
 74 {
 75     ClassFactoryImpl *This = impl_from_IClassFactory(iface);
 76     TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
 77 
 78     if (!ppv) return E_INVALIDARG;
 79 
 80     if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IClassFactory, iid))
 81     {
 82         *ppv = This;
 83     }
 84     else
 85     {
 86         *ppv = NULL;
 87         return E_NOINTERFACE;
 88     }
 89 
 90     IUnknown_AddRef((IUnknown*)*ppv);
 91     return S_OK;
 92 }
 93 
 94 static ULONG WINAPI ClassFactoryImpl_AddRef(IClassFactory *iface)
 95 {
 96     ClassFactoryImpl *This = impl_from_IClassFactory(iface);
 97     ULONG ref = InterlockedIncrement(&This->ref);
 98 
 99     TRACE("(%p) refcount=%u\n", iface, ref);
100 
101     return ref;
102 }
103 
104 static ULONG WINAPI ClassFactoryImpl_Release(IClassFactory *iface)
105 {
106     ClassFactoryImpl *This = impl_from_IClassFactory(iface);
107     ULONG ref = InterlockedDecrement(&This->ref);
108 
109     TRACE("(%p) refcount=%u\n", iface, ref);
110 
111     if (ref == 0)
112         HeapFree(GetProcessHeap(), 0, This);
113 
114     return ref;
115 }
116 
117 static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface,
118     IUnknown *pUnkOuter, REFIID riid, void **ppv)
119 {
120     ClassFactoryImpl *This = impl_from_IClassFactory(iface);
121 
122     return This->info->constructor(pUnkOuter, riid, ppv);
123 }
124 
125 static HRESULT WINAPI ClassFactoryImpl_LockServer(IClassFactory *iface, BOOL lock)
126 {
127     TRACE("(%p, %i): stub\n", iface, lock);
128     return E_NOTIMPL;
129 }
130 
131 static const IClassFactoryVtbl ClassFactoryImpl_Vtbl = {
132     ClassFactoryImpl_QueryInterface,
133     ClassFactoryImpl_AddRef,
134     ClassFactoryImpl_Release,
135     ClassFactoryImpl_CreateInstance,
136     ClassFactoryImpl_LockServer
137 };
138 
139 static HRESULT ClassFactoryImpl_Constructor(classinfo *info, REFIID riid, LPVOID *ppv)
140 {
141     ClassFactoryImpl *This;
142     HRESULT ret;
143 
144     *ppv = NULL;
145 
146     This = HeapAlloc(GetProcessHeap(), 0, sizeof(ClassFactoryImpl));
147     if (!This) return E_OUTOFMEMORY;
148 
149     This->IClassFactory_iface.lpVtbl = &ClassFactoryImpl_Vtbl;
150     This->ref = 1;
151     This->info = info;
152 
153     ret = IClassFactory_QueryInterface((IClassFactory*)This, riid, ppv);
154     IClassFactory_Release((IClassFactory*)This);
155 
156     return ret;
157 }
158 
159 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
160 {
161     HRESULT ret;
162     classinfo *info=NULL;
163     int i;
164 
165     TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
166 
167     if (!rclsid || !iid || !ppv)
168         return E_INVALIDARG;
169 
170     *ppv = NULL;
171 
172     for (i=0; wic_classes[i].classid; i++)
173     {
174         if (IsEqualCLSID(wic_classes[i].classid, rclsid))
175         {
176             info = &wic_classes[i];
177             break;
178         }
179     }
180 
181     if (info)
182         ret = ClassFactoryImpl_Constructor(info, iid, ppv);
183     else
184         ret = WIC_DllGetClassObject(rclsid, iid, ppv);
185 
186     TRACE("<-- %08X\n", ret);
187     return ret;
188 }
189 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.