PIP 5.6.1
Platform-Independent Primitives
Public Types | Public Member Functions | Protected Member Functions | List of all members
PIPacketExtractor Class Reference

Extracts packets from data produced by a child PIIODevice. The PIPacketExtractor class provides packet recognition from data stream using various algorithms. More...

#include <pipacketextractor.h>

Inheritance diagram for PIPacketExtractor:
Inheritance graph
[legend]

Public Types

enum  SplitMode {
  None , Header , Footer , HeaderAndFooter ,
  Size , Timeout
}
 Packet splitting modes. More...
 
- Public Types inherited from PIIODevice
enum  DeviceMode { ReadOnly = 0x01 , WriteOnly = 0x02 , ReadWrite = 0x03 }
 Open modes for PIIODevice. More...
 
enum  DeviceOption { BlockingRead = 0x01 , BlockingWrite = 0x02 }
 Generic options supported by some devices. More...
 
enum  DeviceInfoFlag { Sequential = 0x01 , Reliable = 0x02 }
 Characteristics of the device channel. More...
 
typedef PIFlags< DeviceOptionDeviceOptions
 Bitmask of DeviceOption values.
 
typedef PIFlags< DeviceInfoFlagDeviceInfoFlags
 Bitmask of DeviceInfoFlag values.
 

Public Member Functions

 PIPacketExtractor (PIIODevice *device_=nullptr, SplitMode mode=None)
 Constructs extractor bound to "device_" and configured with split mode "mode".
 
virtual ~PIPacketExtractor ()
 Stops extractor background activity and destroys the object.
 
PIIODevicedevice ()
 Returns the current child device.
 
void setDevice (PIIODevice *device_)
 Replaces the child device with "device_".
 
ssize_t bytesAvailable () const override
 Returns unread bytes currently available from the child device.
 
void setHeaderCheckSlot (PacketExtractorHeaderFunc f)
 Sets custom header validation callback.
 
void setPayloadCheckSlot (PacketExtractorPayloadFunc f)
 Sets custom payload validation callback.
 
void setFooterCheckSlot (PacketExtractorFooterFunc f)
 Sets custom footer validation callback.
 
void setSplitMode (SplitMode mode)
 Switches packet extraction to mode "mode".
 
void setPayloadSize (int size)
 Sets fixed payload size used by the size-based extraction modes.
 
void setHeader (const PIByteArray &data)
 Sets reference header bytes.
 
void setFooter (const PIByteArray &data)
 Sets reference footer bytes.
 
void setTimeout (PISystemTime tm)
 Sets accumulation timeout for Timeout mode.
 
SplitMode splitMode () const
 Returns current packet splitting mode.
 
int payloadSize () const
 Returns configured payload size.
 
PIByteArray header () const
 Returns configured reference header.
 
PIByteArray footer () const
 Returns configured reference footer.
 
PISystemTime timeout () const
 Returns timeout used by Timeout mode.
 
ullong missedBytes () const
 Returns number of bytes skipped during resynchronization.
 
void appendData (const uchar *d, int s)
 Feeds raw bytes into the extractor. Emits packetReceived() when a complete packet is recognized.
 
void appendData (const PIByteArray &data)
 Feeds byte-array data into the extractor. Emits packetReceived() when a complete packet is recognized.
 
- Public Member Functions inherited from PIIODevice
 PIIODevice ()
 Constructs an empty PIIODevice.
 
 PIIODevice (const PIString &path, DeviceMode mode=ReadWrite)
 Constructs PIIODevice with path "path" and open mode "mode".
 
virtual ~PIIODevice ()
 Destroys the device base object.
 
DeviceMode mode () const
 Returns current open mode.
 
void setMode (DeviceMode m)
 Sets open mode without reopening the device.
 
DeviceOptions options () const
 Returns current device options.
 
bool isOptionSet (DeviceOption o) const
 Returns whether option "o" is enabled.
 
void setOptions (DeviceOptions o)
 Replaces all current device options with "o".
 
bool setOption (DeviceOption o, bool yes=true)
 Sets option "o" to "yes" and returns its previous state.
 
DeviceInfoFlags infoFlags () const
 Returns device channel characteristics.
 
PIString path () const
 Returns current device path.
 
void setPath (const PIString &path)
 Sets device path without reopening the device.
 
bool isReadable () const
 Returns whether the current mode allows reading.
 
bool isWriteable () const
 Returns whether the current mode allows writing.
 
bool isOpened () const
 Returns whether the device is currently opened.
 
bool isClosed () const
 Returns whether the device is currently closed.
 
virtual bool canRead () const
 Returns whether reading is possible right now.
 
virtual bool canWrite () const
 Returns whether writing is possible right now.
 
void setReopenEnabled (bool yes=true)
 Enables or disables automatic reopen attempts during threaded read.
 
void setReopenTimeout (PISystemTime timeout)
 Sets delay between automatic reopen attempts.
 
bool isReopenEnabled () const
 Returns whether automatic reopen is enabled.
 
PISystemTime reopenTimeout ()
 Returns delay between automatic reopen attempts.
 
void setThreadedReadSlot (ReadRetFunc func)
 Sets callback invoked after successful threaded reads. More...
 
void setThreadedReadData (void *d)
 Sets custom user data passed to threaded read callback.
 
void setThreadedReadBufferSize (int new_size)
 Sets background read buffer size in bytes. More...
 
int threadedReadBufferSize () const
 Returns background read buffer size in bytes.
 
const uchar * threadedReadBuffer () const
 Returns pointer to the internal threaded-read buffer.
 
void * threadedReadData () const
 Returns custom data passed to threaded read callback.
 
bool isThreadedRead () const
 Returns whether threaded read is running.
 
bool isThreadedReadStopping () const
 Returns whether threaded read is stopping.
 
void startThreadedRead ()
 Starts threaded read.
 
void startThreadedRead (ReadRetFunc func)
 Sets threaded read callback to "func" and starts threaded read.
 
void stopThreadedRead ()
 Requests threaded read stop.
 
void terminateThreadedRead ()
 Terminate threaded read. More...
 
bool waitThreadedReadFinished (PISystemTime timeout={})
 Waits until threaded read finishes or "timeout" expires.
 
uint threadedReadTimeout () const
 Returns delay between unsuccessful threaded read attempts in milliseconds.
 
void setThreadedReadTimeout (uint ms)
 Sets delay between unsuccessful threaded read attempts in milliseconds.
 
bool isThreadedWrite () const
 Returns whether threaded write is running.
 
void startThreadedWrite ()
 Starts threaded write.
 
void stopThreadedWrite ()
 Requests threaded write stop.
 
void terminateThreadedWrite ()
 Terminate threaded write. More...
 
bool waitThreadedWriteFinished (PISystemTime timeout={})
 Waits until threaded write finishes or "timeout" expires.
 
void clearThreadedWriteQueue ()
 Clears queued threaded-write tasks.
 
void start ()
 Starts both threaded read and threaded write.
 
void stop ()
 Requests stop for both threaded read and threaded write.
 
void stopAndWait (PISystemTime timeout={})
 Stops both background threads and waits for completion.
 
virtual void interrupt ()
 Interrupts a blocking device operation.
 
ssize_t read (void *read_to, ssize_t max_size)
 Reads at most "max_size" bytes into "read_to".
 
ssize_t read (PIMemoryBlock mb)
 Reads data into memory block "mb".
 
PIByteArray read (ssize_t max_size)
 Reads at most "max_size" bytes and returns them as PIByteArray.
 
virtual ssize_t bytesAvailable () const
 Returns the number of bytes that are available for reading. More...
 
ssize_t write (const void *data, ssize_t max_size)
 Writes at most "max_size" bytes from "data".
 
PIByteArray readForTime (PISystemTime timeout)
 Reads data for up to "timeout" and returns collected bytes.
 
ullong writeThreaded (const void *data, ssize_t max_size)
 Queues "data" for threaded write and returns task ID.
 
ullong writeThreaded (const PIByteArray &data)
 Queues byte array "data" for threaded write and returns task ID.
 
bool configure (const PIString &config_file, const PIString &section, bool parent_section=false)
 Configures the device from section "section" of file "config_file". More...
 
virtual PIConstChars fullPathPrefix () const
 Returns device prefix used in full-path notation. Creating devices by unambiguous string.
 
PIString constructFullPath () const
 Returns full-path representation of this device, fullPathPrefix() + "://" + ...
 
void configureFromFullPath (const PIString &full_path)
 Configures the device from full-path parameters.
 
PIVariantTypes::IODevice constructVariant () const
 Builds PIVariantTypes::IODevice description for this device.
 
void configureFromVariant (const PIVariantTypes::IODevice &d)
 Configures the device from PIVariantTypes::IODevice.
 
ssize_t write (const PIMemoryBlock &mb)
 Writes memory block "mb" to the device.
 
bool open ()
 Opens the device with current path and mode.
 
bool open (const PIString &_path)
 Opens the device with path "path".
 
bool open (DeviceMode _mode)
 Opens the device with mode "mode".
 
bool open (const PIString &_path, DeviceMode _mode)
 Opens the device with path "path" and mode "mode".
 
bool close ()
 Closes the device.
 
ssize_t write (PIByteArray data)
 Writes "data" to the device.
 
virtual void flush ()
 Immediately flushes device buffers.
 
void opened ()
 Raised after successful opening.
 
void closed ()
 Raised after successful closing.
 
void threadedReadEvent (const uchar *readed, ssize_t size)
 Raised after threaded read receives some data.
 
void threadedWriteEvent (ullong id, ssize_t written_size)
 Raised after threaded write processes task with ID "id".
 
- Public Member Functions inherited from PIObject
 PIObject (const PIString &name=PIString())
 Constructs an object and initializes its name property.
 
virtual ~PIObject ()
 Destroys the object, raises deleted() and disconnects it from the event graph.
 
PIString name () const
 Returns the name property of this object.
 
virtual const char * className () const
 Returns the registered class name of this object.
 
virtual uint classNameID () const
 Returns the hash of className().
 
virtual const char * parentClassName () const
 Returns the registered parent class name, or an empty string for the root.
 
bool debug () const
 Returns whether piCoutObj output is enabled for this object.
 
void setName (const PIString &name)
 Sets the name property of this object.
 
void setDebug (bool debug)
 Enables or disables piCoutObj output for this object.
 
PIVariant property (const char *name) const
 Returns the property with name "name".
 
void setProperty (const char *name, const PIVariant &value)
 Sets the property "name" to "value" and creates it if needed. More...
 
bool isPropertyExists (const char *name) const
 Returns whether the property "name" exists.
 
void setThreadSafe (bool yes)
 Enables or disables the internal object mutex during handler execution. More...
 
bool isThreadSafe () const
 Returns whether the internal object mutex is enabled for handler execution.
 
bool execute (const PIString &method, const PIVector< PIVariantSimple > &vl)
 Executes a registered method or handler method by name with the supplied arguments. More...
 
bool execute (const PIString &method)
 Overload of execute() for a method without arguments.
 
bool execute (const PIString &method, const PIVariantSimple &v0)
 Overload of execute() for one argument.
 
bool execute (const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Overload of execute() for two arguments.
 
bool execute (const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Overload of execute() for three arguments.
 
bool execute (const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Overload of execute() for four arguments.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVector< PIVariantSimple > &vl)
 Queues execution of a registered method on the performer object. More...
 
bool executeQueued (PIObject *performer, const PIString &method)
 Overload of executeQueued() for a method without arguments.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0)
 Overload of executeQueued() for one argument.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Overload of executeQueued() for two arguments.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Overload of executeQueued() for three arguments.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Overload of executeQueued() for four arguments.
 
void dump (const PIString &line_prefix=PIString()) const
 Dumps object diagnostics to the project output stream.
 
PIStringList scopeList () const
 Returns the registered inheritance scope of this object, including its own class.
 
PIStringList methodsEH () const
 Returns full signatures of all registered event and handler methods for this class scope.
 
bool isMethodEHContains (const PIString &name) const
 Returns whether a registered event or handler method with this name exists.
 
PIString methodEHArguments (const PIString &name) const
 Returns the comma-separated argument type list of a registered method.
 
PIString methodEHFullFormat (const PIString &name) const
 Returns the full registered signature of a method.
 
PIString methodEHFromAddr (const void *addr) const
 Returns the registered method name for the specified entry-point address.
 
void piDisconnect (const PIString &sig, PIObject *dest, void *ev_h)
 Disconnects this source object from a specific destination handler for event "sig".
 
void piDisconnect (const PIString &sig, PIObject *dest)
 Disconnects this source object from all connections of event "sig" to destination object "dest".
 
void piDisconnect (const PIString &sig)
 Disconnects this source object from all connections of event "sig".
 
bool isPIObject () const
 Returns whether this pointer still refers to a live PIObject instance.
 
template<typename T >
bool isTypeOf () const
 Returns whether this object belongs to class "T" or one of its registered descendants.
 
template<typename T >
T * cast () const
 Returns this object cast to "T" when isTypeOf<T>() succeeds, otherwise nullptr.
 
void callQueuedEvents ()
 Executes all queued deliveries posted to this performer object.
 
bool maybeCallQueuedEvents ()
 Executes queued deliveries only when this object was used as a performer. More...
 
void deleteLater ()
 Schedules the object for deferred deletion. More...
 
void deleted (PIObject *o)
 Raised immediately before object destruction. More...
 

Protected Member Functions

virtual int validateHeader (const uchar *src, const uchar *rec, int size)
 Validates packet header and optionally returns payload size. More...
 
virtual bool validateFooter (const uchar *src, const uchar *rec, int size)
 Validates packet footer. The default implementation compares "src" and "rec" byte by byte.
 
virtual bool validatePayload (const uchar *rec, int size)
 Validates packet payload. The default implementation accepts any payload.
 
- Protected Member Functions inherited from PIIODevice
virtual bool configureDevice (const void *e_main, const void *e_parent=0)
 Reimplement to configure the device from "e_main" and optional "e_parent" entries cast to PIConfig::Entry*.
 
virtual bool openDevice ()=0
 Reimplement to open device, return value will be set to "opened_" variable. Don't call this function in subclass, use open()!
 
virtual bool closeDevice ()
 Reimplement to close the device; inverse return value is stored into "opened_".
 
virtual ssize_t readDevice (void *read_to, ssize_t max_size)
 Reimplement this function to read from your device.
 
virtual ssize_t writeDevice (const void *data, ssize_t max_size)
 Reimplement this function to write to your device.
 
virtual bool threadedRead (const uchar *readed, ssize_t size)
 Called after threaded read receives data; default implementation calls the external callback set by setThreadedReadSlot().
 
virtual PIString constructFullPathDevice () const
 Reimplement to build device-specific part of full-path string. Default implementation returns path().
 
virtual void configureFromFullPathDevice (const PIString &full_path)
 Reimplement to configure the device from device-specific full-path parameters. Default implementation calls setPath().
 
virtual PIPropertyStorage constructVariantDevice () const
 Reimplement to build device-specific variant properties. Default implementation returns PIPropertyStorage with "path".
 
virtual void configureFromVariantDevice (const PIPropertyStorage &d)
 Reimplement to configure the device from PIPropertyStorage. Mode and options are already applied. Default implementation applies "path".
 
virtual void optionsChanged ()
 Reimplement to react to changed device options.
 
virtual DeviceInfoFlags deviceInfoFlags () const
 Reimplement to report actual DeviceInfoFlags. Default implementation returns 0.
 
virtual void threadedReadBufferSizeChanged ()
 Reimplement to react to new threadedReadBufferSize().
 
- Protected Member Functions inherited from PIObject
PIObjectemitter () const
 Returns the source object that raised the current event. More...
 
virtual void propertyChanged (const char *name)
 Virtual method called after property "name" has been changed by setProperty().
 

Events

void packetReceived (const uchar *data, int size)
 Emitted when the current input chunk passes the configured extraction rules.
 

Additional Inherited Members

- Static Public Member Functions inherited from PIIODevice
static PIIODevicecreateFromFullPath (const PIString &full_path)
 Try to create new device by prefix, configure it with configureFromFullPath() and returns it. More...
 
static PIIODevicecreateFromVariant (const PIVariantTypes::IODevice &d)
 Try to create new device by prefix, configure it with configureFromVariant() and returns it.
 
static PIString normalizeFullPath (const PIString &full_path)
 Returns normalized full-path representation for "full_path".
 
static void splitFullPath (PIString fpwm, PIString *full_path, DeviceMode *mode=0, DeviceOptions *opts=0)
 Splits full-path string into path, mode and options.
 
static PIStringList availablePrefixes ()
 Returns fullPath prefixes of all registered devices.
 
static PIStringList availableClasses ()
 Returns class names of all registered devices.
 
- Static Public Member Functions inherited from PIObject
static bool execute (PIObject *o, const PIString &method, const PIVector< PIVariantSimple > &vl)
 Static convenience wrapper for execute().
 
static bool execute (PIObject *o, const PIString &method)
 Static overload of execute() without arguments.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0)
 Static overload of execute() for one argument.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Static overload of execute() for two arguments.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Static overload of execute() for three arguments.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Static overload of execute() for four arguments.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVector< PIVariantSimple > &vl)
 Static convenience wrapper for executeQueued().
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method)
 Static overload of executeQueued() without arguments.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0)
 Static overload of executeQueued() for one argument.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Static overload of executeQueued() for two arguments.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Static overload of executeQueued() for three arguments.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Static overload of executeQueued() for four arguments.
 
static PIObject::Connection piConnect (PIObject *src, const PIString &sig, PIObject *dest_o, void *dest, void *ev_h, void *e_h, int args, const char *loc)
 Low-level direct connection helper behind the legacy CONNECT* macros.
 
static PIObject::Connection piConnectU (PIObject *src, const PIString &sig, PIObject *dest_o, void *dest, const PIString &hname, const char *loc, PIObject *performer=0)
 Low-level name-based connection helper behind CONNECTU() and CONNECTU_QUEUED().
 
static PIObject::Connection piConnectLS (PIObject *src, const PIString &sig, std::function< void()> *f, const char *loc)
 Low-level helper that connects an event to a lambda or functor wrapper.
 
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest, void *ev_h)
 Disconnects source object "src" from a specific destination handler for event "sig".
 
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest)
 Disconnects source object "src" from all connections of event "sig" to destination object "dest".
 
static void piDisconnect (PIObject *src, const PIString &sig)
 Disconnects source object "src" from all connections of event "sig".
 
static void raiseEvent (PIObject *sender, const uint eventID)
 Internal event delivery helper for registered events without arguments.
 
template<typename T0 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0())
 Internal event delivery helper for registered events with one argument.
 
template<typename T0 , typename T1 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0(), const T1 &v1=T1())
 Internal event delivery helper for registered events with two arguments.
 
template<typename T0 , typename T1 , typename T2 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0(), const T1 &v1=T1(), const T2 &v2=T2())
 Internal event delivery helper for registered events with three arguments.
 
template<typename T0 , typename T1 , typename T2 , typename T3 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0(), const T1 &v1=T1(), const T2 &v2=T2(), const T3 &v3=T3())
 Internal event delivery helper for registered events with four arguments.
 
static PIObjectfindByName (const PIString &name)
 Returns the first live object with name "name", or nullptr.
 
static bool isPIObject (const PIObject *o)
 Returns whether "o" points to a live PIObject instance.
 
static bool isPIObject (const void *o)
 Overload of isPIObject() for an untyped pointer.
 
template<typename T >
static bool isTypeOf (const PIObject *o)
 Returns whether "o" belongs to class "T" or one of its registered descendants.
 
template<typename T >
static bool isTypeOf (const void *o)
 Overload of isTypeOf() for an untyped pointer.
 
static PIString simplifyType (const char *a, bool readable=true)
 Simplifies a C++ type spelling for registered-method metadata.
 
- Public Attributes inherited from PIIODevice
bool reopenEnabled
 setReopenEnabled, default "true".
 
int reopenTimeout
 setReopenTimeout, default 1_s.
 
int threadedReadBufferSize
 setThreadedReadBufferSize in bytes, default 4096.
 

Detailed Description

Extracts packets from data produced by a child PIIODevice. The PIPacketExtractor class provides packet recognition from data stream using various algorithms.

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:

Control validating

There are three parameters:

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

◆ SplitMode

Packet splitting modes.

Enumerator
None 

Accept every read chunk as a packet

Header 

Search for header() and use configured payload size or callback result

Footer 

Use fixed payload size and validate trailing footer()

HeaderAndFooter 

Search for packets bounded by header() and footer()

Size 

Treat payloadSize() as full packet size

Timeout 

Collect bytes until timeout() expires after the first read

Member Function Documentation

◆ validateHeader()

int PIPacketExtractor::validateHeader ( const uchar *  src,
const uchar *  rec,
int  size 
)
protectedvirtual

Validates packet header and optionally returns payload size.

The default implementation compares "src" and "rec" byte by byte and returns the configured payloadSize() on success.