2013-10-30 11:46:18 +00:00
|
|
|
#include "PackStream.h"
|
|
|
|
|
2015-08-13 21:46:50 +00:00
|
|
|
#include "Logs.h"
|
2013-10-30 11:46:18 +00:00
|
|
|
#include <QFile>
|
|
|
|
#include <QDataStream>
|
|
|
|
#include <QString>
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
PackStream::PackStream() {
|
2013-10-30 11:46:18 +00:00
|
|
|
file = NULL;
|
2015-08-13 21:46:50 +00:00
|
|
|
buffer = new QByteArray();
|
|
|
|
stream = new QDataStream(buffer, QIODevice::WriteOnly);
|
|
|
|
stream->setVersion(QDataStream::Qt_5_2);
|
2013-10-30 11:46:18 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
PackStream::~PackStream() {
|
2015-08-13 21:46:50 +00:00
|
|
|
delete buffer;
|
|
|
|
delete stream;
|
2015-11-09 21:30:46 +00:00
|
|
|
if (file) {
|
2013-10-30 11:46:18 +00:00
|
|
|
delete file;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
PackStream::PackStream(const PackStream *other) {
|
2015-08-13 22:22:20 +00:00
|
|
|
file = NULL;
|
|
|
|
buffer = new QByteArray();
|
2015-11-09 21:30:46 +00:00
|
|
|
if (other->file) {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::error("System") << "Try to read from a substream bound to a file: "
|
|
|
|
<< other->file->fileName().toStdString() << endl;
|
2015-08-13 22:22:20 +00:00
|
|
|
stream = new QDataStream(buffer, QIODevice::ReadOnly);
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-08-13 22:22:20 +00:00
|
|
|
stream = new QDataStream(other->buffer, QIODevice::ReadOnly);
|
|
|
|
}
|
|
|
|
stream->setVersion(QDataStream::Qt_5_2);
|
|
|
|
}
|
|
|
|
|
2015-12-10 23:36:50 +00:00
|
|
|
PackStream::PackStream(const string &buffer_content) {
|
2015-11-20 00:07:31 +00:00
|
|
|
file = NULL;
|
|
|
|
buffer = new QByteArray(buffer_content.c_str(), buffer_content.size());
|
|
|
|
stream = new QDataStream(buffer, QIODevice::ReadOnly);
|
|
|
|
stream->setVersion(QDataStream::Qt_5_2);
|
|
|
|
}
|
|
|
|
|
2015-12-10 23:36:50 +00:00
|
|
|
bool PackStream::bindToFile(const string &filepath, bool write) {
|
2015-11-09 21:30:46 +00:00
|
|
|
if (not file) {
|
2013-12-10 21:32:58 +00:00
|
|
|
file = new QFile(QString::fromStdString(filepath));
|
2015-11-09 21:30:46 +00:00
|
|
|
if (not file->open(write ? QIODevice::WriteOnly : QIODevice::ReadOnly)) {
|
2013-11-03 12:00:31 +00:00
|
|
|
return false;
|
|
|
|
}
|
2013-10-30 11:46:18 +00:00
|
|
|
|
2015-08-13 21:46:50 +00:00
|
|
|
QDataStream *new_stream = new QDataStream(file);
|
2015-11-09 21:30:46 +00:00
|
|
|
if (new_stream) {
|
2015-08-13 21:46:50 +00:00
|
|
|
delete stream;
|
|
|
|
stream = new_stream;
|
|
|
|
stream->setVersion(QDataStream::Qt_5_2);
|
|
|
|
return true;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-08-13 21:46:50 +00:00
|
|
|
return false;
|
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-08-13 21:46:50 +00:00
|
|
|
return false;
|
2013-10-30 11:46:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::write(const int *value) {
|
|
|
|
if (value) {
|
2013-10-30 11:46:18 +00:00
|
|
|
*stream << *value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::write(const double *value) {
|
|
|
|
if (value) {
|
2013-10-30 11:46:18 +00:00
|
|
|
*stream << *value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::write(const char *value, int max_length) {
|
|
|
|
if (value) {
|
2013-10-30 11:46:18 +00:00
|
|
|
int length = qstrlen(value);
|
|
|
|
*stream << QString::fromUtf8(value, length > max_length ? max_length : length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-10 23:36:50 +00:00
|
|
|
void PackStream::write(const string &value) {
|
2015-08-13 21:46:50 +00:00
|
|
|
*stream << QString::fromStdString(value);
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::writeFromBuffer(const PackStream &other, bool prepend_size) {
|
|
|
|
if (other.file) {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::error("System") << "Try to write from a substream bound to a file: "
|
|
|
|
<< other.file->fileName().toStdString() << endl;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
|
|
|
if (prepend_size) {
|
2015-08-13 21:46:50 +00:00
|
|
|
int buffer_size = (int)other.buffer->size();
|
|
|
|
write(&buffer_size);
|
|
|
|
}
|
|
|
|
stream->writeRawData(other.buffer->data(), other.buffer->size());
|
2013-10-31 16:59:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-10 23:36:50 +00:00
|
|
|
string PackStream::getBuffer() {
|
2015-11-20 00:07:31 +00:00
|
|
|
if (file) {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::error("System") << "Try to get buffer on a stream bound to a file: " << file->fileName().toStdString()
|
|
|
|
<< endl;
|
2015-11-20 00:07:31 +00:00
|
|
|
return "";
|
|
|
|
} else {
|
|
|
|
return buffer->toStdString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::read(int *value) {
|
|
|
|
if (value and not stream->atEnd()) {
|
2013-10-30 11:46:18 +00:00
|
|
|
int output;
|
|
|
|
*stream >> output;
|
|
|
|
*value = output;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::read(double *value) {
|
|
|
|
if (value and not stream->atEnd()) {
|
2013-10-30 11:46:18 +00:00
|
|
|
double output;
|
|
|
|
*stream >> output;
|
|
|
|
*value = output;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::read(char *value, int max_length) {
|
|
|
|
if (value and not stream->atEnd()) {
|
2013-10-30 11:46:18 +00:00
|
|
|
QString output;
|
|
|
|
*stream >> output;
|
|
|
|
QByteArray array = output.toUtf8();
|
|
|
|
qstrncpy(value, array.constData(), max_length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-10 23:36:50 +00:00
|
|
|
string PackStream::readString() {
|
2015-11-09 21:30:46 +00:00
|
|
|
if (not stream->atEnd()) {
|
2013-10-31 16:59:18 +00:00
|
|
|
QString output;
|
|
|
|
*stream >> output;
|
2013-12-10 21:32:58 +00:00
|
|
|
return output.toStdString();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2013-12-10 21:32:58 +00:00
|
|
|
return "";
|
2013-10-31 16:59:18 +00:00
|
|
|
}
|
|
|
|
}
|
2014-08-21 10:36:28 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::skip(const int &value, int count) {
|
2014-08-21 10:36:28 +00:00
|
|
|
stream->skipRawData(sizeof(value) * count);
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void PackStream::skip(const double &value, int count) {
|
2014-08-21 10:36:28 +00:00
|
|
|
stream->skipRawData(sizeof(value) * count);
|
|
|
|
}
|
2015-08-13 21:46:50 +00:00
|
|
|
|
2015-11-18 21:22:09 +00:00
|
|
|
void PackStream::skipBytes(int bytes) {
|
2015-08-13 21:46:50 +00:00
|
|
|
stream->skipRawData(bytes);
|
|
|
|
}
|