indent with astyle v1.15.3: --style=ansi -c -s3 -S --convert-tabs
[reactos.git] / reactos / subsys / win32k / ntuser / prop.c
1 /*
2 * ReactOS W32 Subsystem
3 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 /* $Id$
20 *
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS kernel
23 * PURPOSE: Window properties
24 * FILE: subsys/win32k/ntuser/prop.c
25 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
26 * REVISION HISTORY:
27 * 06-06-2001 CSH Created
28 */
29 /* INCLUDES ******************************************************************/
30
31 #include <w32k.h>
32
33 #define NDEBUG
34 #include <debug.h>
35
36 typedef struct _PROPLISTITEM
37 {
38 ATOM Atom;
39 HANDLE Data;
40 }
41 PROPLISTITEM, *PPROPLISTITEM;
42
43
44 /* STATIC FUNCTIONS **********************************************************/
45
46 /* FUNCTIONS *****************************************************************/
47
48 static
49 PPROPERTY FASTCALL
50 IntGetProp(PWINDOW_OBJECT Window, ATOM Atom)
51 {
52 PLIST_ENTRY ListEntry;
53 PPROPERTY Property;
54
55 ListEntry = Window->PropListHead.Flink;
56 while (ListEntry != &Window->PropListHead)
57 {
58 Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry);
59 if (Property->Atom == Atom)
60 {
61 return(Property);
62 }
63 ListEntry = ListEntry->Flink;
64 }
65 return(NULL);
66 }
67
68 NTSTATUS STDCALL
69 NtUserBuildPropList(HWND hWnd,
70 LPVOID Buffer,
71 DWORD BufferSize,
72 DWORD *Count)
73 {
74 PWINDOW_OBJECT Window;
75 PPROPERTY Property;
76 PLIST_ENTRY ListEntry;
77 PROPLISTITEM listitem, *li;
78 NTSTATUS Status;
79 DWORD Cnt = 0;
80 DECLARE_RETURN(NTSTATUS);
81
82 DPRINT("Enter NtUserBuildPropList\n");
83 UserEnterShared();
84
85 if (!(Window = UserGetWindowObject(hWnd)))
86 {
87 RETURN( STATUS_INVALID_HANDLE);
88 }
89
90 if(Buffer)
91 {
92 if(!BufferSize || (BufferSize % sizeof(PROPLISTITEM) != 0))
93 {
94 RETURN( STATUS_INVALID_PARAMETER);
95 }
96
97 /* copy list */
98 li = (PROPLISTITEM *)Buffer;
99 ListEntry = Window->PropListHead.Flink;
100 while((BufferSize >= sizeof(PROPLISTITEM)) && (ListEntry != &Window->PropListHead))
101 {
102 Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry);
103 listitem.Atom = Property->Atom;
104 listitem.Data = Property->Data;
105
106 Status = MmCopyToCaller(li, &listitem, sizeof(PROPLISTITEM));
107 if(!NT_SUCCESS(Status))
108 {
109 RETURN( Status);
110 }
111
112 BufferSize -= sizeof(PROPLISTITEM);
113 Cnt++;
114 li++;
115 ListEntry = ListEntry->Flink;
116 }
117
118 }
119 else
120 {
121 Cnt = Window->PropListItems * sizeof(PROPLISTITEM);
122 }
123
124 if(Count)
125 {
126 Status = MmCopyToCaller(Count, &Cnt, sizeof(DWORD));
127 if(!NT_SUCCESS(Status))
128 {
129 RETURN( Status);
130 }
131 }
132
133 RETURN( STATUS_SUCCESS);
134
135 CLEANUP:
136 DPRINT("Leave NtUserBuildPropList, ret=%i\n",_ret_);
137 UserLeave();
138 END_CLEANUP;
139 }
140
141 HANDLE STDCALL
142 NtUserRemoveProp(HWND hWnd, ATOM Atom)
143 {
144 PWINDOW_OBJECT Window;
145 PPROPERTY Prop;
146 HANDLE Data;
147 DECLARE_RETURN(HANDLE);
148
149 DPRINT("Enter NtUserRemoveProp\n");
150 UserEnterExclusive();
151
152 if (!(Window = UserGetWindowObject(hWnd)))
153 {
154 RETURN( NULL);
155 }
156
157 Prop = IntGetProp(Window, Atom);
158
159 if (Prop == NULL)
160 {
161 RETURN(NULL);
162 }
163 Data = Prop->Data;
164 RemoveEntryList(&Prop->PropListEntry);
165 ExFreePool(Prop);
166 Window->PropListItems--;
167
168 RETURN(Data);
169
170 CLEANUP:
171 DPRINT("Leave NtUserRemoveProp, ret=%i\n",_ret_);
172 UserLeave();
173 END_CLEANUP;
174 }
175
176 HANDLE STDCALL
177 NtUserGetProp(HWND hWnd, ATOM Atom)
178 {
179 PWINDOW_OBJECT Window;
180 PPROPERTY Prop;
181 HANDLE Data = NULL;
182 DECLARE_RETURN(HANDLE);
183
184 DPRINT("Enter NtUserGetProp\n");
185 UserEnterShared();
186
187 if (!(Window = UserGetWindowObject(hWnd)))
188 {
189 RETURN( FALSE);
190 }
191
192 Prop = IntGetProp(Window, Atom);
193 if (Prop != NULL)
194 {
195 Data = Prop->Data;
196 }
197
198 RETURN(Data);
199
200 CLEANUP:
201 DPRINT("Leave NtUserGetProp, ret=%i\n",_ret_);
202 UserLeave();
203 END_CLEANUP;
204 }
205
206 static
207 BOOL FASTCALL
208 IntSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data)
209 {
210 PPROPERTY Prop;
211
212 Prop = IntGetProp(Wnd, Atom);
213
214 if (Prop == NULL)
215 {
216 Prop = ExAllocatePoolWithTag(PagedPool, sizeof(PROPERTY), TAG_WNDPROP);
217 if (Prop == NULL)
218 {
219 return FALSE;
220 }
221 Prop->Atom = Atom;
222 InsertTailList(&Wnd->PropListHead, &Prop->PropListEntry);
223 Wnd->PropListItems++;
224 }
225
226 Prop->Data = Data;
227 return TRUE;
228 }
229
230
231 BOOL STDCALL
232 NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data)
233 {
234 PWINDOW_OBJECT Window;
235 DECLARE_RETURN(BOOL);
236
237 DPRINT("Enter NtUserSetProp\n");
238 UserEnterExclusive();
239
240 if (!(Window = UserGetWindowObject(hWnd)))
241 {
242 RETURN( FALSE);
243 }
244
245 RETURN( IntSetProp(Window, Atom, Data));
246
247 CLEANUP:
248 DPRINT("Leave NtUserSetProp, ret=%i\n",_ret_);
249 UserLeave();
250 END_CLEANUP;
251 }
252
253 /* EOF */