# PIP: PIPacketExtractor Class Reference

PIPacketExtractor Class Reference

Packets extractor. More...

Inheritance diagram for PIPacketExtractor:
[legend]

## Public Types

enum | SplitMode { None, Header, Footer, HeaderAndFooter, Size, Timeout }
| Extract algorithms. More...
Public Types inherited from PIIODevice
enum | DeviceMode { ReadOnly = 0x01, WriteOnly = 0x02, ReadWrite = 0x03 }
| Open modes for PIIODevice. More...
Public Types inherited from PIThread
enum | Priority { piLowerst, piLow, piNormal, piHigh, piHighest }
| Priority of thread. More...

## Public Member Functions

| PIPacketExtractor (PIIODevice *device_=0, SplitMode mode=None)
| Contructs extractor with child device "device_" and extract algorithm "mode".
PIIODevice * | device ()
| Returns child device.
void | setDevice (PIIODevice *device_)
| Set child device to "device_".
int | bufferSize () const
| Returns buffer size.
void | setBufferSize (int new_size)
| Set buffer size to "new_size" bytes, should be at least greater than whole packet size.
void | setSplitMode (SplitMode mode)
| Set extract algorithm.
void | setPayloadSize (int size)
| Set payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms.
void | setHeader (const PIByteArray &data)
| Set header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms.
void | setFooter (const PIByteArray &data)
| Set footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms.
void | setPacketSize (int size)
| Set packet size, used for PIPacketExtractor::Size algorithm.
void | setTimeout (double msecs)
| Set timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm.
SplitMode | splitMode () const
| Returns current extract algorithm.
int | payloadSize () const
| Returns current payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms.
PIByteArray | header () const
| Returns current header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms.
PIByteArray | footer () const
| Returns current footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms.
int | packetSize () const
| Returns current packet size, used for PIPacketExtractor::Size algorithm.
double | timeout () const
| Returns current timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm.
ullong | missedBytes () const
| Returns missed by validating functions bytes count.
const ullong * | missedBytes_ptr () const
| Returns pointer to missedBytes() count. Useful for output to PIConsole.
int | read (void *read_to, int max_size)
| Directly call read() function of child device.
int | write (const void *data, int max_size)
| Directly call write() function of child device.
PIString | constructFullPath () const
| Reimplement to construct full unambiguous string, describes this device, default returns fullPathPrefix() + "://" + path()
Public Member Functions inherited from PIIODevice
| PIIODevice ()
| Constructs a empty PIIODevice.
| PIIODevice (const PIString &path, DeviceMode mode=ReadWrite)
| Constructs a PIIODevice with path and mode. More...
DeviceMode | mode () const
| Current open mode of device.
void | setMode (DeviceMode m)
| Set open mode of device.
PIString | path () const
| Current path of device.
void | setPath (const PIString &path)
| Set path of device.
bool | isReadable () const
| Return true if mode is ReadOnly or ReadWrite.
bool | isWriteable () const
| Return true if mode is WriteOnly or ReadWrite.
bool | isOpened () const
| Return true if device is successfully opened.
bool | isClosed () const
| Return true if device is closed.
virtual bool | canRead () const
| Return true if device can read now.
virtual bool | canWrite () const
| Return true if device can write now.
void | setReopenEnabled (bool yes=true)
| Set execution of open enabled while threaded read on closed device.
void | setReopenTimeout (int msecs)
| Set timeout in milliseconds between open tryings if reopen is enabled.
bool | isReopenEnabled () const
| Return reopen enable.
int | reopenTimeout ()
| Return reopen timeout.
void | setThreadedReadSlot (ReadRetFunc func)
| Set "threaded read slot". More...
void | setThreadedReadData (void *d)
| Set custom data that will be passed to "threaded read slot".
void | setThreadedReadBufferSize (int new_size)
| Set size of threaded read buffer. More...
int | threadedReadBufferSize () const
| Return size of threaded read buffer.
const uchar * | threadedReadBuffer () const
| Return content of threaded read buffer.
void * | threadedReadData () const
| Return custom data that will be passed to "threaded read slot".
bool | isThreadedRead () const
| Return true if threaded read is started.
void | startThreadedRead ()
| Start threaded read.
void | startThreadedRead (ReadRetFunc func)
| Start threaded read and assign "threaded read slot" to "func".
void | stopThreadedRead ()
| Stop threaded read.
bool | isThreadedWrite () const
| Return true if threaded write is started.
void | startThreadedWrite ()
| Start threaded write.
void | stopThreadedWrite ()
| Stop threaded write.
void | clearThreadedWriteQueue ()
| Clear threaded write task queue.
void | start ()
| Start both threaded read and threaded write.
void | stop (bool wait=false)
| Stop both threaded read and threaded write and if "wait" block until both threads are stop.
PIByteArray | read (int max_size)
| Read from device maximum "max_size" bytes and return them as PIByteArray.
PIByteArray | readForTime (double timeout_ms)
| Read from device for "timeout_ms" milliseconds and return readed data as PIByteArray. Timeout should to be greater than 0.
int | write (const PIByteArray &data)
| Write "data" to device.
ullong | writeThreaded (const void *data, int max_size)
| Add task to threaded write queue and return task ID.
ullong | writeThreaded (const PIByteArray &data)
| Add task to threaded write queue and return task ID.
bool | configure (const PIString &config_file, const PIString &section, bool parent_section=false)
| Configure device from section "section" of file "config_file", if "parent_section" parent section also will be read.
bool | open ()
| Open device.
bool | open (const PIString &_path)
| Open device with path "path".
bool | open (const DeviceMode &_mode)
| Open device with mode "mode".
bool | open (const PIString &_path, const DeviceMode &_mode)
| Open device with path "path" and mode "mode".
bool | close ()
| Close device.
bool | initialize ()
| Initialize device.
virtual void | flush ()
| Immediate write all buffers.
void | opened ()
| Raise if succesfull open.
void | closed ()
| Raise if succesfull close.
void | threadedReadEvent (uchar *readed, int size)
| Raise if read thread succesfull read some data.
void | threadedWriteEvent (ullong id, int written_size)
| Raise if write thread succesfull write some data of task with ID "id".
Public Member Functions inherited from PIThread
| PIThread (void *data, ThreadFunc func, bool startNow=false, int loop_delay=-1)
| Contructs thread with custom data "data", external function "func" and main loop delay "loop_delay".
| PIThread (bool startNow=false, int loop_delay=-1)
| Contructs thread with main loop delay "loop_delay".
void | setData (void *d)
| Set common data passed to external function.
void | setSlot (ThreadFunc func)
| Set external function that will be executed after every run()
void | setPriority (PIThread::Priority prior)
| Set priority of thread.
void * | data () const
| Returns common data passed to external function.
PIThread::Priority | priority () const
| Return priority of thread.
bool | isRunning () const
| Return `true` if thread is running.
void | needLockRun (bool need)
| Set necessity of lock every run with internal mutex.
PIMutex & | mutex ()
| Return internal mutex.
bool | start (int timer_delay)
| Start thread. More...
bool | start (ThreadFunc func, int timer_delay)
| Start thread. More...
bool | startOnce ()
| Start thread without internal loop. More...
bool | startOnce (ThreadFunc func)
| Start thread without internal loop. More...
void | stop (bool wait)
| Stop thread. More...
void | terminate ()
| Strongly stop thread. More...
bool | waitForStart (int timeout_msecs)
| Wait for thread start. More...
bool | waitForFinish (int timeout_msecs)
| Wait for thread finish. More...
void | lock ()
| Lock internal mutex.
void | unlock ()
| Unlock internal mutex.
void | started ()
| Raise on thread start.
void | stopped ()
| Raise on thread stop.
Public Member Functions inherited from PIObject
| PIObject (const PIString &name=PIString())
| Contructs PIObject with name "name".
PIString | name () const
| Returns object name.
virtual const char * | className () const
| Returns object class name.
virtual const char * | superClassName () const
| Returns object superclass name.
bool | debug () const
| Return if debug of this object is active.
void | setName (const PIString &name)
| Set object name.
void | setDebug (bool debug)
| Set object debug active.
const PIMap< PIString, PIVariant > & | properties () const
| Returns properties of the object.
int | propertiesCount () const
| Returns properties count of the object.
PIVariant | property (const PIString &name) const
| Returns property with name "name".
void | setProperty (const PIString &name, const PIVariant &value)
| Set property with name "name" to "value". If there is no such property in object it will be added.
bool | isPropertyExists (const PIString &name) const
| Returns if property with name "name" exists.

## Protected Member Functions

virtual bool | validateHeader (uchar *src, uchar *rec, int size)
| Function to validate header. More...
virtual bool | validateFooter (uchar *src, uchar *rec, int size)
| Function to validate footer. More...
virtual bool | validatePayload (uchar *rec, int size)
| Function to validate payload. More...
Protected Member Functions inherited from PIIODevice
virtual bool | init ()
| Function executed before first openDevice() or from constructor.
virtual bool | configureDevice (const void *e_main, const void *e_parent=0)
| Reimplement to configure device from entries "e_main" and "e_parent", cast arguments to PIConfig::Entry*.
virtual bool | closeDevice ()
| Reimplement to close device, inverse return value will be set to "opened_" variable.
virtual void | configureFromFullPath (const PIString &full_path)
| Reimplement to configure your device with parameters of full unambiguous string. Default implementation does nothing.
Protected Member Functions inherited from PIObject
PIObject * | emitter () const
| Returns PIObject* which has raised an event. This value is correct only in definition of some event handler.
void | deleted ()
| Raise before object delete. More...

## Events

void | packetReceived (uchar *data, int size)
| Raise on successfull packetValidate() function.

## Additional Inherited Members

Static Public Member Functions inherited from PIIODevice
static PIIODevice * | createFromFullPath (const PIString &full_path)
| Try to determine suitable device, create new one, configure it with configureFromFullPath() and returns it. More...
Static Public Member Functions inherited from PIObject
static void | piDisconnect (PIObject *src, const PIString &sig)
| Disconnect object "src" from all connections with event name "sig".
static void | piDisconnect (PIObject *src)
| Disconnect object "src" from all connections, i.e. all connections where object "src" is emitter.
static PIObject * | findByName (const PIString &name)
| Returns PIObject* with name "name" or 0, if there is no object found.
Public Attributes inherited from PIIODevice
bool | reopenEnabled
| setReopenEnabled, default "true"
int | reopenTimeout
| setReopenTimeout in ms, default 1000
int | threadedReadBufferSize
| setThreadedReadBufferSize in bytes, default 4096
Related Functions inherited from PIIODevice
template<typename T >
T | readDeviceSetting (const PIString &name, const T &def, const PIConfig::Entry *em, const PIConfig::Entry *ep)
| Service function. useful for configuring devices. More...
#define | REGISTER_DEVICE(class)
| Use this macro to enable automatic creation instances of your class with createFromFullPath() function.
#define | PIIODEVICE(class)
| Use this macro instead of PIOBJECT when describe your own PIIODevice.
Related Functions inherited from PIObject
#define | piCoutObj
| Macro used for conditional (piDebug and PIObject::debug()) output to PICout for subclasses of PIObject.
#define | PIOBJECT(name)
| you should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutObj output
#define | PIOBJECT_SUBCLASS(name, parent)
| you should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class
#define | EVENT_HANDLER0(ret, name) ret name()
| declare event handler "event" with name "name" and return type "ret", ret name()
#define | EVENT_HANDLER1(ret, name, type0, var0) ret name(type0 var0)
| declare event handler "event" with name "name" and return type "ret", ret name(type0 var0)
#define | EVENT_HANDLER2(ret, name, type0, var0, type1, var1) ret name(type0 var0, type1 var1)
| declare event handler "event" with name "name" and return type "ret", ret name(type0 var0, type1 var1)
#define | EVENT_HANDLER3(ret, name, type0, var0, type1, var1, type2, var2) ret name(type0 var0, type1 var1, type2 var2)
| declare event handler "event" with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2)
#define | EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) ret name(type0 var0, type1 var1, type2 var2, type3 var3)
| declare event handler "event" with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2, type3 var3)
#define | EVENT_HANDLER EVENT_HANDLER0
| EVENT_HANDLER is synonym of EVENT_HANDLER0.
#define | EVENT_VHANDLER0(ret, name) virtual ret name()
| declare virtual event handler "event" with name "name" and return type "ret", virtual ret name()
#define | EVENT_VHANDLER1(ret, name, type0, var0) virtual ret name(type0 var0)
| declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0)
#define | EVENT_VHANDLER2(ret, name, type0, var0, type1, var1) virtual ret name(type0 var0, type1 var1)
| declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1)
#define | EVENT_VHANDLER3(ret, name, type0, var0, type1, var1, type2, var2) virtual ret name(type0 var0, type1 var1, type2 var2)
| declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2)
#define | EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
| declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
#define | EVENT_VHANDLER EVENT_VHANDLER0
| EVENT_VHANDLER is synonym of EVENT_VHANDLER0.
#define | EVENT0(name) void name();
| declare event "event" with name "name", void name();
#define | EVENT1(name, type0, var0) void name(type0 var0);
| declare event "event" with name "name", void name(type0 var0);
#define | EVENT2(name, type0, var0, type1, var1) void name(type0 var0, type1 var1);
| declare event "event" with name "name", void name(type0 var0, type1 var1);
#define | EVENT3(name, type0, var0, type1, var1, type2, var2) void name(type0 var0, type1 var1, type2 var2);
| declare event "event" with name "name", void name(type0 var0, type1 var1, type2 var2);
#define | EVENT4(name, type0, var0, type1, var1, type2, var2, type3, var3) void name(type0 var0, type1 var1, type2 var2, type3 var3);
| declare event "event" with name "name", void name(type0 var0, type1 var1, type2 var2, type3 var3);
#define | EVENT EVENT0
| EVENT is synonym of EVENT0.
#define | CONNECTU(src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler". "Event" and "handler" must has equal argument lists.
#define | CONNECT0(ret, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
#define | CONNECT1(ret, type0, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
#define | CONNECT2(ret, type0, type1, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
#define | CONNECT3(ret, type0, type1, type2, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
#define | CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
#define | CONNECT CONNECT0
| CONNECT is synonym of CONNECT0.
#define | WEAK_CONNECT0(ret, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
#define | WEAK_CONNECT1(ret, type0, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
#define | WEAK_CONNECT2(ret, type0, type1, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
#define | WEAK_CONNECT3(ret, type0, type1, type2, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
#define | WEAK_CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
| connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
#define | WEAK_CONNECT WEAK_CONNECT0
| WEAK_CONNECT is synonym of WEAK_CONNECT0.
#define | DISCONNECT0(ret, src, event, dest, handler)
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
#define | DISCONNECT1(ret, type0, src, event, dest, handler)
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
#define | DISCONNECT2(ret, type0, type1, src, event, dest, handler)
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
#define | DISCONNECT3(ret, type0, type1, type2, src, event, dest, handler)
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
#define | DISCONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
#define | DISCONNECT DISCONNECT0
| DISCONNECT is synonym of DISCONNECT0.
#define | HANDLER(handler)
| Returns pointer to events handler "handler".

## Detailed Description

Packets extractor.

# Synopsis

This class implements packet recognition by various algorithms and custom validating from data stream. Stream is formed from child PIIODevice passed from contructor or with function setDevice().

# Principle of work

PIPacketExtractor works with child PIIODevice. read and write functions directly call child device functions. You should start threaded read of extractor (not child device) to proper work. Extractor read data from child device, try to detect packet from readed data and raise packetReceived() event on success.

# Algorithms

There are 6 algorithms:

- PIPacketExtractor::None
  Packet is successfully received on every read without any validation.
- PIPacketExtractor::Header
  Wait for at least header() bytes + payloadSize(), then validate header with virtual function validateHeader() and if it fail, shifts for next 1 byte. If header is successfully validated check payload with function validatePayload() and if it fail, shifts for next 1 byte. If all validations were successful raise packetReceived() event.
- PIPacketExtractor::Footer
  This algorithm similar to previous, but instead of header() first validate footer() at after payloadSize() bytes with function validateFooter().
- PIPacketExtractor::HeaderAndFooter
  Wait for at least header() bytes + footer() bytes, then validate header with virtual function validateHeader() and if it fail, shifts for next 1 byte. If header is successfully validated check footer with function validateFooter() and if it fail, shifts footer position for next 1 byte. Then validate payload and if it fail, search header again, starts from next byte of previous header. If all validations were successful raise packetReceived() event.
- PIPacketExtractor::Size
  Wait for at least packetSize() bytes, then validate packet with function validatePayload() and if it fail, shifts for next 1 byte. If validating was successfull raise packetReceived() event.
- PIPacketExtractor::Timeout
  Wait for first read, then read for timeout() milliseconds and raise packetReceived() event.

# Control validating

There are three parameters:

- header content
- header size
- payload size

Extractor can detect packet with compare your header with readed data. It is default implementation of function packetHeaderValidate(). If header validating passed, function packetValidate() will be called. If either of this function return false extractor shifts by one byte and takes next header. If both functions returns true extractor shifts by whole packet size.

## Member Enumeration Documentation

enum PIPacketExtractor::SplitMode

Extract algorithms.

Enumerator
None | No data processing
Header | Detect packets with header() and following payloadSize()
Footer | Detect packets with footer() and leading payloadSize()
HeaderAndFooter | Detect packets with header() and footer() without payloadSize()
Size | Detect packets with packetSize()
Timeout | Wait for first read, then read for timeout() milliseconds

## Member Function Documentation

virtual bool PIPacketExtractor::validateHeader | ( | uchar * | src,
|  | uchar * | rec,
|  | int | size
| ) |  |

inlineprotectedvirtual

Function to validate header.

Parameters

  src | Your header content
  rec | Received header
  size | Header size

Default implementation returns by-byte "src" with "rec" compare result

virtual bool PIPacketExtractor::validateFooter | ( | uchar * | src,
|  | uchar * | rec,
|  | int | size
| ) |  |

inlineprotectedvirtual

Function to validate footer.

Parameters

  src | Your footer content
  rec | Received footer
  size | Footer size

Default implementation returns by-byte "src" with "rec" compare result

virtual bool PIPacketExtractor::validatePayload | ( | uchar * | rec,
|  | int | size
| ) |  |

inlineprotectedvirtual

Function to validate payload.

Parameters

  rec | Received payload
  size | payload size

Default implementation returns true