Implement basic string table functions Modified: trunk/reactos/include/wine/setupapi.h Modified: trunk/reactos/lib/setupapi/Makefile.in Modified: trunk/reactos/lib/setupapi/setupapi.spec Modified: trunk/reactos/lib/setupapi/setupapi.xml Added: trunk/reactos/lib/setupapi/stringtable.c Modified: trunk/reactos/w32api/include/setupapi.h _____
Modified: trunk/reactos/include/wine/setupapi.h --- trunk/reactos/include/wine/setupapi.h 2005-06-18 08:04:30 UTC (rev 16024) +++ trunk/reactos/include/wine/setupapi.h 2005-06-18 11:30:49 UTC (rev 16025) @@ -39,6 +39,8 @@
typedef PVOID HDSKSPC;
+typedef PVOID HSTRING_TABLE; + /* inf structure. */ typedef struct _INFCONTEXT { @@ -665,7 +667,11 @@ #define SPDRP_MAXIMUM_PROPERTY 0x00000023
-LONG WINAPI AddTagToGroupOrderList(PCWSTR lpGroupName, DWORD dwUnknown2, DWORD dwUnknown3); +/* Flags for StringTableAddString and StringTableLookUpString */ +#define ST_CASE_SENSITIVE_COMPARE 0x00000001 + + +LONG WINAPI AddTagToGroupOrderList(PCWSTR, DWORD, DWORD); VOID WINAPI AssertFail(LPSTR, UINT, LPSTR); DWORD WINAPI CaptureAndConvertAnsiArg(PCSTR lpSrc, PWSTR *lpDst); DWORD WINAPI CaptureStringArg(PCWSTR lpSrc, PWSTR *lpDst); @@ -827,6 +833,15 @@ BOOL WINAPI SetupSetFileQueueFlags( HSPFILEQ, DWORD, DWORD ); void WINAPI SetupTermDefaultQueueCallback( PVOID ); DWORD WINAPI StampFileSecurity(PCWSTR, PSECURITY_DESCRIPTOR); + +DWORD WINAPI StringTableAddString(HSTRING_TABLE, LPWSTR, DWORD); +VOID WINAPI StringTableDestroy(HSTRING_TABLE); +HSTRING_TABLE WINAPI StringTableInitialize(VOID); +DWORD WINAPI StringTableLookUpString(HSTRING_TABLE, LPWSTR, DWORD); +LPWSTR WINAPI StringTableStringFromId(HSTRING_TABLE, DWORD); +BOOL WINAPI StringTableStringFromIdEx(HSTRING_TABLE, DWORD, LPWSTR, LPDWORD); +VOID WINAPI StringTableTrim(HSTRING_TABLE); + DWORD WINAPI TakeOwnershipOfFile(PCWSTR); PSTR WINAPI UnicodeToMultiByte(PCWSTR lpUnicodeStr, UINT uCodePage); BOOL WINAPI UnmapAndCloseFile(HANDLE, HANDLE, PVOID); _____
Modified: trunk/reactos/lib/setupapi/Makefile.in --- trunk/reactos/lib/setupapi/Makefile.in 2005-06-18 08:04:30 UTC (rev 16024) +++ trunk/reactos/lib/setupapi/Makefile.in 2005-06-18 11:30:49 UTC (rev 16025) @@ -20,6 +20,7 @@
parser.c \ queue.c \ setupcab.c \ + stringtable.c \ stubs.c \ rpc.c
_____
Modified: trunk/reactos/lib/setupapi/setupapi.spec --- trunk/reactos/lib/setupapi/setupapi.spec 2005-06-18 08:04:30 UTC (rev 16024) +++ trunk/reactos/lib/setupapi/setupapi.spec 2005-06-18 11:30:49 UTC (rev 16025) @@ -513,20 +513,20 @@
@ stdcall SetupTerminateFileLog(long) @ stub ShouldDeviceBeExcluded @ stdcall StampFileSecurity(wstr ptr) -@ stub StringTableAddString +@ stdcall StringTableAddString(ptr wstr long) @ stub StringTableAddStringEx -@ stub StringTableDestroy +@ stdcall StringTableDestroy(ptr) @ stub StringTableDuplicate @ stub StringTableEnum @ stub StringTableGetExtraData -@ stub StringTableInitialize +@ stdcall StringTableInitialize() @ stub StringTableInitializeEx -@ stub StringTableLookUpString +@ stdcall StringTableLookUpString(ptr wstr long) @ stub StringTableLookUpStringEx @ stub StringTableSetExtraData -@ stub StringTableStringFromId -@ stub StringTableStringFromIdEx -@ stub StringTableTrim +@ stdcall StringTableStringFromId(ptr long) +@ stdcall StringTableStringFromIdEx(ptr long ptr ptr) +@ stdcall StringTableTrim(ptr) @ stdcall TakeOwnershipOfFile(wstr) @ stdcall UnicodeToMultiByte(wstr long) @ stdcall UnmapAndCloseFile(long long ptr) _____
Modified: trunk/reactos/lib/setupapi/setupapi.xml --- trunk/reactos/lib/setupapi/setupapi.xml 2005-06-18 08:04:30 UTC (rev 16024) +++ trunk/reactos/lib/setupapi/setupapi.xml 2005-06-18 11:30:49 UTC (rev 16025) @@ -29,6 +29,7 @@
<file>parser.c</file> <file>queue.c</file> <file>setupcab.c</file> + <file>stringtable.c</file> <file>stubs.c</file> <file>rpc.c</file> <file>setupapi.rc</file> _____
Added: trunk/reactos/lib/setupapi/stringtable.c --- trunk/reactos/lib/setupapi/stringtable.c 2005-06-18 08:04:30 UTC (rev 16024) +++ trunk/reactos/lib/setupapi/stringtable.c 2005-06-18 11:30:49 UTC (rev 16025) @@ -0,0 +1,389 @@
+/* + * Setupapi string table functions + * + * Copyright 2005 Eric Kohl + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" +#include "setupapi.h" + +#include "wine/debug.h" + + +#define TABLE_DEFAULT_SIZE 256 + +WINE_DEFAULT_DEBUG_CHANNEL(setupapi); + +typedef struct _STRING_TABLE +{ + LPWSTR *pSlots; /* 0x00 */ + DWORD dwUsedSlots; /* 0x04 */ + DWORD dwMaxSlots; /* 0x08 */ +} STRING_TABLE, *PSTRING_TABLE; + + +/********************************************************************** **** + * StringTableInitialize [SETUPAPI.@] + * + * Creates a new string table and initializes it. + * + * PARAMS + * None + * + * RETURNS + * Success: Handle to the string table + * Failure: NULL + */ +HSTRING_TABLE WINAPI +StringTableInitialize(VOID) +{ + PSTRING_TABLE pStringTable; + + TRACE("\n"); + + pStringTable = MyMalloc(sizeof(STRING_TABLE)); + if (pStringTable == NULL) + { + ERR("Invalid hStringTable!\n"); + return NULL; + } + + memset(pStringTable, 0, sizeof(STRING_TABLE)); + + pStringTable->pSlots = MyMalloc(sizeof(LPWSTR) * TABLE_DEFAULT_SIZE); + if (pStringTable->pSlots == NULL) + { + MyFree(pStringTable->pSlots); + return NULL; + } + + memset(pStringTable->pSlots, 0, sizeof(LPWSTR) * TABLE_DEFAULT_SIZE); + + pStringTable->dwUsedSlots = 0; + pStringTable->dwMaxSlots = TABLE_DEFAULT_SIZE; + + TRACE("Done\n"); + + return (HSTRING_TABLE)pStringTable; +} + + +/********************************************************************** **** + * StringTableDestroy [SETUPAPI.@] + * + * Destroys a string table. + * + * PARAMS + * hStringTable [I] Handle to the string table to be destroyed + * + * RETURNS + * None + */ +VOID WINAPI +StringTableDestroy(HSTRING_TABLE hStringTable) +{ + PSTRING_TABLE pStringTable; + DWORD i; + + TRACE("%p\n", (PVOID)hStringTable); + + pStringTable = (PSTRING_TABLE)hStringTable; + if (pStringTable == NULL) + return; + + if (pStringTable->pSlots != NULL) + { + for (i = 0; i < pStringTable->dwMaxSlots; i++) + { + if (pStringTable->pSlots[i] != NULL) + { + MyFree(pStringTable->pSlots[i]); + pStringTable->pSlots[i] = NULL; + } + } + + MyFree(pStringTable->pSlots); + } + + MyFree(pStringTable); +} + + +/********************************************************************** **** + * StringTableAddString [SETUPAPI.@] + * + * Adds a new string to the string table. + * + * PARAMS + * hStringTable [I] Handle to the string table + * lpString [I] String to be added to the string table + * dwFlags [I] Flags + * 1: case sensitive compare + * + * RETURNS + * Success: String ID + * Failure: -1 + * + * NOTES + * If the given string already exists in the string table it will not + * be added again. The ID of the existing string will be returned in + * this case. + */ +DWORD WINAPI +StringTableAddString(HSTRING_TABLE hStringTable, + LPWSTR lpString, + DWORD dwFlags) +{ + PSTRING_TABLE pStringTable; + DWORD i; + + TRACE("%p %s %lx\n", (PVOID)hStringTable, debugstr_w(lpString), dwFlags); + + pStringTable = (PSTRING_TABLE)hStringTable; + if (pStringTable == NULL) + { + ERR("Invalid hStringTable!\n"); + return (DWORD)-1; + } + + /* Search for existing string in the string table */ + for (i = 0; i < pStringTable->dwMaxSlots; i++) + { + if (pStringTable->pSlots[i] != NULL) + { + if (dwFlags & 1) + { + if (!lstrcmpW(pStringTable->pSlots[i], lpString)) + { + return i; + } + } + else + { + if (!lstrcmpiW(pStringTable->pSlots[i], lpString)) + { + return i; + } + } + } + } + + /* Check for filled slot table */ + if (pStringTable->dwUsedSlots == pStringTable->dwMaxSlots) + { + FIXME("Resize the string table!\n"); + return (DWORD)-1; + } + + /* Search for an empty slot */ + for (i = 0; i < pStringTable->dwMaxSlots; i++) + { + if (pStringTable->pSlots[i] == NULL) + { + pStringTable->pSlots[i] = MyMalloc(lstrlenW(lpString) + sizeof(WCHAR)); + if (pStringTable->pSlots[i] == NULL) + { + TRACE("Couldn't allocate memory for a new string!\n"); + return (DWORD)-1; + } + + lstrcpyW(pStringTable->pSlots[i], lpString); + + pStringTable->dwUsedSlots++; + + return i; + } + } + + TRACE("Couldn't find an empty slot!\n"); + + return (DWORD)-1; +} + + +/********************************************************************** **** + * StringTableLookUpString [SETUPAPI.@] + * + * Searches a string table for a given string. + * + * PARAMS + * hStringTable [I] Handle to the string table + * lpString [I] String to be searched for + * dwFlags [I] Flags + * 1: case sensitive compare + * + * RETURNS + * Success: String ID + * Failure: -1 + */ +DWORD WINAPI +StringTableLookUpString(HSTRING_TABLE hStringTable, + LPWSTR lpString, + DWORD dwFlags) +{ + PSTRING_TABLE pStringTable; + DWORD i; + + TRACE("%p %s %lx\n", (PVOID)hStringTable, debugstr_w(lpString), dwFlags); + + pStringTable = (PSTRING_TABLE)hStringTable; + if (pStringTable == NULL) + { + ERR("Invalid hStringTable!\n"); + return (DWORD)-1; + } + + /* Search for existing string in the string table */ + for (i = 0; i < pStringTable->dwMaxSlots; i++) + { + if (pStringTable->pSlots[i] != NULL) + { + if (dwFlags & 1) + { + if (!lstrcmpW(pStringTable->pSlots[i], lpString)) + { + return i; + } + } + else + { + if (!lstrcmpiW(pStringTable->pSlots[i], lpString)) + { + return i; + } + } + } + } + + return (DWORD)-1; +} + + +/********************************************************************** **** + * StringTableStringFromId [SETUPAPI.@] + * + * Returns a pointer to a string for the given string ID. + * + * PARAMS + * hStringTable [I] Handle to the string table. + * dwId [I] String ID + * + * RETURNS + * Success: Pointer to the string + * Failure: NULL + */ +LPWSTR WINAPI +StringTableStringFromId(HSTRING_TABLE hStringTable, + DWORD dwId) +{ + PSTRING_TABLE pStringTable; + + TRACE("%p %lx\n", (PVOID)hStringTable, dwId); + + pStringTable = (PSTRING_TABLE)hStringTable; + if (pStringTable == NULL) + { + ERR("Invalid hStringTable!\n"); + return NULL; + } + + if (dwId >= pStringTable->dwMaxSlots) + return NULL; + + return pStringTable->pSlots[dwId]; +} + + +/********************************************************************** **** + * StringTableStringFromIdEx [SETUPAPI.@] + * + * Returns a string for the given string ID. + * + * PARAMS + * hStringTable [I] Handle to the string table + * dwId [I] String ID + * lpBuffer [I] Pointer to string buffer + * lpBufferSize [I/O] Pointer to the size of the string buffer + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI +StringTableStringFromIdEx(HSTRING_TABLE hStringTable, + DWORD dwId, + LPWSTR lpBuffer, + LPDWORD lpBufferLength) +{ + PSTRING_TABLE pStringTable; + DWORD dwLength; + BOOL bResult = FALSE; + + TRACE("%p %lx %p %p\n", + (PVOID)hStringTable, dwId, lpBuffer, lpBufferLength); + + pStringTable = (PSTRING_TABLE)hStringTable; + if (pStringTable == NULL) + { + ERR("Invalid hStringTable!\n"); + *lpBufferLength = 0; + return FALSE; + } + + if (dwId >= pStringTable->dwMaxSlots || + pStringTable->pSlots[dwId] == NULL) + { + WARN("Invalid string ID!\n"); + *lpBufferLength = 0; + return FALSE; + } + + dwLength = lstrlenW(pStringTable->pSlots[dwId]) + sizeof(WCHAR); + if (dwLength <= *lpBufferLength) + { + lstrcpyW(lpBuffer, pStringTable->pSlots[dwId]); + bResult = TRUE; + } + + *lpBufferLength = dwLength; + + return bResult; +} + + +/********************************************************************** **** + * StringTableTrim [SETUPAPI.@] + * + * ... + * + * PARAMS + * hStringTable [I] Handle to the string table + * + * RETURNS + * None + */ +VOID WINAPI +StringTableTrim(HSTRING_TABLE hStringTable) +{ + FIXME("%p\n", (PVOID)hStringTable); +} _____
Modified: trunk/reactos/w32api/include/setupapi.h --- trunk/reactos/w32api/include/setupapi.h 2005-06-18 08:04:30 UTC (rev 16024) +++ trunk/reactos/w32api/include/setupapi.h 2005-06-18 11:30:49 UTC (rev 16025) @@ -577,6 +577,9 @@
#define SRCLIST_APPEND 0x00000200 #define SRCLIST_NOSTRIPPLATFORM 0x00000400
+/* Flags for StringTableAddString and StringTableLookUpString */ +#define ST_CASE_SENSITIVE_COMPARE 0x00000001 + #ifndef RC_INVOKED typedef PVOID HINF; typedef PVOID HDSKSPC; @@ -585,6 +588,8 @@ typedef PVOID HSPFILELOG; typedef UINT DI_FUNCTION;
+typedef PVOID HSTRING_TABLE; + typedef enum { SetupFileLogSourceFilename, SetupFileLogChecksum, @@ -1326,6 +1331,15 @@ WINSETUPAPI VOID WINAPI SetupTermDefaultQueueCallback(PVOID); WINSETUPAPI BOOL WINAPI SetupTerminateFileLog(HSPFILELOG);
+WINSETUPAPI DWORD WINAPI StringTableAddString(HSTRING_TABLE, LPWSTR, DWORD); +WINSETUPAPI VOID WINAPI StringTableDestroy(HSTRING_TABLE); +WINSETUPAPI HSTRING_TABLE WINAPI StringTableInitialize(VOID); +WINSETUPAPI DWORD WINAPI StringTableLookUpString(HSTRING_TABLE, LPWSTR, DWORD); +WINSETUPAPI LPWSTR WINAPI StringTableStringFromId(HSTRING_TABLE, DWORD); +WINSETUPAPI BOOL WINAPI StringTableStringFromIdEx(HSTRING_TABLE, DWORD, LPWSTR, LPDWORD); +WINSETUPAPI VOID WINAPI StringTableTrim(HSTRING_TABLE); + + /* for backward compatability */ #define SetupDiCreateInterfaceDeviceW SetupDiCreateDeviceInterfaceW #define SetupDiCreateInterfaceDeviceRegKeyW SetupDiCreateDeviceInterfaceRegKeyW