version 3.17.0
finally properly works PIIOString inside PIIOStream
This commit is contained in:
@@ -41,7 +41,18 @@ PIIOString::PIIOString(const PIString & string) {
|
||||
}
|
||||
|
||||
|
||||
void PIIOString::clear() {
|
||||
if (str) str->clear();
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
|
||||
bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode) {
|
||||
if (mode == PIIODevice::ReadWrite) {
|
||||
piCoutObj << "Error: ReadWrite mode not supported, use WriteOnly or ReadOnly";
|
||||
str = nullptr;
|
||||
return false;
|
||||
}
|
||||
str = string;
|
||||
return PIIODevice::open(mode);
|
||||
}
|
||||
@@ -53,26 +64,57 @@ bool PIIOString::open(const PIString & string) {
|
||||
}
|
||||
|
||||
|
||||
bool PIIOString::isEnd() const {
|
||||
if (!str) return true;
|
||||
if (mode_ == PIIODevice::WriteOnly)
|
||||
return pos >= str->size_s();
|
||||
else {
|
||||
str->dataUTF8();
|
||||
return pos >= static_cast<ssize_t>(str->lastDataSize());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PIIOString::seekToBegin() {
|
||||
if (!str) return;
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
|
||||
void PIIOString::seekToEnd() {
|
||||
if (!str) return;
|
||||
if (mode_ == PIIODevice::WriteOnly)
|
||||
pos = str->size_s();
|
||||
else {
|
||||
str->dataUTF8();
|
||||
pos = str->lastDataSize();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PIString PIIOString::readLine() {
|
||||
if (!canRead() || !str) return PIString();
|
||||
int np = pos;
|
||||
while (++np < str->size_s()) {
|
||||
if ((*str)[np] == '\n') break;
|
||||
auto utf8_data = str->dataUTF8();
|
||||
ssize_t utf8_size = str->lastDataSize();
|
||||
int pp = pos;
|
||||
while (++pp < utf8_size) {
|
||||
if (utf8_data[pp] == '\n') break;
|
||||
}
|
||||
PIString ret = str->mid(pos, np - pos);
|
||||
pos = piMini(np + 1, str->size_s());
|
||||
PIString ret = PIString::fromUTF8(&(utf8_data[pos]), pp - pos);
|
||||
pos = piMini(pp + 1, utf8_size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
ssize_t PIIOString::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (!canRead() || !str || max_size <= 0) return -1;
|
||||
PIString rs = str->mid(pos, max_size);
|
||||
pos += max_size;
|
||||
if (pos > str->size_s()) pos = str->size_s();
|
||||
const char * cc = rs.data();
|
||||
int ret = strlen(cc);
|
||||
memcpy(read_to, cc, ret);
|
||||
auto utf8_data = str->dataUTF8();
|
||||
ssize_t utf8_size = str->lastDataSize();
|
||||
if (pos >= utf8_size) return 0;
|
||||
int ret = piMini(max_size, utf8_size - pos);
|
||||
if (ret <= 0) return 0;
|
||||
memcpy(read_to, &(utf8_data[pos]), ret);
|
||||
pos += ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -98,6 +140,12 @@ int PIIOString::writeString(const PIString & string) {
|
||||
}
|
||||
|
||||
|
||||
ssize_t PIIOString::bytesAvailable() const {
|
||||
if (!str) return 0;
|
||||
return str->size() - pos;
|
||||
}
|
||||
|
||||
|
||||
bool PIIOString::openDevice() {
|
||||
pos = 0;
|
||||
return (str != 0);
|
||||
|
||||
@@ -39,7 +39,7 @@ class PIP_EXPORT PIIOString: public PIIODevice {
|
||||
public:
|
||||
//! \~english Contructs %PIIOString with "string" content and "mode" open mode
|
||||
//! \~russian Создает %PIIOString с содержимым "string" и режимом открытия "mode"
|
||||
explicit PIIOString(PIString * string = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite);
|
||||
explicit PIIOString(PIString * string = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadOnly);
|
||||
|
||||
//! \~english Contructs %PIIOString with "string" content only for read
|
||||
//! \~russian Создает %PIIOString с содержимым "string" только для чтения
|
||||
@@ -51,10 +51,7 @@ public:
|
||||
|
||||
//! \~english Clear content string
|
||||
//! \~russian Очищает содержимое строки
|
||||
void clear() {
|
||||
if (str) str->clear();
|
||||
pos = 0;
|
||||
}
|
||||
void clear();
|
||||
|
||||
//! \~english Open "string" content with "mode" open mode
|
||||
//! \~russian Открывает содержимое "string" с режимом открытия "mode"
|
||||
@@ -66,10 +63,7 @@ public:
|
||||
|
||||
//! \~english Returns if position is at the end of content
|
||||
//! \~russian Возвращает в конце содержимого ли позиция
|
||||
bool isEnd() const {
|
||||
if (!str) return true;
|
||||
return pos >= str->size_s();
|
||||
}
|
||||
bool isEnd() const;
|
||||
|
||||
|
||||
//! \~english Move read/write position to "position"
|
||||
@@ -78,15 +72,11 @@ public:
|
||||
|
||||
//! \~english Move read/write position to the beginning of the string
|
||||
//! \~russian Перемещает позицию чтения/записи на начало строки
|
||||
void seekToBegin() {
|
||||
if (str) pos = 0;
|
||||
}
|
||||
void seekToBegin();
|
||||
|
||||
//! \~english Move read/write position to the end of the string
|
||||
//! \~russian Перемещает позицию чтения/записи на конец строки
|
||||
void seekToEnd() {
|
||||
if (str) pos = str->size_s();
|
||||
}
|
||||
void seekToEnd();
|
||||
|
||||
|
||||
//! \~english Read one text line and return it
|
||||
@@ -97,12 +87,7 @@ public:
|
||||
//! \~russian Вставляет строку "string" в содержимое буфера в текущую позицию
|
||||
int writeString(const PIString & string);
|
||||
|
||||
ssize_t bytesAvailable() const override {
|
||||
if (str)
|
||||
return str->size() - pos;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
ssize_t bytesAvailable() const override;
|
||||
|
||||
protected:
|
||||
bool openDevice() override;
|
||||
|
||||
@@ -770,8 +770,8 @@ void PISerial::applySettings() {
|
||||
GetCommMask(PRIVATE->hCom, &PRIVATE->mask);
|
||||
SetCommMask(PRIVATE->hCom, EV_RXCHAR);
|
||||
GetCommState(PRIVATE->hCom, &PRIVATE->sdesc);
|
||||
piCoutObj << PRIVATE->sdesc.fBinary << PRIVATE->sdesc.fAbortOnError << PRIVATE->sdesc.fDsrSensitivity << PRIVATE->sdesc.fDtrControl
|
||||
<< PRIVATE->sdesc.fDummy2 << PRIVATE->sdesc.fErrorChar;
|
||||
// piCoutObj << PRIVATE->sdesc.fBinary << PRIVATE->sdesc.fAbortOnError << PRIVATE->sdesc.fDsrSensitivity << PRIVATE->sdesc.fDtrControl
|
||||
// << PRIVATE->sdesc.fDummy2 << PRIVATE->sdesc.fErrorChar;
|
||||
PRIVATE->desc = PRIVATE->sdesc;
|
||||
PRIVATE->desc.DCBlength = sizeof(PRIVATE->desc);
|
||||
PRIVATE->desc.BaudRate = convertSpeed(outSpeed());
|
||||
|
||||
Reference in New Issue
Block a user