mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 04:11:30 +00:00
490 lines
9.7 KiB
C
490 lines
9.7 KiB
C
/*
|
|
* ReactOS kernel
|
|
* Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
/*
|
|
* PROJECT: ReactOS user32.dll
|
|
* FILE: win32ss/user/user32/windows/prop.c
|
|
* PURPOSE: Window Property
|
|
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
* UPDATE HISTORY:
|
|
* 09-05-2001 CSH Created
|
|
*/
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
#include <user32.h>
|
|
|
|
#define ATOM_BUFFER_SIZE 256
|
|
|
|
/* INTERNAL FUNCTIONS ********************************************************/
|
|
|
|
HANDLE
|
|
FASTCALL
|
|
IntGetProp(HWND hWnd, ATOM Atom, BOOLEAN SystemProp)
|
|
{
|
|
PLIST_ENTRY ListEntry, temp;
|
|
PPROPERTY Property;
|
|
PWND pWnd;
|
|
int i;
|
|
WORD SystemFlag = SystemProp ? PROPERTY_FLAG_SYSTEM : 0;
|
|
|
|
pWnd = ValidateHwnd(hWnd);
|
|
if (!pWnd) return NULL;
|
|
|
|
ListEntry = SharedPtrToUser(pWnd->PropListHead.Flink);
|
|
for (i = 0; i < pWnd->PropListItems; i++ )
|
|
{
|
|
Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry);
|
|
if (Property->Atom == Atom &&
|
|
(Property->fs & PROPERTY_FLAG_SYSTEM) == SystemFlag)
|
|
{
|
|
return(Property);
|
|
}
|
|
temp = ListEntry->Flink;
|
|
ListEntry = SharedPtrToUser(temp);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
HANDLE
|
|
FASTCALL
|
|
UserGetProp(HWND hWnd, ATOM Atom, BOOLEAN SystemProp)
|
|
{
|
|
PPROPERTY Prop;
|
|
Prop = IntGetProp(hWnd, Atom, SystemProp);
|
|
return Prop ? Prop->Data : NULL;
|
|
}
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
int WINAPI
|
|
EnumPropsA(HWND hWnd, PROPENUMPROCA lpEnumFunc)
|
|
{
|
|
PPROPLISTITEM pli, i;
|
|
NTSTATUS Status;
|
|
DWORD Count;
|
|
int ret = -1;
|
|
|
|
if(!lpEnumFunc)
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return ret;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, NULL, 0, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
if(Count > 0)
|
|
{
|
|
pli = RtlAllocateHeap(GetProcessHeap(), 0, Count);
|
|
if (pli == NULL)
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return -1;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
i = pli;
|
|
for(; Count > 0; Count--, i++)
|
|
{
|
|
char str[ATOM_BUFFER_SIZE];
|
|
|
|
if(!GlobalGetAtomNameA(i->Atom, str, ATOM_BUFFER_SIZE))
|
|
continue;
|
|
|
|
ret = lpEnumFunc(hWnd, str, i->Data);
|
|
if(!ret)
|
|
break;
|
|
}
|
|
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
int WINAPI
|
|
EnumPropsExA(HWND hWnd, PROPENUMPROCEXA lpEnumFunc, LPARAM lParam)
|
|
{
|
|
PPROPLISTITEM pli, i;
|
|
NTSTATUS Status;
|
|
DWORD Count;
|
|
int ret = -1;
|
|
|
|
if(!lpEnumFunc)
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return ret;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, NULL, 0, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
if(Count > 0)
|
|
{
|
|
pli = RtlAllocateHeap(GetProcessHeap(), 0, Count);
|
|
if (pli == NULL)
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return -1;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
i = pli;
|
|
for(; Count > 0; Count--, i++)
|
|
{
|
|
char str[ATOM_BUFFER_SIZE];
|
|
|
|
if(!GlobalGetAtomNameA(i->Atom, str, ATOM_BUFFER_SIZE))
|
|
continue;
|
|
|
|
ret = lpEnumFunc(hWnd, str, i->Data, lParam);
|
|
if(!ret)
|
|
break;
|
|
}
|
|
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
int WINAPI
|
|
EnumPropsExW(HWND hWnd, PROPENUMPROCEXW lpEnumFunc, LPARAM lParam)
|
|
{
|
|
PPROPLISTITEM pli, i;
|
|
NTSTATUS Status;
|
|
DWORD Count;
|
|
int ret = -1;
|
|
|
|
if(!lpEnumFunc)
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return ret;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, NULL, 0, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
if(Count > 0)
|
|
{
|
|
pli = RtlAllocateHeap(GetProcessHeap(), 0, Count);
|
|
if (pli == NULL)
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return -1;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
i = pli;
|
|
for(; Count > 0; Count--, i++)
|
|
{
|
|
WCHAR str[ATOM_BUFFER_SIZE];
|
|
|
|
if(!GlobalGetAtomNameW(i->Atom, str, ATOM_BUFFER_SIZE))
|
|
continue;
|
|
|
|
ret = lpEnumFunc(hWnd, str, i->Data, lParam);
|
|
if(!ret)
|
|
break;
|
|
}
|
|
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
int WINAPI
|
|
EnumPropsW(HWND hWnd, PROPENUMPROCW lpEnumFunc)
|
|
{
|
|
PPROPLISTITEM pli, i;
|
|
NTSTATUS Status;
|
|
DWORD Count;
|
|
int ret = -1;
|
|
|
|
if(!lpEnumFunc)
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return ret;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, NULL, 0, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
if(Count > 0)
|
|
{
|
|
pli = RtlAllocateHeap(GetProcessHeap(), 0, Count);
|
|
if (pli == NULL)
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return -1;
|
|
}
|
|
|
|
Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count);
|
|
if(!NT_SUCCESS(Status))
|
|
{
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
if(Status == STATUS_INVALID_HANDLE)
|
|
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
|
else
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
return ret;
|
|
}
|
|
|
|
i = pli;
|
|
for(; Count > 0; Count--, i++)
|
|
{
|
|
WCHAR str[ATOM_BUFFER_SIZE];
|
|
|
|
if(!GlobalGetAtomNameW(i->Atom, str, ATOM_BUFFER_SIZE))
|
|
continue;
|
|
|
|
ret = lpEnumFunc(hWnd, str, i->Data);
|
|
if(!ret)
|
|
break;
|
|
}
|
|
|
|
RtlFreeHeap(GetProcessHeap(), 0, pli);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE WINAPI
|
|
GetPropA(HWND hWnd, LPCSTR lpString)
|
|
{
|
|
PWSTR lpWString;
|
|
UNICODE_STRING UString;
|
|
HANDLE Ret;
|
|
if (HIWORD(lpString))
|
|
{
|
|
RtlCreateUnicodeStringFromAsciiz(&UString, (LPSTR)lpString);
|
|
lpWString = UString.Buffer;
|
|
if (lpWString == NULL)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
Ret = GetPropW(hWnd, lpWString);
|
|
RtlFreeUnicodeString(&UString);
|
|
}
|
|
else
|
|
{
|
|
Ret = GetPropW(hWnd, (LPWSTR)lpString);
|
|
}
|
|
return(Ret);
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE WINAPI
|
|
GetPropW(HWND hWnd, LPCWSTR lpString)
|
|
{
|
|
ATOM Atom;
|
|
HANDLE Data = NULL;
|
|
PPROPERTY Prop;
|
|
if (HIWORD(lpString))
|
|
{
|
|
Atom = GlobalFindAtomW(lpString);
|
|
}
|
|
else
|
|
{
|
|
Atom = LOWORD((DWORD_PTR)lpString);
|
|
}
|
|
Prop = IntGetProp(hWnd, Atom, FALSE);
|
|
if (Prop != NULL) Data = Prop->Data;
|
|
return Data;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE WINAPI
|
|
RemovePropA(HWND hWnd, LPCSTR lpString)
|
|
{
|
|
PWSTR lpWString;
|
|
UNICODE_STRING UString;
|
|
HANDLE Ret;
|
|
|
|
if (HIWORD(lpString))
|
|
{
|
|
RtlCreateUnicodeStringFromAsciiz(&UString, (LPSTR)lpString);
|
|
lpWString = UString.Buffer;
|
|
if (lpWString == NULL)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
Ret = RemovePropW(hWnd, lpWString);
|
|
RtlFreeUnicodeString(&UString);
|
|
}
|
|
else
|
|
{
|
|
Ret = RemovePropW(hWnd, (LPCWSTR)lpString);
|
|
}
|
|
return(Ret);
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE WINAPI
|
|
RemovePropW(HWND hWnd,
|
|
LPCWSTR lpString)
|
|
{
|
|
ATOM Atom;
|
|
if (HIWORD(lpString))
|
|
{
|
|
Atom = GlobalFindAtomW(lpString);
|
|
}
|
|
else
|
|
{
|
|
Atom = LOWORD((DWORD_PTR)lpString);
|
|
}
|
|
return(NtUserRemoveProp(hWnd, Atom));
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL WINAPI
|
|
SetPropA(HWND hWnd, LPCSTR lpString, HANDLE hData)
|
|
{
|
|
PWSTR lpWString;
|
|
UNICODE_STRING UString;
|
|
BOOL Ret;
|
|
|
|
if (HIWORD(lpString))
|
|
{
|
|
RtlCreateUnicodeStringFromAsciiz(&UString, (LPSTR)lpString);
|
|
lpWString = UString.Buffer;
|
|
if (lpWString == NULL)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
Ret = SetPropW(hWnd, lpWString, hData);
|
|
RtlFreeUnicodeString(&UString);
|
|
}
|
|
else
|
|
{
|
|
Ret = SetPropW(hWnd, (LPWSTR)lpString, hData);
|
|
}
|
|
return(Ret);
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL WINAPI
|
|
SetPropW(HWND hWnd, LPCWSTR lpString, HANDLE hData)
|
|
{
|
|
ATOM Atom;
|
|
if (HIWORD(lpString))
|
|
{
|
|
Atom = GlobalAddAtomW(lpString);
|
|
}
|
|
else
|
|
{
|
|
Atom = LOWORD((DWORD_PTR)lpString);
|
|
}
|
|
|
|
return(NtUserSetProp(hWnd, Atom, hData));
|
|
}
|