Merge branch 'develop' of https://github.com/pocoproject/poco into develop

This commit is contained in:
Cristian Thiago Moecke 2014-06-05 16:53:10 -03:00
commit d67f6be95f
150 changed files with 3111 additions and 1177 deletions

View File

@ -67,6 +67,16 @@ Release 1.5.3 (2014-05-xx)
- fixed GH #442: Use correct prefix length field of Windows IP_ADAPTER_PREFIX structure
- improved GH #328: NetworkInterface on Windows XP
- fixed GH #154 Add support for MYSQL_TYPE_NEWDECIMAL to Poco::Data::MySQL
- fixed GH #290: Unicode support
- fixed GH #318: Logger local time doesn't automatically account for DST
- fixed GH #363: DateTimeParser tryParse/parse
- added HTMLForm Content-Length calculation (Rangel Reale)
- Make TemporaryFile append a slash to tempDir
- fixed GH #319 android build with cmake
- added hasDelegates() method to AbstractEvent
- fixed GH #230: Poco::Timer problem
- fixed GH #317: Poco::Zip does not support newer Zip file versions.
Release 1.5.2 (2013-09-16)
==========================

View File

@ -114,12 +114,12 @@ if(CMAKE_SYSTEM MATCHES "Windows")
endif(CMAKE_SYSTEM MATCHES "Windows")
if (CMAKE_SYSTEM MATCHES "Linux")
if (CMAKE_SYSTEM MATCHES "Linux" AND NOT ANDROID )
add_definitions( -DPOCO_OS_FAMILY_UNIX )
# Standard 'must be' defines
add_definitions( -D_XOPEN_SOURCE=500 -D_REENTRANT -D_THREAD_SAFE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64)
set(SYSLIBS pthread dl rt)
endif(CMAKE_SYSTEM MATCHES "Linux")
endif(CMAKE_SYSTEM MATCHES "Linux" AND NOT ANDROID )
if (CMAKE_SYSTEM MATCHES "SunOS")
add_definitions( -DPOCO_OS_FAMILY_UNIX )
@ -149,6 +149,11 @@ if (IOS)
add_definitions( -DPOCO_HAVE_IPv6 -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_STAT64 -DPOCO_NO_SHAREDLIBS -DPOCO_NO_NET_IFTYPES )
endif(IOS)
#ANDROID
if (ANDROID)
add_definitions( -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY )
endif()
IF (ENABLE_TESTS)
add_subdirectory(CppUnit)
ENDIF ()

View File

@ -41,6 +41,8 @@ Cristian Thiago Moecke
Sergei Nikulov
Aaron Kaluszka
Iyed Bennour
Scott Davis
Kristin Cowalcijk
--
$Id$

View File

@ -23,7 +23,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -27,7 +27,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
add_subdirectory( SQLite )

View File

@ -22,7 +22,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -35,7 +35,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -252,6 +252,18 @@ public:
void bind(std::size_t pos, const std::list<std::string>& val, Direction dir);
/// Binds a string list.
void bind(std::size_t pos, const UTF16String& val, Direction dir);
/// Binds a string.
void bind(std::size_t pos, const std::vector<UTF16String>& val, Direction dir);
/// Binds a string vector.
void bind(std::size_t pos, const std::deque<UTF16String>& val, Direction dir);
/// Binds a string deque.
void bind(std::size_t pos, const std::list<UTF16String>& val, Direction dir);
/// Binds a string list.
void bind(std::size_t pos, const BLOB& val, Direction dir);
/// Binds a BLOB. In-bound only.
@ -341,18 +353,20 @@ public:
/// Clears the cached storage.
private:
typedef std::vector<SQLLEN*> LengthVec;
typedef std::vector<std::vector<SQLLEN> > LengthVecVec;
typedef std::vector<char*> CharPtrVec;
typedef std::vector<bool*> BoolPtrVec;
typedef std::vector<std::vector<SQL_DATE_STRUCT> > DateVec;
typedef std::vector<std::vector<SQL_TIME_STRUCT> > TimeVec;
typedef std::vector<std::vector<SQL_TIMESTAMP_STRUCT> > DateTimeVec;
typedef std::vector<std::vector<Poco::Any> > AnyVec;
typedef std::map<char*, std::string*> StringMap;
typedef std::map<SQL_DATE_STRUCT*, Date*> DateMap;
typedef std::map<SQL_TIME_STRUCT*, Time*> TimeMap;
typedef std::map<SQL_TIMESTAMP_STRUCT*, DateTime*> TimestampMap;
typedef std::vector<SQLLEN*> LengthVec;
typedef std::vector<std::vector<SQLLEN> > LengthVecVec;
typedef std::vector<char*> CharPtrVec;
typedef std::vector<UTF16Char*> UTF16CharPtrVec;
typedef std::vector<bool*> BoolPtrVec;
typedef std::vector<std::vector<SQL_DATE_STRUCT> > DateVec;
typedef std::vector<std::vector<SQL_TIME_STRUCT> > TimeVec;
typedef std::vector<std::vector<SQL_TIMESTAMP_STRUCT> > DateTimeVec;
typedef std::vector<std::vector<Poco::Any> > AnyVec;
typedef std::map<char*, std::string*> StringMap;
typedef std::map<UTF16String::value_type*, UTF16String*> UTF16StringMap;
typedef std::map<SQL_DATE_STRUCT*, Date*> DateMap;
typedef std::map<SQL_TIME_STRUCT*, Time*> TimeMap;
typedef std::map<SQL_TIMESTAMP_STRUCT*, DateTime*> TimestampMap;
void describeParameter(std::size_t pos);
/// Sets the description field for the parameter, if needed.
@ -581,6 +595,71 @@ private:
}
}
template <typename C>
void bindImplContainerUTF16String(std::size_t pos, const C& val, Direction dir)
/// Utility function to bind containers of strings.
{
if (isOutBound(dir) || !isInBound(dir))
throw NotImplementedException("String container parameter type can only be inbound.");
if (PB_IMMEDIATE != _paramBinding)
throw InvalidAccessException("Containers can only be bound immediately.");
if (0 == val.size())
throw InvalidArgumentException("Empty container not allowed.");
setParamSetSize(val.size());
SQLINTEGER size = 0;
getColumnOrParameterSize(pos, size);
poco_assert(size > 0);
if (size == _maxFieldSize)
{
getMinValueSize(val, size);
// accomodate for terminating zero
if (size != _maxFieldSize) size += sizeof(UTF16Char);
}
if (_vecLengthIndicator.size() <= pos)
{
_vecLengthIndicator.resize(pos + 1);
_vecLengthIndicator[pos].resize(val.size(), SQL_NTS);
}
if (_utf16CharPtrs.size() <= pos)
_utf16CharPtrs.resize(pos + 1, 0);
_utf16CharPtrs[pos] = (UTF16Char*)std::calloc(val.size() * size, sizeof(UTF16Char));
std::size_t strSize;
std::size_t offset = 0;
typename C::const_iterator it = val.begin();
typename C::const_iterator end = val.end();
for (; it != end; ++it)
{
strSize = it->size() * sizeof(UTF16Char);
if (strSize > size)
throw LengthExceededException("SQLBindParameter(std::vector<UTF16String>)");
std::memcpy(_utf16CharPtrs[pos] + offset, it->data(), strSize);
offset += (size / sizeof(UTF16Char));
}
if (Utility::isError(SQLBindParameter(_rStmt,
(SQLUSMALLINT)pos + 1,
toODBCDirection(dir),
SQL_C_WCHAR,
SQL_WLONGVARCHAR,
(SQLUINTEGER)size - 1,
0,
_utf16CharPtrs[pos],
(SQLINTEGER)size,
&_vecLengthIndicator[pos][0])))
{
throw StatementException(_rStmt, "SQLBindParameter(std::vector<UTF16String>)");
}
}
template <typename C>
void bindImplContainerLOB(std::size_t pos, const C& val, Direction dir)
{
@ -859,7 +938,7 @@ private:
typename T::const_iterator end = val.end();
for (; it != end; ++it)
{
std::size_t sz = it->size();
std::size_t sz = it->size() * sizeof(T);
if (sz > _maxFieldSize)
throw LengthExceededException();
@ -888,11 +967,13 @@ private:
TimeMap _times;
TimestampMap _timestamps;
StringMap _strings;
UTF16StringMap _utf16Strings;
DateVec _dateVec;
TimeVec _timeVec;
DateTimeVec _dateTimeVec;
CharPtrVec _charPtrs;
UTF16CharPtrVec _utf16CharPtrs;
BoolPtrVec _boolPtrs;
const TypeInfo* _pTypeInfo;
SQLINTEGER _paramSetSize;
@ -1241,6 +1322,24 @@ inline void Binder::bind(std::size_t pos, const std::list<std::string>& val, Dir
bindImplContainerString(pos, val, dir);
}
inline void Binder::bind(std::size_t pos, const std::vector<UTF16String>& val, Direction dir)
{
bindImplContainerUTF16String(pos, val, dir);
}
inline void Binder::bind(std::size_t pos, const std::deque<UTF16String>& val, Direction dir)
{
bindImplContainerUTF16String(pos, val, dir);
}
inline void Binder::bind(std::size_t pos, const std::list<UTF16String>& val, Direction dir)
{
bindImplContainerUTF16String(pos, val, dir);
}
inline void Binder::bind(std::size_t pos, const BLOB& val, Direction dir)
{
bindImplLOB<BLOB>(pos, val, dir);

View File

@ -33,6 +33,7 @@
#include "Poco/Any.h"
#include "Poco/Dynamic/Var.h"
#include "Poco/Nullable.h"
#include "Poco/UTFString.h"
#include "Poco/Exception.h"
#include <map>
#ifdef POCO_OS_FAMILY_WINDOWS
@ -232,6 +233,19 @@ public:
bool extract(std::size_t pos, std::list<std::string>& val);
/// Extracts a string list.
/// Extracts a single character list.
bool extract(std::size_t pos, UTF16String& val);
/// Extracts a string.
bool extract(std::size_t pos, std::vector<UTF16String>& val);
/// Extracts a string vector.
bool extract(std::size_t pos, std::deque<UTF16String>& val);
/// Extracts a string deque.
bool extract(std::size_t pos, std::list<UTF16String>& val);
/// Extracts a string list.
bool extract(std::size_t pos, Poco::Data::BLOB& val);
/// Extracts a BLOB.
@ -372,7 +386,10 @@ private:
bool extractBoundImplContainer(std::size_t pos, std::vector<std::string>& values);
bool extractBoundImplContainer(std::size_t pos, std::deque<std::string>& values);
bool extractBoundImplContainer(std::size_t pos, std::list<std::string>& values);
bool extractBoundImplContainer(std::size_t pos, std::list<std::string>& values);
bool extractBoundImplContainer(std::size_t pos, std::vector<Poco::UTF16String>& values);
bool extractBoundImplContainer(std::size_t pos, std::deque<Poco::UTF16String>& values);
bool extractBoundImplContainer(std::size_t pos, std::list<Poco::UTF16String>& values);
bool extractBoundImplContainer(std::size_t pos, std::vector<Poco::Data::CLOB>& values);
bool extractBoundImplContainer(std::size_t pos, std::deque<Poco::Data::CLOB>& values);
bool extractBoundImplContainer(std::size_t pos, std::list<Poco::Data::CLOB>& values);
@ -394,7 +411,19 @@ private:
ItType it = values.begin();
ItType end = values.end();
for (int row = 0; it != end; ++it, ++row)
it->assign(*pc + row * colWidth, _pPreparator->actualDataSize(pos, row));
{
it->assign(*pc + row * colWidth / sizeof(CharType), _pPreparator->actualDataSize(pos, row));
// clean up superfluous null chars returned by some drivers
typename StringType::size_type trimLen = 0;
typename StringType::reverse_iterator sIt = it->rbegin();
typename StringType::reverse_iterator sEnd = it->rend();
for (; sIt != sEnd; ++sIt)
{
if (*sIt == '\0') ++trimLen;
else break;
}
if (trimLen) it->assign(it->begin(), it->begin() + it->length() - trimLen);
}
return true;
}
@ -522,6 +551,9 @@ private:
case MetaColumn::FDT_STRING:
{ return extAny<T, std::string>(pos, val); }
case MetaColumn::FDT_WSTRING:
{ return extAny<T, Poco::UTF16String>(pos, val); }
case MetaColumn::FDT_BLOB:
{ return extAny<T, Poco::Data::BLOB>(pos, val); }
@ -592,6 +624,24 @@ inline bool Extractor::extractBoundImplContainer(std::size_t pos, std::list<std:
}
inline bool Extractor::extractBoundImplContainer(std::size_t pos, std::vector<Poco::UTF16String>& values)
{
return extractBoundImplContainerString(pos, values);
}
inline bool Extractor::extractBoundImplContainer(std::size_t pos, std::deque<Poco::UTF16String>& values)
{
return extractBoundImplContainerString(pos, values);
}
inline bool Extractor::extractBoundImplContainer(std::size_t pos, std::list<Poco::UTF16String>& values)
{
return extractBoundImplContainerString(pos, values);
}
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
std::vector<Poco::Data::CLOB>& values)
{

View File

@ -31,6 +31,7 @@
#include "Poco/DynamicAny.h"
#include "Poco/DateTime.h"
#include "Poco/SharedPtr.h"
#include "Poco/UTFString.h"
#include <vector>
#ifdef POCO_OS_FAMILY_WINDOWS
#include <windows.h>
@ -87,8 +88,10 @@ public:
DT_BOOL,
DT_BOOL_ARRAY,
DT_CHAR,
DT_WCHAR,
DT_UCHAR,
DT_CHAR_ARRAY,
DT_WCHAR_ARRAY,
DT_UCHAR_ARRAY,
DT_DATE,
DT_TIME,
@ -280,6 +283,18 @@ public:
void prepare(std::size_t pos, const std::list<std::string>& val);
/// Prepares a string list.
void prepare(std::size_t pos, const UTF16String& val);
/// Prepares a string.
void prepare(std::size_t pos, const std::vector<UTF16String>& val);
/// Prepares a string vector.
void prepare(std::size_t pos, const std::deque<UTF16String>& val);
/// Prepares a string deque.
void prepare(std::size_t pos, const std::list<UTF16String>& val);
/// Prepares a string list.
void prepare(std::size_t pos, const Poco::Data::BLOB& val);
/// Prepares a BLOB.
@ -490,6 +505,15 @@ private:
else
return prepareVariableLen<char>(pos, SQL_C_CHAR, maxDataSize(pos), DT_CHAR);
case MetaColumn::FDT_WSTRING:
{
typedef UTF16String::value_type CharType;
if (pVal)
return prepareCharArray<CharType, DT_WCHAR_ARRAY>(pos, SQL_C_WCHAR, maxDataSize(pos), pVal->size());
else
return prepareVariableLen<CharType>(pos, SQL_C_WCHAR, maxDataSize(pos), DT_WCHAR);
}
case MetaColumn::FDT_BLOB:
{
typedef Poco::Data::BLOB::ValueType CharType;
@ -1007,6 +1031,30 @@ inline void Preparator::prepare(std::size_t pos, const std::list<std::string>& v
}
inline void Preparator::prepare(std::size_t pos, const UTF16String&)
{
prepareVariableLen<UTF16String::value_type>(pos, SQL_C_WCHAR, maxDataSize(pos), DT_CHAR);
}
inline void Preparator::prepare(std::size_t pos, const std::vector<UTF16String>& val)
{
prepareCharArray<UTF16String::value_type, DT_WCHAR_ARRAY>(pos, SQL_C_WCHAR, maxDataSize(pos), val.size());
}
inline void Preparator::prepare(std::size_t pos, const std::deque<UTF16String>& val)
{
prepareCharArray<UTF16String::value_type, DT_WCHAR_ARRAY>(pos, SQL_C_WCHAR, maxDataSize(pos), val.size());
}
inline void Preparator::prepare(std::size_t pos, const std::list<UTF16String>& val)
{
prepareCharArray<UTF16String::value_type, DT_WCHAR_ARRAY>(pos, SQL_C_WCHAR, maxDataSize(pos), val.size());
}
inline void Preparator::prepare(std::size_t pos, const Poco::Data::BLOB&)
{
prepareVariableLen<Poco::Data::BLOB::ValueType>(pos, SQL_C_BINARY, maxDataSize(pos), DT_UCHAR);

View File

@ -73,6 +73,10 @@ void Binder::freeMemory()
CharPtrVec::iterator endChr = _charPtrs.end();
for (; itChr != endChr; ++itChr) std::free(*itChr);
UTF16CharPtrVec::iterator itUTF16Chr = _utf16CharPtrs.begin();
UTF16CharPtrVec::iterator endUTF16Chr = _utf16CharPtrs.end();
for (; itUTF16Chr != endUTF16Chr; ++itUTF16Chr) std::free(*itUTF16Chr);
BoolPtrVec::iterator itBool = _boolPtrs.begin();
BoolPtrVec::iterator endBool = _boolPtrs.end();
for (; itBool != endBool; ++itBool) delete [] *itBool;
@ -127,6 +131,58 @@ void Binder::bind(std::size_t pos, const std::string& val, Direction dir)
}
void Binder::bind(std::size_t pos, const UTF16String& val, Direction dir)
{
typedef UTF16String::value_type CharT;
SQLPOINTER pVal = 0;
SQLINTEGER size = (SQLINTEGER)(val.size() * sizeof(CharT));
if (isOutBound(dir))
{
getColumnOrParameterSize(pos, size);
CharT* pChar = (CharT*)std::calloc(size, 1);
pVal = (SQLPOINTER)pChar;
_outParams.insert(ParamMap::value_type(pVal, size));
_utf16Strings.insert(UTF16StringMap::value_type(pChar, const_cast<UTF16String*>(&val)));
}
else if (isInBound(dir))
{
pVal = (SQLPOINTER)val.c_str();
_inParams.insert(ParamMap::value_type(pVal, size));
}
else
throw InvalidArgumentException("Parameter must be [in] OR [out] bound.");
SQLLEN* pLenIn = new SQLLEN;
SQLINTEGER colSize = 0;
SQLSMALLINT decDigits = 0;
getColSizeAndPrecision(pos, SQL_C_WCHAR, colSize, decDigits);
*pLenIn = SQL_NTS;
if (PB_AT_EXEC == _paramBinding)
{
*pLenIn = SQL_LEN_DATA_AT_EXEC(size);
}
_lengthIndicator.push_back(pLenIn);
if (Utility::isError(SQLBindParameter(_rStmt,
(SQLUSMALLINT)pos + 1,
toODBCDirection(dir),
SQL_C_WCHAR,
SQL_WLONGVARCHAR,
(SQLUINTEGER)colSize,
0,
pVal,
(SQLINTEGER)size,
_lengthIndicator.back())))
{
throw StatementException(_rStmt, "SQLBindParameter(std::string)");
}
}
void Binder::bind(std::size_t pos, const Date& val, Direction dir)
{
SQLINTEGER size = (SQLINTEGER) sizeof(SQL_DATE_STRUCT);

View File

@ -64,6 +64,22 @@ bool Extractor::extractBoundImpl<std::string>(std::size_t pos, std::string& val)
}
template<>
bool Extractor::extractBoundImpl<UTF16String>(std::size_t pos, UTF16String& val)
{
typedef UTF16String::value_type CharT;
if (isNull(pos)) return false;
std::size_t dataSize = _pPreparator->actualDataSize(pos);
CharT* sp = AnyCast<CharT*>(_pPreparator->at(pos));
std::size_t len = Poco::UnicodeConverter::UTFStrlen(sp);
if (len < dataSize) dataSize = len;
checkDataSize(dataSize);
val.assign(sp, dataSize);
return true;
}
template<>
bool Extractor::extractBoundImpl<Poco::Data::Date>(std::size_t pos, Poco::Data::Date& val)
{
@ -280,6 +296,61 @@ bool Extractor::extractManualImpl<std::string>(std::size_t pos, std::string& val
}
template<>
bool Extractor::extractManualImpl<UTF16String>(std::size_t pos, UTF16String& val, SQLSMALLINT cType)
{
std::size_t maxSize = _pPreparator->getMaxFieldSize();
std::size_t fetchedSize = 0;
std::size_t totalSize = 0;
SQLLEN len;
const int bufSize = CHUNK_SIZE;
Poco::Buffer<UTF16String::value_type> apChar(bufSize);
UTF16String::value_type* pChar = apChar.begin();
SQLRETURN rc = 0;
val.clear();
resizeLengths(pos);
do
{
std::memset(pChar, 0, bufSize);
len = 0;
rc = SQLGetData(_rStmt,
(SQLUSMALLINT)pos + 1,
cType, //C data type
pChar, //returned value
bufSize, //buffer length
&len); //length indicator
if (SQL_NO_DATA != rc && Utility::isError(rc))
throw StatementException(_rStmt, "SQLGetData()");
if (SQL_NO_TOTAL == len)//unknown length, throw
throw UnknownDataLengthException("Could not determine returned data length.");
if (isNullLengthIndicator(len))
{
_lengths[pos] = len;
return false;
}
if (SQL_NO_DATA == rc || !len)
break;
_lengths[pos] += len;
fetchedSize = _lengths[pos] > CHUNK_SIZE ? CHUNK_SIZE : _lengths[pos];
totalSize += fetchedSize;
if (totalSize <= maxSize)
val.append(pChar, fetchedSize / sizeof(UTF16Char));
else
throw DataException(format(FLD_SIZE_EXCEEDED_FMT, fetchedSize, maxSize));
} while (true);
return true;
}
template<>
bool Extractor::extractManualImpl<Poco::Data::CLOB>(std::size_t pos,
Poco::Data::CLOB& val,
@ -608,6 +679,42 @@ bool Extractor::extract(std::size_t pos, std::list<std::string>& val)
}
bool Extractor::extract(std::size_t pos, UTF16String& val)
{
if (Preparator::DE_MANUAL == _dataExtraction)
return extractManualImpl(pos, val, SQL_C_WCHAR);
else
return extractBoundImpl(pos, val);
}
bool Extractor::extract(std::size_t pos, std::vector<UTF16String>& val)
{
if (Preparator::DE_BOUND == _dataExtraction)
return extractBoundImplContainer(pos, val);
else
throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
}
bool Extractor::extract(std::size_t pos, std::deque<UTF16String>& val)
{
if (Preparator::DE_BOUND == _dataExtraction)
return extractBoundImplContainer(pos, val);
else
throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
}
bool Extractor::extract(std::size_t pos, std::list<UTF16String>& val)
{
if (Preparator::DE_BOUND == _dataExtraction)
return extractBoundImplContainer(pos, val);
else
throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
}
bool Extractor::extract(std::size_t pos, Poco::Data::BLOB& val)
{
if (Preparator::DE_MANUAL == _dataExtraction)

View File

@ -83,14 +83,16 @@ void ODBCMetaColumn::init()
{
case SQL_BIT:
setType(MetaColumn::FDT_BOOL); break;
case SQL_CHAR:
case SQL_VARCHAR:
case SQL_LONGVARCHAR:
case -8:// PostgreSQL CHAR (with size specified - psqlODBC)
case -9:// SQL Server NVARCHAR
case -10:// PostgreSQL VARCHAR (without size specified)
setType(MetaColumn::FDT_STRING); break;
case SQL_WCHAR:
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
setType(MetaColumn::FDT_WSTRING); break;
case SQL_TINYINT:
setType(MetaColumn::FDT_INT8); break;

View File

@ -72,6 +72,10 @@ void Preparator::freeMemory() const
deleteCachedArray<char>(it->first);
break;
case DT_WCHAR:
deleteCachedArray<UTF16String>(it->first);
break;
case DT_UCHAR:
deleteCachedArray<unsigned char>(it->first);
break;
@ -83,6 +87,13 @@ void Preparator::freeMemory() const
break;
}
case DT_WCHAR_ARRAY:
{
UTF16String::value_type** pc = AnyCast<UTF16String::value_type*>(&_values[it->first]);
if (pc) std::free(*pc);
break;
}
case DT_UCHAR_ARRAY:
{
unsigned char** pc = AnyCast<unsigned char*>(&_values[it->first]);

View File

@ -834,6 +834,17 @@ void ODBCOracleTest::recreateLogTable()
}
void ODBCOracleTest::recreateUnicodeTable()
{
#if defined (POCO_ODBC_UNICODE)
dropObject("TABLE", "UnicodeTable");
try { session() << "CREATE TABLE UnicodeTable (str NVARCHAR2(30))", now; }
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail("recreateUnicodeTable()"); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail("recreateUnicodeTable()"); }
#endif
}
CppUnit::Test* ODBCOracleTest::suite()
{
if ((_pSession = init(_driver, _dsn, _uid, _pwd, _connectString)))
@ -923,6 +934,7 @@ CppUnit::Test* ODBCOracleTest::suite()
CppUnit_addTest(pSuite, ODBCOracleTest, testTransaction);
CppUnit_addTest(pSuite, ODBCOracleTest, testTransactor);
CppUnit_addTest(pSuite, ODBCOracleTest, testNullable);
CppUnit_addTest(pSuite, ODBCOracleTest, testUnicode);
CppUnit_addTest(pSuite, ODBCOracleTest, testReconnect);
return pSuite;

View File

@ -70,6 +70,7 @@ private:
void recreateNullsTable(const std::string& notNull = "");
void recreateMiscTable();
void recreateLogTable();
void recreateUnicodeTable();
static ODBCTest::SessionPtr _pSession;
static ODBCTest::ExecPtr _pExecutor;

View File

@ -53,6 +53,10 @@ using Poco::DateTime;
#define POSTGRESQL_DSN "PocoDataPgSQLTest"
#endif
#if defined(POCO_OS_FAMILY_WINDOWS)
#pragma message ("Using " POSTGRESQL_ODBC_DRIVER " driver.")
#endif
#define POSTGRESQL_SERVER POCO_ODBC_TEST_DATABASE_SERVER
#define POSTGRESQL_PORT "5432"
#define POSTGRESQL_DB "postgres"
@ -559,6 +563,17 @@ void ODBCPostgreSQLTest::recreateLogTable()
}
void ODBCPostgreSQLTest::recreateUnicodeTable()
{
#if defined (POCO_ODBC_UNICODE)
dropObject("TABLE", "UnicodeTable");
try { session() << "CREATE TABLE UnicodeTable (str TEXT)", now; }
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail("recreateUnicodeTable()"); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail("recreateUnicodeTable()"); }
#endif
}
CppUnit::Test* ODBCPostgreSQLTest::suite()
{
if ((_pSession = init(_driver, _dsn, _uid, _pwd, _connectString)))
@ -659,6 +674,7 @@ CppUnit::Test* ODBCPostgreSQLTest::suite()
CppUnit_addTest(pSuite, ODBCPostgreSQLTest, testTransaction);
CppUnit_addTest(pSuite, ODBCPostgreSQLTest, testTransactor);
CppUnit_addTest(pSuite, ODBCPostgreSQLTest, testNullable);
CppUnit_addTest(pSuite, ODBCPostgreSQLTest, testUnicode);
CppUnit_addTest(pSuite, ODBCPostgreSQLTest, testReconnect);
return pSuite;

View File

@ -69,6 +69,7 @@ private:
void recreateBoolTable();
void recreateMiscTable();
void recreateLogTable();
void recreateUnicodeTable();
void configurePLPgSQL();
/// Configures PL/pgSQL in the database. A reasonable defaults

View File

@ -715,6 +715,17 @@ void ODBCSQLServerTest::recreateLogTable()
}
void ODBCSQLServerTest::recreateUnicodeTable()
{
#if defined (POCO_ODBC_UNICODE)
dropObject("TABLE", "UnicodeTable");
try { session() << "CREATE TABLE UnicodeTable (str NVARCHAR(30))", now; }
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail("recreateUnicodeTable()"); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail("recreateUnicodeTable()"); }
#endif
}
CppUnit::Test* ODBCSQLServerTest::suite()
{
if ((_pSession = init(_driver, _dsn, _uid, _pwd, _connectString, _db)))
@ -801,6 +812,7 @@ CppUnit::Test* ODBCSQLServerTest::suite()
CppUnit_addTest(pSuite, ODBCSQLServerTest, testTransaction);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testTransactor);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testNullable);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testUnicode);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testReconnect);
return pSuite;

View File

@ -74,6 +74,7 @@ private:
void recreateBoolTable();
void recreateMiscTable();
void recreateLogTable();
void recreateUnicodeTable();
static SessionPtr _pSession;
static ExecPtr _pExecutor;

View File

@ -969,7 +969,11 @@ void ODBCTest::testInternalBulkExtraction()
recreatePersonTable();
_pSession->setFeature("autoBind", true);
_pSession->setFeature("autoExtract", true);
#ifdef POCO_ODBC_UNICODE
_pExecutor->internalBulkExtractionUTF16();
#else
_pExecutor->internalBulkExtraction();
#endif
}
@ -1199,6 +1203,25 @@ void ODBCTest::testNullable()
}
void ODBCTest::testUnicode()
{
#if defined (POCO_ODBC_UNICODE)
if (!_pSession) fail("Test not available.");
for (int i = 0; i < 8;)
{
recreateUnicodeTable();
_pSession->setFeature("autoBind", bindValue(i));
_pSession->setFeature("autoExtract", bindValue(i + 1));
_pExecutor->unicode(_rConnectString);
i += 2;
}
#else
std::cout << "Not an UNICODE build, skipping." << std::endl;
#endif
}
void ODBCTest::testReconnect()
{
if (!_pSession) fail ("Test not available.");
@ -1296,7 +1319,7 @@ ODBCTest::SessionPtr ODBCTest::init(const std::string& driver,
try
{
std::cout << "Conecting to [" << dbConnString << ']' << std::endl;
return new Session(Poco::Data::ODBC::Connector::KEY, dbConnString);
return new Session(Poco::Data::ODBC::Connector::KEY, dbConnString, 5);
}catch (ConnectionFailedException& ex)
{
std::cout << ex.displayText() << std::endl;

View File

@ -149,6 +149,8 @@ public:
virtual void testTransactor();
virtual void testNullable();
virtual void testUnicode();
virtual void testReconnect();
protected:
@ -172,6 +174,7 @@ protected:
virtual void recreateBoolTable();
virtual void recreateMiscTable();
virtual void recreateLogTable();
virtual void recreateUnicodeTable();
static SessionPtr init(const std::string& driver,
std::string& dsn,
@ -357,6 +360,12 @@ inline void ODBCTest::recreateLogTable()
}
inline void ODBCTest::recreateUnicodeTable()
{
throw Poco::NotImplementedException("ODBCTest::recreateUnicodeTable()");
}
inline bool ODBCTest::bindValue(int i)
{
poco_assert (i < 8);

View File

@ -46,6 +46,8 @@
#include "Poco/Data/ODBC/Preparator.h"
#include "Poco/Data/ODBC/ODBCException.h"
#include "Poco/Data/ODBC/ODBCStatementImpl.h"
#include "Poco/UnicodeConverter.h"
#include "Poco/UTFString.h"
#include <sqltypes.h>
#include <iostream>
#include <sstream>
@ -94,7 +96,9 @@ using Poco::NotImplementedException;
using Poco::BadCastException;
using Poco::RangeException;
using Poco::TimeoutException;
using Poco::UnicodeConverter;
using Poco::UTF16String;
using Poco::UTF32String;
struct Person
{
@ -2441,24 +2445,24 @@ void SQLExecutor::dateTime()
DateTime born(1965, 6, 18, 5, 35, 1);
int count = 0;
try { session() << "INSERT INTO Person VALUES (?,?,?,?)", use(lastName), use(firstName), use(address), use(born), now; }
catch(ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail (funct); }
catch(StatementException& se){ std::cout << se.toString() << std::endl; fail (funct); }
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail(funct); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail(funct); }
try { session() << "SELECT COUNT(*) FROM Person", into(count), now; }
catch(ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail (funct); }
catch(StatementException& se){ std::cout << se.toString() << std::endl; fail (funct); }
assert (count == 1);
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail(funct); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail(funct); }
assert(count == 1);
DateTime res;
try { session() << "SELECT Born FROM Person", into(res), now; }
catch(ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail (funct); }
catch(StatementException& se){ std::cout << se.toString() << std::endl; fail (funct); }
assert (res == born);
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail(funct); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail(funct); }
assert(res == born);
Statement stmt = (session() << "SELECT Born FROM Person", now);
RecordSet rset(stmt);
res = rset["Born"].convert<DateTime>();
assert (res == born);
assert(res == born);
}
@ -2619,7 +2623,7 @@ void SQLExecutor::internalExtraction()
rset.moveFirst();
assert (rset["str0"] == "3");
rset.moveLast();
assert (rset["str0"] == "6");
assert(rset["str0"] == "6");
RecordSet rset2(rset);
assert (3 == rset2.columnCount());
@ -2645,8 +2649,17 @@ void SQLExecutor::internalExtraction()
assert (2.5 == f);
}
s = rset.value<std::string>(2,2);
assert ("5" == s);
try
{
s = rset.value<std::string>(2, 2);
}
catch (BadCastException&)
{
UTF16String us = rset.value<Poco::UTF16String>(2, 2);
Poco::UnicodeConverter::convert(us, s);
}
assert("5" == s);
i = rset.value("str0", 2);
assert (5 == i);
@ -2815,8 +2828,11 @@ void SQLExecutor::internalBulkExtraction()
Statement stmt = (session() << "SELECT * FROM Person", bulk(size), now);
RecordSet rset(stmt);
assert (size == rset.rowCount());
assert ("LN0" == rset["LastName"]);
assert("LN0" == rset["LastName"]);
assert (0 == rset["Age"]);
rset.moveNext();
assert("LN1" == rset["LastName"]);
assert(1 == rset["Age"]);
rset.moveLast();
assert (std::string("LN") + NumberFormatter::format(size - 1) == rset["LastName"]);
assert (size - 1 == rset["Age"]);
@ -2840,6 +2856,68 @@ void SQLExecutor::internalBulkExtraction()
}
void SQLExecutor::internalBulkExtractionUTF16()
{
std::string funct = "internalBulkExtraction()";
int size = 100;
std::vector<UTF16String> lastName(size);
std::vector<UTF16String> firstName(size);
std::vector<UTF16String> address(size);
std::vector<int> age(size);
for (int i = 0; i < size; ++i)
{
lastName[i] = Poco::UnicodeConverter::to<UTF16String>("LN" + NumberFormatter::format(i));
firstName[i] = Poco::UnicodeConverter::to<UTF16String>("FN" + NumberFormatter::format(i));
address[i] = Poco::UnicodeConverter::to<UTF16String>("Addr" + NumberFormatter::format(i));
age[i] = i;
}
try
{
session() << "INSERT INTO Person VALUES (?,?,?,?)",
use(lastName, bulk),
use(firstName, bulk),
use(address, bulk),
use(age, bulk),
now;
}
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail(funct); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail(funct); }
try
{
Statement stmt = (session() << "SELECT * FROM Person", bulk(size), now);
RecordSet rset(stmt);
assert(size == rset.rowCount());
assert(Poco::UnicodeConverter::to<UTF16String>("LN0") == rset["LastName"]);
assert(0 == rset["Age"]);
rset.moveNext();
assert(Poco::UnicodeConverter::to<UTF16String>("LN1") == rset["LastName"]);
assert(1 == rset["Age"]);
rset.moveLast();
assert(std::string("LN") + NumberFormatter::format(size - 1) == rset["LastName"]);
assert(size - 1 == rset["Age"]);
}
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail(funct); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail(funct); }
try
{
Statement stmt = (session() << "SELECT * FROM Person", limit(size), bulk, now);
RecordSet rset(stmt);
assert(size == rset.rowCount());
assert("LN0" == rset["LastName"]);
assert(0 == rset["Age"]);
rset.moveLast();
assert(std::string("LN") + NumberFormatter::format(size - 1) == rset["LastName"]);
assert(size - 1 == rset["Age"]);
}
catch (ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail(funct); }
catch (StatementException& se){ std::cout << se.toString() << std::endl; fail(funct); }
}
void SQLExecutor::internalStorageType()
{
std::string funct = "internalStorageType()";
@ -3247,8 +3325,13 @@ void SQLExecutor::any()
{
Any i = 42;
Any f = 42.5;
Any s = std::string("42");
std::string ss("42");
Any s = ss;
#ifdef POCO_ODBC_UNICODE
UTF16String us;
Poco::UnicodeConverter::convert(ss, us);
s = us;
#endif
Session tmp = session();
tmp << "INSERT INTO Anys VALUES (?, ?, ?)", use(i), use(f), use(s), now;
@ -3263,7 +3346,19 @@ void SQLExecutor::any()
tmp << "SELECT * FROM Anys", into(i), into(f), into(s), now;
assert (AnyCast<int>(i) == 42);
assert (AnyCast<double>(f) == 42.5);
#ifdef POCO_ODBC_UNICODE
// drivers may behave differently here
try
{
assert(AnyCast<UTF16String>(s) == us);
}
catch (BadCastException&)
{
assert (AnyCast<std::string>(s) == "42");
}
#else
assert (AnyCast<std::string>(s) == "42");
#endif
}
@ -3830,7 +3925,7 @@ void SQLExecutor::nullable()
assert (rs.isNull("EmptyInteger"));
assert (rs.isNull("EmptyFloat"));
assert (rs.isNull("EmptyDateTime"));
Var di = 1;
Var df = 1.5;
Var ds = "abc";
@ -3840,8 +3935,8 @@ void SQLExecutor::nullable()
assert (!df.isEmpty());
assert (!ds.isEmpty());
assert (!dd.isEmpty());
session() << "SELECT EmptyString, EmptyInteger, EmptyFloat, EmptyDateTime FROM NullableTest", into(di), into(df), into(ds), into(dd), now;
Statement stmt = (session() << "SELECT EmptyString, EmptyInteger, EmptyFloat, EmptyDateTime FROM NullableTest", into(ds), into(di), into(df), into(dd), now);
assert (di.isEmpty());
assert (df.isEmpty());
@ -3889,3 +3984,19 @@ void SQLExecutor::reconnect()
assert (count == age);
assert (session().isConnected());
}
void SQLExecutor::unicode(const std::string& dbConnString)
{
const unsigned char supp[] = { 0x41, 0x42, 0xf0, 0x90, 0x82, 0xa4, 0xf0, 0xaf, 0xa6, 0xa0, 0xf0, 0xaf, 0xa8, 0x9d, 0x00 };
std::string text((const char*) supp);
UTF16String wtext;
Poco::UnicodeConverter::convert(text, wtext);
session() << "INSERT INTO UnicodeTable VALUES (?)", use(wtext), now;
wtext.clear();
text.clear();
session() << "SELECT str FROM UnicodeTable", into(wtext), now;
Poco::UnicodeConverter::convert(wtext, text);
assert(text == std::string((const char*)supp));
}

View File

@ -479,6 +479,7 @@ public:
const std::string& intFldName = "int0");
void internalBulkExtraction();
void internalBulkExtractionUTF16();
void internalStorageType();
void nulls();
void notNulls(const std::string& sqlState = "23502");
@ -503,6 +504,8 @@ public:
void transactor();
void nullable();
void unicode(const std::string& dbConnString);
void reconnect();
private:

View File

@ -39,7 +39,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -705,10 +705,10 @@ void SQLiteTest::testInsertSingleBulk()
Session tmp (Poco::Data::SQLite::Connector::KEY, "dummy.db");
tmp << "DROP TABLE IF EXISTS Strings", now;
tmp << "CREATE TABLE IF NOT EXISTS Strings (str INTEGER(10))", now;
int x = 0;
std::size_t x = 0;
Statement stmt((tmp << "INSERT INTO Strings VALUES(:str)", use(x)));
for (int i = 0; x < 100; ++x)
for (std::size_t i = 0; x < 100; ++x)
{
i = stmt.execute();
assert (1 == i);
@ -835,7 +835,7 @@ void SQLiteTest::testLimitPrepare()
Statement stmt = (tmp << "SELECT * FROM Strings", into(retData), limit(50));
assert (retData.size() == 0);
assert (!stmt.done());
Poco::UInt32 rows = stmt.execute();
std::size_t rows = stmt.execute();
assert (50 == rows);
assert (!stmt.done());
assert (retData.size() == 50);
@ -2049,7 +2049,7 @@ void SQLiteTest::testNullable()
}
void SQLiteTest::testNull()
void SQLiteTest::testNulls()
{
Session ses (Poco::Data::SQLite::Connector::KEY, "dummy.db");
ses << "DROP TABLE IF EXISTS NullTest", now;
@ -2067,13 +2067,19 @@ void SQLiteTest::testNull()
ses << "INSERT INTO NullTest VALUES(:i, :r, :v)", use(null), use(null), use(null), now;
RecordSet rs(ses, "SELECT * FROM NullTest");
RecordSet rs(ses, "SELECT i, r, v, null as e FROM NullTest");
rs.moveFirst();
assert (rs.isNull("i"));
assert (rs["i"].isEmpty());
assert (rs.isNull("r"));
assert (rs.isNull("v"));
assert (rs["v"].isEmpty());
assert (rs["e"].isEmpty());
assert (rs[0].isEmpty());
assert (rs[1].isEmpty());
assert (rs[2].isEmpty());
assert (rs[3].isEmpty());
ses << "DROP TABLE IF EXISTS NullTest", now;
ses << "CREATE TABLE NullTest (i INTEGER, r REAL, v VARCHAR)", now;
@ -2265,13 +2271,15 @@ void SQLiteTest::testDynamicAny()
{
Session tmp (Poco::Data::SQLite::Connector::KEY, "dummy.db");
tmp << "DROP TABLE IF EXISTS Anys", now;
tmp << "CREATE TABLE Anys (int0 INTEGER, flt0 REAL, str0 VARCHAR)", now;
tmp << "CREATE TABLE Anys (int0 INTEGER, flt0 REAL, str0 VARCHAR, empty INTEGER)", now;
DynamicAny i = Int32(42);
DynamicAny f = double(42.5);
DynamicAny s = std::string("42");
DynamicAny e;
assert (e.isEmpty());
tmp << "INSERT INTO Anys VALUES (?, ?, ?)", use(i), use(f), use(s), now;
tmp << "INSERT INTO Anys VALUES (?, ?, ?, null)", use(i), use(f), use(s), now;
int count = 0;
tmp << "SELECT COUNT(*) FROM Anys", into(count), now;
@ -2280,10 +2288,13 @@ void SQLiteTest::testDynamicAny()
i = 0;
f = 0.0;
s = std::string("");
tmp << "SELECT * FROM Anys", into(i), into(f), into(s), now;
e = 1;
assert (!e.isEmpty());
tmp << "SELECT * FROM Anys", into(i), into(f), into(s), into(e), now;
assert (42 == i);
assert (42.5 == f);
assert ("42" == s);
assert (e.isEmpty());
}
@ -2585,7 +2596,7 @@ void SQLiteTest::testThreadModes()
assert (Utility::isThreadSafe());
assert (Utility::getThreadMode() == Utility::THREAD_MODE_SERIAL);
const int datasize = 1000;
const int datasize = 100;
ModeVec mode;
mode.push_back(Utility::THREAD_MODE_SINGLE);
mode.push_back(Utility::THREAD_MODE_MULTI);
@ -3413,7 +3424,7 @@ CppUnit::Test* SQLiteTest::suite()
CppUnit_addTest(pSuite, SQLiteTest, testInternalExtraction);
CppUnit_addTest(pSuite, SQLiteTest, testPrimaryKeyConstraint);
CppUnit_addTest(pSuite, SQLiteTest, testNullable);
CppUnit_addTest(pSuite, SQLiteTest, testNull);
CppUnit_addTest(pSuite, SQLiteTest, testNulls);
CppUnit_addTest(pSuite, SQLiteTest, testRowIterator);
CppUnit_addTest(pSuite, SQLiteTest, testAsync);
CppUnit_addTest(pSuite, SQLiteTest, testAny);

View File

@ -104,7 +104,7 @@ public:
void testInternalExtraction();
void testPrimaryKeyConstraint();
void testNullable();
void testNull();
void testNulls();
void testRowIterator();
void testAsync();

View File

@ -28,6 +28,7 @@
#include "Poco/Nullable.h"
#include "Poco/Any.h"
#include "Poco/Dynamic/Var.h"
#include "Poco/UTFString.h"
#include <vector>
#include <deque>
#include <list>
@ -246,6 +247,18 @@ public:
virtual void bind(std::size_t pos, const std::list<std::string>& val, Direction dir = PD_IN);
/// Binds a string list.
virtual void bind(std::size_t pos, const UTF16String& val, Direction dir = PD_IN);
/// Binds a UTF-16 Unicode string.
virtual void bind(std::size_t pos, const std::vector<UTF16String>& val, Direction dir = PD_IN);
/// Binds a UTF-16 Unicode string vector.
virtual void bind(std::size_t pos, const std::deque<UTF16String>& val, Direction dir = PD_IN);
/// Binds a UTF-16 Unicode string deque.
virtual void bind(std::size_t pos, const std::list<UTF16String>& val, Direction dir = PD_IN);
/// Binds a UTF-16 Unicode string list.
virtual void bind(std::size_t pos, const BLOB& val, Direction dir = PD_IN) = 0;
/// Binds a BLOB.

View File

@ -25,6 +25,7 @@
#include "Poco/Data/AbstractPreparation.h"
#include "Poco/Data/Limit.h"
#include "Poco/RefCountedObject.h"
#include "Poco/UTFString.h"
#include "Poco/AutoPtr.h"
#include <vector>
#include <deque>
@ -144,7 +145,26 @@ public:
/// - string is empty
/// - getEmptyStringIsNull() returns true
bool isValueNull(const Poco::UTF16String& str, bool deflt);
/// Overload for const reference to UTF16String.
///
/// Returns true when folowing conditions are met:
///
/// - string is empty
/// - getEmptyStringIsNull() returns true
private:
template <typename S>
bool isStringNull(const S& str, bool deflt)
{
if (getForceEmptyString()) return false;
if (getEmptyStringIsNull() && str.empty())
return true;
return deflt;
}
ExtractorPtr _pExtractor;
Poco::UInt32 _limit;
Poco::UInt32 _position;
@ -242,6 +262,18 @@ inline bool AbstractExtraction::getForceEmptyString() const
}
inline bool AbstractExtraction::isValueNull(const std::string& str, bool deflt)
{
return isStringNull(str, deflt);
}
inline bool AbstractExtraction::isValueNull(const Poco::UTF16String& str, bool deflt)
{
return isStringNull(str, deflt);
}
} } // namespace Poco::Data

View File

@ -23,6 +23,7 @@
#include "Poco/Data/Data.h"
#include "Poco/Data/Constants.h"
#include "Poco/Data/LOB.h"
#include "Poco/UTFString.h"
#include <vector>
#include <deque>
#include <list>
@ -233,6 +234,18 @@ public:
virtual bool extract(std::size_t pos, std::list<std::string>& val);
/// Extracts a string list.
virtual bool extract(std::size_t pos, UTF16String& val);
/// Extracts a UTF16String. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<UTF16String>& val);
/// Extracts a UTF16String vector.
virtual bool extract(std::size_t pos, std::deque<UTF16String>& val);
/// Extracts a UTF16String deque.
virtual bool extract(std::size_t pos, std::list<UTF16String>& val);
/// Extracts a UTF16String list.
virtual bool extract(std::size_t pos, BLOB& val) = 0;
/// Extracts a BLOB. Returns false if null was received.

View File

@ -44,7 +44,7 @@ public:
/// Destroys the AbstractPreparation.
virtual void prepare() = 0;
/// Preparations data.
/// Prepares data.
protected:
AbstractPreparation();

View File

@ -23,6 +23,7 @@
#include "Poco/Data/Data.h"
#include "Poco/RefCountedObject.h"
#include "Poco/Data/LOB.h"
#include "Poco/UTFString.h"
#include <vector>
#include <deque>
#include <list>
@ -237,7 +238,19 @@ public:
/// Prepares a string deque.
virtual void prepare(std::size_t pos, const std::list<std::string>& val);
/// Prepares a string list.
/// Prepares a character list.
virtual void prepare(std::size_t pos, const UTF16String&);
/// Prepares a UTF16String.
virtual void prepare(std::size_t pos, const std::vector<UTF16String>& val);
/// Prepares a UTF16String vector.
virtual void prepare(std::size_t pos, const std::deque<UTF16String>& val);
/// Prepares a UTF16String deque.
virtual void prepare(std::size_t pos, const std::list<UTF16String>& val);
/// Prepares a UTF16String list.
virtual void prepare(std::size_t pos, const BLOB&) = 0;
/// Prepares a BLOB.

View File

@ -46,6 +46,7 @@ public:
FDT_FLOAT,
FDT_DOUBLE,
FDT_STRING,
FDT_WSTRING,
FDT_BLOB,
FDT_CLOB,
FDT_DATE,

View File

@ -50,7 +50,7 @@ public:
}
void prepare()
/// Preparations data.
/// Prepares data.
{
TypeHandler<T>::prepare(_pos, _val, preparation());
}
@ -82,7 +82,7 @@ public:
}
void prepare()
/// Preparations data.
/// Prepares data.
{
TypeHandler<std::vector<T> >::prepare(_pos, _val, preparation());
}
@ -114,7 +114,7 @@ public:
}
void prepare()
/// Preparations data.
/// Prepares data.
{
TypeHandler<std::deque<T> >::prepare(_pos, _val, preparation());
}
@ -146,7 +146,7 @@ public:
}
void prepare()
/// Preparations data.
/// Prepares data.
{
TypeHandler<std::list<T> >::prepare(_pos, _val, preparation());
}

View File

@ -292,6 +292,30 @@ void AbstractBinder::bind(std::size_t pos, const std::list<std::string>& val, Di
}
void AbstractBinder::bind(std::size_t pos, const UTF16String& val, Direction dir)
{
throw NotImplementedException("UTF16String binder must be implemented.");
}
void AbstractBinder::bind(std::size_t pos, const std::vector<UTF16String>& val, Direction dir)
{
throw NotImplementedException("std::vector binder must be implemented.");
}
void AbstractBinder::bind(std::size_t pos, const std::deque<UTF16String>& val, Direction dir)
{
throw NotImplementedException("std::deque binder must be implemented.");
}
void AbstractBinder::bind(std::size_t pos, const std::list<UTF16String>& val, Direction dir)
{
throw NotImplementedException("std::list binder must be implemented.");
}
void AbstractBinder::bind(std::size_t pos, const std::vector<BLOB>& val, Direction dir)
{
throw NotImplementedException("std::vector binder must be implemented.");
@ -408,6 +432,8 @@ void AbstractBinder::bind(std::size_t pos, const Any& val, Direction dir)
bind(pos, RefAnyCast<Int32>(val), dir);
else if(type == typeid(std::string))
bind(pos, RefAnyCast<std::string>(val), dir);
else if (type == typeid(Poco::UTF16String))
bind(pos, RefAnyCast<Poco::UTF16String>(val), dir);
else if (type == typeid(bool))
bind(pos, RefAnyCast<bool>(val), dir);
else if(type == typeid(char))
@ -457,6 +483,8 @@ void AbstractBinder::bind(std::size_t pos, const Poco::Dynamic::Var& val, Direct
bind(pos, val.extract<Int32>(), dir);
else if(type == typeid(std::string))
bind(pos, val.extract<std::string>(), dir);
else if (type == typeid(Poco::UTF16String))
bind(pos, val.extract<Poco::UTF16String>(), dir);
else if (type == typeid(bool))
bind(pos, val.extract<bool>(), dir);
else if(type == typeid(char))

View File

@ -39,15 +39,4 @@ AbstractExtraction::~AbstractExtraction()
}
bool AbstractExtraction::isValueNull(const std::string& str, bool deflt)
{
if (getForceEmptyString()) return false;
if (getEmptyStringIsNull() && str.empty())
return true;
return deflt;
}
} } // namespace Poco::Data

View File

@ -286,6 +286,30 @@ bool AbstractExtractor::extract(std::size_t pos, std::list<std::string>& val)
}
bool AbstractExtractor::extract(std::size_t pos, UTF16String& val)
{
throw NotImplementedException("UTF16String extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<UTF16String>& val)
{
throw NotImplementedException("std::vector<UTF16String> extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<UTF16String>& val)
{
throw NotImplementedException("std::deque<UTF16String> extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<UTF16String>& val)
{
throw NotImplementedException("std::list<UTF16String> extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<BLOB>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");

View File

@ -287,6 +287,30 @@ void AbstractPreparator::prepare(std::size_t pos, const std::list<std::string>&
}
void AbstractPreparator::prepare(std::size_t pos, const UTF16String& val)
{
throw NotImplementedException("UTF16String preparator must be implemented.");
}
void AbstractPreparator::prepare(std::size_t pos, const std::vector<UTF16String>& val)
{
throw NotImplementedException("std::vector<UTF16String> preparator must be implemented.");
}
void AbstractPreparator::prepare(std::size_t pos, const std::deque<UTF16String>& val)
{
throw NotImplementedException("std::deque<UTF16String> preparator must be implemented.");
}
void AbstractPreparator::prepare(std::size_t pos, const std::list<UTF16String>& val)
{
throw NotImplementedException("std::list<UTF16String> preparator must be implemented.");
}
void AbstractPreparator::prepare(std::size_t pos, const std::vector<BLOB>& val)
{
throw NotImplementedException("std::vector preparator must be implemented.");

View File

@ -20,10 +20,12 @@
#include "Poco/Data/Time.h"
#include "Poco/Data/DataException.h"
#include "Poco/DateTime.h"
#include "Poco/UTFString.h"
using namespace Poco::Data::Keywords;
using Poco::DateTime;
using Poco::UTF16String;
namespace Poco {
@ -104,6 +106,7 @@ Poco::Dynamic::Var RecordSet::value(std::size_t col, std::size_t row, bool useFi
case MetaColumn::FDT_FLOAT: return value<float>(col, row, useFilter);
case MetaColumn::FDT_DOUBLE: return value<double>(col, row, useFilter);
case MetaColumn::FDT_STRING: return value<std::string>(col, row, useFilter);
case MetaColumn::FDT_WSTRING: return value<UTF16String>(col, row, useFilter);
case MetaColumn::FDT_BLOB: return value<BLOB>(col, row, useFilter);
case MetaColumn::FDT_CLOB: return value<CLOB>(col, row, useFilter);
case MetaColumn::FDT_DATE: return value<Date>(col, row, useFilter);
@ -136,6 +139,7 @@ Poco::Dynamic::Var RecordSet::value(const std::string& name, std::size_t row, bo
case MetaColumn::FDT_FLOAT: return value<float>(name, row, useFilter);
case MetaColumn::FDT_DOUBLE: return value<double>(name, row, useFilter);
case MetaColumn::FDT_STRING: return value<std::string>(name, row, useFilter);
case MetaColumn::FDT_WSTRING: return value<UTF16String>(name, row, useFilter);
case MetaColumn::FDT_BLOB: return value<BLOB>(name, row, useFilter);
case MetaColumn::FDT_DATE: return value<Date>(name, row, useFilter);
case MetaColumn::FDT_TIME: return value<Time>(name, row, useFilter);

View File

@ -327,6 +327,8 @@ void StatementImpl::makeExtractors(std::size_t count)
addInternalExtract<double>(mc); break;
case MetaColumn::FDT_STRING:
addInternalExtract<std::string>(mc); break;
case MetaColumn::FDT_WSTRING:
addInternalExtract<Poco::UTF16String>(mc); break;
case MetaColumn::FDT_BLOB:
addInternalExtract<BLOB>(mc); break;
case MetaColumn::FDT_DATE:

View File

@ -112,6 +112,11 @@ void Binder::bind(std::size_t pos, const std::string& val, Direction dir)
}
void Binder::bind(std::size_t pos, const Poco::UTF16String& val, Direction dir)
{
}
void Binder::bind(std::size_t pos, const BLOB& val, Direction dir)
{
}

View File

@ -84,6 +84,9 @@ public:
void bind(std::size_t pos, const std::string& val, Direction dir);
/// Binds a string.
void bind(std::size_t pos, const Poco::UTF16String& val, Direction dir);
/// Binds a UTF16String.
void bind(std::size_t pos, const BLOB& val, Direction dir);
/// Binds a BLOB.

View File

@ -137,6 +137,14 @@ bool Extractor::extract(std::size_t pos, std::string& val)
}
bool Extractor::extract(std::size_t pos, Poco::UTF16String& val)
{
std::string str("");
Poco::UnicodeConverter::convert(str, val);
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Data::BLOB& val)
{
return true;

View File

@ -87,6 +87,9 @@ public:
bool extract(std::size_t pos, std::string& val);
/// Extracts a string.
bool extract(std::size_t pos, Poco::UTF16String& val);
/// Extracts a UTF16String.
bool extract(std::size_t pos, Poco::Data::BLOB& val);
/// Extracts a BLOB.

View File

@ -107,6 +107,11 @@ void Preparator::prepare(std::size_t pos, const std::string&)
}
void Preparator::prepare(std::size_t pos, const Poco::UTF16String&)
{
}
void Preparator::prepare(std::size_t pos, const Poco::Data::BLOB&)
{
}

View File

@ -36,72 +36,75 @@ public:
/// Destroys the Preparator.
void prepare(std::size_t pos, const Poco::Int8&);
/// Preparations an Int8.
/// Prepares an Int8.
void prepare(std::size_t pos, const Poco::UInt8&);
/// Preparations an UInt8.
/// Prepares an UInt8.
void prepare(std::size_t pos, const Poco::Int16&);
/// Preparations an Int16.
/// Prepares an Int16.
void prepare(std::size_t pos, const Poco::UInt16&);
/// Preparations an UInt16.
/// Prepares an UInt16.
void prepare(std::size_t pos, const Poco::Int32&);
/// Preparations an Int32.
/// Prepares an Int32.
void prepare(std::size_t pos, const Poco::UInt32&);
/// Preparations an UInt32.
/// Prepares an UInt32.
void prepare(std::size_t pos, const Poco::Int64&);
/// Preparations an Int64.
/// Prepares an Int64.
void prepare(std::size_t pos, const Poco::UInt64&);
/// Preparations an UInt64.
/// Prepares an UInt64.
#ifndef POCO_LONG_IS_64_BIT
void prepare(std::size_t pos, const long&);
/// Preparations a long.
/// Prepares a long.
void prepare(std::size_t pos, const unsigned long&);
/// Preparations an unsigned long.
/// Prepares an unsigned long.
#endif
void prepare(std::size_t pos, const bool&);
/// Preparations a boolean.
/// Prepares a boolean.
void prepare(std::size_t pos, const float&);
/// Preparations a float.
/// Prepares a float.
void prepare(std::size_t pos, const double&);
/// Preparations a double.
/// Prepares a double.
void prepare(std::size_t pos, const char&);
/// Preparations a single character.
/// Prepares a single character.
void prepare(std::size_t pos, const std::string&);
/// Preparations a string.
/// Prepares a string.
void prepare(std::size_t pos, const Poco::UTF16String&);
/// Prepares a UTF16String.
void prepare(std::size_t pos, const Poco::Data::BLOB&);
/// Preparations a BLOB.
/// Prepares a BLOB.
void prepare(std::size_t pos, const Poco::Data::CLOB&);
/// Preparations a CLOB.
/// Prepares a CLOB.
void prepare(std::size_t pos, const Poco::Data::Date&);
/// Preparations a Date.
/// Prepares a Date.
void prepare(std::size_t pos, const Poco::Data::Time&);
/// Preparations a Time.
/// Prepares a Time.
void prepare(std::size_t pos, const Poco::DateTime&);
/// Preparations a DateTime.
/// Prepares a DateTime.
void prepare(std::size_t pos, const Poco::Any&);
/// Preparations an Any.
/// Prepares an Any.
void prepare(std::size_t pos, const Poco::Dynamic::Var&);
/// Preparations a Var.
/// Prepares a Var.
};

View File

@ -249,7 +249,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -1060,6 +1060,7 @@
<ClInclude Include="include\Poco\Types.h" />
<ClInclude Include="include\Poco\UnWindows.h" />
<ClInclude Include="include\Poco\UTF32Encoding.h" />
<ClInclude Include="include\Poco\UTFString.h" />
<ClInclude Include="include\Poco\Version.h" />
<ClInclude Include="include\Poco\Void.h" />
<ClInclude Include="include\Poco\Base32Decoder.h" />

View File

@ -1880,6 +1880,12 @@
<ClInclude Include="include\Poco\UTF32Encoding.h">
<Filter>Text\Header Files</Filter>
</ClInclude>
<ClInclude Include="include\Poco\UTFString.h">
<Filter>Text\Header Files</Filter>
</ClInclude>
<ClInclude Include="include\Poco\PBKDF2Engine.h">
<Filter>Crypt\Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="src\pocomsg.rc">

View File

@ -223,6 +223,10 @@ public:
strategy.notify(pSender, args);
}
bool hasDelegates() const {
return !(_strategy.empty());
}
ActiveResult<TArgs> notifyAsync(const void* pSender, const TArgs& args)
/// Sends a notification to all registered delegates. The order is
/// determined by the TStrategy. This method is not blocking and will

View File

@ -69,6 +69,15 @@ public:
int getCurrentLineNumber() const;
/// Returns the current line number (same as lines()).
void addChars(int chars);
/// Add to the total number of characters.
void addLines(int lines);
/// Add to the total number of lines.
void addPos(int pos);
/// Add to the number of characters on the current line.
protected:
int readFromDevice();
int writeToDevice(char c);
@ -124,6 +133,15 @@ public:
int getCurrentLineNumber() const;
/// Returns the current line number (same as lines()).
void addChars(int chars);
/// Add to the total number of characters.
void addLines(int lines);
/// Add to the total number of lines.
void addPos(int pos);
/// Add to the number of characters on the current line.
CountingStreamBuf* rdbuf();
/// Returns a pointer to the underlying streambuf.

View File

@ -2027,6 +2027,22 @@ inline bool operator != (const std::string& other, const Var& da)
}
inline bool operator == (const UTF16String& other, const Var& da)
/// Equality operator for comparing Var with UTF16String
{
if (da.isEmpty()) return false;
return other == da.convert<UTF16String>();
}
inline bool operator != (const UTF16String& other, const Var& da)
/// Inequality operator for comparing Var with UTF16String
{
if (da.isEmpty()) return true;
return other != da.convert<UTF16String>();
}
inline bool operator == (const char* other, const Var& da)
/// Equality operator for comparing Var with const char*
{

View File

@ -30,6 +30,9 @@
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeParser.h"
#include "Poco/String.h"
#include "Poco/UnicodeConverter.h"
#include "Poco/UTFString.h"
#include "Poco/UTF8String.h"
#include "Poco/Any.h"
#include "Poco/Exception.h"
#include <vector>
@ -106,7 +109,7 @@ class Foundation_API VarHolder
/// Only data types for which VarHolder specialization exists are supported.
///
/// Provided are specializations for all C++ built-in types with addition of
/// std::string, DateTime, LocalDateTime, Timestamp, std::vector<Var> and DynamicStruct.
/// std::string, Poco::UTF16String, DateTime, LocalDateTime, Timestamp, std::vector<Var> and DynamicStruct.
///
/// Additional types can be supported by adding specializations. When implementing specializations,
/// the only condition is that they reside in Poco namespace and implement the pure virtual functions
@ -208,6 +211,10 @@ public:
/// Throws BadCastException. Must be overriden in a type
/// specialization in order to suport the conversion.
virtual void convert(Poco::UTF16String& val) const;
/// Throws BadCastException. Must be overriden in a type
/// specialization in order to suport the conversion.
virtual bool isArray() const;
/// Returns true.
@ -534,6 +541,12 @@ inline void VarHolder::convert(std::string& /*val*/) const
}
inline void VarHolder::convert(Poco::UTF16String& /*val*/) const
{
throw BadCastException("Can not convert to Poco::UTF16String");
}
inline bool VarHolder::isArray() const
{
return true;
@ -728,6 +741,12 @@ public:
val = NumberFormatter::format(_val);
}
void convert(Poco::UTF16String& val) const
{
std::string str = NumberFormatter::format(_val);
Poco::UnicodeConverter::convert(str, val);
}
VarHolder* clone(Placeholder<VarHolder>* pVarHolder = 0) const
{
return cloneHolder(pVarHolder, _val);
@ -861,6 +880,12 @@ public:
val = NumberFormatter::format(_val);
}
void convert(Poco::UTF16String& val) const
{
std::string str = NumberFormatter::format(_val);
Poco::UnicodeConverter::convert(str, val);
}
VarHolder* clone(Placeholder<VarHolder>* pVarHolder = 0) const
{
return cloneHolder(pVarHolder, _val);
@ -2280,15 +2305,15 @@ private:
};
template <typename T>
class VarHolderImpl<std::basic_string<T> >: public VarHolder
template <>
class VarHolderImpl<std::string>: public VarHolder
{
public:
VarHolderImpl(const char* pVal): _val(pVal)
{
}
VarHolderImpl(const std::string& val): _val(val)
VarHolderImpl(const std::string& val) : _val(val)
{
}
@ -2347,16 +2372,16 @@ public:
void convert(bool& val) const
{
static const std::string VAL_FALSE("false");
static const std::string VAL_INT_FALSE("0");
if (_val.empty() ||
_val == VAL_INT_FALSE ||
(icompare(_val, VAL_FALSE) == 0))
if (_val.empty())
{
val = false;
return;
}
else val = true;
static const std::string VAL_FALSE("false");
static const std::string VAL_INT_FALSE("0");
val = (_val != VAL_INT_FALSE &&
(icompare(_val, VAL_FALSE) != 0));
}
void convert(float& val) const
@ -2383,6 +2408,11 @@ public:
val = _val;
}
void convert(Poco::UTF16String& val) const
{
Poco::UnicodeConverter::convert(_val, val);
}
void convert(DateTime& val) const
{
int tzd = 0;
@ -2415,7 +2445,7 @@ public:
return cloneHolder(pVarHolder, _val);
}
const std::string& value() const
const std:: string& value() const
{
return _val;
}
@ -2430,14 +2460,14 @@ public:
return _val.length();
}
T& operator[](std::string::size_type n)
char& operator[](std::string::size_type n)
{
if (n < size()) return _val.operator[](n);
throw RangeException("String index out of range");
}
const T& operator[](std::string::size_type n) const
const char& operator[](std::string::size_type n) const
{
if (n < size()) return _val.operator[](n);
@ -2449,7 +2479,195 @@ private:
VarHolderImpl(const VarHolderImpl&);
VarHolderImpl& operator = (const VarHolderImpl&);
std::basic_string<T> _val;
std::string _val;
};
template <>
class VarHolderImpl<UTF16String>: public VarHolder
{
public:
VarHolderImpl(const char* pVal) : _val(Poco::UnicodeConverter::to<UTF16String>(pVal))
{
}
VarHolderImpl(const Poco::UTF16String& val) : _val(val)
{
}
~VarHolderImpl()
{
}
const std::type_info& type() const
{
return typeid(Poco::UTF16String);
}
void convert(Int8& val) const
{
int v = NumberParser::parse(toStdString());
convertToSmaller(v, val);
}
void convert(Int16& val) const
{
int v = NumberParser::parse(toStdString());
convertToSmaller(v, val);
}
void convert(Int32& val) const
{
val = NumberParser::parse(toStdString());
}
void convert(Int64& val) const
{
val = NumberParser::parse64(toStdString());
}
void convert(UInt8& val) const
{
unsigned int v = NumberParser::parseUnsigned(toStdString());
convertToSmallerUnsigned(v, val);
}
void convert(UInt16& val) const
{
unsigned int v = NumberParser::parseUnsigned(toStdString());
convertToSmallerUnsigned(v, val);
}
void convert(UInt32& val) const
{
val = NumberParser::parseUnsigned(toStdString());
}
void convert(UInt64& val) const
{
val = NumberParser::parseUnsigned64(toStdString());
}
void convert(bool& val) const
{
static const std::string VAL_FALSE("false");
static const std::string VAL_INT_FALSE("0");
if (_val.empty()) val = false;
std::string str;
UnicodeConverter::convert(_val, str);
val = (str != VAL_INT_FALSE &&
(icompare(str, VAL_FALSE) != 0));
}
void convert(float& val) const
{
double v = NumberParser::parseFloat(toStdString());
convertToSmaller(v, val);
}
void convert(double& val) const
{
val = NumberParser::parseFloat(toStdString());
}
void convert(char& val) const
{
if (_val.empty())
val = '\0';
else
{
std::string s;
UnicodeConverter::convert(_val, s);
val = s[0];
}
}
void convert(Poco::UTF16String& val) const
{
val = _val;
}
void convert(std::string& val) const
{
UnicodeConverter::convert(_val, val);
}
void convert(DateTime& val) const
{
int tzd = 0;
if (!DateTimeParser::tryParse(DateTimeFormat::ISO8601_FORMAT, toStdString(), val, tzd))
throw BadCastException("string -> DateTime");
}
void convert(LocalDateTime& ldt) const
{
int tzd = 0;
DateTime tmp;
if (!DateTimeParser::tryParse(DateTimeFormat::ISO8601_FORMAT, toStdString(), tmp, tzd))
throw BadCastException("string -> LocalDateTime");
ldt = LocalDateTime(tzd, tmp, false);
}
void convert(Timestamp& ts) const
{
int tzd = 0;
DateTime tmp;
if (!DateTimeParser::tryParse(DateTimeFormat::ISO8601_FORMAT, toStdString(), tmp, tzd))
throw BadCastException("string -> Timestamp");
ts = tmp.timestamp();
}
VarHolder* clone(Placeholder<VarHolder>* pVarHolder = 0) const
{
return cloneHolder(pVarHolder, _val);
}
const Poco::UTF16String& value() const
{
return _val;
}
bool isString() const
{
return true;
}
std::size_t size() const
{
return _val.length();
}
UTF16Char& operator[](Poco::UTF16String::size_type n)
{
if (n < size()) return _val.operator[](n);
throw RangeException("String index out of range");
}
const UTF16Char& operator[](Poco::UTF16String::size_type n) const
{
if (n < size()) return _val.operator[](n);
throw RangeException("String index out of range");
}
private:
VarHolderImpl();
VarHolderImpl(const VarHolderImpl&);
VarHolderImpl& operator = (const VarHolderImpl&);
std::string toStdString() const
{
std::string str;
UnicodeConverter::convert(_val, str);
return str;
}
Poco::UTF16String _val;
};

View File

@ -24,110 +24,111 @@
#include "Poco/UnWindows.h"
// Determine the real version.
// This setting can be forced from UnWindows.h
#if defined (_WIN32_WINNT_WINBLUE)
//Windows 8.1 _WIN32_WINNT_WINBLUE (0x0602)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#ifndef POCO_FORCE_MIN_WINDOWS_OS_SUPPORT
// Determine the real version.
// This setting can be forced from UnWindows.h
#if defined (_WIN32_WINNT_WINBLUE)
//Windows 8.1 _WIN32_WINNT_WINBLUE (0x0602)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WINBLUE
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WINBLUE
#elif defined (_WIN32_WINNT_WIN8)
//Windows 8 _WIN32_WINNT_WIN8 (0x0602)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WIN8
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WIN8
#elif defined (_WIN32_WINNT_WIN7)
//Windows 7 _WIN32_WINNT_WIN7 (0x0601)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WIN7
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WIN7
#elif defined (_WIN32_WINNT_WS08)
//Windows Server 2008 _WIN32_WINNT_WS08 (0x0600)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WS08
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WS08
#elif defined (_WIN32_WINNT_VISTA)
//Windows Vista _WIN32_WINNT_VISTA (0x0600)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_VISTA
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_VISTA
#elif defined (_WIN32_WINNT_LONGHORN)
//Windows Vista and server 2008 Development _WIN32_WINNT_LONGHORN (0x0600)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_LONGHORN
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION 0x06000000 // hardcoded, VS90 can't find NTDDI_* macros
#elif defined (_WIN32_WINNT_WS03)
//Windows Server 2003 with SP1,
//Windows XP with SP2 _WIN32_WINNT_WS03 (0x0502)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WS03
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WS03
#elif defined (_WIN32_WINNT_WINXP)
//Windows Server 2003, Windows XP _WIN32_WINNT_WINXP (0x0501)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WINXP
#elif defined (_WIN32_WINNT_WIN2K)
//Windows 2000 _WIN32_WINNT_WIN2K (0x0500)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WIN2K
#elif defined (WINVER)
// fail back on WINVER
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT WINVER
#elif !defined(_WIN32_WINNT)
// last resort = Win XP, SP1 is minimum supported
#define _WIN32_WINNT 0x0501
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION 0x05010100
#endif
#define _WIN32_WINNT _WIN32_WINNT_WINBLUE
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WINBLUE
#elif defined (_WIN32_WINNT_WIN8)
//Windows 8 _WIN32_WINNT_WIN8 (0x0602)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WIN8
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WIN8
#elif defined (_WIN32_WINNT_WIN7)
//Windows 7 _WIN32_WINNT_WIN7 (0x0601)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WIN7
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WIN7
#elif defined (_WIN32_WINNT_WS08)
//Windows Server 2008 _WIN32_WINNT_WS08 (0x0600)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WS08
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WS08
#elif defined (_WIN32_WINNT_VISTA)
//Windows Vista _WIN32_WINNT_VISTA (0x0600)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_VISTA
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_VISTA
#elif defined (_WIN32_WINNT_LONGHORN)
//Windows Vista and server 2008 Development _WIN32_WINNT_LONGHORN (0x0600)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_LONGHORN
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION 0x06000000 // hardcoded, VS90 can't find NTDDI_* macros
#elif defined (_WIN32_WINNT_WS03)
//Windows Server 2003 with SP1,
//Windows XP with SP2 _WIN32_WINNT_WS03 (0x0502)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WS03
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WS03
#elif defined (_WIN32_WINNT_WINXP)
//Windows Server 2003, Windows XP _WIN32_WINNT_WINXP (0x0501)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION NTDDI_WINXP
#elif defined (_WIN32_WINNT_WIN2K)
//Windows 2000 _WIN32_WINNT_WIN2K (0x0500)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WIN2K
#elif defined (WINVER)
// fail back on WINVER
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT WINVER
#elif !defined(_WIN32_WINNT)
// last resort = Win XP, SP1 is minimum supported
#define _WIN32_WINNT 0x0501
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION 0x05010100
#endif
#endif // POCO_FORCE_MIN_WINDOWS_OS_SUPPORT
#if defined(_MSC_VER) && !defined(POCO_MSVC_SECURE_WARNINGS) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE

View File

@ -23,7 +23,6 @@
#include "Poco/Foundation.h"
#include "Poco/Ascii.h"
#include <cstring>
#include <locale>
#include <algorithm>

View File

@ -21,13 +21,246 @@
#include "Poco/Foundation.h"
#include "Poco/Types.h"
#include <string>
namespace Poco {
// UTF string types
struct UTF16CharTraits
{
typedef std::fpos<mbstate_t> u16streampos;
typedef UInt16 char_type;
typedef int int_type;
typedef std::streamoff off_type;
typedef u16streampos pos_type;
typedef mbstate_t state_type;
static void assign(char_type& c1, const char_type& c2)
{
c1 = c2;
}
static bool eq(char_type c1, char_type c2)
{
return c1 == c2;
}
static bool lt(char_type c1, char_type c2)
{
return c1 < c2;
}
static int compare(const char_type* s1, const char_type* s2, size_t n)
{
for (; n; --n, ++s1, ++s2)
{
if (lt(*s1, *s2))
return -1;
if (lt(*s2, *s1))
return 1;
}
return 0;
}
static size_t length(const char_type* s)
{
size_t len = 0;
for (; !eq(*s, char_type(0)); ++s)
++len;
return len;
}
static const char_type* find(const char_type* s, size_t n, const char_type& a)
{
for (; n; --n)
{
if (eq(*s, a))
return s;
++s;
}
return 0;
}
static char_type* move(char_type* s1, const char_type* s2, size_t n)
{
char_type* r = s1;
if (s1 < s2)
{
for (; n; --n, ++s1, ++s2)
assign(*s1, *s2);
}
else if (s2 < s1)
{
s1 += n;
s2 += n;
for (; n; --n)
assign(*--s1, *--s2);
}
return r;
}
static char_type* copy(char_type* s1, const char_type* s2, size_t n)
{
poco_assert(s2 < s1 || s2 >= s1 + n);
char_type* r = s1;
for (; n; --n, ++s1, ++s2)
assign(*s1, *s2);
return r;
}
static char_type* assign(char_type* s, size_t n, char_type a)
{
char_type* r = s;
for (; n; --n, ++s)
assign(*s, a);
return r;
}
static int_type not_eof(int_type c)
{
return eq_int_type(c, eof()) ? ~eof() : c;
}
static char_type to_char_type(int_type c)
{
return char_type(c);
}
static int_type to_int_type(char_type c)
{
return int_type(c);
}
static bool eq_int_type(int_type c1, int_type c2)
{
return c1 == c2;
}
static int_type eof()
{
return int_type(0xDFFF);
}
};
struct UTF32CharTraits
{
typedef std::fpos<mbstate_t> u32streampos;
typedef UInt32 char_type;
typedef int int_type;
typedef std::streamoff off_type;
typedef u32streampos pos_type;
typedef mbstate_t state_type;
static void assign(char_type& c1, const char_type& c2)
{
c1 = c2;
}
static bool eq(char_type c1, char_type c2)
{
return c1 == c2;
}
static bool lt(char_type c1, char_type c2)
{
return c1 < c2;
}
static int compare(const char_type* s1, const char_type* s2, size_t n)
{
for (; n; --n, ++s1, ++s2)
{
if (lt(*s1, *s2))
return -1;
if (lt(*s2, *s1))
return 1;
}
return 0;
}
static size_t length(const char_type* s)
{
size_t len = 0;
for (; !eq(*s, char_type(0)); ++s)
++len;
return len;
}
static const char_type* find(const char_type* s, size_t n, const char_type& a)
{
for (; n; --n)
{
if (eq(*s, a))
return s;
++s;
}
return 0;
}
static char_type* move(char_type* s1, const char_type* s2, size_t n)
{
char_type* r = s1;
if (s1 < s2)
{
for (; n; --n, ++s1, ++s2)
assign(*s1, *s2);
}
else if (s2 < s1)
{
s1 += n;
s2 += n;
for (; n; --n)
assign(*--s1, *--s2);
}
return r;
}
static char_type* copy(char_type* s1, const char_type* s2, size_t n)
{
poco_assert(s2 < s1 || s2 >= s1 + n);
char_type* r = s1;
for (; n; --n, ++s1, ++s2)
assign(*s1, *s2);
return r;
}
static char_type* assign(char_type* s, size_t n, char_type a)
{
char_type* r = s;
for (; n; --n, ++s)
assign(*s, a);
return r;
}
static int_type not_eof(int_type c)
{
return eq_int_type(c, eof()) ? ~eof() : c;
}
static char_type to_char_type(int_type c)
{
return char_type(c);
}
static int_type to_int_type(char_type c)
{
return int_type(c);
}
static bool eq_int_type(int_type c1, int_type c2)
{
return c1 == c2;
}
static int_type eof()
{
return int_type(0xDFFF);
}
};
//#if defined(POCO_ENABLE_CPP11) //TODO
// typedef char16_t UTF16Char;
@ -36,33 +269,33 @@ namespace Poco {
// typedef std::u32string UTF32String;
//#else
#ifdef POCO_NO_WSTRING
typedef Poco::UInt16 UTF16Char;
typedef std::basic_string<UInt16> UTF16String;
typedef UInt32 UTF32Char;
typedef std::basic_string<UInt32> UTF32String;
typedef Poco::UInt16 UTF16Char;
typedef std::basic_string<UTF16Char, UTF16CharTraits> UTF16String;
typedef UInt32 UTF32Char;
typedef std::basic_string<UTF32Char, UTF32CharTraits> UTF32String;
#else // POCO_NO_WSTRING
#if defined(POCO_OS_FAMILY_WINDOWS)
typedef wchar_t UTF16Char;
typedef std::wstring UTF16String;
typedef UInt32 UTF32Char;
typedef std::basic_string<UInt32> UTF32String;
typedef wchar_t UTF16Char;
typedef std::wstring UTF16String;
typedef UInt32 UTF32Char;
typedef std::basic_string<UTF32Char, UTF32CharTraits> UTF32String;
#elif defined(__SIZEOF_WCHAR_T__) //gcc
#if (__SIZEOF_WCHAR_T__ == 2)
typedef wchar_t UTF16Char;
typedef std::wstring UTF16String;
typedef UInt32 UTF32Char;
typedef std::basic_string<UInt32> UTF32String;
typedef wchar_t UTF16Char;
typedef std::wstring UTF16String;
typedef UInt32 UTF32Char;
typedef std::basic_string<UTF32Char, UTF32CharTraits> UTF32String;
#elif (__SIZEOF_WCHAR_T__ == 4)
typedef Poco::UInt16 UTF16Char;
typedef std::basic_string<UInt16> UTF16String;
typedef wchar_t UTF32Char;
typedef std::wstring UTF32String;
typedef Poco::UInt16 UTF16Char;
typedef std::basic_string<UTF16Char, UTF16CharTraits> UTF16String;
typedef wchar_t UTF32Char;
typedef std::wstring UTF32String;
#endif
#else // default to 32-bit wchar_t
typedef Poco::UInt16 UTF16Char;
typedef std::basic_string<UInt16> UTF16String;
typedef wchar_t UTF32Char;
typedef std::wstring UTF32String;
typedef Poco::UInt16 UTF16Char;
typedef std::basic_string<UTF16Char, UTF16CharTraits> UTF16String;
typedef wchar_t UTF32Char;
typedef std::wstring UTF32String;
#endif //POCO_OS_FAMILY_WINDOWS
#endif //POCO_NO_WSTRING
//#endif // POCO_ENABLE_CPP11

View File

@ -57,6 +57,7 @@
// the header file that contains the definition for conditional
// definitions.) For more information, see SdkDdkVer.h.
#if defined(_WIN32_WINNT)
#if (_WIN32_WINNT < 0x0501)
#error Unsupported Windows version.
@ -68,8 +69,9 @@
#elif !defined(_WIN32_WINNT)
// Define minimum supported version.
// This can be changed, if needed.
// Otherwise, the Platform_WIN32.h will do
// its best to determine the appropriate values
// If allowed (see POCO_MIN_WINDOWS_OS_SUPPORT
// below), Platform_WIN32.h will do its
// best to determine the appropriate values
// and may redefine these. See Platform_WIN32.h
// for details.
#define _WIN32_WINNT 0x0501
@ -77,6 +79,12 @@
#endif
// To prevent Platform_WIN32.h to modify version defines,
// uncomment this, otherwise versions will be automatically
// discovered in Platform_WIN32.h.
// #define POCO_FORCE_MIN_WINDOWS_OS_SUPPORT
#include <windows.h>

View File

@ -108,6 +108,23 @@ public:
convert(f, l, t);
}
template <typename T>
static T to(const char* pChar)
{
T utfStr;
Poco::UnicodeConverter::convert(pChar, utfStr);
return utfStr;
}
template <typename T>
static T to(const std::string& str)
{
T utfStr;
Poco::UnicodeConverter::convert(str, utfStr);
return utfStr;
}
template <typename T>
static std::size_t UTFStrlen(const T* ptr)
/// Returns the length (in characters) of a zero-terminated UTF string.

View File

@ -96,6 +96,24 @@ void CountingStreamBuf::setCurrentLineNumber(int line)
}
void CountingStreamBuf::addChars(int chars)
{
_chars += chars;
}
void CountingStreamBuf::addLines(int lines)
{
_lines += lines;
}
void CountingStreamBuf::addPos(int pos)
{
_pos += pos;
}
CountingIOS::CountingIOS()
{
poco_ios_init(&_buf);
@ -131,6 +149,24 @@ void CountingIOS::setCurrentLineNumber(int line)
}
void CountingIOS::addChars(int chars)
{
_buf.addChars(chars);
}
void CountingIOS::addLines(int lines)
{
_buf.addLines(lines);
}
void CountingIOS::addPos(int pos)
{
_buf.addPos(pos);
}
CountingStreamBuf* CountingIOS::rdbuf()
{
return &_buf;

View File

@ -46,6 +46,9 @@ namespace Poco {
void DateTimeParser::parse(const std::string& fmt, const std::string& str, DateTime& dateTime, int& timeZoneDifferential)
{
if (fmt.empty() || str.empty())
throw SyntaxException("Empty string.");
int year = 0;
int month = 0;
int day = 0;

View File

@ -55,10 +55,10 @@ namespace Poco {
without -D_GNU_SOURCE is needed, otherwise the GNU version is
preferred.
*/
#ifdef _GNU_SOURCE
#if defined _GNU_SOURCE && !POCO_ANDROID
char errmsg[256] = "";
return std::string(strerror_r(errorCode, errmsg, 256));
#elif (_XOPEN_SOURCE >= 600)
#elif (_XOPEN_SOURCE >= 600) || POCO_ANDROID
char errmsg[256] = "";
strerror_r(errorCode, errmsg, 256);
return errmsg;

View File

@ -350,7 +350,7 @@ void format(std::string& result, const std::string& fmt, const std::vector<Any>&
{
case '%':
++itFmt;
if (itFmt != endFmt && itVal != endVal)
if (itFmt != endFmt && (itVal != endVal || *itFmt == '['))
{
if (*itFmt == '[')
{

View File

@ -13,7 +13,13 @@
// SPDX-License-Identifier: BSL-1.0
//
#include "Poco/Bugcheck.h"
// +++ double conversion +++
#define UNREACHABLE poco_bugcheck
#define UNIMPLEMENTED poco_bugcheck
#include "diy-fp.cc"
#include "cached-powers.cc"
#include "bignum-dtoa.cc"

View File

@ -134,6 +134,10 @@ std::string TemporaryFile::tempName(const std::string& tempDir)
unsigned long n = count++;
mutex.unlock();
name << (tempDir.empty() ? Path::temp() : tempDir);
if (name.str().at(name.str().size() - 1) != Path::separator())
{
name << Path::separator();
}
#if defined(POCO_VXWORKS)
name << "tmp";
#else

View File

@ -18,6 +18,7 @@
#include "Poco/Mutex.h"
#include "Poco/Exception.h"
#include "Poco/ThreadLocal.h"
#include "Poco/AtomicCounter.h"
#include <sstream>
@ -144,19 +145,10 @@ std::string Thread::makeName()
}
namespace
{
static FastMutex uniqueIdMutex;
}
int Thread::uniqueId()
{
FastMutex::ScopedLock lock(uniqueIdMutex);
static unsigned count = 0;
++count;
return count;
static Poco::AtomicCounter counter;
return ++counter;
}

View File

@ -61,14 +61,27 @@ void Timer::start(const AbstractTimerCallback& method, Thread::Priority priority
{
Clock nextInvocation;
nextInvocation += static_cast<Clock::ClockVal>(_startInterval)*1000;
poco_assert (!_pCallback);
FastMutex::ScopedLock lock(_mutex);
if (_pCallback)
{
throw Poco::IllegalStateException("Timer already running");
}
_nextInvocation = nextInvocation;
_pCallback = method.clone();
_wakeUp.reset();
threadPool.startWithPriority(priority, *this);
try
{
threadPool.startWithPriority(priority, *this);
}
catch (...)
{
delete _pCallback;
_pCallback = 0;
throw;
}
}
@ -164,7 +177,7 @@ void Timer::run()
}
while (sleep < 0);
if (_wakeUp.tryWait(sleep))
if (_wakeUp.tryWait(sleep > _periodicInterval ? _periodicInterval : sleep))
{
Poco::FastMutex::ScopedLock lock(_mutex);
_nextInvocation.update();

View File

@ -16,6 +16,7 @@
#include "Poco/Timezone.h"
#include "Poco/Exception.h"
#include "Poco/Mutex.h"
#include <ctime>
@ -32,6 +33,8 @@ public:
int timeZone()
{
Poco::FastMutex::ScopedLock lock(_mutex);
#if defined(__APPLE__) || defined(__FreeBSD__) || defined (__OpenBSD__) || defined(POCO_ANDROID) // no timezone global var
std::time_t now = std::time(NULL);
struct std::tm t;
@ -39,16 +42,24 @@ public:
std::time_t utc = std::mktime(&t);
return now - utc;
#elif defined(__CYGWIN__)
tzset();
return -_timezone;
#else
tzset();
return -timezone;
#endif
}
const char* name(bool dst)
{
Poco::FastMutex::ScopedLock lock(_mutex);
tzset();
return tzname[dst ? 1 : 0];
}
private:
Poco::FastMutex _mutex;
};

View File

@ -14,9 +14,6 @@
//
#ifndef POCO_NO_WSTRING
#include "Poco/UnicodeConverter.h"
#include "Poco/TextConverter.h"
#include "Poco/TextIterator.h"
@ -164,6 +161,3 @@ void UnicodeConverter::convert(const UTF32Char* utf32String, std::string& utf8St
} // namespace Poco
#endif // POCO_NO_WSTRING

View File

@ -146,7 +146,10 @@ set(TESTUNIT "${LIBNAME}-testrunner")
add_executable( ${TESTUNIT} ${TEST_SRCS} )
#set_target_properties( ${TESTUNIT} PROPERTIES COMPILE_FLAGS ${RELEASE_CXX_FLAGS} )
target_link_libraries( ${TESTUNIT} PocoFoundation CppUnit pthread)
target_link_libraries( ${TESTUNIT} PocoFoundation CppUnit )
if (NOT ANDROID)
target_link_libraries( ${TESTUNIT} pthread)
endif ()
add_executable( TestApp src/TestApp.cpp )
#set_target_properties( TestApp PROPERTIES COMPILE_FLAGS ${RELEASE_CXX_FLAGS} )

View File

@ -585,6 +585,9 @@
<ClCompile Include="src\Driver.cpp">
<Filter>_Driver\Source Files</Filter>
</ClCompile>
<ClCompile Include="src\PBKDF2EngineTest.cpp">
<Filter>Text\Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\AnyTest.h">
@ -992,5 +995,8 @@
<ClInclude Include="src\ArrayTest.h">
<Filter>Core\Header Files</Filter>
</ClInclude>
<ClInclude Include="src\PBKDF2EngineTest.h">
<Filter>Text\Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -54,6 +54,16 @@ void CountingStreamTest::testInput()
assert (ci3.lines() == 2);
assert (ci3.chars() == 8);
assert (ci3.pos() == 0);
std::istringstream istr4("foo");
CountingInputStream ci4(istr4);
while (ci4.good()) ci4.get(c);
ci4.addChars(10);
ci4.addLines(2);
ci4.addPos(3);
assert (ci4.lines() == 1 + 2);
assert (ci4.chars() == 3 + 10);
assert (ci4.pos() == 3 + 3);
}
@ -80,6 +90,16 @@ void CountingStreamTest::testOutput()
assert (co3.lines() == 2);
assert (co3.chars() == 8);
assert (co3.pos() == 0);
std::ostringstream ostr4;
CountingOutputStream co4(ostr4);
co4 << "foo";
co4.addChars(10);
co4.addLines(2);
co4.addPos(3);
assert (co4.lines() == 1 + 2);
assert (co4.chars() == 3 + 10);
assert (co4.pos() == 3 + 3);
}

View File

@ -505,6 +505,37 @@ void DateTimeParserTest::testCustom()
assert (dt.hour() == 12);
assert (dt.minute() == 30);
assert (dt.second() == 0);
assert (!DateTimeParser::tryParse("%h:%M %a", "", dt, tzd));
assert (!DateTimeParser::tryParse("", "12:30 PM", dt, tzd));
assert (!DateTimeParser::tryParse("", "", dt, tzd));
try
{
DateTimeParser::parse("%h:%M %a", "", tzd);
fail ("must fail");
}
catch (SyntaxException&)
{
}
try
{
DateTimeParser::parse("", "12:30 PM", tzd);
fail ("must fail");
}
catch (SyntaxException&)
{
}
try
{
DateTimeParser::parse("", "", tzd);
fail ("must fail");
}
catch (SyntaxException&)
{
}
}

View File

@ -49,7 +49,7 @@ void DirectoryIteratorsTest::testDirectoryIterator()
result.push_back(file);
}
assertEquals(7, result.size());
assertEquals(7, (long) result.size());
}
@ -68,7 +68,7 @@ void DirectoryIteratorsTest::testSortedDirectoryIterator()
result.push_back(file);
}
assertEquals(7, result.size());
assertEquals(7, (long) result.size());
assertEquals("first", result[0]);
assertEquals("1", result[1]);
assertEquals("2", result[2]);
@ -94,7 +94,7 @@ void DirectoryIteratorsTest::testSimpleRecursiveDirectoryIterator()
result.push_back(file);
}
assertEquals(20, result.size());
assertEquals(20, (long) result.size());
}
@ -113,7 +113,7 @@ void DirectoryIteratorsTest::testSiblingsFirstRecursiveDirectoryIterator()
result.push_back(file);
}
assertEquals(20, result.size());
assertEquals(20, (long) result.size());
}

View File

@ -305,7 +305,7 @@ void FormatTest::testString()
std::string foo("foo");
std::string s(format("%s", foo));
assert (s == "foo");
s = format("%5s", foo);
assert (s == " foo");
@ -349,6 +349,9 @@ void FormatTest::testIndex()
s = format("%%%[1]d%%%[2]d%%%d", 1, 2, 3);
assert(s == "%2%3%1");
s = format("%%%d%%%d%%%[0]d", 1, 2);
assert(s == "%1%2%1");
}

View File

@ -969,7 +969,7 @@ void StringTest::testIntToString()
{
char pResult[POCO_MAX_INT_STRING_LEN];
std::size_t sz = POCO_MAX_INT_STRING_LEN;
intToStr(0, 10, pResult, sz, false, sz + 1, ' ');
intToStr(0, 10, pResult, sz, false, (int) sz + 1, ' ');
fail ("must throw RangeException");
} catch (RangeException&) { }
}

View File

@ -175,7 +175,7 @@ void TextConverterTest::testLatin1toUTF8()
int errors = converter.convert(latin1Text, result0);
assert (result0 == utf8Text);
assert (errors == 0);
assertEqual (result0.size(), 7);
assertEqual((long) result0.size(), 7);
std::string result1;
errors = converter.convert(latin1Chars, 6, result1);
@ -200,13 +200,13 @@ void TextConverterTest::testLatin2toUTF8()
int errors = converter.convert(latinText, result0);
assertEqual (result0, utf8Text);
assertEqual (errors, 0);
assertEqual (result0.size(), 49);
assertEqual((long) result0.size(), 49);
std::string result1;
errors = converter.convert(latinChars, 25, result1);
assertEqual (result1, utf8Text);
assertEqual (errors, 0);
assertEqual (result1.size(), 49);
assertEqual((long) result1.size(), 49);
}
@ -226,13 +226,13 @@ void TextConverterTest::testLatin9toUTF8()
int errors = converter.convert(latinText, result0);
assertEqual (result0, utf8Text);
assertEqual (errors, 0);
assertEqual (result0.size(), 43);
assertEqual((long) result0.size(), 43);
std::string result1;
errors = converter.convert(latinChars, 25, result1);
assertEqual (result1, utf8Text);
assertEqual (errors, 0);
assertEqual (result1.size(), 43);
assertEqual(result1, utf8Text);
assertEqual((long) errors, 0);
assertEqual((long) result1.size(), 43);
}
@ -252,13 +252,13 @@ void TextConverterTest::testCP1250toUTF8()
int errors = converter.convert(latinText, result0);
assertEqual (result0, utf8Text);
assertEqual (errors, 0);
assertEqual (result0.size(), 49);
assertEqual((long) result0.size(), 49);
std::string result1;
errors = converter.convert(latinChars, 25, result1);
assertEqual (result1, utf8Text);
assertEqual (errors, 0);
assertEqual (result1.size(), 49);
assertEqual(result1, utf8Text);
assertEqual((long) errors, 0);
assertEqual((long) result1.size(), 49);
}
@ -277,13 +277,13 @@ void TextConverterTest::testCP1251toUTF8()
int errors = converter.convert(latinText, result0);
assertEqual (result0, utf8Text);
assertEqual (errors, 0);
assertEqual (result0.size(), 62);
assertEqual((long) result0.size(), 62);
std::string result1;
errors = converter.convert(latinChars, 31, result1);
assertEqual (result1, utf8Text);
assertEqual (errors, 0);
assertEqual (result1.size(), 62);
assertEqual((long) result1.size(), 62);
}
@ -301,15 +301,15 @@ void TextConverterTest::testCP1252toUTF8()
std::string result0;
int errors = converter.convert(latinText, result0);
assertEqual (result0, utf8Text);
assertEqual (errors, 0);
assertEqual (result0.size(), 43);
assertEqual(result0, utf8Text);
assertEqual(errors, 0);
assertEqual((long) result0.size(), 43);
std::string result1;
errors = converter.convert(latinChars, 25, result1);
assertEqual (result1, utf8Text);
assertEqual (errors, 0);
assertEqual (result1.size(), 43);
assertEqual(result1, utf8Text);
assertEqual(errors, 0);
assertEqual((long) result1.size(), 43);
}

View File

@ -19,6 +19,7 @@
#include "Poco/Foundation.h"
#include "CppUnit/TestCase.h"
#include "Poco/UnicodeConverter.h"
#include "Poco/UTFString.h"
#include <cstring>
@ -46,11 +47,16 @@ private:
// Convert from UTF-8 to wide
T wtext, wtext2, wtext3;
Poco::UnicodeConverter::convert(text, wtext);
if (sizeof(T) == 2)
assert(Poco::UnicodeConverter::UTFStrlen(wtext.data()) == 8);
else if (sizeof(T) == 4)
assert(Poco::UnicodeConverter::UTFStrlen(wtext.data()) == 5);
Poco::UnicodeConverter::convert((const char*) supp, strlen((const char*) supp), wtext2);
Poco::UnicodeConverter::convert((const char*) supp, wtext3);
Poco::UnicodeConverter::convert((const char*)supp, wtext3);
assert(wtext == wtext2);
assert(wtext == wtext3);
std::string text2, text3, text4;
assert (text != text2);
assert (text != text3);
assert (text != text4);

View File

@ -1115,7 +1115,7 @@ void VarTest::testString()
Poco::UInt64 s9;
float s10;
double s11;
bool s12;
bool s12 = false;
char s13;
a1.convert(s1);
a1.convert(s2);

View File

@ -20,7 +20,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -154,6 +154,9 @@ public:
void add(const Dynamic::Var& value);
/// Add the given value to the array
void set(unsigned int index, const Dynamic::Var& value);
/// Update the element on the given index to specified value
void stringify(std::ostream& out, unsigned int indent = 0, int step = -1) const;
/// Prints the array to out. When indent has zero value,
/// the array will be printed without newline breaks and spaces between elements.
@ -221,6 +224,13 @@ inline void Array::add(const Dynamic::Var& value)
}
inline void Array::set(unsigned int index, const Dynamic::Var& value)
{
if (index >= _values.size()) _values.resize(index + 1);
_values[index] = value;
}
inline void Array::remove(unsigned int index)
{
_values.erase(_values.begin() + index);

View File

@ -221,7 +221,7 @@ private:
{
for(unsigned int i = 0; i < indent; i++) out << ' ';
out << '"' << getKey(it) << '"';
Stringifier::stringify(getKey(it), out);
out << ((indent > 0) ? " : " : ":");
Stringifier::stringify(getValue(it), out, indent + step, step);

View File

@ -602,6 +602,10 @@ private:
static const int _stateTransitionTable[NR_STATES][NR_CLASSES];
static const int xx = -1;
bool isHighSurrogate(unsigned uc);
bool isLowSurrogate(unsigned uc);
unsigned decodeSurrogatePair(unsigned hi, unsigned lo);
Handler::Ptr _pHandler;
signed char _state;
signed char _beforeCommentState;
@ -713,6 +717,24 @@ inline void Parser::growBuffer()
}
inline bool Parser::isHighSurrogate(unsigned uc)
{
return (uc & 0xFC00) == 0xD800;
}
inline bool Parser::isLowSurrogate(unsigned uc)
{
return (uc & 0xFC00) == 0xDC00;
}
inline unsigned Parser::decodeSurrogatePair(unsigned hi, unsigned lo)
{
return ((hi & 0x3FF) << 10) + (lo & 0x3FF) + 0x10000;
}
}} // namespace Poco::JSON

View File

@ -30,17 +30,7 @@ namespace Poco {
namespace JSON {
#ifndef IS_HIGH_SURROGATE
#define IS_HIGH_SURROGATE(uc) (((uc) & 0xFC00) == 0xD800)
#endif
#ifndef IS_LOW_SURROGATE
#define IS_LOW_SURROGATE(uc) (((uc) & 0xFC00) == 0xDC00)
#endif
#ifndef DECODE_SURROGATE_PAIR
#define DECODE_SURROGATE_PAIR(hi,lo) ((((hi) & 0x3FF) << 10) + ((lo) & 0x3FF) + 0x10000)
#endif
#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
static unsigned char utf8_lead_bits[4] = { 0x00, 0xC0, 0xE0, 0xF0 };
static const unsigned char UTF8_LEAD_BITS[4] = { 0x00, 0xC0, 0xE0, 0xF0 };
const int Parser::_asciiClass[] = {
@ -245,6 +235,7 @@ void Parser::addEscapedCharToParseBuffer(CharIntType nextChar)
_escaped = 0;
// remove the backslash
parseBufferPopBackChar();
switch(nextChar)
{
case 'b':
@ -304,44 +295,38 @@ Parser::CharIntType Parser::decodeUnicodeChar()
int i;
unsigned uc = 0;
char* p;
int trail_bytes;
int trailBytes;
poco_assert(_parseBuffer.size() >= 6);
p = &_parseBuffer[_parseBuffer.size() - 4];
for (i = 12; i >= 0; i -= 4, ++p) {
for (i = 12; i >= 0; i -= 4, ++p)
{
unsigned x = *p;
if (x >= 'a') {
x -= ('a' - 10);
} else if (x >= 'A') {
x -= ('A' - 10);
} else {
x &= ~0x30u;
}
if (x >= 'a') x -= ('a' - 10);
else if (x >= 'A') x -= ('A' - 10);
else x &= ~0x30u;
poco_assert(x < 16);
uc |= x << i;
}
if ( !_allowNullByte && uc == 0 ) return 0; // Null byte not allowed
if ( !_allowNullByte && uc == 0 ) return 0;
// clear UTF-16 char from buffer
_parseBuffer.resize(_parseBuffer.size() - 6);
// attempt decoding
if (_utf16HighSurrogate)
{
if (IS_LOW_SURROGATE(uc))
if (isLowSurrogate(uc))
{
uc = DECODE_SURROGATE_PAIR(_utf16HighSurrogate, uc);
trail_bytes = 3;
uc = decodeSurrogatePair(_utf16HighSurrogate, uc);
trailBytes = 3;
_utf16HighSurrogate = 0;
}
else
else // high surrogate without a following low surrogate
{
// high surrogate without a following low surrogate
return 0;
}
}
@ -349,32 +334,32 @@ Parser::CharIntType Parser::decodeUnicodeChar()
{
if (uc < 0x80)
{
trail_bytes = 0;
trailBytes = 0;
}
else if (uc < 0x800)
{
trail_bytes = 1;
trailBytes = 1;
}
else if (IS_HIGH_SURROGATE(uc))
else if (isHighSurrogate(uc))
{
// save the high surrogate and wait for the low surrogate
_utf16HighSurrogate = uc;
return 1;
}
else if (IS_LOW_SURROGATE(uc))
else if (isLowSurrogate(uc))
{
// low surrogate without a preceding high surrogate
return 0;
}
else
{
trail_bytes = 2;
trailBytes = 2;
}
}
_parseBuffer.append((char) ((uc >> (trail_bytes * 6)) | utf8_lead_bits[trail_bytes]));
_parseBuffer.append((char) ((uc >> (trailBytes * 6)) | UTF8_LEAD_BITS[trailBytes]));
for (i = trail_bytes * 6 - 6; i >= 0; i -= 6)
for (i = trailBytes * 6 - 6; i >= 0; i -= 6)
{
_parseBuffer.append((char) (((uc >> i) & 0x3F) | 0x80));
}

View File

@ -118,7 +118,8 @@ void PrintHandler::key(const std::string& k)
comma();
_value = false;
}
_out << _tab << '"' << k << '"';
_out << _tab;
Stringifier::formatString(k, _out);
if (!printFlat()) _out << ' ';
_out << ':';
if (!printFlat()) _out << ' ';

View File

@ -70,46 +70,17 @@ void Stringifier::stringify(const Var& any, std::ostream& out, unsigned int inde
void Stringifier::formatString(const std::string& value, std::ostream& out)
{
out << '"';
for (std::string::const_iterator it = value.begin(); it != value.end(); ++it)
for (std::string::const_iterator it = value.begin(),
end = value.end(); it != end; ++it)
{
if (*it == 0x20 ||
*it == 0x21 ||
(*it >= 0x23 && *it <= 0x2E) ||
(*it >= 0x30 && *it <= 0x5B) ||
(*it >= 0x5D && *it <= 0xFF))
out << *it;
else if (*it == '"')
out << "\\\"";
else if (*it == '\\')
out << "\\\\";
else if (*it == '\b')
out << "\\b";
else if (*it == '\f')
out << "\\f";
else if (*it == '\n')
out << "\\n";
else if (*it == '\r')
out << "\\r";
else if (*it == '\t')
out << "\\t";
else if ( *it == '\0' )
out << "\\u0000";
else
if (*it <= 0x1F || *it == '"' || *it == '\\' || *it == '/')
{
const char *hexdigits = "0123456789ABCDEF";
unsigned long u = (std::min)(static_cast<unsigned long>(static_cast<unsigned char>(*it)), 0xFFFFul);
int d1 = u / 4096; u -= d1 * 4096;
int d2 = u / 256; u -= d2 * 256;
int d3 = u / 16; u -= d3 * 16;
int d4 = u;
out << "\\u";
out << hexdigits[d1];
out << hexdigits[d2];
out << hexdigits[d3];
out << hexdigits[d4];
out << '\\';
}
out << *it;
}
out << '"';
}
} } // Namespace Poco::JSON

View File

@ -991,6 +991,34 @@ void JSONTest::testDoubleElement()
}
void JSONTest::testSetArrayElement()
{
std::string json = "[]";
Parser parser;
Var result = parser.parse(json);
Poco::JSON::Array::Ptr array = result.extract<Poco::JSON::Array::Ptr>();
// array[0] = 7
array->set(0, 7);
assert(array->size() == 1);
assert(array->getElement<int>(0) == 7);
// array[2] = "foo"
array->set(2, std::string("foo"));
assert(array->size() == 3);
assert(array->getElement<int>(0) == 7);
assert(array->isNull(1));
assert(array->getElement<std::string>(2) == "foo");
// array[1] = 13
array->set(1, 13);
assert(array->size() == 3);
assert(array->getElement<int>(0) == 7);
assert(array->getElement<int>(1) == 13);
assert(array->getElement<std::string>(2) == "foo");
}
void JSONTest::testOptValue()
{
std::string json = "{ }";
@ -1196,12 +1224,14 @@ void JSONTest::testPrintHandler()
void JSONTest::testStringify()
{
Object jObj(false);
jObj.set("foo", 0);
jObj.set("bar", 0);
jObj.set("foo\\", 0);
jObj.set("bar/", 0);
jObj.set("baz", 0);
jObj.set("q\"uote\"d", 0);
std::stringstream ss;
jObj.stringify(ss);
assert(ss.str() == "{\"bar\":0,\"baz\":0,\"foo\":0}");
assert(ss.str() == "{\"bar\\/\":0,\"baz\":0,\"foo\\\\\":0,\"q\\\"uote\\\"d\":0}");
std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, "
"\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], "
@ -1241,6 +1271,7 @@ void JSONTest::testStringify()
"\"wife\":{"
"\"age\":36,\"name\":\"Marge\""
"}}}";
assert (ostr.str() == str);
ostr.str("");
@ -1625,16 +1656,9 @@ void JSONTest::testUnicode()
Parser parser;
Var result;
try
{
parser.parse(json);
result = parser.asVar();
}
catch(JSONException& jsone)
{
std::cout << jsone.message() << std::endl;
assert(false);
}
parser.parse(json);
result = parser.asVar();
assert(result.type() == typeid(Object::Ptr));
Object::Ptr object = result.extract<Object::Ptr>();
@ -1647,6 +1671,54 @@ void JSONTest::testUnicode()
converter.convert(text, original);
assert(test.convert<std::string>() == original);
parser.reset();
std::ostringstream os;
os << '[' << (char) 0x92 << ']';
try
{
parser.parse(os.str());
fail("Invalid Unicode sequence, must fail.");
}
catch (JSONException&) {}
parser.reset();
os.str("");
os << '[' << (char)0xC2 << (char)0x92 << ']';
result = parser.parse(os.str());
assert(result.type() == typeid(Poco::JSON::Array::Ptr));
parser.reset();
os.str("");
os << '[' << (char)0xAC << ']';
try
{
parser.parse(os.str());
fail("Invalid Unicode sequence, must fail.");
}
catch (JSONException&) {}
parser.reset();
os.str("");
os << '[' << (char)0xE2 << (char)0x82 << (char)0xAC << ']';
result = parser.parse(os.str());
assert(result.type() == typeid(Poco::JSON::Array::Ptr));
parser.reset();
os.str("");
os << '[' << (char)0xA2 << ']';
try
{
parser.parse(os.str());
fail("Invalid Unicode sequence, must fail.");
}
catch (JSONException&){}
parser.reset();
os.str("");
os << '[' << (char)0xF0 << (char)0xA4 << (char)0xAD << (char)0xAD << ']';
result = parser.parse(os.str());
assert(result.type() == typeid(Poco::JSON::Array::Ptr));
}
@ -1717,6 +1789,7 @@ CppUnit::Test* JSONTest::suite()
CppUnit_addTest(pSuite, JSONTest, testStringElement);
CppUnit_addTest(pSuite, JSONTest, testEmptyObjectElement);
CppUnit_addTest(pSuite, JSONTest, testDoubleElement);
CppUnit_addTest(pSuite, JSONTest, testSetArrayElement);
CppUnit_addTest(pSuite, JSONTest, testOptValue);
CppUnit_addTest(pSuite, JSONTest, testQuery);
CppUnit_addTest(pSuite, JSONTest, testComment);

View File

@ -53,6 +53,7 @@ public:
void testStringElement();
void testEmptyObjectElement();
void testDoubleElement();
void testSetArrayElement();
void testOptValue();
void testQuery();
void testComment();

View File

@ -20,7 +20,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -131,7 +131,9 @@ install(
install(
TARGETS ${LIBNAME}
DESTINATION lib
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX}
RUNTIME DESTINATION bin
)
if (ENABLE_TESTS)

View File

@ -44,7 +44,8 @@
DebugInformationFormat="3"
DisableSpecificWarnings="4800;"
CompileForArchitecture="2"
InterworkCalls="false"/>
InterworkCalls="false"
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -54,7 +55,7 @@
Name="VCPreLinkEventTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/FORCE:MULTIPLE"
AdditionalOptions="/FORCE:MULTIPLE "
AdditionalDependencies="ws2.lib iphlpapi.lib"
OutputFile="..\bin\$(PlatformName)\PocoNetd.dll"
LinkIncremental="2"
@ -123,7 +124,8 @@
DebugInformationFormat="3"
DisableSpecificWarnings="4800;"
CompileForArchitecture="2"
InterworkCalls="false"/>
InterworkCalls="false"
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -133,7 +135,7 @@
Name="VCPreLinkEventTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/FORCE:MULTIPLE"
AdditionalOptions="/FORCE:MULTIPLE "
AdditionalDependencies="ws2.lib iphlpapi.lib"
OutputFile="..\bin\$(PlatformName)\PocoNet.dll"
LinkIncremental="1"
@ -202,7 +204,8 @@
CompileAs="0"
DisableSpecificWarnings="4800;"
CompileForArchitecture="2"
InterworkCalls="false"/>
InterworkCalls="false"
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -267,7 +270,8 @@
CompileAs="0"
DisableSpecificWarnings="4800;"
CompileForArchitecture="2"
InterworkCalls="false"/>
InterworkCalls="false"
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -331,7 +335,8 @@
CompileAs="0"
DisableSpecificWarnings="4800;"
CompileForArchitecture="2"
InterworkCalls="false"/>
InterworkCalls="false"
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -396,7 +401,8 @@
CompileAs="0"
DisableSpecificWarnings="4800;"
CompileForArchitecture="2"
InterworkCalls="false"/>
InterworkCalls="false"
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -904,6 +910,27 @@
RelativePath=".\src\ICMPv4PacketImpl.cpp"/>
</Filter>
</Filter>
<Filter
Name="NTP">
<Filter
Name="Header Files">
<File
RelativePath=".\include\Poco\Net\NTPClient.h"/>
<File
RelativePath=".\include\Poco\Net\NTPEventArgs.h"/>
<File
RelativePath=".\include\Poco\Net\NTPPacket.h"/>
</Filter>
<Filter
Name="Source Files">
<File
RelativePath=".\src\NTPClient.cpp"/>
<File
RelativePath=".\src\NTPEventArgs.cpp"/>
<File
RelativePath=".\src\NTPPacket.cpp"/>
</Filter>
</Filter>
<Filter
Name="Logging">
<Filter

View File

@ -2,139 +2,139 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="NetCore">
<UniqueIdentifier>{ddb8d95a-0693-4a1e-a9dd-eb08c136fca6}</UniqueIdentifier>
<UniqueIdentifier>{14aec283-7ff4-4efb-9f81-3420ab775e3c}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Header Files">
<UniqueIdentifier>{80717d63-b118-4722-abe8-83ffb2fac8e3}</UniqueIdentifier>
<UniqueIdentifier>{c2d100ce-eb72-4c06-bb12-e565f4897cbd}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Source Files">
<UniqueIdentifier>{13deda94-2254-42e1-8005-df3e80316da6}</UniqueIdentifier>
<UniqueIdentifier>{b33527d9-8e86-432d-bb0f-86eb1bb2c35e}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets">
<UniqueIdentifier>{9c96e602-8870-4754-bb0e-436d9574c51b}</UniqueIdentifier>
<UniqueIdentifier>{bd76363d-cb8c-4b72-aefe-673066f957d1}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Header Files">
<UniqueIdentifier>{ad6f60c3-7278-4e9a-ac93-ede210ccf921}</UniqueIdentifier>
<UniqueIdentifier>{52f57056-64b6-4701-9ce7-27544cf708f1}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Source Files">
<UniqueIdentifier>{caeae3da-09e2-4f66-8f27-ecf3227644a5}</UniqueIdentifier>
<UniqueIdentifier>{554ed281-1bdc-4842-9a86-964a1e82c4e1}</UniqueIdentifier>
</Filter>
<Filter Include="Messages">
<UniqueIdentifier>{6d40b89f-1a08-49ef-852d-ff0291bde4c8}</UniqueIdentifier>
<UniqueIdentifier>{aa1cac08-334e-44ab-8ab0-92c26384648c}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Header Files">
<UniqueIdentifier>{9dda9199-36d1-4396-9671-f7b145c4633b}</UniqueIdentifier>
<UniqueIdentifier>{6b7232a9-cf64-4161-bba6-5249774b928f}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Source Files">
<UniqueIdentifier>{4a19a934-062a-4a1f-8087-83b63d98d465}</UniqueIdentifier>
<UniqueIdentifier>{4b5bf70d-92da-40a5-8eca-0a1d2045dd6f}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP">
<UniqueIdentifier>{d34b9921-3efb-4716-8cb4-f400bf35a282}</UniqueIdentifier>
<UniqueIdentifier>{323b204f-c3c6-401c-9417-128f0db4754e}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Header Files">
<UniqueIdentifier>{c7e1dd4b-13bf-4986-9258-10eae72b6f9c}</UniqueIdentifier>
<UniqueIdentifier>{5a364297-48e8-4741-83c6-cecc41f2bfb8}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Source Files">
<UniqueIdentifier>{bd86cce7-9f74-4d3b-b85f-804fcd76aabb}</UniqueIdentifier>
<UniqueIdentifier>{d11b9384-75a7-4009-8fdb-43e1052d3d51}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer">
<UniqueIdentifier>{a9760b2a-c55b-47c8-ac70-2a7ed872ff3d}</UniqueIdentifier>
<UniqueIdentifier>{c618ead8-59a0-4a7e-98af-bb3347ef2636}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Header Files">
<UniqueIdentifier>{fe8adb99-d1f8-4fe0-bc38-71ca2977b8e0}</UniqueIdentifier>
<UniqueIdentifier>{63edd2a7-3dc3-489d-ba29-e02b104df71d}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Source Files">
<UniqueIdentifier>{aea840ca-6105-44fe-985e-c9ddfc6534f3}</UniqueIdentifier>
<UniqueIdentifier>{6d3a6069-37c3-429b-bbb0-73160054d193}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer">
<UniqueIdentifier>{4ee18f87-8a22-4651-b339-e1b90e520abd}</UniqueIdentifier>
<UniqueIdentifier>{b942f118-d065-4c0e-9f23-ae066c00fb4d}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Header Files">
<UniqueIdentifier>{cff8ce88-b758-4db8-97b3-791555791c7d}</UniqueIdentifier>
<UniqueIdentifier>{ae858c60-46e6-4a61-b9a1-fe61146609c9}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Source Files">
<UniqueIdentifier>{3d4905cb-9e73-4482-a0c1-6cd9a3c99e3a}</UniqueIdentifier>
<UniqueIdentifier>{98093087-8998-491e-8013-7cb4c7d9e7f5}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient">
<UniqueIdentifier>{6ee90700-fd9d-4d9f-a9b8-92475696c3b4}</UniqueIdentifier>
<UniqueIdentifier>{bcadeca8-82eb-4d1d-b48e-2a29fb328b5b}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Header Files">
<UniqueIdentifier>{7615fa51-8d6b-421a-ae95-39a2f055b2c2}</UniqueIdentifier>
<UniqueIdentifier>{5684a188-249f-4fe9-89fc-ad555334867b}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Source Files">
<UniqueIdentifier>{5c5c75a6-9538-4b72-b2da-aee4d64c073e}</UniqueIdentifier>
<UniqueIdentifier>{310dc949-f275-44db-a2bb-3b5052ee1330}</UniqueIdentifier>
</Filter>
<Filter Include="HTML">
<UniqueIdentifier>{4adaaefe-9305-48af-b56c-bab8ea3453ed}</UniqueIdentifier>
<UniqueIdentifier>{ffd629df-10e2-42e7-99f6-a824a952cc93}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Header Files">
<UniqueIdentifier>{c8fe1ad2-2643-4177-a087-b2324d253cec}</UniqueIdentifier>
<UniqueIdentifier>{bc6735f8-45ac-412c-ac70-73901e04e676}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Source Files">
<UniqueIdentifier>{6f04438b-3c5a-480d-a044-181e13b2ca74}</UniqueIdentifier>
<UniqueIdentifier>{f1de02f7-07df-4b9b-afe3-61fbdb3e1920}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient">
<UniqueIdentifier>{6f934d1a-0c43-42c5-88b8-a44248803bc2}</UniqueIdentifier>
<UniqueIdentifier>{9c927ae0-0600-472c-9d69-58faa87503b7}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Header Files">
<UniqueIdentifier>{2a203585-ac88-478c-b07d-b7a9144ca1a2}</UniqueIdentifier>
<UniqueIdentifier>{5ac39e79-1c72-44e3-afef-a414298f8855}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Source Files">
<UniqueIdentifier>{bc87f701-2087-4feb-bf1d-79536f6ca6f9}</UniqueIdentifier>
<UniqueIdentifier>{781af335-85a6-402e-bebc-4ef140150a13}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor">
<UniqueIdentifier>{5d690637-3297-4245-ae57-5fb1c9935740}</UniqueIdentifier>
<UniqueIdentifier>{d5c1067e-f8bf-4980-b4ba-1c405f1bf954}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Header Files">
<UniqueIdentifier>{b329416c-c38d-47ab-887b-24fc72a2b0af}</UniqueIdentifier>
<UniqueIdentifier>{f160eb45-29a5-42a2-9854-dc0aa804be98}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Source Files">
<UniqueIdentifier>{c39bba1b-fcec-44b1-b4a6-3c5904c1432a}</UniqueIdentifier>
<UniqueIdentifier>{f028f30a-b838-4379-98d3-58c24b2cda1b}</UniqueIdentifier>
</Filter>
<Filter Include="Mail">
<UniqueIdentifier>{a0ab05f6-b94e-438d-a8c8-95a79561595c}</UniqueIdentifier>
<UniqueIdentifier>{f15dae81-6d71-4d44-8d77-22f62e2ad6d4}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Header Files">
<UniqueIdentifier>{64886fbc-d7b4-46e2-9788-7fec9903517f}</UniqueIdentifier>
<UniqueIdentifier>{fabd148d-4686-4056-b7ba-ed65f4e0c36e}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Source Files">
<UniqueIdentifier>{0e81ec45-b160-4d5d-b9d4-e13f026b9dfa}</UniqueIdentifier>
<UniqueIdentifier>{0511c8d5-11ee-4570-af10-4d1c2e42cd52}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP">
<UniqueIdentifier>{cb61233d-ea57-4bcb-9856-df33db4318f9}</UniqueIdentifier>
<UniqueIdentifier>{61996bdf-4574-4f03-a127-0f30b95221e2}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Header Files">
<UniqueIdentifier>{0e2e1940-d2a6-4265-96b8-c2086e485e9e}</UniqueIdentifier>
<UniqueIdentifier>{24dba10a-82a3-418a-80fb-3ca2e0cfdd1b}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Source Files">
<UniqueIdentifier>{163f94cd-ea04-4e28-958c-59b335b07e43}</UniqueIdentifier>
<UniqueIdentifier>{02e2d08f-f75b-4476-a3e0-682c6d267cf3}</UniqueIdentifier>
</Filter>
<Filter Include="NTP">
<UniqueIdentifier>{2ec78cd8-35a1-48c9-94ff-5d305a20a45a}</UniqueIdentifier>
<UniqueIdentifier>{b26d82c0-d35b-4df5-b40f-2a8a9bc89646}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Header Files">
<UniqueIdentifier>{69366170-6c75-45a0-aa79-c74719c70ab5}</UniqueIdentifier>
<UniqueIdentifier>{f6dcdeaa-47a2-4a5f-a3af-cb62e7f19e7d}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Source Files">
<UniqueIdentifier>{2bdb858c-272f-470d-80ae-90b31bfc9f9e}</UniqueIdentifier>
<UniqueIdentifier>{89725839-1149-4efd-89be-a14ef6a274bf}</UniqueIdentifier>
</Filter>
<Filter Include="Logging">
<UniqueIdentifier>{df5bcead-35a0-430f-9ab4-faaf3ae6ead5}</UniqueIdentifier>
<UniqueIdentifier>{15e1419e-557b-46ee-b77a-e6325c737c34}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Header Files">
<UniqueIdentifier>{331a663b-e2a5-4781-98cd-09ad253211c2}</UniqueIdentifier>
<UniqueIdentifier>{9e39bb30-ab26-418d-8a16-fb61d6754f65}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Source Files">
<UniqueIdentifier>{bc74edb5-d005-4223-a98a-7d74da970b4b}</UniqueIdentifier>
<UniqueIdentifier>{9c2b5a00-a3dd-4942-9aeb-a27c726c6b00}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket">
<UniqueIdentifier>{8f720bab-3700-4e2c-9f49-d2f20376f368}</UniqueIdentifier>
<UniqueIdentifier>{039e718b-12e9-4a53-aa83-68e2c40954b6}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Header Files">
<UniqueIdentifier>{7c78005b-d3f1-41ad-a4ed-f30e9459af97}</UniqueIdentifier>
<UniqueIdentifier>{98587191-10da-4e10-9985-7e2a3088bbb3}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Source Files">
<UniqueIdentifier>{d01f885d-495a-4b82-8e5b-12873d533ae1}</UniqueIdentifier>
<UniqueIdentifier>{f86fa534-af29-4476-a5c3-c35b269ae784}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>

View File

@ -119,6 +119,7 @@
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -130,6 +131,7 @@
<SubSystem>Console</SubSystem>
<ImportLibrary>..\lib\PocoNetd.lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_shared|Win32'">
@ -152,6 +154,7 @@
<DebugInformationFormat/>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -164,6 +167,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<ImportLibrary>..\lib\PocoNet.lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='debug_static_mt|Win32'">
@ -185,6 +189,7 @@
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib\PocoNetmtd.lib</OutputFile>
@ -210,6 +215,7 @@
<DebugInformationFormat/>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib\PocoNetmt.lib</OutputFile>
@ -234,6 +240,7 @@
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib\PocoNetmdd.lib</OutputFile>
@ -260,6 +267,7 @@
<DebugInformationFormat/>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>

View File

@ -2,139 +2,139 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="NetCore">
<UniqueIdentifier>{bf93ac22-b1ed-45b0-b1ad-6e5c45dd357b}</UniqueIdentifier>
<UniqueIdentifier>{3faeeac7-6dbb-4e28-82da-d3f8ca810ff0}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Header Files">
<UniqueIdentifier>{13e6bafa-9776-4d40-aef0-afbaab425acd}</UniqueIdentifier>
<UniqueIdentifier>{c0ff83aa-e870-4522-8173-6543c2c1a955}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Source Files">
<UniqueIdentifier>{e5fe6a3d-b398-4c9a-9a9b-0e7974aa2c67}</UniqueIdentifier>
<UniqueIdentifier>{2285ffec-5f56-496c-9bbe-1ec1877e64a5}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets">
<UniqueIdentifier>{17cec3ce-58b8-4f3b-80fd-278549e9f0ef}</UniqueIdentifier>
<UniqueIdentifier>{2754b11a-56ca-44c6-bb1f-3af8aaf04d53}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Header Files">
<UniqueIdentifier>{883506bd-9f38-4a21-a0d9-e9fbd2f48109}</UniqueIdentifier>
<UniqueIdentifier>{01a6454d-f0a1-4a16-a5b6-915a1b6c9d97}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Source Files">
<UniqueIdentifier>{906cc65b-a424-4e23-8bef-bd0692b53c0a}</UniqueIdentifier>
<UniqueIdentifier>{aad4b3fa-2d92-46e1-8f75-7c98712dfd8a}</UniqueIdentifier>
</Filter>
<Filter Include="Messages">
<UniqueIdentifier>{8b41a70d-665b-469c-b594-a2e0fd1dec83}</UniqueIdentifier>
<UniqueIdentifier>{65fd9a0f-c124-4c75-8cd7-bbda6cd4d936}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Header Files">
<UniqueIdentifier>{85820bf0-24cd-41fd-b2da-30468b93ff80}</UniqueIdentifier>
<UniqueIdentifier>{f174f985-c147-4c41-b8af-dc349b2ce5ae}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Source Files">
<UniqueIdentifier>{33d34ed1-97f1-4935-92bf-923eaddf3865}</UniqueIdentifier>
<UniqueIdentifier>{c32612a5-8bff-4320-83f9-9ebfa020a128}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP">
<UniqueIdentifier>{1433c088-0942-470a-a5f2-c1d5c98dbccd}</UniqueIdentifier>
<UniqueIdentifier>{13bbfd3b-e6d9-490b-8e68-1074ae8878ae}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Header Files">
<UniqueIdentifier>{ade366b2-74a8-440b-90a7-cf3f622bfb0f}</UniqueIdentifier>
<UniqueIdentifier>{1707d3e1-0ad4-4136-99a4-34df505b6aef}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Source Files">
<UniqueIdentifier>{83f28ae0-7192-4353-b46c-4db7a39c42a6}</UniqueIdentifier>
<UniqueIdentifier>{1ded03f1-0d2d-4b4b-bf9e-324e53e674af}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer">
<UniqueIdentifier>{1313e814-7e84-4182-9fa0-8a65b0d3886e}</UniqueIdentifier>
<UniqueIdentifier>{547a106e-fe37-4c2e-b227-1eb51325596c}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Header Files">
<UniqueIdentifier>{a589d672-41af-4a2b-9e46-568cec5c06ab}</UniqueIdentifier>
<UniqueIdentifier>{86aa99d7-487a-47ed-b1d0-19c9459b18e6}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Source Files">
<UniqueIdentifier>{6af0df92-a0b0-4b51-95de-4d889bf18899}</UniqueIdentifier>
<UniqueIdentifier>{5dfe4076-3aa8-4ede-9ef8-87cf84bb6d3d}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer">
<UniqueIdentifier>{af6c5d6a-a250-4b51-97e2-bc592c700b9e}</UniqueIdentifier>
<UniqueIdentifier>{465ec6bc-9210-4245-82b0-97dccbd0d1aa}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Header Files">
<UniqueIdentifier>{e67db7fb-6a04-4c39-97d3-3d5a6a83cdd5}</UniqueIdentifier>
<UniqueIdentifier>{bcc0569e-0c27-425a-a837-d9d7fe901553}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Source Files">
<UniqueIdentifier>{5b06e1c5-1100-43de-a9c4-54dfd7c0fce9}</UniqueIdentifier>
<UniqueIdentifier>{eff8fe48-41e7-4969-88f3-8009bb81fc89}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient">
<UniqueIdentifier>{8939f790-51f1-4953-9b27-472fb47d1659}</UniqueIdentifier>
<UniqueIdentifier>{1a326f54-901d-4dba-bc76-6bdc9edfa144}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Header Files">
<UniqueIdentifier>{3e779fb0-e41b-4fc0-9304-462d8019aaf8}</UniqueIdentifier>
<UniqueIdentifier>{87922337-ffa6-4348-972e-07ed33616906}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Source Files">
<UniqueIdentifier>{671ad416-a0f4-48e0-a71a-733bf3675bf8}</UniqueIdentifier>
<UniqueIdentifier>{034f9977-4003-4ec3-826b-b39c49f2bfa5}</UniqueIdentifier>
</Filter>
<Filter Include="HTML">
<UniqueIdentifier>{18b73242-192b-4860-897e-56cd81e84ea1}</UniqueIdentifier>
<UniqueIdentifier>{b014abff-b300-4503-bbd2-f842ca6d5465}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Header Files">
<UniqueIdentifier>{b29abaef-8b6b-4a92-bf7a-a0aea7f11dcb}</UniqueIdentifier>
<UniqueIdentifier>{8fe1d7f4-6aa0-40c9-84a1-832778b88982}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Source Files">
<UniqueIdentifier>{a3513b74-30be-444f-95d1-6fdf24f6d1e4}</UniqueIdentifier>
<UniqueIdentifier>{5cdface9-6c8c-49bd-b9c5-18163eded745}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient">
<UniqueIdentifier>{e97df5ae-1adb-4646-9bd3-250829068321}</UniqueIdentifier>
<UniqueIdentifier>{2e096fb4-af27-4fab-9ea6-4db04eb67d8d}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Header Files">
<UniqueIdentifier>{b6b83878-3308-46c7-9972-26520ca304fd}</UniqueIdentifier>
<UniqueIdentifier>{c1911cd9-eee8-491a-9d04-f94217de95f7}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Source Files">
<UniqueIdentifier>{2433021f-2ab9-4261-8f3a-6d023ba160d1}</UniqueIdentifier>
<UniqueIdentifier>{aac0e9bf-1a10-4078-8e1f-1f7f000f43ca}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor">
<UniqueIdentifier>{70a6eafd-56f9-4773-8e4f-87e5d2175d7c}</UniqueIdentifier>
<UniqueIdentifier>{91986bae-908f-4d46-97e9-8ef13ad41f89}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Header Files">
<UniqueIdentifier>{9a7ce52d-d095-4559-8436-7de95e971afb}</UniqueIdentifier>
<UniqueIdentifier>{3f07622a-9481-4c40-be77-348cd1f1bf17}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Source Files">
<UniqueIdentifier>{da3dc270-121d-48b9-9ca8-3e513d0f9239}</UniqueIdentifier>
<UniqueIdentifier>{1509bc83-502b-4d67-a308-3d239a811410}</UniqueIdentifier>
</Filter>
<Filter Include="Mail">
<UniqueIdentifier>{b8704ed1-e104-4a4b-8109-0e29edd7bb66}</UniqueIdentifier>
<UniqueIdentifier>{ccf88456-697b-4d70-97db-d06fe3c4f674}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Header Files">
<UniqueIdentifier>{1a0cc176-9c59-43d3-82e1-23f45f7fce68}</UniqueIdentifier>
<UniqueIdentifier>{c0110802-085e-446a-889f-f44ddd3509d7}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Source Files">
<UniqueIdentifier>{91e5e9c2-d7ec-43ce-8aec-66c543a11955}</UniqueIdentifier>
<UniqueIdentifier>{0f4fedcc-d579-4f06-957f-f41338e8504e}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP">
<UniqueIdentifier>{3e294831-7b07-47d1-842d-570496a6d952}</UniqueIdentifier>
<UniqueIdentifier>{9b204259-96cf-45a9-b3cf-35819de930c8}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Header Files">
<UniqueIdentifier>{3638e5e7-1a9e-4e8b-b592-d1b62c141ec7}</UniqueIdentifier>
<UniqueIdentifier>{24023f67-6d21-42a8-89c4-6f6f5abf4f59}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Source Files">
<UniqueIdentifier>{2ce82646-f2ab-4e38-8713-79cd35e42530}</UniqueIdentifier>
<UniqueIdentifier>{32cef24e-e499-4f14-a870-76f229fd0062}</UniqueIdentifier>
</Filter>
<Filter Include="NTP">
<UniqueIdentifier>{f3d85145-90c3-4a17-8562-be316bf20a1d}</UniqueIdentifier>
<UniqueIdentifier>{68029fdf-7518-42a2-915a-98627f2da600}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Header Files">
<UniqueIdentifier>{52ea85f6-a62a-4fe2-a402-c0f9a5fa450b}</UniqueIdentifier>
<UniqueIdentifier>{68c55bea-e6a3-42b1-ad56-69d3c31938fd}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Source Files">
<UniqueIdentifier>{182f7431-8d75-4743-95e1-97b299d06f3d}</UniqueIdentifier>
<UniqueIdentifier>{5e4dadea-83f5-4fa9-b2ed-9e73853930aa}</UniqueIdentifier>
</Filter>
<Filter Include="Logging">
<UniqueIdentifier>{48534ce3-5ed5-407b-b2c6-ebdfdc546dbc}</UniqueIdentifier>
<UniqueIdentifier>{17c8cfa6-d431-4e42-8c73-2b186cd267f7}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Header Files">
<UniqueIdentifier>{4740c6cf-e0ca-4965-bcc6-42c0b529dd0e}</UniqueIdentifier>
<UniqueIdentifier>{29f55cc6-4c0f-4a03-aab9-736f0720e66a}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Source Files">
<UniqueIdentifier>{d1b42d09-3e9a-4297-8887-e93c1f32875c}</UniqueIdentifier>
<UniqueIdentifier>{c896ce9a-cdbc-493c-80de-32bc44d0cd1f}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket">
<UniqueIdentifier>{01029c33-8806-433a-a26e-5f9c5cb105ed}</UniqueIdentifier>
<UniqueIdentifier>{ddd3660f-296a-4d05-bbb1-2925d5bcc704}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Header Files">
<UniqueIdentifier>{7845d469-a70e-40e0-81f3-6cab58acca9f}</UniqueIdentifier>
<UniqueIdentifier>{8f716034-d24f-43ef-a50b-fb722d02f7f3}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Source Files">
<UniqueIdentifier>{f914c395-d3b5-4373-a26b-4c6f73ac0d96}</UniqueIdentifier>
<UniqueIdentifier>{aec27efb-2416-4163-80f0-0d5ba376d7e4}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>

View File

@ -2,139 +2,139 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="NetCore">
<UniqueIdentifier>{b12d7ec2-1093-4e9c-8906-70bad655464f}</UniqueIdentifier>
<UniqueIdentifier>{94bc8b12-842d-4e55-bcc4-5c7e3a2dfe70}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Header Files">
<UniqueIdentifier>{9a78119d-4efb-484a-9429-31cdc099264d}</UniqueIdentifier>
<UniqueIdentifier>{48f82ead-b800-44b0-8e1e-1ee4c128fe2f}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Source Files">
<UniqueIdentifier>{799e8f86-ed35-4909-ac87-fafe2c551df1}</UniqueIdentifier>
<UniqueIdentifier>{ac27bda7-075d-4b75-a6a2-4e6e5c28fa76}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets">
<UniqueIdentifier>{0f9b239e-bb53-44a0-b936-2d7ebad7bed8}</UniqueIdentifier>
<UniqueIdentifier>{f32c8f66-88f1-4b4f-8693-1c78e9b8bfd0}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Header Files">
<UniqueIdentifier>{0e6d492a-b0ec-4c71-bb1c-a2dacefb3126}</UniqueIdentifier>
<UniqueIdentifier>{248ab3e9-6a8a-46b0-937e-4d9e36b5b0f7}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Source Files">
<UniqueIdentifier>{9987986f-c3d0-4242-aa15-2a6309ed0821}</UniqueIdentifier>
<UniqueIdentifier>{195a7671-b24e-4f2f-ba09-a5bc32027ec0}</UniqueIdentifier>
</Filter>
<Filter Include="Messages">
<UniqueIdentifier>{aa4b8e2e-a5f6-4eea-90f1-8d82be298824}</UniqueIdentifier>
<UniqueIdentifier>{fa319dc2-d2c4-4932-802c-8e8aa1f3aa40}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Header Files">
<UniqueIdentifier>{c27d8619-524e-4777-bb65-1a7f88b49cb7}</UniqueIdentifier>
<UniqueIdentifier>{3747e209-dc15-43e8-8d7d-83112ff2c64c}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Source Files">
<UniqueIdentifier>{632ded72-a1f9-4b1f-ba56-0edc2001b4f8}</UniqueIdentifier>
<UniqueIdentifier>{ca1a5a4c-fa26-4d1f-928c-afd010316606}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP">
<UniqueIdentifier>{ab948413-c58e-4b37-84c2-f7478bf7d9e3}</UniqueIdentifier>
<UniqueIdentifier>{573cced0-afe0-4360-b371-5f6038c922e0}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Header Files">
<UniqueIdentifier>{c5a7e7db-2211-43ee-a624-66a55520581e}</UniqueIdentifier>
<UniqueIdentifier>{f130cf90-f064-49b7-ab97-654fd4824217}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Source Files">
<UniqueIdentifier>{ceb26577-00a4-409e-a51b-7a4e8008f28b}</UniqueIdentifier>
<UniqueIdentifier>{7440359c-8642-45dd-b460-b38c919233ed}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer">
<UniqueIdentifier>{98e5ef2c-f449-4fb5-8477-bd653536ef6b}</UniqueIdentifier>
<UniqueIdentifier>{4fe38773-171d-4343-9eea-99a9b56efd65}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Header Files">
<UniqueIdentifier>{d2396321-d74f-4d30-a7e1-1e2d30a26940}</UniqueIdentifier>
<UniqueIdentifier>{0c25702f-285a-4ca6-8d07-ac588a72ec6d}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Source Files">
<UniqueIdentifier>{a51057ae-c932-4553-a622-9c463fb6a503}</UniqueIdentifier>
<UniqueIdentifier>{8801550c-efea-4650-8c54-c193becf816a}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer">
<UniqueIdentifier>{775adef8-b3f9-4edf-b1d4-70952dbf0c9a}</UniqueIdentifier>
<UniqueIdentifier>{ded77143-eddf-4c98-8b92-670d2aaf32ba}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Header Files">
<UniqueIdentifier>{31788d1c-d581-4755-b604-11588b8749d8}</UniqueIdentifier>
<UniqueIdentifier>{ebd7751b-680a-4fcb-adc3-cdee68bc5af5}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Source Files">
<UniqueIdentifier>{74ec7f29-4e6c-4d2b-a028-d50c3af007e3}</UniqueIdentifier>
<UniqueIdentifier>{3f293abf-6132-46af-bd32-58620604baae}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient">
<UniqueIdentifier>{04c2ece0-9f32-473f-96eb-092b7bc6f693}</UniqueIdentifier>
<UniqueIdentifier>{4b622fc6-ab83-45f4-bf18-44d9f2a99ad4}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Header Files">
<UniqueIdentifier>{8eb0477b-0aa0-43a7-8db2-f56cf22ad8ca}</UniqueIdentifier>
<UniqueIdentifier>{7c821706-00b5-4bf9-a032-4a2ed9edafdb}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Source Files">
<UniqueIdentifier>{834ca5e7-486d-4a1b-b729-b497b0a7fef7}</UniqueIdentifier>
<UniqueIdentifier>{75465328-9751-49f1-8473-af5455532cd6}</UniqueIdentifier>
</Filter>
<Filter Include="HTML">
<UniqueIdentifier>{9697ec4e-ceb2-49c6-985f-c04272c0cb7f}</UniqueIdentifier>
<UniqueIdentifier>{860da874-bf1b-4499-989b-0f0793e386ff}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Header Files">
<UniqueIdentifier>{1646e2dd-04a4-4f07-b4f0-1d3baeaa6926}</UniqueIdentifier>
<UniqueIdentifier>{a169cf4c-df11-4162-8afc-46d579c0f8b4}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Source Files">
<UniqueIdentifier>{63b09b8c-a34e-4b43-bbfb-c5a740fb6bd5}</UniqueIdentifier>
<UniqueIdentifier>{36251e50-f85e-4e10-a4d6-a0982d939e43}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient">
<UniqueIdentifier>{079fd901-385b-4e3c-aedd-8bcbeb0c2e24}</UniqueIdentifier>
<UniqueIdentifier>{99a71257-4c73-4d13-8d45-44c9232b5a6d}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Header Files">
<UniqueIdentifier>{3ebb62af-b1cb-4ef1-9f49-b2c26ab43eba}</UniqueIdentifier>
<UniqueIdentifier>{ec6b0d92-393f-4aa3-acbd-cd9f8ad99ca2}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Source Files">
<UniqueIdentifier>{a084bbb3-a4c7-442f-9dbe-31135fa1503b}</UniqueIdentifier>
<UniqueIdentifier>{3f00e37a-7f05-429a-b5cd-afcb9ed7079a}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor">
<UniqueIdentifier>{646da178-8728-4867-9085-88050223c5c6}</UniqueIdentifier>
<UniqueIdentifier>{47aaf606-c705-41f9-9d7d-1f085f3e323b}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Header Files">
<UniqueIdentifier>{ec93ff0e-f854-48e4-bd3c-aa25437fb28f}</UniqueIdentifier>
<UniqueIdentifier>{6ef62c8d-d0af-4bc9-887e-ddf329e3450e}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Source Files">
<UniqueIdentifier>{f73e3a47-6100-4b79-bd28-5d6eb1ff3329}</UniqueIdentifier>
<UniqueIdentifier>{51ed5aca-1e09-4a9f-b37d-62d3c9bcea2c}</UniqueIdentifier>
</Filter>
<Filter Include="Mail">
<UniqueIdentifier>{73dfa3f3-6a27-4fa7-af7f-628ebf154086}</UniqueIdentifier>
<UniqueIdentifier>{b325febe-fb66-40b6-bfd9-ac8b0cfbcae3}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Header Files">
<UniqueIdentifier>{d2480f81-64d6-4e67-b626-119f6611b627}</UniqueIdentifier>
<UniqueIdentifier>{2be1eb81-9f40-4954-a0fe-ed638e04dc14}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Source Files">
<UniqueIdentifier>{bdd8ba6f-5b59-4ccb-9dae-96de0f0f9186}</UniqueIdentifier>
<UniqueIdentifier>{57f384c8-5556-49a1-bdff-9c8428e9e48e}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP">
<UniqueIdentifier>{7bd431a6-eb3a-4e10-9aa3-7cbfb8d6d042}</UniqueIdentifier>
<UniqueIdentifier>{cbbfaa90-62cf-4053-8fd8-411428a32c80}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Header Files">
<UniqueIdentifier>{d6306ebe-ce12-4860-b4e3-c13d83899b9f}</UniqueIdentifier>
<UniqueIdentifier>{07d212e1-2f2f-42e2-b857-f1ab4994a44a}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Source Files">
<UniqueIdentifier>{d5ef0627-2c3a-4769-8d3e-81e90817a55f}</UniqueIdentifier>
<UniqueIdentifier>{f786fda2-b2f1-4ed5-955b-43464b2a263a}</UniqueIdentifier>
</Filter>
<Filter Include="NTP">
<UniqueIdentifier>{ec6d0d27-ba9b-4aaf-ac8f-bb2932e0810a}</UniqueIdentifier>
<UniqueIdentifier>{13736faa-2272-4f9b-a4d0-fac2303564f0}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Header Files">
<UniqueIdentifier>{8534ac9e-2d9c-4c44-89b6-c525221a07c6}</UniqueIdentifier>
<UniqueIdentifier>{77deb1b1-2cea-4a41-9f62-e42cb21f51f4}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Source Files">
<UniqueIdentifier>{38cb9773-1ca1-4a20-b3c5-b7feeb9eb170}</UniqueIdentifier>
<UniqueIdentifier>{bbf51640-bf5e-4745-9acf-917473cf2619}</UniqueIdentifier>
</Filter>
<Filter Include="Logging">
<UniqueIdentifier>{7bc7d911-6f05-4573-9f70-e07fda36405d}</UniqueIdentifier>
<UniqueIdentifier>{56a52865-7293-488d-bcdc-15bd38f7d7d7}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Header Files">
<UniqueIdentifier>{eb2d39d3-b631-4b89-b203-fcf778b92388}</UniqueIdentifier>
<UniqueIdentifier>{ddeef394-ed8f-492e-8aba-303938220fc7}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Source Files">
<UniqueIdentifier>{d2b52d30-03d8-4a6a-a6e2-232458c39fbf}</UniqueIdentifier>
<UniqueIdentifier>{b7eadfb2-9ed1-47a9-b2d0-a5f33c850e69}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket">
<UniqueIdentifier>{79b6fb46-c7b8-46a9-940c-f5ca2a9508b6}</UniqueIdentifier>
<UniqueIdentifier>{bf26605d-7d66-4eed-8a24-e639d0d776d4}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Header Files">
<UniqueIdentifier>{7c6ba88f-9e65-4613-9472-9527379610bb}</UniqueIdentifier>
<UniqueIdentifier>{0844955e-5232-44e3-b713-896fa381be47}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Source Files">
<UniqueIdentifier>{928ec224-7371-410e-a9e7-3c7fadea1e9d}</UniqueIdentifier>
<UniqueIdentifier>{e7d9f7b5-8f31-4e30-a3b5-0a7dd57e0771}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>

View File

@ -2,139 +2,139 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="NetCore">
<UniqueIdentifier>{ff5582f7-c508-4365-8f37-67be6af2be6f}</UniqueIdentifier>
<UniqueIdentifier>{b6d506fd-4c62-4cac-a59a-59b839acae4b}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Header Files">
<UniqueIdentifier>{0e03a507-77f8-4f77-a539-cd1731c4c298}</UniqueIdentifier>
<UniqueIdentifier>{b8d8e3f0-9ff4-4897-ae9a-d2502cf5bb49}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Source Files">
<UniqueIdentifier>{383e9176-fe8d-4633-b2d2-cb5a6bb03bf5}</UniqueIdentifier>
<UniqueIdentifier>{b6509127-9a9a-4f7b-8700-7c385e14c3fe}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets">
<UniqueIdentifier>{b59af455-f5ec-44d7-9d60-3b9ae519e666}</UniqueIdentifier>
<UniqueIdentifier>{93b3c1fc-bbf4-4128-a895-e6ca410422fa}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Header Files">
<UniqueIdentifier>{f0f2291c-1d55-4ec1-9ecd-f6b2f805888c}</UniqueIdentifier>
<UniqueIdentifier>{f2531f9c-2b2d-485a-8604-04dbe8445737}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Source Files">
<UniqueIdentifier>{ef83b525-5fd3-4fd1-90ad-79926a03d4a8}</UniqueIdentifier>
<UniqueIdentifier>{d9e29e4f-6c47-4e48-b850-51a734197a0a}</UniqueIdentifier>
</Filter>
<Filter Include="Messages">
<UniqueIdentifier>{c186f713-dbcd-4c3c-bb55-0190f8315aed}</UniqueIdentifier>
<UniqueIdentifier>{4cdb753e-4149-461d-acae-da8fe6fd53cd}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Header Files">
<UniqueIdentifier>{fffdc611-4ea7-4327-8726-206dd34dda65}</UniqueIdentifier>
<UniqueIdentifier>{543d3096-b1e5-4d6c-95f2-6287a8b8bf7c}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Source Files">
<UniqueIdentifier>{f6c04114-8f0f-44d9-8b4e-36b4180891f4}</UniqueIdentifier>
<UniqueIdentifier>{8e06b1f4-2d89-4805-8a6a-ddcb13eb2693}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP">
<UniqueIdentifier>{219fd87c-90d4-438c-aca9-a7c2e9b864cf}</UniqueIdentifier>
<UniqueIdentifier>{931c30be-8200-41aa-8d00-c96d8693e461}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Header Files">
<UniqueIdentifier>{42f64970-2178-4486-bd08-a7559af2c471}</UniqueIdentifier>
<UniqueIdentifier>{ea7fcb91-7608-4334-85a8-f25b5f5a2179}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Source Files">
<UniqueIdentifier>{07d2d40e-640b-48cc-9a6c-aa68469f36e4}</UniqueIdentifier>
<UniqueIdentifier>{e3c0da2f-e023-4300-82eb-c4a53896bcd4}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer">
<UniqueIdentifier>{e4bae9b2-192c-4107-86b8-56efb6db46bd}</UniqueIdentifier>
<UniqueIdentifier>{3cdecaa9-e61d-4bf8-991e-51acb65ee39b}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Header Files">
<UniqueIdentifier>{bd8b6f2d-d05d-4c78-a386-8ec911bac675}</UniqueIdentifier>
<UniqueIdentifier>{f055a72c-929b-486d-9a92-f7e56b0bf569}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Source Files">
<UniqueIdentifier>{b648fb3c-f134-4327-88ed-a8d755c131f5}</UniqueIdentifier>
<UniqueIdentifier>{487a8de4-d7b0-4382-adeb-739837767345}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer">
<UniqueIdentifier>{e81b06d1-da9b-4d29-b1f3-a84cb877dc8c}</UniqueIdentifier>
<UniqueIdentifier>{a233e7a7-dbc1-44dc-8c84-e4904e77c0a6}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Header Files">
<UniqueIdentifier>{718b66c9-316e-4561-8edb-0a94e089e6f2}</UniqueIdentifier>
<UniqueIdentifier>{ab6da2c8-9a6c-40fe-8b23-1d30f384a5cf}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Source Files">
<UniqueIdentifier>{6aeffea2-550f-478f-91c3-3c977ee5a0f2}</UniqueIdentifier>
<UniqueIdentifier>{1f5f2396-9a70-4795-b724-973b3c6c1c63}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient">
<UniqueIdentifier>{adba4a95-88c4-492a-9f56-a0a9a3658dc1}</UniqueIdentifier>
<UniqueIdentifier>{aa14c682-75e5-4046-99f6-1db9740d9ed8}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Header Files">
<UniqueIdentifier>{a748edf5-e6b0-4a1a-917e-34e1faf4d658}</UniqueIdentifier>
<UniqueIdentifier>{23071926-aa1e-45dd-8b52-6d3f8f28f76c}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Source Files">
<UniqueIdentifier>{c021ccc1-2e80-4f5b-b3d4-b3bb3948a910}</UniqueIdentifier>
<UniqueIdentifier>{d7bfcf28-bc98-4cda-94c5-8fa7a051dfdc}</UniqueIdentifier>
</Filter>
<Filter Include="HTML">
<UniqueIdentifier>{921315ff-a234-415e-bcc0-e7d44f8a9496}</UniqueIdentifier>
<UniqueIdentifier>{8bec130e-c335-4c3c-bead-a43a9f7d2d6d}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Header Files">
<UniqueIdentifier>{977ae80f-ab98-4da6-b02a-dc541fc62a14}</UniqueIdentifier>
<UniqueIdentifier>{19a3bc6e-4da0-431d-a485-fd2212bea8ea}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Source Files">
<UniqueIdentifier>{15222d19-aa1e-4e7a-a500-604c21ab6359}</UniqueIdentifier>
<UniqueIdentifier>{f60f0781-3575-4f87-b3b5-da7368f0325a}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient">
<UniqueIdentifier>{009e9f81-bfde-48ac-89c2-68f1c271edeb}</UniqueIdentifier>
<UniqueIdentifier>{d0e4e903-091b-448a-ad32-dbed0219b98e}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Header Files">
<UniqueIdentifier>{53c3a4b5-e1a3-4673-b258-3e832dc27fbe}</UniqueIdentifier>
<UniqueIdentifier>{aac1e726-6488-4fa0-924a-615486c67532}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Source Files">
<UniqueIdentifier>{1c97b4e1-a55b-4c6b-b6df-e507c55c69eb}</UniqueIdentifier>
<UniqueIdentifier>{aaf8df3e-442b-4abd-b792-b4cd7639b8d2}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor">
<UniqueIdentifier>{c01052b2-cabd-410a-917e-c491576628e2}</UniqueIdentifier>
<UniqueIdentifier>{cafc54f6-2027-41dc-9389-96b3f358591a}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Header Files">
<UniqueIdentifier>{89eff0d7-ffbe-4a2e-8242-c89f92fd6301}</UniqueIdentifier>
<UniqueIdentifier>{5a44fb8f-53bb-4f57-b4d4-e3bc14bf941f}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Source Files">
<UniqueIdentifier>{56a2991c-7b80-404e-8d65-a9966cb05e57}</UniqueIdentifier>
<UniqueIdentifier>{dd220b49-10d3-4a87-bb41-9a61f76969bd}</UniqueIdentifier>
</Filter>
<Filter Include="Mail">
<UniqueIdentifier>{3adef306-6add-450c-8287-33ff742b3889}</UniqueIdentifier>
<UniqueIdentifier>{57f83d69-ea56-4a5a-8d60-5109de1a9650}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Header Files">
<UniqueIdentifier>{af9a82ea-237e-42e5-b2dc-341287b8fb0f}</UniqueIdentifier>
<UniqueIdentifier>{784ab8b9-047a-4f25-993c-6c3b5a371cfd}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Source Files">
<UniqueIdentifier>{eabc6b03-405e-426e-be45-94c745524016}</UniqueIdentifier>
<UniqueIdentifier>{7e4ae408-678b-45a8-85d2-3f81c2907e17}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP">
<UniqueIdentifier>{8dce5b80-7a9d-49ba-a839-0e1b71a55f06}</UniqueIdentifier>
<UniqueIdentifier>{c502d851-48bb-4bbb-8726-7bd71454bd48}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Header Files">
<UniqueIdentifier>{730e0866-d1b6-4112-831a-9015c069b8c1}</UniqueIdentifier>
<UniqueIdentifier>{178ba19a-34c8-447e-b6cc-2907be564c5e}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Source Files">
<UniqueIdentifier>{5c3801df-aa59-43b5-9d76-9add796824cf}</UniqueIdentifier>
<UniqueIdentifier>{a711043b-3584-4cec-a965-7255e9d51f16}</UniqueIdentifier>
</Filter>
<Filter Include="NTP">
<UniqueIdentifier>{9ad300da-0d2e-441f-b98b-83ae110050ce}</UniqueIdentifier>
<UniqueIdentifier>{81d52583-7352-4788-afbe-b50703100e97}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Header Files">
<UniqueIdentifier>{e80fea6b-5292-4823-88b0-d7e06c15fac1}</UniqueIdentifier>
<UniqueIdentifier>{e1d31fc5-8559-4734-ba80-4478cfa88fef}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Source Files">
<UniqueIdentifier>{b33508c9-4eda-4a87-a697-e36f6b0507dd}</UniqueIdentifier>
<UniqueIdentifier>{b5e97038-51ab-44f0-9556-d9a7bedb0405}</UniqueIdentifier>
</Filter>
<Filter Include="Logging">
<UniqueIdentifier>{bc882a6a-7a39-48bd-a1fa-c477d6eea108}</UniqueIdentifier>
<UniqueIdentifier>{db299127-8739-46ca-9625-94c227765f66}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Header Files">
<UniqueIdentifier>{8112bfa1-d1db-4606-aba7-67388032e1fd}</UniqueIdentifier>
<UniqueIdentifier>{c7413499-ea68-4b01-b489-19e937ef5bde}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Source Files">
<UniqueIdentifier>{ae09252f-b13e-488c-bd1e-604ad3dc673e}</UniqueIdentifier>
<UniqueIdentifier>{625b91d4-a59a-44a9-839b-b8b0247fceb0}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket">
<UniqueIdentifier>{6bf2ff5d-0867-4d71-9bf9-d0126918a5ac}</UniqueIdentifier>
<UniqueIdentifier>{b6d0fedb-2419-4881-ad48-2255eb15cfce}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Header Files">
<UniqueIdentifier>{1212c7aa-632b-4135-9bb5-030133c23da3}</UniqueIdentifier>
<UniqueIdentifier>{623393e4-515a-46e2-8027-69d4ffcf32e5}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Source Files">
<UniqueIdentifier>{c56ef8a7-2144-4d36-874b-b23e85ac20de}</UniqueIdentifier>
<UniqueIdentifier>{612c1bdc-3eb3-4349-8eee-97ebb0704ba9}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>

View File

@ -37,7 +37,8 @@
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings="4800;"/>
DisableSpecificWarnings="4800;"
AdditionalOptions=""/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
@ -51,7 +52,8 @@
AdditionalLibraryDirectories="..\lib"
SubSystem="1"
ImportLibrary="..\lib\PocoNetd.lib"
TargetMachine="1"/>
TargetMachine="1"
AdditionalOptions=""/>
<Tool
Name="VCMIDLTool"/>
<Tool
@ -102,7 +104,8 @@
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings="4800;"/>
DisableSpecificWarnings="4800;"
AdditionalOptions=""/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
@ -117,7 +120,8 @@
OptimizeReferences="2"
EnableCOMDATFolding="2"
ImportLibrary="..\lib\PocoNet.lib"
TargetMachine="1"/>
TargetMachine="1"
AdditionalOptions=""/>
<Tool
Name="VCMIDLTool"/>
<Tool
@ -165,7 +169,8 @@
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings="4800;"/>
DisableSpecificWarnings="4800;"
AdditionalOptions=""/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
@ -221,7 +226,8 @@
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings="4800;"/>
DisableSpecificWarnings="4800;"
AdditionalOptions=""/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\lib\PocoNetmt.lib"/>
@ -274,7 +280,8 @@
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings="4800;"/>
DisableSpecificWarnings="4800;"
AdditionalOptions=""/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
@ -330,7 +337,8 @@
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings="4800;"/>
DisableSpecificWarnings="4800;"
AdditionalOptions=""/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\lib\PocoNetmd.lib"/>

View File

@ -46,7 +46,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -64,7 +65,8 @@
AdditionalLibraryDirectories="..\lib"
SubSystem="1"
ImportLibrary="..\lib\PocoNetd.lib"
TargetMachine="1"/>
TargetMachine="1"
AdditionalOptions=""/>
<Tool
Name="VCALinkTool"/>
<Tool
@ -116,7 +118,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -136,7 +139,8 @@
EnableCOMDATFolding="2"
OptimizeForWindows98="0"
ImportLibrary="..\lib\PocoNet.lib"
TargetMachine="1"/>
TargetMachine="1"
AdditionalOptions=""/>
<Tool
Name="VCALinkTool"/>
<Tool
@ -187,7 +191,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -244,7 +249,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -300,7 +306,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -357,7 +364,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool

View File

@ -46,7 +46,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -64,7 +65,8 @@
AdditionalLibraryDirectories="..\lib"
SubSystem="1"
ImportLibrary="..\lib\PocoNetd.lib"
TargetMachine="1"/>
TargetMachine="1"
AdditionalOptions=""/>
<Tool
Name="VCALinkTool"/>
<Tool
@ -116,7 +118,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -135,7 +138,8 @@
OptimizeReferences="2"
EnableCOMDATFolding="2"
ImportLibrary="..\lib\PocoNet.lib"
TargetMachine="1"/>
TargetMachine="1"
AdditionalOptions=""/>
<Tool
Name="VCALinkTool"/>
<Tool
@ -186,7 +190,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -243,7 +248,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -299,7 +305,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool
@ -356,7 +363,8 @@
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="0"
DisableSpecificWarnings=""/>
DisableSpecificWarnings=""
AdditionalOptions=""/>
<Tool
Name="VCManagedResourceCompilerTool"/>
<Tool

View File

@ -119,6 +119,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -130,6 +131,7 @@
<SubSystem>Console</SubSystem>
<ImportLibrary>..\lib64\PocoNetd.lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_shared|x64'">
@ -152,6 +154,7 @@
<DebugInformationFormat/>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -164,6 +167,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<ImportLibrary>..\lib64\PocoNet.lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='debug_static_mt|x64'">
@ -185,6 +189,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib64\PocoNetmtd.lib</OutputFile>
@ -210,6 +215,7 @@
<DebugInformationFormat/>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib64\PocoNetmt.lib</OutputFile>
@ -234,6 +240,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib64\PocoNetmdd.lib</OutputFile>
@ -259,6 +266,7 @@
<DebugInformationFormat/>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Lib>
<OutputFile>..\lib64\PocoNetmd.lib</OutputFile>

View File

@ -2,139 +2,139 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="NetCore">
<UniqueIdentifier>{d3008dba-917f-44d5-82b0-c9e8be0a6f51}</UniqueIdentifier>
<UniqueIdentifier>{9758a553-641c-4325-ad21-f22cb087fa17}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Header Files">
<UniqueIdentifier>{79cf9077-0e82-47c5-95d9-e64916560e4b}</UniqueIdentifier>
<UniqueIdentifier>{de0d5167-86f7-4614-81e9-439689e04125}</UniqueIdentifier>
</Filter>
<Filter Include="NetCore\Source Files">
<UniqueIdentifier>{039a79d3-57c4-4793-8df9-479c0ec77082}</UniqueIdentifier>
<UniqueIdentifier>{551a82c7-f681-4241-9a50-d3ea1b33c00c}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets">
<UniqueIdentifier>{50b72a8b-2646-4187-b353-3992707c8106}</UniqueIdentifier>
<UniqueIdentifier>{a1b61fef-9442-4b16-9982-65d3afea2d5a}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Header Files">
<UniqueIdentifier>{955bff75-e4d9-4be7-8d7d-d15da48ac8cc}</UniqueIdentifier>
<UniqueIdentifier>{1522d4e1-9cdf-4c9d-9157-db7e690b033b}</UniqueIdentifier>
</Filter>
<Filter Include="Sockets\Source Files">
<UniqueIdentifier>{74ea59d3-69e3-4435-acf6-630ce9e36505}</UniqueIdentifier>
<UniqueIdentifier>{28167d4b-868e-4a84-a027-85b40afbbf12}</UniqueIdentifier>
</Filter>
<Filter Include="Messages">
<UniqueIdentifier>{e17fbd19-41ae-4850-b531-27112ff3603a}</UniqueIdentifier>
<UniqueIdentifier>{f47a4ed7-06dd-4c41-8fe8-46ae0bbdc508}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Header Files">
<UniqueIdentifier>{d2ac61ed-c839-4283-9cca-b34bf1e88622}</UniqueIdentifier>
<UniqueIdentifier>{22571d0e-1298-4f30-956c-6bb6cb2cc15d}</UniqueIdentifier>
</Filter>
<Filter Include="Messages\Source Files">
<UniqueIdentifier>{042c5f8e-ed33-4abe-a8a0-377a2789242c}</UniqueIdentifier>
<UniqueIdentifier>{fa39ebb6-0fdc-4aef-b6fa-e93f64625c17}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP">
<UniqueIdentifier>{a7a457ce-f935-4390-8c28-9e593b6c87cf}</UniqueIdentifier>
<UniqueIdentifier>{f7f60e6c-9743-4056-b173-285208024c15}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Header Files">
<UniqueIdentifier>{e122c056-3967-4e90-ad15-4ac895986b51}</UniqueIdentifier>
<UniqueIdentifier>{b03de4e3-3a9d-4ba3-8353-5fee41f79798}</UniqueIdentifier>
</Filter>
<Filter Include="HTTP\Source Files">
<UniqueIdentifier>{dbe20e05-289c-4f68-949b-0b0f0dc8832c}</UniqueIdentifier>
<UniqueIdentifier>{9890bd5c-f95a-4c30-8f29-860adb2cf6e8}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer">
<UniqueIdentifier>{4ef88655-6d63-4997-a819-355163dd718d}</UniqueIdentifier>
<UniqueIdentifier>{3d685f78-9976-49a0-a0df-aa63aaa6e637}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Header Files">
<UniqueIdentifier>{8399833b-309a-4629-8f9f-b09f970de8e8}</UniqueIdentifier>
<UniqueIdentifier>{e0cd97fa-aec4-41b9-af04-c4819cb5898a}</UniqueIdentifier>
</Filter>
<Filter Include="TCPServer\Source Files">
<UniqueIdentifier>{13147168-cb4b-490e-90b7-92cc37146c01}</UniqueIdentifier>
<UniqueIdentifier>{ad923405-95d4-4efc-b046-576c75736bca}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer">
<UniqueIdentifier>{dc2f1250-6ed6-468d-82bf-5f5686c5a012}</UniqueIdentifier>
<UniqueIdentifier>{98e355f9-4573-405e-a7b8-b01fe8b92afe}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Header Files">
<UniqueIdentifier>{8f448dd8-9f5f-4ee4-ad03-77ec8ba6c4be}</UniqueIdentifier>
<UniqueIdentifier>{79723e1c-beb3-412f-9100-a8e64ca6daae}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPServer\Source Files">
<UniqueIdentifier>{3aaf7c6f-7bdd-43a3-ac38-e061ec458028}</UniqueIdentifier>
<UniqueIdentifier>{9ff72959-28df-4ed5-bd7d-a1c3491a956c}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient">
<UniqueIdentifier>{c536054f-a8a4-46c7-9d6d-a23f3481fd8b}</UniqueIdentifier>
<UniqueIdentifier>{5050d0dc-e0ca-4ca6-99a2-cf9edf002645}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Header Files">
<UniqueIdentifier>{e4ef790c-01c0-43a8-a23c-e48e99682662}</UniqueIdentifier>
<UniqueIdentifier>{3c8ed476-84e0-4ed5-b250-39579953eadd}</UniqueIdentifier>
</Filter>
<Filter Include="HTTPClient\Source Files">
<UniqueIdentifier>{e42c99d2-8516-454c-9f11-76224053945d}</UniqueIdentifier>
<UniqueIdentifier>{b28f7e59-4113-4efc-8e3d-b1bdd538c95b}</UniqueIdentifier>
</Filter>
<Filter Include="HTML">
<UniqueIdentifier>{9500b16a-5021-45bf-866f-cf5acec79408}</UniqueIdentifier>
<UniqueIdentifier>{33afdd14-1b99-4add-a598-0e50278e5426}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Header Files">
<UniqueIdentifier>{b0a64912-64e5-4f83-b97b-817edfd81fac}</UniqueIdentifier>
<UniqueIdentifier>{99db43aa-9d05-46d7-a463-849466735d7d}</UniqueIdentifier>
</Filter>
<Filter Include="HTML\Source Files">
<UniqueIdentifier>{b2e18da9-0f8c-42cd-84ab-8ac611b59805}</UniqueIdentifier>
<UniqueIdentifier>{37c8e621-3ba0-4315-b90d-3843afc17b8f}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient">
<UniqueIdentifier>{f2a680bc-730d-448f-960c-30dfe1a51c4f}</UniqueIdentifier>
<UniqueIdentifier>{3f1bc5f8-6743-4f69-be0f-f6a0d61cbe2f}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Header Files">
<UniqueIdentifier>{7d86c36f-9864-475f-9b28-7ec862735a4d}</UniqueIdentifier>
<UniqueIdentifier>{a8f04eed-9498-4cfe-8a54-5faeb741a0f8}</UniqueIdentifier>
</Filter>
<Filter Include="FTPClient\Source Files">
<UniqueIdentifier>{b48260d2-4022-42b6-988e-b28e39345444}</UniqueIdentifier>
<UniqueIdentifier>{00808d76-1b2b-40d3-94ea-a561f126788b}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor">
<UniqueIdentifier>{12ce2095-0b63-448d-8619-eedf3adf3170}</UniqueIdentifier>
<UniqueIdentifier>{1cb79d6c-80c6-4ae2-9de5-f1b49aea716f}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Header Files">
<UniqueIdentifier>{f0ad3d9c-3acd-438a-abfe-81997c3e5fa9}</UniqueIdentifier>
<UniqueIdentifier>{8e31358c-3d7d-4c61-b5d6-afe5b667934e}</UniqueIdentifier>
</Filter>
<Filter Include="Reactor\Source Files">
<UniqueIdentifier>{715aa320-3965-411c-a67a-6a55931c4b8a}</UniqueIdentifier>
<UniqueIdentifier>{a36ac539-0751-4a73-8d50-b5a966f1bd09}</UniqueIdentifier>
</Filter>
<Filter Include="Mail">
<UniqueIdentifier>{49a4e73d-a1b9-424a-be3e-0c635b47551b}</UniqueIdentifier>
<UniqueIdentifier>{eefde8d3-504d-4b15-9eab-06fb1d127dfd}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Header Files">
<UniqueIdentifier>{2743c350-58e4-4de9-a043-e7ca653d0ad5}</UniqueIdentifier>
<UniqueIdentifier>{b3e90411-80bf-47a2-a625-7bbb03f07624}</UniqueIdentifier>
</Filter>
<Filter Include="Mail\Source Files">
<UniqueIdentifier>{3db82e12-65bd-4d2c-ab06-36ba640b5dee}</UniqueIdentifier>
<UniqueIdentifier>{2168bc76-70b9-4086-94d7-4978d630dccb}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP">
<UniqueIdentifier>{4457ec56-9bde-4d5e-86a3-839202c01f49}</UniqueIdentifier>
<UniqueIdentifier>{4f1d4134-b52f-4af0-ab55-7b167d705322}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Header Files">
<UniqueIdentifier>{ea5c59cc-9844-44a4-b108-75f96ef3332e}</UniqueIdentifier>
<UniqueIdentifier>{71302c2c-d59e-4ce8-99f0-ba7fdf40f437}</UniqueIdentifier>
</Filter>
<Filter Include="ICMP\Source Files">
<UniqueIdentifier>{c4d2c6ac-5d2c-4b6d-9913-a0bc431b56f0}</UniqueIdentifier>
<UniqueIdentifier>{ca5c5950-0f05-4f46-a9fc-2fcfafc3e79a}</UniqueIdentifier>
</Filter>
<Filter Include="NTP">
<UniqueIdentifier>{0587daf7-29be-4a18-a67d-0261e8630b0d}</UniqueIdentifier>
<UniqueIdentifier>{d84576f4-5d21-4019-90f5-2e96ecd1c570}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Header Files">
<UniqueIdentifier>{b0f0fc71-db47-4bfd-a360-7222e15ee3d8}</UniqueIdentifier>
<UniqueIdentifier>{3f60fe07-6a44-45b8-a84a-cfc048601a2c}</UniqueIdentifier>
</Filter>
<Filter Include="NTP\Source Files">
<UniqueIdentifier>{41095bc8-537a-4def-a7c0-efd4b45e64f2}</UniqueIdentifier>
<UniqueIdentifier>{90f692e2-4643-4fbf-b432-b9379ea2ce7c}</UniqueIdentifier>
</Filter>
<Filter Include="Logging">
<UniqueIdentifier>{0be4eb52-0a25-40da-884c-513fbab72b9c}</UniqueIdentifier>
<UniqueIdentifier>{7719f7dd-c0f0-4a7f-a8c9-30e60caf252c}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Header Files">
<UniqueIdentifier>{6be2c1e1-dcb5-4d07-808c-be41d09e9b7d}</UniqueIdentifier>
<UniqueIdentifier>{57ca2e84-90ec-40fc-9e20-ee48d63e5a65}</UniqueIdentifier>
</Filter>
<Filter Include="Logging\Source Files">
<UniqueIdentifier>{b963bab6-61f5-4f34-8d53-d65dd135bd6c}</UniqueIdentifier>
<UniqueIdentifier>{5676cfed-4b8c-4a10-9a9d-b71246261746}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket">
<UniqueIdentifier>{55efb30a-51b3-48d4-83a4-f0ab03c6fb07}</UniqueIdentifier>
<UniqueIdentifier>{e886a01c-a2a2-43f2-be67-5a9a7cf60ae6}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Header Files">
<UniqueIdentifier>{6960e095-591c-4bb4-8a40-da02a264705a}</UniqueIdentifier>
<UniqueIdentifier>{6a4c12cd-5e0a-4222-8258-1353b7f51208}</UniqueIdentifier>
</Filter>
<Filter Include="WebSocket\Source Files">
<UniqueIdentifier>{efd4dbfa-2b21-4fe9-a142-03e7ccfce9fa}</UniqueIdentifier>
<UniqueIdentifier>{25c2dd6a-0af6-41b6-82de-57fd3eb74f70}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>

Some files were not shown because too many files have changed in this diff Show More