mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-07-17 22:37:12 +02:00
.github
bin
module
vendor
CPR
CivetWeb
ConcurrentQueue
Fmt
MDBC
MaxmindDB
POCO
ActiveRecord
ApacheConnector
CppParser
CppUnit
Crypto
Data
Encodings
Foundation
cmake
include
Poco
Dynamic
ASCIIEncoding.h
AbstractCache.h
AbstractDelegate.h
AbstractEvent.h
AbstractObserver.h
AbstractPriorityDelegate.h
AbstractStrategy.h
AccessExpirationDecorator.h
AccessExpireCache.h
AccessExpireLRUCache.h
AccessExpireStrategy.h
ActiveDispatcher.h
ActiveMethod.h
ActiveResult.h
ActiveRunnable.h
ActiveStarter.h
Activity.h
Alignment.h
Any.h
ArchiveStrategy.h
Array.h
Ascii.h
AsyncChannel.h
AtomicCounter.h
AtomicFlag.h
AutoPtr.h
AutoReleasePool.h
Base32Decoder.h
Base32Encoder.h
Base64Decoder.h
Base64Encoder.h
BasicEvent.h
BinaryReader.h
BinaryWriter.h
Buffer.h
BufferAllocator.h
BufferedBidirectionalStreamBuf.h
BufferedStreamBuf.h
Bugcheck.h
ByteOrder.h
Channel.h
Checksum.h
ClassLibrary.h
ClassLoader.h
Clock.h
Condition.h
Config.h
Configurable.h
ConsoleChannel.h
CountingStream.h
DataURIStream.h
DataURIStreamFactory.h
DateTime.h
DateTimeFormat.h
DateTimeFormatter.h
DateTimeParser.h
Debugger.h
DefaultStrategy.h
DeflatingStream.h
Delegate.h
DigestEngine.h
DigestStream.h
DirectoryIterator.h
DirectoryIteratorStrategy.h
DirectoryIterator_UNIX.h
DirectoryIterator_WIN32U.h
DirectoryWatcher.h
DynamicAny.h
DynamicAnyHolder.h
DynamicFactory.h
DynamicStruct.h
Environment.h
Environment_UNIX.h
Environment_VX.h
Environment_WIN32U.h
Environment_WINCE.h
Error.h
ErrorHandler.h
Event.h
EventArgs.h
EventChannel.h
EventLogChannel.h
Event_POSIX.h
Event_VX.h
Event_WIN32.h
Exception.h
ExpirationDecorator.h
Expire.h
ExpireCache.h
ExpireLRUCache.h
ExpireStrategy.h
FIFOBuffer.h
FIFOBufferStream.h
FIFOEvent.h
FIFOStrategy.h
FPEnvironment.h
FPEnvironment_C99.h
FPEnvironment_DEC.h
FPEnvironment_DUMMY.h
FPEnvironment_QNX.h
FPEnvironment_SUN.h
FPEnvironment_WIN32.h
File.h
FileChannel.h
FileStream.h
FileStreamFactory.h
FileStream_POSIX.h
FileStream_WIN32.h
File_UNIX.h
File_VX.h
File_WIN32U.h
File_WINCE.h
Format.h
Formatter.h
FormattingChannel.h
Foundation.h
FunctionDelegate.h
FunctionPriorityDelegate.h
Glob.h
HMACEngine.h
Hash.h
HashFunction.h
HashMap.h
HashSet.h
HashStatistic.h
HashTable.h
HexBinaryDecoder.h
HexBinaryEncoder.h
InflatingStream.h
Instantiator.h
JSONString.h
KeyValueArgs.h
LRUCache.h
LRUStrategy.h
Latin1Encoding.h
Latin2Encoding.h
Latin9Encoding.h
LineEndingConverter.h
LinearHashTable.h
ListMap.h
LocalDateTime.h
LogFile.h
LogFile_STD.h
LogFile_WIN32U.h
LogStream.h
Logger.h
LoggingFactory.h
LoggingRegistry.h
MD4Engine.h
MD5Engine.h
Manifest.h
MemoryPool.h
MemoryStream.h
Message.h
MetaObject.h
MetaProgramming.h
Mutex.h
Mutex_POSIX.h
Mutex_VX.h
Mutex_WIN32.h
Mutex_WINCE.h
NObserver.h
NamedEvent.h
NamedEvent_Android.h
NamedEvent_UNIX.h
NamedEvent_WIN32U.h
NamedMutex.h
NamedMutex_Android.h
NamedMutex_UNIX.h
NamedMutex_WIN32U.h
NamedTuple.h
NestedDiagnosticContext.h
Notification.h
NotificationCenter.h
NotificationQueue.h
NotificationStrategy.h
NullChannel.h
NullStream.h
Nullable.h
NumberFormatter.h
NumberParser.h
NumericString.h
ObjectPool.h
Observer.h
Optional.h
OrderedMap.h
OrderedSet.h
PBKDF2Engine.h
Path.h
Path_UNIX.h
Path_WIN32U.h
Path_WINCE.h
PatternFormatter.h
Pipe.h
PipeImpl.h
PipeImpl_DUMMY.h
PipeImpl_POSIX.h
PipeImpl_WIN32.h
PipeStream.h
Platform.h
Platform_POSIX.h
Platform_VX.h
Platform_WIN32.h
Poco.h
PriorityDelegate.h
PriorityEvent.h
PriorityExpire.h
PriorityNotificationQueue.h
PriorityStrategy.h
Process.h
Process_UNIX.h
Process_VX.h
Process_WIN32U.h
Process_WINCE.h
PurgeStrategy.h
RWLock.h
RWLock_Android.h
RWLock_POSIX.h
RWLock_VX.h
RWLock_WIN32.h
RWLock_WINCE.h
Random.h
RandomStream.h
RecursiveDirectoryIterator.h
RecursiveDirectoryIteratorImpl.h
RefCountedObject.h
RegularExpression.h
RotateStrategy.h
Runnable.h
RunnableAdapter.h
SHA1Engine.h
SHA2Engine.h
ScopedLock.h
ScopedUnlock.h
Semaphore.h
Semaphore_POSIX.h
Semaphore_VX.h
Semaphore_WIN32.h
SharedLibrary.h
SharedLibrary_HPUX.h
SharedLibrary_UNIX.h
SharedLibrary_VX.h
SharedLibrary_WIN32U.h
SharedMemory.h
SharedMemory_DUMMY.h
SharedMemory_POSIX.h
SharedMemory_WIN32.h
SharedPtr.h
SignalHandler.h
SimpleFileChannel.h
SimpleHashTable.h
SingletonHolder.h
SortedDirectoryIterator.h
SplitterChannel.h
Stopwatch.h
StrategyCollection.h
StreamChannel.h
StreamConverter.h
StreamCopier.h
StreamTokenizer.h
StreamUtil.h
String.h
StringTokenizer.h
SynchronizedObject.h
SyslogChannel.h
Task.h
TaskManager.h
TaskNotification.h
TeeStream.h
TemporaryFile.h
TextBufferIterator.h
TextConverter.h
TextEncoding.h
TextIterator.h
Thread.h
ThreadLocal.h
ThreadPool.h
ThreadTarget.h
Thread_POSIX.h
Thread_VX.h
Thread_WIN32.h
Thread_WINCE.h
TimedNotificationQueue.h
Timer.h
Timespan.h
Timestamp.h
Timezone.h
Token.h
Tuple.h
TypeList.h
Types.h
URI.h
URIStreamFactory.h
URIStreamOpener.h
UTF16Encoding.h
UTF32Encoding.h
UTF8Encoding.h
UTF8String.h
UTFString.h
UUID.h
UUIDGenerator.h
UnWindows.h
UnbufferedStreamBuf.h
Unicode.h
UnicodeConverter.h
UniqueAccessExpireCache.h
UniqueAccessExpireLRUCache.h
UniqueAccessExpireStrategy.h
UniqueExpireCache.h
UniqueExpireLRUCache.h
UniqueExpireStrategy.h
ValidArgs.h
Version.h
Void.h
Windows1250Encoding.h
Windows1251Encoding.h
Windows1252Encoding.h
WindowsConsoleChannel.h
ordered_hash.h
ordered_map.h
ordered_set.h
zconf.h
zlib.h
samples
src
testsuite
wcelibcex-1.0
CMakeLists.txt
Foundation_vs140.sln
Foundation_vs140.vcxproj
Foundation_vs140.vcxproj.filters
Foundation_vs150.sln
Foundation_vs150.vcxproj
Foundation_vs150.vcxproj.filters
Foundation_vs160.sln
Foundation_vs160.vcxproj
Foundation_vs160.vcxproj.filters
Makefile
extradirs
JSON
JWT
MongoDB
Net
NetSSL_OpenSSL
NetSSL_Win
PDF
PageCompiler
PocoDoc
ProGen
Redis
SevenZip
Util
XML
Zip
build
ci
cmake
contrib
doc
packaging
patches
release
.gitattributes
.gitignore
.gitmodules
CHANGELOG
CMakeLists.txt
CODE_OF_CONDUCT.md
CONTRIBUTING.md
CONTRIBUTORS
LICENSE
Makefile
NEWS
README
README.md
VERSION
build_cmake.cmd
build_cmake.sh
build_vs140.cmd
build_vs150.cmd
build_vs160.cmd
buildwin.cmd
buildwin.ps1
components
configure
cppignore.lnx
cppignore.win
env.bat
env.sh
libversion
PUGIXML
RPMalloc
SAJSON
SimpleIni
Squirrel
TinyDir
UTF8
ZMQ
xxHash
CMakeLists.txt
.gitignore
.gitmodules
CMakeLists.txt
LICENSE
README.md
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
270 lines
6.9 KiB
C++
270 lines
6.9 KiB
C++
//
|
|
// BinaryWriter.h
|
|
//
|
|
// Library: Foundation
|
|
// Package: Streams
|
|
// Module: BinaryReaderWriter
|
|
//
|
|
// Definition of the BinaryWriter class.
|
|
//
|
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#ifndef Foundation_BinaryWriter_INCLUDED
|
|
#define Foundation_BinaryWriter_INCLUDED
|
|
|
|
|
|
#include "Poco/Foundation.h"
|
|
#include "Poco/Buffer.h"
|
|
#include "Poco/MemoryStream.h"
|
|
#include <vector>
|
|
#include <ostream>
|
|
|
|
|
|
namespace Poco {
|
|
|
|
|
|
class TextEncoding;
|
|
class TextConverter;
|
|
|
|
|
|
class Foundation_API BinaryWriter
|
|
/// This class writes basic types (and std::vectors of these)
|
|
/// in binary form into an output stream.
|
|
/// It provides an inserter-based interface similar to ostream.
|
|
/// The writer also supports automatic conversion from big-endian
|
|
/// (network byte order) to little-endian and vice-versa.
|
|
/// Use a BinaryReader to read from a stream created by a BinaryWriter.
|
|
/// Be careful when exchanging data between systems with different
|
|
/// data type sizes (e.g., 32-bit and 64-bit architectures), as the sizes
|
|
/// of some of the basic types may be different. For example, writing a
|
|
/// long integer on a 64-bit system and reading it on a 32-bit system
|
|
/// may yield an incorrent result. Use fixed-size types (Int32, Int64, etc.)
|
|
/// in such a case.
|
|
{
|
|
public:
|
|
enum StreamByteOrder
|
|
{
|
|
NATIVE_BYTE_ORDER = 1, /// the host's native byte-order
|
|
BIG_ENDIAN_BYTE_ORDER = 2, /// big-endian (network) byte-order
|
|
NETWORK_BYTE_ORDER = 2, /// big-endian (network) byte-order
|
|
LITTLE_ENDIAN_BYTE_ORDER = 3 /// little-endian byte-order
|
|
};
|
|
|
|
BinaryWriter(std::ostream& ostr, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER);
|
|
/// Creates the BinaryWriter.
|
|
|
|
BinaryWriter(std::ostream& ostr, TextEncoding& encoding, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER);
|
|
/// Creates the BinaryWriter using the given TextEncoding.
|
|
///
|
|
/// Strings will be converted from the currently set global encoding
|
|
/// (see Poco::TextEncoding::global()) to the specified encoding.
|
|
|
|
~BinaryWriter();
|
|
/// Destroys the BinaryWriter.
|
|
|
|
BinaryWriter& operator << (bool value);
|
|
BinaryWriter& operator << (char value);
|
|
BinaryWriter& operator << (unsigned char value);
|
|
BinaryWriter& operator << (signed char value);
|
|
BinaryWriter& operator << (short value);
|
|
BinaryWriter& operator << (unsigned short value);
|
|
BinaryWriter& operator << (int value);
|
|
BinaryWriter& operator << (unsigned int value);
|
|
BinaryWriter& operator << (long value);
|
|
BinaryWriter& operator << (unsigned long value);
|
|
BinaryWriter& operator << (float value);
|
|
BinaryWriter& operator << (double value);
|
|
|
|
#if defined(POCO_HAVE_INT64)
|
|
BinaryWriter& operator << (long long value);
|
|
BinaryWriter& operator << (unsigned long long value);
|
|
#endif
|
|
|
|
BinaryWriter& operator << (const std::string& value);
|
|
BinaryWriter& operator << (const char* value);
|
|
|
|
template <typename T>
|
|
BinaryWriter& operator << (const std::vector<T>& value)
|
|
{
|
|
Poco::UInt32 size(static_cast<Poco::UInt32>(value.size()));
|
|
|
|
*this << size;
|
|
for (const auto& v: value)
|
|
{
|
|
*this << v;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
void write7BitEncoded(UInt32 value);
|
|
/// Writes a 32-bit unsigned integer in a compressed format.
|
|
/// The value is written out seven bits at a time, starting
|
|
/// with the seven least-significant bits.
|
|
/// The high bit of a byte indicates whether there are more bytes to be
|
|
/// written after this one.
|
|
/// If value will fit in seven bits, it takes only one byte of space.
|
|
/// If value will not fit in seven bits, the high bit is set on the first byte and
|
|
/// written out. value is then shifted by seven bits and the next byte is written.
|
|
/// This process is repeated until the entire integer has been written.
|
|
|
|
#if defined(POCO_HAVE_INT64)
|
|
void write7BitEncoded(UInt64 value);
|
|
/// Writes a 64-bit unsigned integer in a compressed format.
|
|
/// The value written out seven bits at a time, starting
|
|
/// with the seven least-significant bits.
|
|
/// The high bit of a byte indicates whether there are more bytes to be
|
|
/// written after this one.
|
|
/// If value will fit in seven bits, it takes only one byte of space.
|
|
/// If value will not fit in seven bits, the high bit is set on the first byte and
|
|
/// written out. value is then shifted by seven bits and the next byte is written.
|
|
/// This process is repeated until the entire integer has been written.
|
|
#endif
|
|
|
|
void writeRaw(const std::string& rawData);
|
|
/// Writes the string as-is to the stream.
|
|
|
|
void writeRaw(const char* buffer, std::streamsize length);
|
|
/// Writes length raw bytes from the given buffer to the stream.
|
|
|
|
void writeBOM();
|
|
/// Writes a byte-order mark to the stream. A byte order mark is
|
|
/// a 16-bit integer with a value of 0xFEFF, written in host byte-order.
|
|
/// A BinaryReader uses the byte-order mark to determine the byte-order
|
|
/// of the stream.
|
|
|
|
void flush();
|
|
/// Flushes the underlying stream.
|
|
|
|
bool good();
|
|
/// Returns _ostr.good();
|
|
|
|
bool fail();
|
|
/// Returns _ostr.fail();
|
|
|
|
bool bad();
|
|
/// Returns _ostr.bad();
|
|
|
|
std::ostream& stream() const;
|
|
/// Returns the underlying stream.
|
|
|
|
StreamByteOrder byteOrder() const;
|
|
/// Returns the byte ordering used by the writer, which is
|
|
/// either BIG_ENDIAN_BYTE_ORDER or LITTLE_ENDIAN_BYTE_ORDER.
|
|
|
|
private:
|
|
std::ostream& _ostr;
|
|
bool _flipBytes;
|
|
TextConverter* _pTextConverter;
|
|
};
|
|
|
|
|
|
template <typename T>
|
|
class BasicMemoryBinaryWriter: public BinaryWriter
|
|
/// A convenient wrapper for using Buffer and MemoryStream with BinarWriter.
|
|
{
|
|
public:
|
|
BasicMemoryBinaryWriter(Buffer<T>& data, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER):
|
|
BinaryWriter(_ostr, byteOrder),
|
|
_data(data),
|
|
_ostr(data.begin(), data.capacity())
|
|
{
|
|
}
|
|
|
|
BasicMemoryBinaryWriter(Buffer<T>& data, TextEncoding& encoding, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER):
|
|
BinaryWriter(_ostr, encoding, byteOrder),
|
|
_data(data),
|
|
_ostr(data.begin(), data.capacity())
|
|
{
|
|
}
|
|
|
|
~BasicMemoryBinaryWriter()
|
|
{
|
|
try
|
|
{
|
|
flush();
|
|
}
|
|
catch (...)
|
|
{
|
|
poco_unexpected();
|
|
}
|
|
}
|
|
|
|
Buffer<T>& data()
|
|
{
|
|
return _data;
|
|
}
|
|
|
|
const Buffer<T>& data() const
|
|
{
|
|
return _data;
|
|
}
|
|
|
|
const MemoryOutputStream& stream() const
|
|
{
|
|
return _ostr;
|
|
}
|
|
|
|
MemoryOutputStream& stream()
|
|
{
|
|
return _ostr;
|
|
}
|
|
|
|
private:
|
|
Buffer<T>& _data;
|
|
MemoryOutputStream _ostr;
|
|
};
|
|
|
|
|
|
typedef BasicMemoryBinaryWriter<char> MemoryBinaryWriter;
|
|
|
|
|
|
//
|
|
// inlines
|
|
//
|
|
|
|
|
|
inline std::ostream& BinaryWriter::stream() const
|
|
{
|
|
return _ostr;
|
|
}
|
|
|
|
|
|
inline bool BinaryWriter::good()
|
|
{
|
|
return _ostr.good();
|
|
}
|
|
|
|
|
|
inline bool BinaryWriter::fail()
|
|
{
|
|
return _ostr.fail();
|
|
}
|
|
|
|
|
|
inline bool BinaryWriter::bad()
|
|
{
|
|
return _ostr.bad();
|
|
}
|
|
|
|
|
|
inline BinaryWriter::StreamByteOrder BinaryWriter::byteOrder() const
|
|
{
|
|
#if defined(POCO_ARCH_BIG_ENDIAN)
|
|
return _flipBytes ? LITTLE_ENDIAN_BYTE_ORDER : BIG_ENDIAN_BYTE_ORDER;
|
|
#else
|
|
return _flipBytes ? BIG_ENDIAN_BYTE_ORDER : LITTLE_ENDIAN_BYTE_ORDER;
|
|
#endif
|
|
}
|
|
|
|
|
|
} // namespace Poco
|
|
|
|
|
|
#endif // Foundation_BinaryWriter_INCLUDED
|