4 * Copyright 1995, 1996, 2001 Alexandre Julliard
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.
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.
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
22 #include "wine/port.h"
31 #include "wine/unicode.h"
32 #include "wine/winuser16.h"
33 #include "wine/server.h"
35 /* size of buffer needed to store an atom string */
36 #define ATOM_BUFFER_SIZE 256
39 /***********************************************************************
42 * Retrieve the list of properties of a given window.
43 * Returned buffer must be freed by caller.
45 static property_data_t *get_properties( HWND hwnd, int *count )
47 property_data_t *data;
53 if (!(data = HeapAlloc( GetProcessHeap(), 0, total * sizeof(*data) ))) break;
55 SERVER_START_REQ( get_window_properties )
58 wine_server_add_data( req, data, total * sizeof(*data) );
59 if (!wine_server_call( req )) res = reply->total;
62 if (res && res <= total)
67 HeapFree( GetProcessHeap(), 0, data );
68 total = res; /* restart with larger buffer */
74 /***********************************************************************
77 * relay to call the EnumProps callback function from EnumPropsEx
79 static BOOL CALLBACK EnumPropsA_relay( HWND hwnd, LPCSTR str, HANDLE handle, ULONG_PTR lparam )
81 PROPENUMPROCA func = (PROPENUMPROCA)lparam;
82 return func( hwnd, str, handle );
86 /***********************************************************************
89 * relay to call the EnumProps callback function from EnumPropsEx
91 static BOOL CALLBACK EnumPropsW_relay( HWND hwnd, LPCWSTR str, HANDLE handle, ULONG_PTR lparam )
93 PROPENUMPROCW func = (PROPENUMPROCW)lparam;
94 return func( hwnd, str, handle );
98 /***********************************************************************
99 * EnumPropsA (USER32.@)
101 INT WINAPI EnumPropsA( HWND hwnd, PROPENUMPROCA func )
103 return EnumPropsExA( hwnd, EnumPropsA_relay, (LPARAM)func );
107 /***********************************************************************
108 * EnumPropsW (USER32.@)
110 INT WINAPI EnumPropsW( HWND hwnd, PROPENUMPROCW func )
112 return EnumPropsExW( hwnd, EnumPropsW_relay, (LPARAM)func );
116 /***********************************************************************
117 * GetPropA (USER32.@)
119 HANDLE WINAPI GetPropA( HWND hwnd, LPCSTR str )
121 WCHAR buffer[ATOM_BUFFER_SIZE];
123 if (!HIWORD(str)) return GetPropW( hwnd, (LPCWSTR)str );
124 if (!MultiByteToWideChar( CP_ACP, 0, str, -1, buffer, ATOM_BUFFER_SIZE )) return 0;
125 return GetPropW( hwnd, buffer );
129 /***********************************************************************
130 * GetPropW (USER32.@)
132 HANDLE WINAPI GetPropW( HWND hwnd, LPCWSTR str )
136 SERVER_START_REQ( get_window_property )
139 if (!HIWORD(str)) req->atom = LOWORD(str);
140 else wine_server_add_data( req, str, strlenW(str) * sizeof(WCHAR) );
141 if (!wine_server_call_err( req )) ret = reply->handle;
148 /***********************************************************************
149 * SetPropA (USER32.@)
151 BOOL WINAPI SetPropA( HWND hwnd, LPCSTR str, HANDLE handle )
153 WCHAR buffer[ATOM_BUFFER_SIZE];
155 if (!HIWORD(str)) return SetPropW( hwnd, (LPCWSTR)str, handle );
156 if (!MultiByteToWideChar( CP_ACP, 0, str, -1, buffer, ATOM_BUFFER_SIZE )) return FALSE;
157 return SetPropW( hwnd, buffer, handle );
161 /***********************************************************************
162 * SetPropW (USER32.@)
164 BOOL WINAPI SetPropW( HWND hwnd, LPCWSTR str, HANDLE handle )
168 SERVER_START_REQ( set_window_property )
171 req->handle = handle;
172 if (!HIWORD(str)) req->atom = LOWORD(str);
173 else wine_server_add_data( req, str, strlenW(str) * sizeof(WCHAR) );
174 ret = !wine_server_call_err( req );
181 /***********************************************************************
182 * RemovePropA (USER32.@)
184 HANDLE WINAPI RemovePropA( HWND hwnd, LPCSTR str )
186 WCHAR buffer[ATOM_BUFFER_SIZE];
188 if (!HIWORD(str)) return RemovePropW( hwnd, (LPCWSTR)str );
189 if (!MultiByteToWideChar( CP_ACP, 0, str, -1, buffer, ATOM_BUFFER_SIZE )) return 0;
190 return RemovePropW( hwnd, buffer );
194 /***********************************************************************
195 * RemovePropW (USER32.@)
197 HANDLE WINAPI RemovePropW( HWND hwnd, LPCWSTR str )
201 SERVER_START_REQ( remove_window_property )
204 if (!HIWORD(str)) req->atom = LOWORD(str);
205 else wine_server_add_data( req, str, strlenW(str) * sizeof(WCHAR) );
206 if (!wine_server_call_err( req )) ret = reply->handle;
214 /***********************************************************************
215 * EnumPropsExA (USER32.@)
217 INT WINAPI EnumPropsExA(HWND hwnd, PROPENUMPROCEXA func, LPARAM lParam)
219 int ret = -1, i, count;
220 property_data_t *list = get_properties( hwnd, &count );
224 for (i = 0; i < count; i++)
226 char string[ATOM_BUFFER_SIZE];
227 if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
228 if (!(ret = func( hwnd, string, list[i].handle, lParam ))) break;
230 HeapFree( GetProcessHeap(), 0, list );
236 /***********************************************************************
237 * EnumPropsExW (USER32.@)
239 INT WINAPI EnumPropsExW(HWND hwnd, PROPENUMPROCEXW func, LPARAM lParam)
241 int ret = -1, i, count;
242 property_data_t *list = get_properties( hwnd, &count );
246 for (i = 0; i < count; i++)
248 WCHAR string[ATOM_BUFFER_SIZE];
249 if (!GlobalGetAtomNameW( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
250 if (!(ret = func( hwnd, string, list[i].handle, lParam ))) break;
252 HeapFree( GetProcessHeap(), 0, list );
258 /***********************************************************************
259 * EnumProps (USER.27)
261 INT16 WINAPI EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
263 int ret = -1, i, count;
264 property_data_t *list = get_properties( HWND_32(hwnd), &count );
268 char string[ATOM_BUFFER_SIZE];
269 SEGPTR segptr = MapLS( string );
273 for (i = 0; i < count; i++)
275 if (list[i].string) /* it was a string originally */
277 if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
279 args[2] = SELECTOROF(segptr);
280 args[1] = OFFSETOF(segptr);
281 args[0] = LOWORD(list[i].handle);
287 args[1] = list[i].atom;
288 args[0] = LOWORD(list[i].handle);
290 WOWCallback16Ex( (DWORD)func, WCB16_PASCAL, sizeof(args), args, &result );
291 if (!(ret = LOWORD(result))) break;
294 HeapFree( GetProcessHeap(), 0, list );