mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
fix vba read and other
This commit is contained in:
@ -435,7 +435,7 @@ namespace VBA
|
||||
|
||||
virtual void load(CVbaFileStreamPtr stream);
|
||||
|
||||
_UINT32 TextOffset;
|
||||
_UINT32 TextOffset = 0xffffffff;
|
||||
};
|
||||
typedef boost::shared_ptr<MODULEOFFSET> MODULEOFFSETPtr;
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@ -132,6 +132,11 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
|
||||
return;
|
||||
}
|
||||
dataSize -= 1;
|
||||
|
||||
if (offset > dataSize)
|
||||
{
|
||||
return; //error;
|
||||
}
|
||||
|
||||
stream->seek(stream->tell() + offset);
|
||||
dataSize -= offset;
|
||||
@ -140,23 +145,24 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
|
||||
stream->read(data, dataSize);
|
||||
|
||||
unsigned char *dataCur = data;
|
||||
size_t dataPos = 0;
|
||||
|
||||
while (dataPos + 2 < dataSize)
|
||||
while (dataCur - data < dataSize - 2)
|
||||
{
|
||||
std::vector<unsigned char> arrChunk;
|
||||
_UINT16 header = *((_UINT32*)dataCur); dataCur += 2;
|
||||
|
||||
bool bCompressed = ((header & CHUNK_COMPRESSED) != 0);
|
||||
_UINT16 chunkSize = (header & CHUNK_LENMASK);
|
||||
_UINT16 chunkSize = (header & CHUNK_LENMASK) + 1;
|
||||
|
||||
bool bUnknown = false;
|
||||
if ((header & CHUNK_SIGMASK) != CHUNK_SIG)
|
||||
{
|
||||
bCompressed = true;
|
||||
chunkSize = 4094; //по факту
|
||||
bUnknown = true;
|
||||
}
|
||||
POLE::uint64 target = (dataCur - data) + chunkSize;
|
||||
|
||||
unsigned char *dataNext = dataCur + chunkSize;
|
||||
|
||||
if (bCompressed)
|
||||
{
|
||||
unsigned char nBitCount = 4;
|
||||
@ -203,8 +209,7 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
|
||||
}
|
||||
else
|
||||
{
|
||||
arrChunk.emplace_back();
|
||||
arrChunk.back() = *dataCur; dataCur++;
|
||||
arrChunk.push_back(*dataCur); dataCur++;
|
||||
++chunkPos;
|
||||
}
|
||||
}
|
||||
@ -215,7 +220,8 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
|
||||
arrChunk.resize(chunkSize);
|
||||
memcpy(arrChunk.data(), dataCur, chunkSize); dataCur += chunkSize;
|
||||
}
|
||||
dataPos = target;
|
||||
|
||||
dataCur = dataNext;
|
||||
arrChunks.insert(arrChunks.end(), arrChunk.begin(), arrChunk.end());
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,6 +103,9 @@ const std::wstring CVbaReader::convert()
|
||||
{
|
||||
for (size_t i = 0; i < DirStreamObject->ModulesRecord->modules.size(); ++i)
|
||||
{
|
||||
if (!DirStreamObject->ModulesRecord->modules[i])
|
||||
continue;
|
||||
|
||||
CP_XML_NODE(L"Module")
|
||||
{
|
||||
if (DirStreamObject->ModulesRecord->modules[i]->StreamNameRecord)
|
||||
@ -121,7 +124,10 @@ const std::wstring CVbaReader::convert()
|
||||
DirStreamObject->ModulesRecord->modules[i]->StreamNameRecord->StreamNameUnicode.value);
|
||||
|
||||
_UINT32 offset = DirStreamObject->ModulesRecord->modules[i]->OffsetRecord ?
|
||||
DirStreamObject->ModulesRecord->modules[i]->OffsetRecord->TextOffset : 0;//skip cache
|
||||
DirStreamObject->ModulesRecord->modules[i]->OffsetRecord->TextOffset : 0xffffffff;//skip cache
|
||||
|
||||
if (offset == 0xffffffff)
|
||||
continue; // error record
|
||||
|
||||
CVbaFileStreamPtr strmModule = vbaProject_file_->getNamedStream(streamName, offset);
|
||||
strmModule->CodePage = code_page_;
|
||||
|
||||
Reference in New Issue
Block a user