mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 08:05:43 +00:00
[APPHELP_APITEST][APPHELP] Add new tests showing that SdbWriteStringTag and SdbEndWriteListTag are incorrect, fix SdbEndWriteListTag CORE-10367
SdbWriteStringTag requires the database to keep track of written strings, and append a stringtable to a database. svn path=/trunk/; revision=71501
This commit is contained in:
parent
f5da7c7b8c
commit
4847a35732
4 changed files with 128 additions and 5 deletions
|
@ -259,12 +259,17 @@ void WINAPI SdbpFlush(PDB db)
|
|||
|
||||
DWORD SdbpStrlen(PCWSTR string)
|
||||
{
|
||||
return (lstrlenW(string) + 1) * sizeof(WCHAR);
|
||||
return lstrlenW(string);
|
||||
}
|
||||
|
||||
DWORD SdbpStrsize(PCWSTR string)
|
||||
{
|
||||
return (SdbpStrlen(string) + 1) * sizeof(WCHAR);
|
||||
}
|
||||
|
||||
PWSTR SdbpStrDup(LPCWSTR string)
|
||||
{
|
||||
PWSTR ret = SdbpAlloc(SdbpStrlen(string));
|
||||
PWSTR ret = SdbpAlloc(SdbpStrsize(string));
|
||||
lstrcpyW(ret, string);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -65,7 +65,8 @@ void WINAPI SdbpCloseMemMappedFile(PMEMMAPPED mapping);
|
|||
|
||||
PDB WINAPI SdbpCreate(LPCWSTR path, PATH_TYPE type, BOOL write);
|
||||
void WINAPI SdbpFlush(PDB db);
|
||||
DWORD SdbpStrlen(LPCWSTR string);
|
||||
DWORD SdbpStrlen(PCWSTR string);
|
||||
DWORD SdbpStrsize(PCWSTR string);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -37,6 +37,10 @@
|
|||
|
||||
#endif
|
||||
|
||||
BOOL WINAPI SdbWriteStringRefTag(PDB db, TAG tag, TAGID tagid);
|
||||
TAGID WINAPI SdbBeginWriteListTag(PDB db, TAG tag);
|
||||
BOOL WINAPI SdbEndWriteListTag(PDB db, TAGID tagid);
|
||||
|
||||
|
||||
static void WINAPI SdbpWrite(PDB db, const void* data, DWORD size)
|
||||
{
|
||||
|
@ -51,6 +55,23 @@ static void WINAPI SdbpWrite(PDB db, const void* data, DWORD size)
|
|||
db->write_iter += size;
|
||||
}
|
||||
|
||||
static BOOL WINAPI SdbpGetOrAddStringRef(PDB db, LPCWSTR string, TAGID* tagid)
|
||||
{
|
||||
/* TODO:
|
||||
- Insert or find in stringtable
|
||||
- return TAGID
|
||||
*/
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void WINAPI SdbpWriteStringtable(PDB db)
|
||||
{
|
||||
TAGID table = SdbBeginWriteListTag(db, TAG_STRINGTABLE);
|
||||
/* TODO: Write out all strings*/
|
||||
SdbEndWriteListTag(db, table);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new shim database file
|
||||
*
|
||||
|
@ -90,6 +111,7 @@ PDB WINAPI SdbCreateDatabase(LPCWSTR path, PATH_TYPE type)
|
|||
*/
|
||||
void WINAPI SdbCloseDatabaseWrite(PDB db)
|
||||
{
|
||||
SdbpWriteStringtable(db);
|
||||
SdbpFlush(db);
|
||||
SdbCloseDatabase(db);
|
||||
}
|
||||
|
@ -181,10 +203,19 @@ BOOL WINAPI SdbWriteStringTag(PDB db, TAG tag, LPCWSTR string)
|
|||
{
|
||||
DWORD size;
|
||||
|
||||
if (SdbpCheckTagType(tag, TAG_TYPE_STRINGREF))
|
||||
{
|
||||
TAGID tagid = 0;
|
||||
if (!SdbpGetOrAddStringRef(db, string, &tagid))
|
||||
return FALSE;
|
||||
|
||||
return SdbWriteStringRefTag(db, tag, tagid);
|
||||
}
|
||||
|
||||
if (!SdbpCheckTagType(tag, TAG_TYPE_STRING))
|
||||
return FALSE;
|
||||
|
||||
size = SdbpStrlen(string);
|
||||
size = SdbpStrsize(string);
|
||||
SdbpWrite(db, &tag, sizeof(TAG));
|
||||
SdbpWrite(db, &size, sizeof(size));
|
||||
SdbpWrite(db, string, size);
|
||||
|
@ -297,7 +328,7 @@ BOOL WINAPI SdbEndWriteListTag(PDB db, TAGID tagid)
|
|||
return FALSE;
|
||||
|
||||
/* Write size of list to list tag header */
|
||||
*(DWORD*)&db->data[tagid + sizeof(TAG)] = db->write_iter - tagid - sizeof(TAG);
|
||||
*(DWORD*)&db->data[tagid + sizeof(TAG)] = db->write_iter - tagid - sizeof(TAG) - sizeof(TAGID);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -313,6 +313,91 @@ static void test_Sdb(void)
|
|||
DeleteFileW(path1);
|
||||
}
|
||||
|
||||
/*
|
||||
- Show that a stringtable is automatically generated,
|
||||
- validate multiple lists (for the length)
|
||||
*/
|
||||
static void test_write_ex(void)
|
||||
{
|
||||
WCHAR path1[] = {'t','e','s','t','.','s','d','b',0};
|
||||
WCHAR test1[] = {'T','E','S','T',0};
|
||||
WCHAR test2[] = {'t','e','s','t',0};
|
||||
PDB pdb;
|
||||
TAGID tagdb, tagstr;
|
||||
TAG tag;
|
||||
DWORD size;
|
||||
BOOL ret;
|
||||
|
||||
/* Write a small database */
|
||||
pdb = pSdbCreateDatabase(path1, DOS_PATH);
|
||||
ok(pdb != NULL, "Expected a valid database\n");
|
||||
if (!pdb)
|
||||
return;
|
||||
tagdb = pSdbBeginWriteListTag(pdb, TAG_DATABASE);
|
||||
ok(tagdb == 12, "Expected tag to be 12, was %u\n", tagdb);
|
||||
ret = pSdbWriteStringTag(pdb, TAG_NAME, test1);
|
||||
ok(ret, "Expected SdbWriteStringTag to succeed\n");
|
||||
ret = pSdbEndWriteListTag(pdb, tagdb);
|
||||
ok(ret, "Expected SdbEndWriteListTag to succeed\n");
|
||||
|
||||
tagdb = pSdbBeginWriteListTag(pdb, TAG_DATABASE);
|
||||
ok(tagdb == 24, "Expected tag to be 24, was %u\n", tagdb);
|
||||
ret = pSdbWriteStringTag(pdb, TAG_NAME, test2);
|
||||
ok(ret, "Expected SdbWriteStringTag to succeed\n");
|
||||
ret = pSdbEndWriteListTag(pdb, tagdb);
|
||||
ok(ret, "Expected SdbEndWriteListTag to succeed\n");
|
||||
|
||||
pSdbCloseDatabaseWrite(pdb);
|
||||
|
||||
/* Now validate it's contents */
|
||||
pdb = pSdbOpenDatabase(path1, DOS_PATH);
|
||||
ok(pdb != NULL, "Expected a valid database\n");
|
||||
if (!pdb)
|
||||
return;
|
||||
tagdb = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
|
||||
ok(tagdb == 12, "Expected tag to be 12, was %u\n", tagdb);
|
||||
size = pSdbGetTagDataSize(pdb, tagdb);
|
||||
ok(size == 6, "Expected size to be 6, was %u\n", size);
|
||||
tagstr = pSdbFindFirstTag(pdb, tagdb, TAG_NAME);
|
||||
ok(tagstr == 18, "Expected string tag to be 18, was %u\n", tagstr);
|
||||
tag = pSdbGetTagFromTagID(pdb, tagstr);
|
||||
ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x\n", (DWORD)tag);
|
||||
size = pSdbGetTagDataSize(pdb, tagstr);
|
||||
ok(size == 4, "Expected size to be 4, was 0x%x\n", size);
|
||||
|
||||
tagdb = pSdbFindNextTag(pdb, TAGID_ROOT, tagdb);
|
||||
ok(tagdb == 24, "Expected tag to be 24, was %u\n", tagdb);
|
||||
size = pSdbGetTagDataSize(pdb, tagdb);
|
||||
ok(size == 6, "Expected size to be 6, was %u\n", size);
|
||||
tagstr = pSdbFindFirstTag(pdb, tagdb, TAG_NAME);
|
||||
ok(tagstr == 30, "Expected string tag to be 30, was %u\n", tagstr);
|
||||
tag = pSdbGetTagFromTagID(pdb, tagstr);
|
||||
ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x\n", (DWORD)tag);
|
||||
size = pSdbGetTagDataSize(pdb, tagstr);
|
||||
ok(size == 4, "Expected size to be 4, was %u\n", size);
|
||||
|
||||
tagdb = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_STRINGTABLE);
|
||||
ok(tagdb == 36, "Expected tag to be 36, was %u\n", tagdb);
|
||||
size = pSdbGetTagDataSize(pdb, tagdb);
|
||||
ok(size == 32, "Expected size to be 32, was %u\n", size);
|
||||
tagstr = pSdbGetFirstChild(pdb, tagdb);
|
||||
ok(tagstr == 42, "Expected string tag to be 42, was %u\n", tagstr);
|
||||
tag = pSdbGetTagFromTagID(pdb, tagstr);
|
||||
ok(tag == TAG_STRINGTABLE_ITEM, "Expected tag to be TAG_STRINGTABLE_ITEM, was 0x%x\n", (DWORD)tag);
|
||||
size = pSdbGetTagDataSize(pdb, tagstr);
|
||||
ok(size == 10, "Expected size to be 10, was %u\n", size);
|
||||
|
||||
tagstr = pSdbGetNextChild(pdb, tagdb, tagstr);
|
||||
ok(tagstr == 58, "Expected string tag to be 58, was %u\n", tagstr);
|
||||
tag = pSdbGetTagFromTagID(pdb, tagstr);
|
||||
ok(tag == TAG_STRINGTABLE_ITEM, "Expected tag to be TAG_STRINGTABLE_ITEM, was 0x%x\n", (DWORD)tag);
|
||||
size = pSdbGetTagDataSize(pdb, tagstr);
|
||||
ok(size == 10, "Expected size to be 10, was %u\n", size);
|
||||
|
||||
pSdbCloseDatabase(pdb);
|
||||
}
|
||||
|
||||
|
||||
static void match_str_attr_imp(PDB pdb, TAGID parent, TAG find, const char* compare)
|
||||
{
|
||||
TAGID attr = pSdbFindFirstTag(pdb, parent, find);
|
||||
|
@ -790,5 +875,6 @@ START_TEST(db)
|
|||
pSdbGUIDToString = (void *) GetProcAddress(hdll, "SdbGUIDToString");
|
||||
|
||||
test_Sdb();
|
||||
test_write_ex();
|
||||
test_CheckDatabaseManually();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue