git-svn-id: svn://db.shs.com.ru/pip@251 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -1,26 +1,26 @@
|
||||
/*! \file pibase.h
|
||||
* \brief Base types and functions
|
||||
*
|
||||
*
|
||||
* This file implements first layer above the system and
|
||||
* 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
|
||||
|
||||
@@ -266,7 +266,7 @@ template<typename T> inline void piSwapBinary(T & f, T & s) {
|
||||
* There are some macros:
|
||||
* - \c piRoundf for "float"
|
||||
* - \c piRoundd for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp round */
|
||||
template<typename T> inline int piRound(const T & v) {return int(v >= T(0.) ? v + T(0.5) : v - T(0.5));}
|
||||
@@ -276,7 +276,7 @@ template<typename T> inline int piRound(const T & v) {return int(v >= T(0.) ? v
|
||||
* There are some macros:
|
||||
* - \c piFloorf for "float"
|
||||
* - \c piFloord for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp floor */
|
||||
template<typename T> inline int piFloor(const T & v) {return v < T(0) ? int(v) - 1 : int(v);}
|
||||
@@ -286,7 +286,7 @@ template<typename T> inline int piFloor(const T & v) {return v < T(0) ? int(v) -
|
||||
* There are some macros:
|
||||
* - \c piCeilf for "float"
|
||||
* - \c piCeild for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp ceil */
|
||||
template<typename T> inline int piCeil(const T & v) {return v < T(0) ? int(v) : int(v) + 1;}
|
||||
@@ -300,7 +300,7 @@ template<typename T> inline int piCeil(const T & v) {return v < T(0) ? int(v) :
|
||||
* - \c piAbsll for "llong"
|
||||
* - \c piAbsf for "float"
|
||||
* - \c piAbsd for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp abs */
|
||||
template<typename T> inline T piAbs(const T & v) {return (v >= T(0) ? v : -v);}
|
||||
@@ -313,7 +313,7 @@ template<typename T> inline T piAbs(const T & v) {return (v >= T(0) ? v : -v);}
|
||||
* - \c piMinll for "llong"
|
||||
* - \c piMinf for "float"
|
||||
* - \c piMind for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp min2 */
|
||||
template<typename T> inline T piMin(const T & f, const T & s) {return ((f > s) ? s : f);}
|
||||
@@ -326,7 +326,7 @@ template<typename T> inline T piMin(const T & f, const T & s) {return ((f > s) ?
|
||||
* - \c piMinll for "llong"
|
||||
* - \c piMinf for "float"
|
||||
* - \c piMind for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp min3 */
|
||||
template<typename T> inline T piMin(const T & f, const T & s, const T & t) {return ((f < s && f < t) ? f : ((s < t) ? s : t));}
|
||||
@@ -339,7 +339,7 @@ template<typename T> inline T piMin(const T & f, const T & s, const T & t) {retu
|
||||
* - \c piMaxll for "llong"
|
||||
* - \c piMaxf for "float"
|
||||
* - \c piMaxd for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp max2 */
|
||||
template<typename T> inline T piMax(const T & f, const T & s) {return ((f < s) ? s : f);}
|
||||
@@ -352,7 +352,7 @@ template<typename T> inline T piMax(const T & f, const T & s) {return ((f < s) ?
|
||||
* - \c piMaxll for "llong"
|
||||
* - \c piMaxf for "float"
|
||||
* - \c piMaxd for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp max3 */
|
||||
template<typename T> inline T piMax(const T & f, const T & s, const T & t) {return ((f > s && f > t) ? f : ((s > t) ? s : t));}
|
||||
@@ -366,7 +366,7 @@ template<typename T> inline T piMax(const T & f, const T & s, const T & t) {retu
|
||||
* - \c piClampll for "llong"
|
||||
* - \c piClampf for "float"
|
||||
* - \c piClampd for "double"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp clamp */
|
||||
template<typename T> inline T piClamp(const T & v, const T & min, const T & max) {return (v > max ? max : (v < min ? min : v));}
|
||||
@@ -387,7 +387,7 @@ template<typename T> inline void piLetobe(T * v) {piLetobe(v, sizeof(T));}
|
||||
* - \c piLetobei for "uint"
|
||||
* - \c piLetobel for "ulong"
|
||||
* - \c piLetobell for "ullong"
|
||||
*
|
||||
*
|
||||
* Example:
|
||||
* \snippet piincludes.cpp letobe */
|
||||
template<typename T> inline T piLetobe(const T & v) {T tv(v); piLetobe(&tv, sizeof(T)); return tv;}
|
||||
@@ -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