git-svn-id: svn://db.shs.com.ru/pip@251 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -5,22 +5,22 @@
|
||||
* declares some basic useful functions
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Base types and functions
|
||||
Copyright (C) 2016 Ivan Pelipenko peri4ko@yandex.ru
|
||||
PIP - Platform Independent Primitives
|
||||
Base types and functions
|
||||
Copyright (C) 2016 Ivan Pelipenko peri4ko@yandex.ru
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef PIBASE_H
|
||||
@@ -176,9 +176,9 @@
|
||||
# pragma warning(disable: 4986)
|
||||
# pragma warning(disable: 4996)
|
||||
# ifdef ARCH_BITS_32
|
||||
typedef long ssize_t;
|
||||
typedef long ssize_t;
|
||||
# else
|
||||
typedef long long ssize_t;
|
||||
typedef long long ssize_t;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -395,6 +395,11 @@ template<typename T> inline T piLetobe(const T & v) {T tv(v); piLetobe(&tv, size
|
||||
// specialization
|
||||
template<> inline ushort piLetobe(const ushort & v) {return (v << 8) | (v >> 8);}
|
||||
template<> inline uint piLetobe(const uint & v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);}
|
||||
template<> inline float piLetobe(const float & f) {
|
||||
uint v = *((uint *)&f);
|
||||
v = (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);
|
||||
return *((float *)&v);
|
||||
}
|
||||
|
||||
DEPRECATED inline ushort letobe_s(const ushort & v) {return (v << 8) | (v >> 8);}
|
||||
DEPRECATED inline uint letobe_i(const uint & v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);}
|
||||
@@ -443,6 +448,7 @@ uint letobe_i(uint v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF
|
||||
#define piLetobei piLetobe<uint>
|
||||
#define piLetobel piLetobe<ulong>
|
||||
#define piLetobell piLetobe<ullong>
|
||||
#define piLetobef piLetobe<float>
|
||||
|
||||
|
||||
#endif // PIBASE_H
|
||||
|
||||
@@ -828,12 +828,6 @@ void PIConnection::stopAllSenders() {
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::destroy() {
|
||||
stop();
|
||||
removeAllDevices();
|
||||
}
|
||||
|
||||
|
||||
PIDiagnostics * PIConnection::diagnostic(const PIString & full_path_name) const {
|
||||
PIIODevice * dev = deviceByFullPath(full_path_name);
|
||||
if (dev == 0) dev = device_names.value(full_path_name, 0);
|
||||
|
||||
@@ -246,7 +246,8 @@ public:
|
||||
//! Stop all read threads and senders
|
||||
void stop() {stopAllThreadedReads(); stopAllSenders();}
|
||||
|
||||
void destroy();
|
||||
//! Stop connection and remove all devices
|
||||
void destroy() {stop(); removeAllDevices();}
|
||||
|
||||
//! Returns if there are no devices in this connection
|
||||
bool isEmpty() const {return device_modes.isEmpty();}
|
||||
|
||||
@@ -105,7 +105,9 @@ void PIDiagnostics::tick(void * , int ) {
|
||||
float itr = disconn_ * (float(tcnt_recv) / history_rec.size());
|
||||
float its = disconn_ * (float(tcnt_send) / history_send.size());
|
||||
float hz = interval() / 1000.f;
|
||||
integral_freq = recv.cnt_ok / itr;
|
||||
if (tcnt_recv == 0) integral_freq = 0;
|
||||
// piCoutObj << itr << tcnt_recv << history_rec.size();
|
||||
else integral_freq = recv.cnt_ok / itr;
|
||||
packets_recv_sec = ullong(float(recv.cnt_ok) / itr);
|
||||
packets_send_sec = ullong(float(send.cnt_ok) / its);
|
||||
bytes_recv_sec = ullong(double(recv.bytes_ok) / itr);
|
||||
|
||||
95
src/io/piiobytearray.cpp
Normal file
95
src/io/piiobytearray.cpp
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
PIIODevice wrapper around PIByteArray
|
||||
Copyright (C) 2016 Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "piiobytearray.h"
|
||||
|
||||
|
||||
/*! \class PIIOByteArray
|
||||
* \brief PIIODevice wrapper around PIByteArray
|
||||
*
|
||||
* \section PIIOByteArray_sec0 Synopsis
|
||||
* This class sllow you to use PIByteArray as PIIODevice and pass it to, e.g. PIConfig
|
||||
*/
|
||||
|
||||
//REGISTER_DEVICE(PIIOByteArray);
|
||||
|
||||
|
||||
PIIOByteArray::PIIOByteArray(PIByteArray *buffer, PIIODevice::DeviceMode mode) {
|
||||
open(buffer, mode);
|
||||
}
|
||||
|
||||
|
||||
PIIOByteArray::PIIOByteArray(const PIByteArray &buffer) {
|
||||
open(buffer);
|
||||
}
|
||||
|
||||
|
||||
bool PIIOByteArray::open(PIByteArray *buffer, PIIODevice::DeviceMode mode) {
|
||||
data_ = buffer;
|
||||
mode_ = mode;
|
||||
return PIIODevice::open(mode);
|
||||
}
|
||||
|
||||
|
||||
bool PIIOByteArray::open(const PIByteArray &buffer) {
|
||||
data_ = const_cast<PIByteArray*>(&buffer);
|
||||
mode_ = PIIODevice::ReadOnly;
|
||||
return PIIODevice::open(PIIODevice::ReadOnly);
|
||||
}
|
||||
|
||||
|
||||
int PIIOByteArray::read(void * read_to, int size) {
|
||||
// piCout << "PIIOByteArray::read" << data_ << size << canRead();
|
||||
if (!canRead() || !data_) return -1;
|
||||
int ret = piMini(size, data_->size_s() - pos);
|
||||
if (ret <= 0) return -1;
|
||||
memcpy(read_to, data_->data(pos), ret);
|
||||
// piCout << "readed" << ret;
|
||||
pos += size;
|
||||
if (pos > data_->size_s()) pos = data_->size_s();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int PIIOByteArray::write(const void * data, int size) {
|
||||
// piCout << "PIIOByteArray::write" << data << size << canWrite();
|
||||
if (!canWrite() || !data) return -1;
|
||||
//piCout << "write" << data;
|
||||
if (pos > data_->size_s()) pos = data_->size_s();
|
||||
PIByteArray rs = PIByteArray(data, size);
|
||||
// piCoutObj << rs;
|
||||
data_->insert(pos, rs);
|
||||
pos += rs.size_s();
|
||||
return rs.size_s();
|
||||
}
|
||||
|
||||
|
||||
int PIIOByteArray::writeByteArray(const PIByteArray &ba) {
|
||||
if (!canWrite() || !data_) return -1;
|
||||
if (pos > data_->size_s()) pos = data_->size_s();
|
||||
data_->insert(pos, ba);
|
||||
pos += ba.size_s();
|
||||
return ba.size_s();
|
||||
}
|
||||
|
||||
|
||||
bool PIIOByteArray::openDevice() {
|
||||
pos = 0;
|
||||
return (data_ != 0);
|
||||
}
|
||||
82
src/io/piiobytearray.h
Normal file
82
src/io/piiobytearray.h
Normal file
@@ -0,0 +1,82 @@
|
||||
/*! \file piiobytearray.h
|
||||
* \brief PIIODevice wrapper around PIByteArray
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
PIIODevice wrapper around PIString
|
||||
Copyright (C) 2016 Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef PIIOBYTEARRAY_H
|
||||
#define PIIOBYTEARRAY_H
|
||||
|
||||
#include "piiodevice.h"
|
||||
|
||||
|
||||
class PIP_EXPORT PIIOByteArray: public PIIODevice
|
||||
{
|
||||
PIIODEVICE(PIIOByteArray)
|
||||
public:
|
||||
|
||||
//! Contructs %PIIOByteArray with \"buffer\" content and \"mode\" open mode
|
||||
PIIOByteArray(PIByteArray * buffer = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite);
|
||||
|
||||
//! Contructs %PIIOByteArray with \"buffer\" content only for read
|
||||
PIIOByteArray(const PIByteArray & buffer);
|
||||
|
||||
~PIIOByteArray() {closeDevice();}
|
||||
|
||||
//! Returns content
|
||||
PIByteArray * byteArray() const {return data_;}
|
||||
|
||||
//! Clear content buffer
|
||||
void clear() {if (data_) data_->clear(); pos = 0;}
|
||||
|
||||
//! Open \"buffer\" content with \"mode\" open mode
|
||||
bool open(PIByteArray * buffer, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite);
|
||||
|
||||
//! Open \"buffer\" content only for read
|
||||
bool open(const PIByteArray & buffer);
|
||||
|
||||
//! Returns if position is at the end of content
|
||||
bool isEnd() const {if (!data_) return true; return pos >= data_->size_s();}
|
||||
|
||||
|
||||
//! Move read/write position to \"position\"
|
||||
void seek(llong position) {pos = position;}
|
||||
|
||||
//! Move read/write position to the begin of the string
|
||||
void seekToBegin() {if (data_) pos = 0;}
|
||||
|
||||
//! Move read/write position to the end of the string
|
||||
void seekToEnd() {if (data_) pos = data_->size_s();}
|
||||
|
||||
|
||||
int read(void * read_to, int size);
|
||||
int write(const void * data_, int size);
|
||||
|
||||
//! Insert data \"ba\" into content at current position
|
||||
int writeByteArray(const PIByteArray & ba);
|
||||
|
||||
protected:
|
||||
bool openDevice();
|
||||
|
||||
ssize_t pos;
|
||||
PIByteArray * data_;
|
||||
|
||||
};
|
||||
|
||||
#endif // PIIOBYTEARRAY_H
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "pibinarylog.h"
|
||||
#include "pifiletransfer.h"
|
||||
#include "piiostring.h"
|
||||
#include "piiobytearray.h"
|
||||
#include "pipeer.h"
|
||||
#include "pipacketextractor.h"
|
||||
#include "piprotocol.h"
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
//REGISTER_DEVICE(PIIOString);
|
||||
|
||||
|
||||
PIIOString::PIIOString(PIString * string, PIIODevice::DeviceMode mode_) {
|
||||
open(string, mode_);
|
||||
PIIOString::PIIOString(PIString * string, PIIODevice::DeviceMode mode) {
|
||||
open(string, mode);
|
||||
}
|
||||
|
||||
|
||||
@@ -40,9 +40,9 @@ PIIOString::PIIOString(const PIString & string) {
|
||||
}
|
||||
|
||||
|
||||
bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode_) {
|
||||
bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode) {
|
||||
str = string;
|
||||
return PIIODevice::open(mode_);
|
||||
return PIIODevice::open(mode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
int bufferSize() const {return buffer_size;}
|
||||
|
||||
//! Set buffer size to "new_size" bytes, should be at least greater than whole packet size
|
||||
void setBufferSize(int new_size) {buffer_size = new_size; buffer.resize(buffer_size); sbuffer.resize(buffer_size); memset(buffer.data(), 0, buffer.size()); memset(sbuffer.data(), 0, sbuffer.size());}
|
||||
void setBufferSize(int new_size) {buffer_size = new_size; buffer.resize(buffer_size); memset(buffer.data(), 0, buffer.size());}
|
||||
|
||||
void setHeaderCheckSlot(PacketExtractorCheckFunc f) {ret_func_header = f;}
|
||||
void setFooterCheckSlot(PacketExtractorCheckFunc f) {ret_func_footer = f;}
|
||||
@@ -167,7 +167,7 @@ private:
|
||||
bool openDevice() {if (dev == 0) return false; return dev->open();}
|
||||
|
||||
PIIODevice * dev;
|
||||
PIByteArray buffer, sbuffer, tmpbuf, src_header, src_footer, trbuf;
|
||||
PIByteArray buffer, tmpbuf, src_header, src_footer, trbuf;
|
||||
PacketExtractorCheckFunc ret_func_header, ret_func_footer;
|
||||
SplitMode mode_;
|
||||
void * data;
|
||||
|
||||
@@ -147,7 +147,6 @@ PIPeer::PIPeer(const PIString & n): PIIODevice() {
|
||||
prev_ifaces = PIEthernet::interfaces();
|
||||
no_timer = false;
|
||||
// initNetwork();
|
||||
sendSelfInfo();
|
||||
sync_timer.addDelimiter(5);
|
||||
sync_timer.start(1000);
|
||||
}
|
||||
@@ -835,6 +834,7 @@ void PIPeer::reinit() {
|
||||
PIMutexLocker pl(peers_mutex);
|
||||
PIMutexLocker sl(send_mutex);
|
||||
initNetwork();
|
||||
sendSelfInfo();
|
||||
// eth_send.close();
|
||||
// eth_lo.stopThreadedRead();
|
||||
// eth_lo.close();
|
||||
|
||||
Reference in New Issue
Block a user