PIChunkStream::set() new feature
This commit is contained in:
@@ -72,6 +72,16 @@ void PIChunkStream::setSource(PIByteArray * data) {
|
||||
}
|
||||
|
||||
|
||||
PIByteArray PIChunkStream::data() const {
|
||||
if (first_byte_taken) {
|
||||
PIByteArray ret(*data_);
|
||||
ret.prepend((uchar)(0x80 | version_));
|
||||
return ret;
|
||||
}
|
||||
return *data_;
|
||||
}
|
||||
|
||||
|
||||
int PIChunkStream::read() {
|
||||
switch (version_) {
|
||||
case Version_1:
|
||||
@@ -108,16 +118,40 @@ int PIChunkStream::peekVInt(Version version_, PIByteArray * data_, int pos, PIBy
|
||||
}
|
||||
|
||||
|
||||
void PIChunkStream::replaceChunk(int id, const PIByteArray & v) {
|
||||
if (!data_map.contains(id)) return;
|
||||
auto & pos(data_map[id]);
|
||||
PIByteArray nsba;
|
||||
writeVInt(nsba, v.size());
|
||||
int size_mod = (v.size_s() + nsba.size_s()) - (pos.length + pos.size_bytes);
|
||||
pos.length = v.size_s();
|
||||
if (size_mod != 0) {
|
||||
auto it = data_map.makeIterator();
|
||||
while (it.next())
|
||||
if (it.valueRef().start > pos.start)
|
||||
it.valueRef().start += size_mod;
|
||||
if (size_mod > 0)
|
||||
data_->insert(pos.start, PIByteArray(size_mod));
|
||||
else
|
||||
data_->remove(pos.start, -size_mod);
|
||||
}
|
||||
memcpy(data_->data(pos.start - pos.size_bytes), nsba.data(), nsba.size());
|
||||
pos.start += nsba.size_s() - pos.size_bytes;
|
||||
memcpy(data_->data(pos.start), v.data(), pos.length);
|
||||
}
|
||||
|
||||
|
||||
void PIChunkStream::readAll() {
|
||||
data_map.clear();
|
||||
if (!data_) return;
|
||||
int pos = 0, sz = data_->size_s();
|
||||
int pos = 0, sz = data_->size_s(), hsz = 0;
|
||||
uint csz = 0, cid = 0;
|
||||
PIByteArray hdr;
|
||||
while (pos < sz) {
|
||||
pos += peekVInt((Version)version_, data_, pos, hdr, cid);
|
||||
pos += peekVInt((Version)version_, data_, pos, hdr, csz);
|
||||
data_map[cid] = PIPair<int, int>(pos, csz);
|
||||
hsz = peekVInt((Version)version_, data_, pos, hdr, csz);
|
||||
pos += hsz;
|
||||
data_map[cid] = CacheEntry(pos, csz, hsz);
|
||||
pos += csz;
|
||||
}
|
||||
}
|
||||
@@ -140,6 +174,7 @@ bool PIChunkStream::extract(PIByteArray & data, bool read_all) {
|
||||
|
||||
|
||||
void PIChunkStream::_init() {
|
||||
first_byte_taken = false;
|
||||
last_id = -1;
|
||||
last_data.clear();
|
||||
if (!data_->isEmpty()) {
|
||||
@@ -147,7 +182,7 @@ void PIChunkStream::_init() {
|
||||
if ((v & 0x80) == 0x80) {
|
||||
v &= 0x7f;
|
||||
switch (v) {
|
||||
case 2: version_ = (uchar)Version_2; data_->pop_front(); break;
|
||||
case 2: version_ = (uchar)Version_2; data_->pop_front(); first_byte_taken = true; break;
|
||||
default: version_ = Version_1; break;
|
||||
}
|
||||
} else
|
||||
|
||||
Reference in New Issue
Block a user