--- trunk/reactos/lib/setupapi/stringtable.c 2005-08-27 18:13:52 UTC (rev 17572)
+++ trunk/reactos/lib/setupapi/stringtable.c 2005-08-27 19:14:35 UTC (rev 17573)
@@ -34,11 +34,19 @@
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
+typedef struct _TABLE_SLOT
+{
+ LPWSTR pString;
+ LPVOID pData;
+ DWORD dwSize;
+} TABLE_SLOT, *PTABLE_SLOT;
+
typedef struct _STRING_TABLE
{
- LPWSTR *pSlots;
+ PTABLE_SLOT pSlots;
DWORD dwUsedSlots;
DWORD dwMaxSlots;
+ DWORD dwMaxDataSize;
} STRING_TABLE, *PSTRING_TABLE;
@@ -70,17 +78,18 @@
memset(pStringTable, 0, sizeof(STRING_TABLE));
- pStringTable->pSlots = MyMalloc(sizeof(LPWSTR) * TABLE_DEFAULT_SIZE);
+ pStringTable->pSlots = MyMalloc(sizeof(TABLE_SLOT) * TABLE_DEFAULT_SIZE);
if (pStringTable->pSlots == NULL)
{
MyFree(pStringTable->pSlots);
return NULL;
}
- memset(pStringTable->pSlots, 0, sizeof(LPWSTR) * TABLE_DEFAULT_SIZE);
+ memset(pStringTable->pSlots, 0, sizeof(TABLE_SLOT) * TABLE_DEFAULT_SIZE);
pStringTable->dwUsedSlots = 0;
pStringTable->dwMaxSlots = TABLE_DEFAULT_SIZE;
+ pStringTable->dwMaxDataSize = 0;
TRACE("Done\n");
@@ -89,6 +98,55 @@
/**************************************************************************
+ * StringTableInitializeEx [SETUPAPI.@]
+ *
+ * Creates a new string table and initializes it.
+ *
+ * PARAMS
+ * dwMaxExtraDataSize [I] Maximum extra data size
+ * dwReserved [I] Unused
+ *
+ * RETURNS
+ * Success: Handle to the string table
+ * Failure: NULL
+ */
+HSTRING_TABLE WINAPI
+StringTableInitializeEx(DWORD dwMaxExtraDataSize,
+ DWORD dwReserved)
+{
+ 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(TABLE_SLOT) * TABLE_DEFAULT_SIZE);
+ if (pStringTable->pSlots == NULL)
+ {
+ MyFree(pStringTable->pSlots);
+ return NULL;
+ }
+
+ memset(pStringTable->pSlots, 0, sizeof(TABLE_SLOT) * TABLE_DEFAULT_SIZE);
+
+ pStringTable->dwUsedSlots = 0;
+ pStringTable->dwMaxSlots = TABLE_DEFAULT_SIZE;
+ pStringTable->dwMaxDataSize = dwMaxExtraDataSize;
+
+ TRACE("Done\n");
+
+ return (HSTRING_TABLE)pStringTable;
+}
+
+
+/**************************************************************************
* StringTableDestroy [SETUPAPI.@]
*
* Destroys a string table.
@@ -115,11 +173,18 @@
{
for (i = 0; i < pStringTable->dwMaxSlots; i++)
{
- if (pStringTable->pSlots[i] != NULL)
+ if (pStringTable->pSlots[i].pString != NULL)
{
- MyFree(pStringTable->pSlots[i]);
- pStringTable->pSlots[i] = NULL;
+ MyFree(pStringTable->pSlots[i].pString);
+ pStringTable->pSlots[i].pString = NULL;
}
+
+ if (pStringTable->pSlots[i].pData != NULL)
+ {
+ MyFree(pStringTable->pSlots[i].pData);
+ pStringTable->pSlots[i].pData = NULL;
+ pStringTable->pSlots[i].dwSize = 0;
+ }
}
MyFree(pStringTable->pSlots);
@@ -169,18 +234,18 @@
/* Search for existing string in the string table */
for (i = 0; i < pStringTable->dwMaxSlots; i++)
{
- if (pStringTable->pSlots[i] != NULL)
+ if (pStringTable->pSlots[i].pString != NULL)
{
if (dwFlags & 1)
{
- if (!lstrcmpW(pStringTable->pSlots[i], lpString))
+ if (!lstrcmpW(pStringTable->pSlots[i].pString, lpString))
{
return i;
}
}
else
{
- if (!lstrcmpiW(pStringTable->pSlots[i], lpString))
+ if (!lstrcmpiW(pStringTable->pSlots[i].pString, lpString))
{
return i;
}
@@ -198,16 +263,16 @@
/* Search for an empty slot */
for (i = 0; i < pStringTable->dwMaxSlots; i++)
{
- if (pStringTable->pSlots[i] == NULL)
+ if (pStringTable->pSlots[i].pString == NULL)
{
- pStringTable->pSlots[i] = MyMalloc((lstrlenW(lpString) + 1) * sizeof(WCHAR));
- if (pStringTable->pSlots[i] == NULL)
+ pStringTable->pSlots[i].pString = MyMalloc((lstrlenW(lpString) + 1) * sizeof(WCHAR));
+ if (pStringTable->pSlots[i].pString == NULL)
{
TRACE("Couldn't allocate memory for a new string!\n");
return (DWORD)-1;
}
- lstrcpyW(pStringTable->pSlots[i], lpString);
+ lstrcpyW(pStringTable->pSlots[i].pString, lpString);
pStringTable->dwUsedSlots++;
@@ -222,6 +287,40 @@
/**************************************************************************
+ * StringTableAddStringEx [SETUPAPI.@]
+ *
+ * Adds a new string plus extra data 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
+ * lpExtraData [I] Pointer to the extra data
+ * dwExtraDataSize [I] Size of the extra data
+ *
+ * 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
+StringTableAddStringEx(HSTRING_TABLE hStringTable,
+ LPWSTR lpString,
+ DWORD dwFlags,
+ LPVOID lpExtraData,
+ DWORD dwExtraDataSize)
+{
+ FIXME("\n");
+ return (DWORD)-1;
+}
+
+
+/**************************************************************************
* StringTableDuplicate [SETUPAPI.@]
*
* Duplicates a given string table.
@@ -260,31 +359,44 @@
memset(pDestinationTable, 0, sizeof(STRING_TABLE));
- pDestinationTable->pSlots = MyMalloc(sizeof(LPWSTR) * pSourceTable->dwMaxSlots);
+ pDestinationTable->pSlots = MyMalloc(sizeof(TABLE_SLOT) * pSourceTable->dwMaxSlots);
if (pDestinationTable->pSlots == NULL)
{
MyFree(pDestinationTable);
return (HSTRING_TABLE)NULL;
}
- memset(pDestinationTable->pSlots, 0, sizeof(LPWSTR) * pSourceTable->dwMaxSlots);
+ memset(pDestinationTable->pSlots, 0, sizeof(TABLE_SLOT) * pSourceTable->dwMaxSlots);
pDestinationTable->dwUsedSlots = 0;
pDestinationTable->dwMaxSlots = pSourceTable->dwMaxSlots;
for (i = 0; i < pSourceTable->dwMaxSlots; i++)
{
- if (pSourceTable->pSlots[i] != NULL)
+ if (pSourceTable->pSlots[i].pString != NULL)
{
- length = (lstrlenW(pSourceTable->pSlots[i]) + 1) * sizeof(WCHAR);
- pDestinationTable->pSlots[i] = MyMalloc(length);
- if (pDestinationTable->pSlots[i] != NULL)
+ length = (lstrlenW(pSourceTable->pSlots[i].pString) + 1) * sizeof(WCHAR);
+ pDestinationTable->pSlots[i].pString = MyMalloc(length);
+ if (pDestinationTable->pSlots[i].pString != NULL)
{
- memcpy(pDestinationTable->pSlots[i],
- pSourceTable->pSlots[i],
+ memcpy(pDestinationTable->pSlots[i].pString,
+ pSourceTable->pSlots[i].pString,
length);
pDestinationTable->dwUsedSlots++;
}
+
+ if (pSourceTable->pSlots[i].pData != NULL)
+ {
+ length = pSourceTable->pSlots[i].dwSize;
+ pDestinationTable->pSlots[i].pData = MyMalloc(length);
+ if (pDestinationTable->pSlots[i].pData)
+ {
+ memcpy(pDestinationTable->pSlots[i].pData,
+ pSourceTable->pSlots[i].pData,
+ length);
+ pDestinationTable->pSlots[i].dwSize = length;
+ }
+ }
}
}
@@ -293,6 +405,59 @@
/**************************************************************************
+ * StringTableGetExtraData [SETUPAPI.@]
+ *
+ * Retrieves extra data from a given string table entry.
+ *
+ * PARAMS
+ * hStringTable [I] Handle to the string table
+ * dwId [I] String ID
+ * lpExtraData [I] Pointer a buffer that receives the extra data
+ * dwExtraDataSize [I] Size of the buffer
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL WINAPI
+StringTableGetExtraData(HSTRING_TABLE hStringTable,
+ DWORD dwId,
+ LPVOID lpExtraData,
+ DWORD dwExtraDataSize)
+{
+ PSTRING_TABLE pStringTable;
+
+ TRACE("%p %lx %p %lu\n",
+ (PVOID)hStringTable, dwId, lpExtraData, dwExtraDataSize);
+
+ pStringTable = (PSTRING_TABLE)hStringTable;
+ if (pStringTable == NULL)
+ {
+ ERR("Invalid hStringTable!\n");
+ return FALSE;
+ }
+
+ if (dwId >= pStringTable->dwMaxSlots)
+ {
+ ERR("Invalid Slot id!\n");
+ return FALSE;
+ }
+
+ if (pStringTable->pSlots[dwId].dwSize < dwExtraDataSize)
+ {
+ ERR("Data size is too large!\n");
+ return FALSE;
+ }
+
+ memcpy(lpExtraData,
+ pStringTable->pSlots[dwId].pData,
+ dwExtraDataSize);
+
+ return TRUE;
+}
+
+
+/**************************************************************************
* StringTableLookUpString [SETUPAPI.@]
*
* Searches a string table for a given string.
@@ -327,21 +492,17 @@
/* Search for existing string in the string table */
for (i = 0; i < pStringTable->dwMaxSlots; i++)
{
- if (pStringTable->pSlots[i] != NULL)
+ if (pStringTable->pSlots[i].pString != NULL)
{
if (dwFlags & 1)
{
- if (!lstrcmpW(pStringTable->pSlots[i], lpString))
- {
+ if (!lstrcmpW(pStringTable->pSlots[i].pString, lpString))
return i;
- }
}
else
{
- if (!lstrcmpiW(pStringTable->pSlots[i], lpString))
- {
+ if (!lstrcmpiW(pStringTable->pSlots[i].pString, lpString))
return i;
- }
}
}
}
@@ -351,6 +512,96 @@
/**************************************************************************
+ * StringTableLookUpStringEx [SETUPAPI.@]
+ *
+ * Searches a string table and extra data 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
+ * lpExtraData [O] Pointer to the buffer that receives the extra data
+ * lpReserved [I/O] Unused
+ *
+ * RETURNS
+ * Success: String ID
+ * Failure: -1
+ */
+DWORD WINAPI
+StringTableLookUpStringEx(HSTRING_TABLE hStringTable,
+ LPWSTR lpString,
+ DWORD dwFlags,
+ LPVOID lpExtraData,
+ LPDWORD lpReserved)
+{
+ FIXME("\n");
+ return (DWORD)-1;
+}
+
+
+/**************************************************************************
+ * StringTableSetExtraData [SETUPAPI.@]
+ *
+ * Sets extra data for a given string table entry.
+ *
+ * PARAMS
+ * hStringTable [I] Handle to the string table
+ * dwId [I] String ID
+ * lpExtraData [I] Pointer to the extra data
+ * dwExtraDataSize [I] Size of the extra data
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL WINAPI
+StringTableSetExtraData(HSTRING_TABLE hStringTable,
+ DWORD dwId,
+ LPVOID lpExtraData,
+ DWORD dwExtraDataSize)
+{
+ PSTRING_TABLE pStringTable;
+
+ TRACE("%p %lx %p %lu\n",
+ (PVOID)hStringTable, dwId, lpExtraData, dwExtraDataSize);
+
+ pStringTable = (PSTRING_TABLE)hStringTable;
+ if (pStringTable == NULL)
+ {
+ ERR("Invalid hStringTable!\n");
+ return FALSE;
+ }
+
+ if (dwId >= pStringTable->dwMaxSlots)
+ {
+ ERR("Invalid Slot id!\n");
+ return FALSE;
+ }
+
+ if (pStringTable->dwMaxDataSize < dwExtraDataSize)
+ {
+ ERR("Data size is too large!\n");
+ return FALSE;
+ }
+
+ pStringTable->pSlots[dwId].pData = MyMalloc(dwExtraDataSize);
+ if (pStringTable->pSlots[dwId].pData == NULL)
+ {
+ ERR("\n");
+ return FALSE;
+ }
+
+ memcpy(pStringTable->pSlots[dwId].pData,
+ lpExtraData,
+ dwExtraDataSize);
+ pStringTable->pSlots[dwId].dwSize = dwExtraDataSize;
+
+ return TRUE;
+}
+
+
+/**************************************************************************
* StringTableStringFromId [SETUPAPI.@]
*
* Returns a pointer to a string for the given string ID.
@@ -381,7 +632,7 @@
if (dwId >= pStringTable->dwMaxSlots)
return NULL;
- return pStringTable->pSlots[dwId];
+ return pStringTable->pSlots[dwId].pString;
}
@@ -422,17 +673,17 @@
}
if (dwId >= pStringTable->dwMaxSlots ||
- pStringTable->pSlots[dwId] == NULL)
+ pStringTable->pSlots[dwId].pString == NULL)
{
WARN("Invalid string ID!\n");
*lpBufferLength = 0;
return FALSE;
}
- dwLength = (lstrlenW(pStringTable->pSlots[dwId]) + 1) * sizeof(WCHAR);
+ dwLength = (lstrlenW(pStringTable->pSlots[dwId].pString) + 1) * sizeof(WCHAR);
if (dwLength <= *lpBufferLength)
{
- lstrcpyW(lpBuffer, pStringTable->pSlots[dwId]);
+ lstrcpyW(lpBuffer, pStringTable->pSlots[dwId].pString);
bResult = TRUE;
}