WSF
UtPackStream.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2003-2015 The Boeing Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11// ****************************************************************************
12// Updated by Infoscitex, a DCS Company.
13// ****************************************************************************
14
15#ifndef UTPACKSTREAM_HPP
16#define UTPACKSTREAM_HPP
17
18#include <string>
19
20class UtPackStream;
22class UtPackPrinter;
23
24// Handles reading and writing of a data value
26{
27public:
28 virtual ~UtPackSerializeFunctor() = default;
29
30 virtual void Initialize(UtPackSerializer& aSerializer) {}
31
32 // Read from the stream into memory pointed to by aDataPtr
33 virtual void Read(UtPackStream& bs, void* aDataPtr) = 0;
34 // Same as Read, except no data is stored. Stream is advanced.
35 virtual void SkipRead(UtPackStream& bs) = 0;
36
37 // Write the value pointed to by aDataPtr to the stream
38 virtual void Write(UtPackStream& bs, void* aDataPtr) = 0;
39
40 // Print value as human readable text
41 // should be implemented by every type
42 virtual void Print(void* aDataPtr, UtPackPrinter& aStream) = 0;
43
44 // Read value from string. Should be implemented by
45 // basic types. Used for initialization of default values
46 virtual bool FromString(void* aDataPtr, const std::string& aString) { return false; }
47};
48
49// A basic stream interface to a buffer
51{
52public:
53 UtPackStream() { mBuffer.SetLittleEndian(); }
54 void Write(const void* aDataPtr, int aBytes) { mBuffer.PutRaw((const char*)aDataPtr, aBytes); }
55 void Read(void* aData, int aBytes)
56 {
57 assert((int)mBuffer.GetValidBytes() >= aBytes);
58 mBuffer.GetRaw((char*)aData, aBytes);
59 }
60 void SkipRead(int aBytes)
61 {
62 assert((int)mBuffer.GetValidBytes() >= aBytes);
63 mBuffer.SetGetPos(mBuffer.GetGetPos() + aBytes);
64 }
65
67};
68
70{
71public:
73 {
74 // number of bytes that follow the size (total bytes - 4)
75 int mSize;
77 };
78 static const int cPACKET_HEADER_SIZE = sizeof(PacketHeaderInfo);
79
80 static PacketHeaderInfo ReadPacketHeader(int aHeaderWord)
81 {
82 PacketHeaderInfo info = {aHeaderWord & 0x3fffffff, aHeaderWord >> 30};
83 return info;
84 }
85 static unsigned int MakePacketHeader(int aPacketSize, int aPacketType) { return aPacketSize | (aPacketType << 30); }
86
93
94 static ReadResult ReadMessageFromIStream(UtPackSerializer& aSerializer, std::istream& aStream, UtBuffer& aBuffer);
95
96 static void WriteMessageToOStream(const UtPackMessage& aMessage,
97 UtPackSerializer& aSerializer,
98 std::ostream& aStream,
99 UtPackStream& aPackStream);
100};
101
102// Abstract stream taking UtPackMessage objects, writing them to some output
104{
105public:
107 virtual ~UtPackMessageStreamO() = default;
108
109 void Write(UtPackMessage& aMessage);
110
111 virtual void Flush();
112
113protected:
116 virtual void WritePacket(const void* aDataPtr, int aBytes) = 0;
117
118private:
119 // message stream holds one message at a time, with enough space left at the beginning to hold a packet header
120 // WritePacket() is called with memory from this buffer, with care to avoid copies
121 UtPackStream mMessageStream;
122 UtPackSerializer* mSerializer;
123};
124
125// Outputs UtPackMessages to a std::ostream (should use binary mode)
127{
128public:
129 UtPackMessageStdStreamO(std::ostream* aStream, UtPackSerializer* aSerializer)
130 : UtPackMessageStreamO(aSerializer)
131 {
132 mStreamPtr = aStream;
133 }
134 ~UtPackMessageStdStreamO() override = default;
135
136 void Flush() override;
137
138private:
139 void WritePacket(const void* aDataPtr, int aBytes) override;
140
141 std::ostream* mStreamPtr;
142};
143#endif
#define WSF_UT_EXPORT
Definition WsfUtExport.hpp:32
Definition UtBuffer.hpp:28
~UtPackMessageStdStreamO() override=default
void Flush() override
Definition UtPack.cpp:980
UtPackMessageStdStreamO(std::ostream *aStream, UtPackSerializer *aSerializer)
Definition UtPackStream.hpp:129
void Write(UtPackMessage &aMessage)
Definition UtPack.cpp:950
UtPackMessageStreamO(UtPackSerializer *aSerializer)
Definition UtPack.cpp:943
virtual void WritePacket(const void *aDataPtr, int aBytes)=0
virtual ~UtPackMessageStreamO()=default
virtual void Flush()
Definition UtPack.cpp:948
Definition UtPackStream.hpp:70
static const int cPACKET_HEADER_SIZE
Definition UtPackStream.hpp:78
static unsigned int MakePacketHeader(int aPacketSize, int aPacketType)
Definition UtPackStream.hpp:85
static PacketHeaderInfo ReadPacketHeader(int aHeaderWord)
Definition UtPackStream.hpp:80
ReadResult
Definition UtPackStream.hpp:88
@ cSKIP_MESSAGE
Definition UtPackStream.hpp:90
@ cEND_OF_STREAM
Definition UtPackStream.hpp:91
@ cREAD_MESSAGE
Definition UtPackStream.hpp:89
Definition UtPackMessage.hpp:119
Definition UtPackSchema.hpp:54
Definition UtPackStream.hpp:26
virtual void Print(void *aDataPtr, UtPackPrinter &aStream)=0
virtual ~UtPackSerializeFunctor()=default
virtual void SkipRead(UtPackStream &bs)=0
virtual void Read(UtPackStream &bs, void *aDataPtr)=0
virtual bool FromString(void *aDataPtr, const std::string &aString)
Definition UtPackStream.hpp:46
virtual void Write(UtPackStream &bs, void *aDataPtr)=0
virtual void Initialize(UtPackSerializer &aSerializer)
Definition UtPackStream.hpp:30
Definition UtPack.hpp:137
Definition UtPackStream.hpp:51
void Write(const void *aDataPtr, int aBytes)
Definition UtPackStream.hpp:54
UtPackStream()
Definition UtPackStream.hpp:53
void Read(void *aData, int aBytes)
Definition UtPackStream.hpp:55
UtBuffer mBuffer
Definition UtPackStream.hpp:66
void SkipRead(int aBytes)
Definition UtPackStream.hpp:60
Definition UtPackStream.hpp:73
int mPacketType
Definition UtPackStream.hpp:76
int mSize
Definition UtPackStream.hpp:75
Copyrights Multiple, All Rights Reserved