Author: mjansen Date: Thu Jun 2 18:59:04 2016 New Revision: 71501 URL: http://svn.reactos.org/svn/reactos?rev=71501&view=rev Log: [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.
Modified: trunk/reactos/dll/appcompat/apphelp/sdbapi.c trunk/reactos/dll/appcompat/apphelp/sdbpapi.h trunk/reactos/dll/appcompat/apphelp/sdbwrite.c trunk/rostests/apitests/apphelp/db.c Modified: trunk/reactos/dll/appcompat/apphelp/sdbapi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/appcompat/apphelp/sdbapi.c?rev=71501&r1=71500&r2=71501&view=diff ============================================================================== --- trunk/reactos/dll/appcompat/apphelp/sdbapi.c [iso-8859-1] (original) +++ trunk/reactos/dll/appcompat/apphelp/sdbapi.c [iso-8859-1] Thu Jun 2 18:59:04 2016 @@ -259,12 +259,17 @@ 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; } Modified: trunk/reactos/dll/appcompat/apphelp/sdbpapi.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/appcompat/apphelp/sdbpapi.h?rev=71501&r1=71500&r2=71501&view=diff ============================================================================== --- trunk/reactos/dll/appcompat/apphelp/sdbpapi.h [iso-8859-1] (original) +++ trunk/reactos/dll/appcompat/apphelp/sdbpapi.h [iso-8859-1] Thu Jun 2 18:59:04 2016 @@ -65,7 +65,8 @@ 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 Modified: trunk/reactos/dll/appcompat/apphelp/sdbwrite.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/appcompat/apphelp/sdbwrite.c?rev=71501&r1=71500&r2=71501&view=diff ============================================================================== --- trunk/reactos/dll/appcompat/apphelp/sdbwrite.c [iso-8859-1] (original) +++ trunk/reactos/dll/appcompat/apphelp/sdbwrite.c [iso-8859-1] Thu Jun 2 18:59:04 2016 @@ -36,6 +36,10 @@ #include "sdbtagid.h" #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 @@ 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 @@ */ void WINAPI SdbCloseDatabaseWrite(PDB db) { + SdbpWriteStringtable(db); SdbpFlush(db); SdbCloseDatabase(db); } @@ -181,10 +203,19 @@ { 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 @@ return FALSE; /* Write size of list to list tag header */ - *(DWORD*)&db->data[tagid + sizeof(TAG)] = db->write_iter - tagid - sizeof(TAG); - return TRUE; -} - + *(DWORD*)&db->data[tagid + sizeof(TAG)] = db->write_iter - tagid - sizeof(TAG) - sizeof(TAGID); + return TRUE; +} + Modified: trunk/rostests/apitests/apphelp/db.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/apphelp/db.c?rev=71501&r1=71500&r2=71501&view=diff ============================================================================== --- trunk/rostests/apitests/apphelp/db.c [iso-8859-1] (original) +++ trunk/rostests/apitests/apphelp/db.c [iso-8859-1] Thu Jun 2 18:59:04 2016 @@ -312,6 +312,91 @@ } 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) { @@ -790,5 +875,6 @@ pSdbGUIDToString = (void *) GetProcAddress(hdll, "SdbGUIDToString"); test_Sdb(); + test_write_ex(); test_CheckDatabaseManually(); }