int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType) { WCHAR *szKey; char * baseP; baseP = p; wLength = *(WORD*)p; p += sizeof(WORD); wValueLength = *(WORD*)p; p += sizeof(WORD); wType = *(WORD*)p; p += sizeof(WORD); szKey = (WCHAR*)p; p += (winchar_strlen(szKey) + 1) * sizeof (WCHAR); while ( ((long)p % 4) != 0 ) p++; return p - baseP; }
void SaveVersionHeader (GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wType, const WCHAR *key, void *value) { WORD valueLen; WORD keyLen; strm.add (&wLength, sizeof (wLength)); strm.add (&wValueLength, sizeof (wValueLength)); strm.add (&wType, sizeof (wType)); keyLen = WORD((winchar_strlen(key) + 1) * sizeof (WCHAR)); strm.add ((void*)key, keyLen); PadStream(strm); if ( wValueLength > 0 ) { valueLen = wValueLength; if ( wType == 1 ) valueLen = valueLen * WORD(sizeof (WCHAR)); strm.add (value, valueLen); } }
void testStrLen() { WCHAR test[] = { _x('t'), _x('e'), _x('s'), _x('t'), 0 }; CPPUNIT_ASSERT_EQUAL( (size_t) 4, winchar_strlen(test) ); }
void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index) { DWORD v; WORD wSize; int p, p1; WCHAR *KeyName, *KeyValue; strm.resize(0); KeyName = winchar_fromansi("VS_VERSION_INFO"); SaveVersionHeader (strm, 0, sizeof (VS_FIXEDFILEINFO), 0, KeyName, &m_FixedInfo); delete [] KeyName; DefineList *pChildStrings = m_ChildStringLists.get_strings(Index); if ( pChildStrings->getnum() > 0 ) { GrowBuf stringInfoStream; int codepage = m_ChildStringLists.get_codepage(Index); LANGID langid = m_ChildStringLists.get_lang(Index); char Buff[16]; sprintf(Buff, "%04x%04x", langid, codepage); KeyName = winchar_fromansi(Buff, CP_ACP); SaveVersionHeader (stringInfoStream, 0, 0, 0, KeyName, &ZEROS); delete [] KeyName; for ( int i = 0; i < pChildStrings->getnum(); i++ ) { PadStream (stringInfoStream); p = stringInfoStream.getlen(); KeyName = winchar_fromansi(pChildStrings->getname(i), codepage); KeyValue = winchar_fromansi(pChildStrings->getvalue(i), codepage); SaveVersionHeader (stringInfoStream, 0, WORD(winchar_strlen(KeyValue) + 1), 1, KeyName, (void*)KeyValue); delete [] KeyName; delete [] KeyValue; wSize = WORD(stringInfoStream.getlen() - p); *(WORD*)((PBYTE)stringInfoStream.get()+p)=wSize; } wSize = WORD(stringInfoStream.getlen()); *(WORD*)((PBYTE)stringInfoStream.get())=wSize; PadStream (strm); p = strm.getlen(); KeyName = winchar_fromansi("StringFileInfo", CP_ACP); SaveVersionHeader (strm, 0, 0, 0, KeyName, &ZEROS); delete [] KeyName; strm.add (stringInfoStream.get(), stringInfoStream.getlen()); wSize = WORD(strm.getlen() - p); *(WORD*)((PBYTE)strm.get()+p)=wSize; } // Show all languages avaiable using Var-Translations if ( m_ChildStringLists.getnum() > 0 ) { PadStream (strm); p = strm.getlen(); KeyName = winchar_fromansi("VarFileInfo", CP_ACP); SaveVersionHeader (strm, 0, 0, 0, KeyName, &ZEROS); delete [] KeyName; PadStream (strm); p1 = strm.getlen(); KeyName = winchar_fromansi("Translation", CP_ACP); SaveVersionHeader (strm, 0, 0, 0, KeyName, &ZEROS); delete [] KeyName; // First add selected code language translation v = MAKELONG(m_ChildStringLists.get_lang(Index), m_ChildStringLists.get_codepage(Index)); strm.add (&v, sizeof (v)); for ( int k =0; k < m_ChildStringLists.getnum(); k++ ) { if ( k != Index ) { v = MAKELONG(m_ChildStringLists.get_lang(k), m_ChildStringLists.get_codepage(k)); strm.add (&v, sizeof (v)); } } wSize = WORD(strm.getlen() - p1); *(WORD*)((PBYTE)strm.get()+p1)=wSize; wSize = WORD(sizeof (int) * m_ChildStringLists.getnum()); p1+=sizeof(WORD); *(WORD*)((PBYTE)strm.get()+p1)=wSize; wSize = WORD(strm.getlen() - p); *(WORD*)((PBYTE)strm.get()+p)=wSize; } wSize = WORD(strm.getlen()); *(WORD*)((PBYTE)strm.get())=wSize; }