diff --git a/src/DirectPlay8Address.cpp b/src/DirectPlay8Address.cpp index b13d36b..8333ed8 100644 --- a/src/DirectPlay8Address.cpp +++ b/src/DirectPlay8Address.cpp @@ -269,9 +269,27 @@ HRESULT DirectPlay8Address::AddComponent(CONST WCHAR* CONST pwszName, CONST void break; case DPNA_DATATYPE_STRING_ANSI: - new_component = new StringComponentA(pwszName, (const char*)(lpvData), dwDataSize); - break; + { + /* DirectX converts ANSI strings to wide on input. */ + int wide_char_count = MultiByteToWideChar(CP_ACP, 0, (const char*)(lpvData), dwDataSize, NULL, 0); + if(wide_char_count == 0) + { + return DPNERR_INVALIDPARAM; + } + + std::vector wide_char_buf(wide_char_count); + + wide_char_count = MultiByteToWideChar(CP_ACP, 0, (const char*)(lpvData), dwDataSize, wide_char_buf.data(), wide_char_count); + if(wide_char_count == 0) + { + return DPNERR_INVALIDPARAM; + } + + new_component = new StringComponentW(pwszName, wide_char_buf.data(), wide_char_count * sizeof(wchar_t)); + break; + } + case DPNA_DATATYPE_DWORD: if(dwDataSize != sizeof(DWORD)) { @@ -375,30 +393,6 @@ HRESULT DirectPlay8Address::StringComponentW::get_component(LPVOID pvBuffer, PDW } } -DirectPlay8Address::StringComponentA::StringComponentA(const std::wstring &name, const char *lpvData, DWORD dwDataSize): - Component(name, DPNA_DATATYPE_STRING_ANSI), value(lpvData, dwDataSize) {} - -HRESULT DirectPlay8Address::StringComponentA::get_component(LPVOID pvBuffer, PDWORD pdwBufferSize, PDWORD pdwDataType) -{ - *pdwDataType = DPNA_DATATYPE_STRING_ANSI; - - if(*pdwBufferSize >= value.length() && pvBuffer != NULL) - { - memcpy(pvBuffer, value.data(), value.length()); - *pdwBufferSize = value.length(); - return S_OK; - } - else{ - *pdwBufferSize = value.length(); - return DPNERR_BUFFERTOOSMALL; - } -} - -DirectPlay8Address::Component *DirectPlay8Address::StringComponentA::clone() -{ - return new DirectPlay8Address::StringComponentA(name, value.data(), value.length()); -} - DirectPlay8Address::DWORDComponent::DWORDComponent(const std::wstring &name, DWORD value): Component(name, DPNA_DATATYPE_DWORD), value(value) {} diff --git a/src/DirectPlay8Address.hpp b/src/DirectPlay8Address.hpp index 7435878..f95e289 100644 --- a/src/DirectPlay8Address.hpp +++ b/src/DirectPlay8Address.hpp @@ -35,16 +35,6 @@ class DirectPlay8Address: public IDirectPlay8Address virtual HRESULT get_component(LPVOID pvBuffer, PDWORD pdwBufferSize, PDWORD pdwDataType); }; - class StringComponentA: public Component - { - public: - const std::string value; - - StringComponentA(const std::wstring &name, const char *lpvData, DWORD dwDataSize); - virtual Component *clone(); - virtual HRESULT get_component(LPVOID pvBuffer, PDWORD pdwBufferSize, PDWORD pdwDataType); - }; - class DWORDComponent: public Component { public: diff --git a/tests/DirectPlay8Address.cpp b/tests/DirectPlay8Address.cpp index d5298a7..747f0f8 100644 --- a/tests/DirectPlay8Address.cpp +++ b/tests/DirectPlay8Address.cpp @@ -310,8 +310,11 @@ class DirectPlay8AddressWithAStringComponent: public DirectPlay8AddressInitial protected: const wchar_t *REFKEY = L"key"; - const char *REFVAL = "ASCII string value"; - const DWORD REFVSIZE = 19; + const char *AREFVAL = "ASCII string value"; + const DWORD AREFVSIZE = 19; + + const wchar_t *WREFVAL = L"ASCII string value"; + const DWORD WREFVSIZE = 38; unsigned char vbuf[256]; @@ -319,7 +322,7 @@ class DirectPlay8AddressWithAStringComponent: public DirectPlay8AddressInitial { memset(vbuf, 0xFF, sizeof(vbuf)); - ASSERT_EQ(idp8->AddComponent(REFKEY, REFVAL, REFVSIZE, DPNA_DATATYPE_STRING_ANSI), S_OK); + ASSERT_EQ(idp8->AddComponent(REFKEY, AREFVAL, AREFVSIZE, DPNA_DATATYPE_STRING_ANSI), S_OK); } }; @@ -337,43 +340,45 @@ TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeZero) ASSERT_EQ(idp8->GetComponentByName(REFKEY, NULL, &vsize, &type), DPNERR_BUFFERTOOSMALL); - EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(vsize, WREFVSIZE); } TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeSmall) { - DWORD vsize = REFVSIZE - 1; + DWORD vsize = WREFVSIZE - 1; DWORD type; ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), DPNERR_BUFFERTOOSMALL); - EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(vsize, WREFVSIZE); } TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeExact) { - DWORD vsize = REFVSIZE; + DWORD vsize = WREFVSIZE; DWORD type; ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); - EXPECT_EQ(vsize, REFVSIZE); - EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_STRING_ANSI)); + EXPECT_EQ(vsize, WREFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_STRING)); - EXPECT_EQ(std::string((const char*)(vbuf), vsize), std::string(REFVAL, REFVSIZE)); + EXPECT_EQ(std::wstring((const wchar_t*)(vbuf), (vsize / sizeof(wchar_t))), + std::wstring(WREFVAL, (WREFVSIZE / sizeof(wchar_t)))); } TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeBig) { - DWORD vsize = REFVSIZE * 2; + DWORD vsize = WREFVSIZE * 2; DWORD type; ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); - EXPECT_EQ(vsize, REFVSIZE); - EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_STRING_ANSI)); + EXPECT_EQ(vsize, WREFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_STRING)); - EXPECT_EQ(std::string((const char*)(vbuf), vsize), std::string(REFVAL, REFVSIZE)); + EXPECT_EQ(std::wstring((const wchar_t*)(vbuf), (vsize / sizeof(wchar_t))), + std::wstring(WREFVAL, (WREFVSIZE / sizeof(wchar_t)))); } // TEST_F(DirectPlay8AddressWithAStringComponent, GetURLW)