[WIN32K:NTUSER] Correctly delete menus in failure cases in MENU_GetSystemMenu. CORE...
[reactos.git] / win32ss / gdi / gdi32 / objects / eng.c
1 /*
2 * reactos/lib/gdi32/misc/eng.c
3 *
4 * GDI32.DLL eng part
5 *
6 *
7 */
8
9 #include <precomp.h>
10
11 /*
12 * @implemented
13 */
14 VOID
15 WINAPI
16 EngAcquireSemaphore ( IN HSEMAPHORE hsem )
17 {
18 RtlEnterCriticalSection((PRTL_CRITICAL_SECTION)hsem);
19 }
20
21
22 /*
23 * @unimplemented
24 */
25 BOOL
26 copy_my_glyphset( FD_GLYPHSET *dst_glyphset , FD_GLYPHSET * src_glyphset, ULONG Size)
27 {
28 BOOL retValue = FALSE;
29
30 memcpy(src_glyphset, dst_glyphset, Size);
31 if (src_glyphset->cRuns == 0)
32 {
33 retValue = TRUE;
34 }
35
36 /* FIXME copy wrun */
37 return retValue;
38 }
39
40 /*
41 * @implemented
42 */
43 FD_GLYPHSET*
44 WINAPI
45 EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars)
46 {
47 FD_GLYPHSET * ntfd_glyphset;
48 FD_GLYPHSET * myfd_glyphset = NULL;
49
50 ntfd_glyphset = NtGdiEngComputeGlyphSet(nCodePage,nFirstChar,cChars);
51
52 if (ntfd_glyphset)
53 {
54 if (ntfd_glyphset->cjThis)
55 {
56 myfd_glyphset = GlobalAlloc(0,ntfd_glyphset->cjThis);
57 if (myfd_glyphset)
58 {
59 if (copy_my_glyphset(myfd_glyphset,ntfd_glyphset,ntfd_glyphset->cjThis) == FALSE)
60 {
61 GlobalFree(myfd_glyphset);
62 myfd_glyphset = NULL;
63 }
64 }
65 }
66 }
67 return myfd_glyphset;
68 }
69
70 /*
71 * @implemented
72 */
73 HSEMAPHORE
74 WINAPI
75 EngCreateSemaphore ( VOID )
76 {
77 PRTL_CRITICAL_SECTION CritSect = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(RTL_CRITICAL_SECTION));
78 if (!CritSect)
79 {
80 return NULL;
81 }
82
83 RtlInitializeCriticalSection( CritSect );
84 return (HSEMAPHORE)CritSect;
85 }
86
87 /*
88 * @implemented
89 */
90 VOID
91 WINAPI
92 EngDeleteSemaphore ( IN HSEMAPHORE hsem )
93 {
94 if (hsem)
95 {
96 RtlDeleteCriticalSection( (PRTL_CRITICAL_SECTION) hsem );
97 RtlFreeHeap( GetProcessHeap(), 0, hsem );
98 }
99 }
100
101 /*
102 * @implemented
103 */
104 PVOID WINAPI
105 EngFindResource(HANDLE h,
106 int iName,
107 int iType,
108 PULONG pulSize)
109 {
110 HRSRC HRSrc;
111 DWORD Size = 0;
112 HGLOBAL Hg;
113 LPVOID Lock = NULL;
114
115 HRSrc = FindResourceW((HMODULE)h, MAKEINTRESOURCEW(iName), MAKEINTRESOURCEW(iType));
116 if (HRSrc != NULL)
117 {
118 Size = SizeofResource((HMODULE)h, HRSrc);
119 if (Size != 0)
120 {
121 Hg = LoadResource((HMODULE)h, HRSrc);
122 if (Hg != NULL)
123 {
124 Lock = LockResource( Hg );
125 }
126 }
127 }
128
129 *pulSize = Size;
130 return (PVOID) Lock;
131 }
132
133 /*
134 * @implemented
135 */
136 VOID WINAPI
137 EngFreeModule(HANDLE h)
138 {
139 FreeLibrary(h);
140 }
141
142 /*
143 * @implemented
144 */
145
146 VOID WINAPI
147 EngGetCurrentCodePage( OUT PUSHORT OemCodePage,
148 OUT PUSHORT AnsiCodePage)
149 {
150 *OemCodePage = GetOEMCP();
151 *AnsiCodePage = GetACP();
152 }
153
154
155 /*
156 * @implemented
157 */
158 LPWSTR WINAPI
159 EngGetDriverName(HDEV hdev)
160 {
161 // DHPDEV from NtGdiGetDhpdev must be from print driver.
162 PUMPDEV pPDev = (PUMPDEV)NtGdiGetDhpdev(hdev);
163
164 if (!pPDev) return NULL;
165
166 if (pPDev->Sig != PDEV_UMPD_ID)
167 {
168 pPDev = (PUMPDEV)pPDev->Sig;
169 }
170 return pPDev->pdi5Info->pDriverPath;
171 }
172
173 /*
174 * @implemented
175 */
176 LPWSTR WINAPI
177 EngGetPrinterDataFileName(HDEV hdev)
178 {
179 PUMPDEV pPDev = (PUMPDEV)NtGdiGetDhpdev(hdev);
180
181 if (!pPDev) return NULL;
182
183 if (pPDev->Sig != PDEV_UMPD_ID)
184 {
185 pPDev = (PUMPDEV)pPDev->Sig;
186 }
187 return pPDev->pdi5Info->pDataFile;
188 }
189
190 /*
191 * @implemented
192 */
193 HANDLE WINAPI
194 EngLoadModule(LPWSTR pwsz)
195 {
196 return LoadLibraryExW ( pwsz, NULL, LOAD_LIBRARY_AS_DATAFILE);
197 }
198
199 /*
200 * @implemented
201 */
202 INT WINAPI
203 EngMultiByteToWideChar(UINT CodePage,
204 LPWSTR WideCharString,
205 INT BytesInWideCharString,
206 LPSTR MultiByteString,
207 INT BytesInMultiByteString)
208 {
209 return MultiByteToWideChar(CodePage,0,MultiByteString,BytesInMultiByteString,WideCharString,BytesInWideCharString / sizeof(WCHAR));
210 }
211
212 /*
213 * @implemented
214 */
215 VOID WINAPI
216 EngQueryLocalTime(PENG_TIME_FIELDS etf)
217 {
218 SYSTEMTIME SystemTime;
219 GetLocalTime( &SystemTime );
220 etf->usYear = SystemTime.wYear;
221 etf->usMonth = SystemTime.wMonth;
222 etf->usWeekday = SystemTime.wDayOfWeek;
223 etf->usDay = SystemTime.wDay;
224 etf->usHour = SystemTime.wHour;
225 etf->usMinute = SystemTime.wMinute;
226 etf->usSecond = SystemTime.wSecond;
227 etf->usMilliseconds = SystemTime.wMilliseconds;
228 }
229
230 /*
231 * @implemented
232 */
233 VOID
234 WINAPI
235 EngReleaseSemaphore ( IN HSEMAPHORE hsem )
236 {
237 RtlLeaveCriticalSection( (PRTL_CRITICAL_SECTION) hsem);
238 }
239
240 /*
241 * @implemented
242 */
243 INT
244 WINAPI
245 EngWideCharToMultiByte( UINT CodePage,
246 LPWSTR WideCharString,
247 INT BytesInWideCharString,
248 LPSTR MultiByteString,
249 INT BytesInMultiByteString)
250 {
251 return WideCharToMultiByte(CodePage, 0, WideCharString, (BytesInWideCharString/sizeof(WCHAR)),
252 MultiByteString, BytesInMultiByteString, NULL, NULL);
253 }
254
255 /*
256 * @unimplemented
257 */
258 ULONG *
259 WINAPI
260 XLATEOBJ_piVector(XLATEOBJ *XlateObj)
261 {
262 return XlateObj->pulXlate;
263 }
264