- Fix scaling when converting MF -> EMF.
[wine] / dlls / mapi32 / imalloc.c
1 /*
2  * MAPI Default IMalloc implementation
3  *
4  * Copyright 2004 Jon Griffiths
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
23 #define COBJMACROS
24 #define NONAMELESSUNION
25 #define NONAMELESSSTRUCT
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winreg.h"
29 #include "winuser.h"
30 #include "winerror.h"
31 #include "winternl.h"
32 #include "objbase.h"
33 #include "shlwapi.h"
34 #include "wine/debug.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(mapi);
37
38 static const IMallocVtbl MAPI_IMalloc_vt;
39
40 typedef struct
41 {
42   const IMallocVtbl *lpVtbl;
43   LONG lRef;
44 } MAPI_IMALLOC;
45
46 static MAPI_IMALLOC MAPI_IMalloc = { &MAPI_IMalloc_vt, 0u };
47
48 extern LONG MAPI_ObjectCount; /* In mapi32_main.c */
49
50 /*************************************************************************
51  * MAPIGetDefaultMalloc@0 (MAPI32.59)
52  *
53  * Get the default MAPI IMalloc interface.
54  *
55  * PARAMS
56  *  None.
57  *
58  * RETURNS
59  *  A pointer to the MAPI default allocator.
60  */
61 LPMALLOC WINAPI MAPIGetDefaultMalloc(void)
62 {
63     TRACE("()\n");
64
65     IMalloc_AddRef((LPMALLOC)&MAPI_IMalloc);
66     return (LPMALLOC)&MAPI_IMalloc;
67 }
68
69 /**************************************************************************
70  * IMAPIMalloc_QueryInterface
71  */
72 static HRESULT WINAPI IMAPIMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid,
73                                                    LPVOID *ppvObj)
74 {
75     TRACE("(%s,%p)\n", debugstr_guid(refiid), ppvObj);
76
77     if (IsEqualIID(refiid, &IID_IUnknown) ||
78         IsEqualIID(refiid, &IID_IMalloc))
79     {
80         *ppvObj = (LPMALLOC) &MAPI_IMalloc;
81         TRACE("Returning IMalloc (%p)\n", *ppvObj);
82         return S_OK;
83     }
84     TRACE("Returning E_NOINTERFACE\n");
85     return E_NOINTERFACE;
86 }
87
88 /**************************************************************************
89  * IMAPIMalloc_AddRef
90  */
91 static ULONG WINAPI IMAPIMalloc_fnAddRef(LPMALLOC iface)
92 {
93     TRACE("(%p)\n", iface);
94     InterlockedIncrement(&MAPI_ObjectCount);
95     return 1u;
96 }
97
98 /**************************************************************************
99  * IMAPIMalloc_Release
100  */
101 static ULONG WINAPI IMAPIMalloc_fnRelease(LPMALLOC iface)
102 {
103     TRACE("(%p)\n", iface);
104     InterlockedDecrement(&MAPI_ObjectCount);
105     return 1u;
106 }
107
108 /**************************************************************************
109  * IMAPIMalloc_Alloc
110  */
111 static LPVOID WINAPI IMAPIMalloc_fnAlloc(LPMALLOC iface, DWORD cb)
112 {
113     TRACE("(%p)->(%ld)\n", iface, cb);
114
115     return LocalAlloc(LMEM_FIXED, cb);
116 }
117
118 /**************************************************************************
119  * IMAPIMalloc_Realloc
120  */
121 static LPVOID WINAPI IMAPIMalloc_fnRealloc(LPMALLOC iface, LPVOID pv, DWORD cb)
122 {
123     TRACE("(%p)->(%p, %ld)\n", iface, pv, cb);
124
125     if (!pv)
126         return LocalAlloc(LMEM_FIXED, cb);
127
128     if (cb)
129         return LocalReAlloc((HANDLE) pv, cb, LMEM_MOVEABLE);
130
131     LocalFree((HANDLE) pv);
132     return NULL;
133 }
134
135 /**************************************************************************
136  * IMAPIMalloc_Free
137  */
138 static void WINAPI IMAPIMalloc_fnFree(LPMALLOC iface, LPVOID pv)
139 {
140     TRACE("(%p)->(%p)\n", iface, pv);
141     LocalFree((HANDLE) pv);
142 }
143
144 /**************************************************************************
145  * IMAPIMalloc_GetSize
146  */
147 static DWORD WINAPI IMAPIMalloc_fnGetSize(LPMALLOC iface, LPVOID pv)
148 {
149     TRACE("(%p)->(%p)\n", iface, pv);
150     return LocalSize((HANDLE) pv);
151 }
152
153 /**************************************************************************
154  * IMAPIMalloc_DidAlloc
155  */
156 static INT WINAPI IMAPIMalloc_fnDidAlloc(LPMALLOC iface, LPVOID pv)
157 {
158     TRACE("(%p)->(%p)\n", iface, pv);
159     return -1;
160 }
161
162 /**************************************************************************
163  * IMAPIMalloc_HeapMinimize
164  */
165 static void WINAPI IMAPIMalloc_fnHeapMinimize(LPMALLOC iface)
166 {
167     TRACE("(%p)\n", iface);
168 }
169
170 static const IMallocVtbl MAPI_IMalloc_vt =
171 {
172     IMAPIMalloc_fnQueryInterface,
173     IMAPIMalloc_fnAddRef,
174     IMAPIMalloc_fnRelease,
175     IMAPIMalloc_fnAlloc,
176     IMAPIMalloc_fnRealloc,
177     IMAPIMalloc_fnFree,
178     IMAPIMalloc_fnGetSize,
179     IMAPIMalloc_fnDidAlloc,
180     IMAPIMalloc_fnHeapMinimize
181 };