mirror of
https://github.com/pocoproject/poco.git
synced 2024-12-13 18:45:10 +01:00
trunk/branch integration: adding new files
This commit is contained in:
parent
fbe704af43
commit
51ddc1baaa
176
Foundation/src/Ascii.cpp
Normal file
176
Foundation/src/Ascii.cpp
Normal file
@ -0,0 +1,176 @@
|
||||
//
|
||||
// Ascii.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Ascii.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Core
|
||||
// Module: Ascii
|
||||
//
|
||||
// Copyright (c) 2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Ascii.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
const int Ascii::CHARACTER_PROPERTIES[128] =
|
||||
{
|
||||
/* 00 . */ ACP_CONTROL,
|
||||
/* 01 . */ ACP_CONTROL,
|
||||
/* 02 . */ ACP_CONTROL,
|
||||
/* 03 . */ ACP_CONTROL,
|
||||
/* 04 . */ ACP_CONTROL,
|
||||
/* 05 . */ ACP_CONTROL,
|
||||
/* 06 . */ ACP_CONTROL,
|
||||
/* 07 . */ ACP_CONTROL,
|
||||
/* 08 . */ ACP_CONTROL,
|
||||
/* 09 . */ ACP_CONTROL | ACP_SPACE,
|
||||
/* 0a . */ ACP_CONTROL | ACP_SPACE,
|
||||
/* 0b . */ ACP_CONTROL | ACP_SPACE,
|
||||
/* 0c . */ ACP_CONTROL | ACP_SPACE,
|
||||
/* 0d . */ ACP_CONTROL | ACP_SPACE,
|
||||
/* 0e . */ ACP_CONTROL,
|
||||
/* 0f . */ ACP_CONTROL,
|
||||
/* 10 . */ ACP_CONTROL,
|
||||
/* 11 . */ ACP_CONTROL,
|
||||
/* 12 . */ ACP_CONTROL,
|
||||
/* 13 . */ ACP_CONTROL,
|
||||
/* 14 . */ ACP_CONTROL,
|
||||
/* 15 . */ ACP_CONTROL,
|
||||
/* 16 . */ ACP_CONTROL,
|
||||
/* 17 . */ ACP_CONTROL,
|
||||
/* 18 . */ ACP_CONTROL,
|
||||
/* 19 . */ ACP_CONTROL,
|
||||
/* 1a . */ ACP_CONTROL,
|
||||
/* 1b . */ ACP_CONTROL,
|
||||
/* 1c . */ ACP_CONTROL,
|
||||
/* 1d . */ ACP_CONTROL,
|
||||
/* 1e . */ ACP_CONTROL,
|
||||
/* 1f . */ ACP_CONTROL,
|
||||
/* 20 */ ACP_SPACE | ACP_PRINT,
|
||||
/* 21 ! */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 22 " */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 23 # */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 24 $ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 25 % */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 26 & */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 27 ' */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 28 ( */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 29 ) */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 2a * */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 2b + */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 2c , */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 2d - */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 2e . */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 2f / */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 30 0 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 31 1 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 32 2 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 33 3 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 34 4 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 35 5 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 36 6 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 37 7 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 38 8 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 39 9 */ ACP_DIGIT | ACP_HEXDIGIT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 3a : */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 3b ; */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 3c < */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 3d = */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 3e > */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 3f ? */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 40 @ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 41 A */ ACP_HEXDIGIT | ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 42 B */ ACP_HEXDIGIT | ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 43 C */ ACP_HEXDIGIT | ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 44 D */ ACP_HEXDIGIT | ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 45 E */ ACP_HEXDIGIT | ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 46 F */ ACP_HEXDIGIT | ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 47 G */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 48 H */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 49 I */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 4a J */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 4b K */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 4c L */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 4d M */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 4e N */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 4f O */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 50 P */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 51 Q */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 52 R */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 53 S */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 54 T */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 55 U */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 56 V */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 57 W */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 58 X */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 59 Y */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 5a Z */ ACP_ALPHA | ACP_UPPER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 5b [ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 5c \ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 5d ] */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 5e ^ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 5f _ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 60 ` */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 61 a */ ACP_HEXDIGIT | ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 62 b */ ACP_HEXDIGIT | ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 63 c */ ACP_HEXDIGIT | ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 64 d */ ACP_HEXDIGIT | ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 65 e */ ACP_HEXDIGIT | ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 66 f */ ACP_HEXDIGIT | ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 67 g */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 68 h */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 69 i */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 6a j */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 6b k */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 6c l */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 6d m */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 6e n */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 6f o */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 70 p */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 71 q */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 72 r */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 73 s */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 74 t */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 75 u */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 76 v */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 77 w */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 78 x */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 79 y */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 7a z */ ACP_ALPHA | ACP_LOWER | ACP_GRAPH | ACP_PRINT,
|
||||
/* 7b { */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 7c | */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 7d } */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 7e ~ */ ACP_PUNCT | ACP_GRAPH | ACP_PRINT,
|
||||
/* 7f . */ ACP_CONTROL
|
||||
};
|
||||
|
||||
|
||||
} // namespace Poco
|
171
Foundation/src/AtomicCounter.cpp
Normal file
171
Foundation/src/AtomicCounter.cpp
Normal file
@ -0,0 +1,171 @@
|
||||
//
|
||||
// AtomicCounter.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/AtomicCounter.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Core
|
||||
// Module: AtomicCounter
|
||||
//
|
||||
// Copyright (c) 2009, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/AtomicCounter.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
#if POCO_OS == POCO_OS_WINDOWS_NT
|
||||
//
|
||||
// Windows
|
||||
//
|
||||
AtomicCounter::AtomicCounter():
|
||||
_counter(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue):
|
||||
_counter(initialValue)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::AtomicCounter(const AtomicCounter& counter):
|
||||
_counter(counter.value())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::~AtomicCounter()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
|
||||
{
|
||||
InterlockedExchange(&_counter, counter.value());
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
|
||||
{
|
||||
InterlockedExchange(&_counter, value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
#elif POCO_OS == POCO_OS_MAC_OS_X
|
||||
//
|
||||
// Mac OS X
|
||||
//
|
||||
AtomicCounter::AtomicCounter():
|
||||
_counter(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue):
|
||||
_counter(initialValue)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::AtomicCounter(const AtomicCounter& counter):
|
||||
_counter(counter.value())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::~AtomicCounter()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
|
||||
{
|
||||
_counter = counter.value();
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
|
||||
{
|
||||
_counter = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
//
|
||||
// Generic implementation based on FastMutex
|
||||
//
|
||||
AtomicCounter::AtomicCounter()
|
||||
{
|
||||
_counter.value = 0;
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue)
|
||||
{
|
||||
_counter.value = initialValue;
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::AtomicCounter(const AtomicCounter& counter)
|
||||
{
|
||||
_counter.value = counter.value();
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter::~AtomicCounter()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
|
||||
{
|
||||
FastMutex::ScopedLock lock(_counter.mutex);
|
||||
_counter.value = counter.value();
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
|
||||
{
|
||||
FastMutex::ScopedLock lock(_counter.mutex);
|
||||
_counter.value = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
#endif // POCO_OS
|
||||
|
||||
|
||||
} // namespace Poco
|
186
Foundation/src/Environment_VX.cpp
Normal file
186
Foundation/src/Environment_VX.cpp
Normal file
@ -0,0 +1,186 @@
|
||||
|
||||
// Environment_VX.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Environment_VX.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Core
|
||||
// Module: Environment
|
||||
//
|
||||
// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Environment_VX.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include <VxWorks.h>
|
||||
#include <envLib.h>
|
||||
#include <hostLib.h>
|
||||
#include <ifLib.h>
|
||||
#include <sockLib.h>
|
||||
#include <ioLib.h>
|
||||
#include <version.h>
|
||||
#include <cstring>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <net/if.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
EnvironmentImpl::StringMap EnvironmentImpl::_map;
|
||||
FastMutex EnvironmentImpl::_mutex;
|
||||
|
||||
|
||||
std::string EnvironmentImpl::getImpl(const std::string& name)
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
|
||||
const char* val = getenv(name.c_str());
|
||||
if (val)
|
||||
return std::string(val);
|
||||
else
|
||||
throw NotFoundException(name);
|
||||
}
|
||||
|
||||
|
||||
bool EnvironmentImpl::hasImpl(const std::string& name)
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
|
||||
return getenv(name.c_str()) != 0;
|
||||
}
|
||||
|
||||
|
||||
void EnvironmentImpl::setImpl(const std::string& name, const std::string& value)
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
|
||||
std::string var = name;
|
||||
var.append("=");
|
||||
var.append(value);
|
||||
_map[name] = var;
|
||||
if (putenv((char*) _map[name].c_str()))
|
||||
{
|
||||
std::string msg = "cannot set environment variable: ";
|
||||
msg.append(name);
|
||||
throw SystemException(msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::osNameImpl()
|
||||
{
|
||||
return runtimeName;
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::osVersionImpl()
|
||||
{
|
||||
return runtimeVersion;
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::osArchitectureImpl()
|
||||
{
|
||||
#if POCO_ARCH == POCO_ARCH_IA32
|
||||
return "i386";
|
||||
#elif POCO_ARCH == POCO_ARCH_MIPS
|
||||
return "mips";
|
||||
#elif POCO_ARCH == POCO_ARCH_PPC
|
||||
return "ppc";
|
||||
#elif POCO_ARCH == POCO_ARCH_ARM
|
||||
return "arm";
|
||||
#elif POCO_ARCH == POCO_ARCH_SH
|
||||
return "sh";
|
||||
#else
|
||||
return "unknown";
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::nodeNameImpl()
|
||||
{
|
||||
char buffer[64];
|
||||
if (gethostname(buffer, sizeof(buffer)) == OK)
|
||||
return buffer;
|
||||
else
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
|
||||
unsigned EnvironmentImpl::processorCountImpl()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void EnvironmentImpl::nodeIdImpl(NodeId& id)
|
||||
{
|
||||
std::memset(&id, 0, sizeof(id));
|
||||
int ifIndex = 0;
|
||||
char ifName[32];
|
||||
char ifAddr[4];
|
||||
|
||||
int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (s == -1) return;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (ifIndexToIfName(ifIndex, ifName) == OK)
|
||||
{
|
||||
if (ifAddrGet(ifName, ifAddr) == OK)
|
||||
{
|
||||
struct arpreq ar;
|
||||
std::memset(&ar, 0, sizeof(ar));
|
||||
struct sockaddr_in* pAddr = reinterpret_cast<struct sockaddr_in*>(&ar.arp_pa);
|
||||
pAddr->sin_family = AF_INET;
|
||||
std::memcpy(&pAddr->sin_addr, ifAddr, sizeof(struct in_addr));
|
||||
int rc = ioctl(s, SIOCGARP, reinterpret_cast<int>(&ar));
|
||||
if (rc < 0) continue;
|
||||
std::memcpy(&id, ar.arp_ha.sa_data, sizeof(id));
|
||||
close(s);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
close(s);
|
||||
throw SystemException("cannot get Ethernet hardware address");
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
259
Foundation/src/Environment_WINCE.cpp
Normal file
259
Foundation/src/Environment_WINCE.cpp
Normal file
@ -0,0 +1,259 @@
|
||||
//
|
||||
// Environment_WINCE.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Environment_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Core
|
||||
// Module: Environment
|
||||
//
|
||||
// Copyright (c) 2009-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Environment_WINCE.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/UnicodeConverter.h"
|
||||
#include "Poco/String.h"
|
||||
#include "Poco/Path.h"
|
||||
#include "Poco/NumberFormatter.h"
|
||||
#include <sstream>
|
||||
#include <cstring>
|
||||
#include <windows.h>
|
||||
#include <iphlpapi.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
const std::string EnvironmentImpl::TEMP("TEMP");
|
||||
const std::string EnvironmentImpl::TMP("TMP");
|
||||
const std::string EnvironmentImpl::HOMEPATH("HOMEPATH");
|
||||
const std::string EnvironmentImpl::COMPUTERNAME("COMPUTERNAME");
|
||||
const std::string EnvironmentImpl::OS("OS");
|
||||
const std::string EnvironmentImpl::NUMBER_OF_PROCESSORS("NUMBER_OF_PROCESSORS");
|
||||
const std::string EnvironmentImpl::PROCESSOR_ARCHITECTURE("PROCESSOR_ARCHITECTURE");
|
||||
|
||||
|
||||
std::string EnvironmentImpl::getImpl(const std::string& name)
|
||||
{
|
||||
std::string value;
|
||||
if (!envVar(name, &value)) throw NotFoundException(name);
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
bool EnvironmentImpl::hasImpl(const std::string& name)
|
||||
{
|
||||
return envVar(name, 0);
|
||||
}
|
||||
|
||||
|
||||
void EnvironmentImpl::setImpl(const std::string& name, const std::string& value)
|
||||
{
|
||||
throw NotImplementedException("Cannot set environment variables on Windows CE");
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::osNameImpl()
|
||||
{
|
||||
return "Windows CE";
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::osVersionImpl()
|
||||
{
|
||||
OSVERSIONINFOW vi;
|
||||
vi.dwOSVersionInfoSize = sizeof(vi);
|
||||
if (GetVersionExW(&vi) == 0) throw SystemException("Cannot get OS version information");
|
||||
std::ostringstream str;
|
||||
str << vi.dwMajorVersion << "." << vi.dwMinorVersion << " (Build " << (vi.dwBuildNumber & 0xFFFF);
|
||||
std::string version;
|
||||
UnicodeConverter::toUTF8(vi.szCSDVersion, version);
|
||||
if (!version.empty()) str << ": " << version;
|
||||
str << ")";
|
||||
return str.str();
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::osArchitectureImpl()
|
||||
{
|
||||
SYSTEM_INFO si;
|
||||
GetSystemInfo(&si);
|
||||
switch (si.wProcessorArchitecture)
|
||||
{
|
||||
case PROCESSOR_ARCHITECTURE_INTEL:
|
||||
return "IA32";
|
||||
case PROCESSOR_ARCHITECTURE_MIPS:
|
||||
return "MIPS";
|
||||
case PROCESSOR_ARCHITECTURE_ALPHA:
|
||||
return "ALPHA";
|
||||
case PROCESSOR_ARCHITECTURE_PPC:
|
||||
return "PPC";
|
||||
case PROCESSOR_ARCHITECTURE_IA64:
|
||||
return "IA64";
|
||||
#ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
|
||||
case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
|
||||
return "IA64/32";
|
||||
#endif
|
||||
#ifdef PROCESSOR_ARCHITECTURE_AMD64
|
||||
case PROCESSOR_ARCHITECTURE_AMD64:
|
||||
return "AMD64";
|
||||
#endif
|
||||
case PROCESSOR_ARCHITECTURE_SHX:
|
||||
return "SHX";
|
||||
case PROCESSOR_ARCHITECTURE_ARM:
|
||||
return "ARM";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string EnvironmentImpl::nodeNameImpl()
|
||||
{
|
||||
HKEY hKey;
|
||||
DWORD dwDisposition;
|
||||
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"\\Ident", 0, 0, 0, 0, 0, &hKey, &dwDisposition) != ERROR_SUCCESS)
|
||||
throw SystemException("Cannot get node name", "registry key not found");
|
||||
|
||||
std::string value;
|
||||
DWORD dwType;
|
||||
BYTE bData[1026];
|
||||
DWORD dwData = sizeof(bData);
|
||||
if (RegQueryValueExW(hKey, L"Name", 0, &dwType, bData, &dwData) == ERROR_SUCCESS)
|
||||
{
|
||||
switch (dwType)
|
||||
{
|
||||
case REG_SZ:
|
||||
UnicodeConverter::toUTF8(reinterpret_cast<wchar_t*>(bData), value);
|
||||
break;
|
||||
|
||||
default:
|
||||
RegCloseKey(hKey);
|
||||
throw SystemException("Cannot get node name", "registry value has wrong type");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
throw SystemException("Cannot get node name", "registry value not found");
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
void EnvironmentImpl::nodeIdImpl(NodeId& id)
|
||||
{
|
||||
PIP_ADAPTER_INFO pAdapterInfo;
|
||||
PIP_ADAPTER_INFO pAdapter = 0;
|
||||
ULONG len = sizeof(IP_ADAPTER_INFO);
|
||||
pAdapterInfo = reinterpret_cast<IP_ADAPTER_INFO*>(new char[len]);
|
||||
// Make an initial call to GetAdaptersInfo to get
|
||||
// the necessary size into len
|
||||
DWORD rc = GetAdaptersInfo(pAdapterInfo, &len);
|
||||
if (rc == ERROR_BUFFER_OVERFLOW)
|
||||
{
|
||||
delete [] reinterpret_cast<char*>(pAdapterInfo);
|
||||
pAdapterInfo = reinterpret_cast<IP_ADAPTER_INFO*>(new char[len]);
|
||||
}
|
||||
else if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
throw SystemException("cannot get network adapter list");
|
||||
}
|
||||
try
|
||||
{
|
||||
bool found = false;
|
||||
if (GetAdaptersInfo(pAdapterInfo, &len) == NO_ERROR)
|
||||
{
|
||||
pAdapter = pAdapterInfo;
|
||||
while (pAdapter && !found)
|
||||
{
|
||||
if (pAdapter->Type == MIB_IF_TYPE_ETHERNET && pAdapter->AddressLength == sizeof(id))
|
||||
{
|
||||
std::memcpy(&id, pAdapter->Address, pAdapter->AddressLength);
|
||||
found = true;
|
||||
}
|
||||
pAdapter = pAdapter->Next;
|
||||
}
|
||||
}
|
||||
else throw SystemException("cannot get network adapter list");
|
||||
if (!found) throw SystemException("no Ethernet adapter found");
|
||||
}
|
||||
catch (Exception&)
|
||||
{
|
||||
delete [] reinterpret_cast<char*>(pAdapterInfo);
|
||||
throw;
|
||||
}
|
||||
delete [] reinterpret_cast<char*>(pAdapterInfo);
|
||||
}
|
||||
|
||||
|
||||
unsigned EnvironmentImpl::processorCountImpl()
|
||||
{
|
||||
SYSTEM_INFO si;
|
||||
GetSystemInfo(&si);
|
||||
return si.dwNumberOfProcessors;
|
||||
}
|
||||
|
||||
|
||||
bool EnvironmentImpl::envVar(const std::string& name, std::string* value)
|
||||
{
|
||||
if (icompare(name, TEMP) == 0)
|
||||
{
|
||||
if (value) *value = Path::temp();
|
||||
}
|
||||
else if (icompare(name, TMP) == 0)
|
||||
{
|
||||
if (value) *value = Path::temp();
|
||||
}
|
||||
else if (icompare(name, HOMEPATH) == 0)
|
||||
{
|
||||
if (value) *value = Path::home();
|
||||
}
|
||||
else if (icompare(name, COMPUTERNAME) == 0)
|
||||
{
|
||||
if (value) *value = nodeNameImpl();
|
||||
}
|
||||
else if (icompare(name, OS) == 0)
|
||||
{
|
||||
if (value) *value = osNameImpl();
|
||||
}
|
||||
else if (icompare(name, NUMBER_OF_PROCESSORS) == 0)
|
||||
{
|
||||
if (value) *value = NumberFormatter::format(processorCountImpl());
|
||||
}
|
||||
else if (icompare(name, PROCESSOR_ARCHITECTURE) == 0)
|
||||
{
|
||||
if (value) *value = osArchitectureImpl();
|
||||
}
|
||||
else return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
388
Foundation/src/File_VX.cpp
Normal file
388
Foundation/src/File_VX.cpp
Normal file
@ -0,0 +1,388 @@
|
||||
//
|
||||
// File_VX.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/File_VX.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
// Module: File
|
||||
//
|
||||
// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/File_VX.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <algorithm>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <utime.h>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
FileImpl::FileImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
FileImpl::FileImpl(const std::string& path): _path(path)
|
||||
{
|
||||
std::string::size_type n = _path.size();
|
||||
if (n > 1 && _path[n - 1] == '/')
|
||||
_path.resize(n - 1);
|
||||
}
|
||||
|
||||
|
||||
FileImpl::~FileImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::swapImpl(FileImpl& file)
|
||||
{
|
||||
std::swap(_path, file._path);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setPathImpl(const std::string& path)
|
||||
{
|
||||
_path = path;
|
||||
std::string::size_type n = _path.size();
|
||||
if (n > 1 && _path[n - 1] == '/')
|
||||
_path.resize(n - 1);
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::existsImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
return stat(const_cast<char*>(_path.c_str()), &st) == 0;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::canReadImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::canWriteImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::canExecuteImpl() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isFileImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
if (stat(const_cast<char*>(_path.c_str()), &st) == 0)
|
||||
return S_ISREG(st.st_mode);
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isDirectoryImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
if (stat(const_cast<char*>(_path.c_str()), &st) == 0)
|
||||
return S_ISDIR(st.st_mode);
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isLinkImpl() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isDeviceImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
if (stat(const_cast<char*>(_path.c_str()), &st) == 0)
|
||||
return S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode);
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isHiddenImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
Path p(_path);
|
||||
p.makeFile();
|
||||
|
||||
return p.getFileName()[0] == '.';
|
||||
}
|
||||
|
||||
|
||||
Timestamp FileImpl::createdImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
if (stat(const_cast<char*>(_path.c_str()), &st) == 0)
|
||||
return Timestamp::fromEpochTime(st.st_ctime);
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Timestamp FileImpl::getLastModifiedImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
if (stat(const_cast<char*>(_path.c_str()), &st) == 0)
|
||||
return Timestamp::fromEpochTime(st.st_mtime);
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setLastModifiedImpl(const Timestamp& ts)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct utimbuf tb;
|
||||
tb.actime = ts.epochTime();
|
||||
tb.modtime = ts.epochTime();
|
||||
if (utime(const_cast<char*>(_path.c_str()), &tb) != 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
FileImpl::FileSizeImpl FileImpl::getSizeImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
struct stat st;
|
||||
if (stat(const_cast<char*>(_path.c_str()), &st) == 0)
|
||||
return st.st_size;
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setSizeImpl(FileSizeImpl size)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
int fd = open(_path.c_str(), O_WRONLY, S_IRWXU);
|
||||
if (fd != -1)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ftruncate(fd, size) != 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
close(fd);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setWriteableImpl(bool flag)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setExecutableImpl(bool flag)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::copyToImpl(const std::string& path) const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
int sd = open(_path.c_str(), O_RDONLY, 0);
|
||||
if (sd == -1) handleLastErrorImpl(_path);
|
||||
|
||||
struct stat st;
|
||||
if (fstat(sd, &st) != 0)
|
||||
{
|
||||
close(sd);
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
const long blockSize = st.st_blksize;
|
||||
|
||||
int dd = open(path.c_str(), O_CREAT | O_TRUNC | O_WRONLY, st.st_mode & S_IRWXU);
|
||||
if (dd == -1)
|
||||
{
|
||||
close(sd);
|
||||
handleLastErrorImpl(path);
|
||||
}
|
||||
Buffer<char> buffer(blockSize);
|
||||
try
|
||||
{
|
||||
int n;
|
||||
while ((n = read(sd, buffer.begin(), blockSize)) > 0)
|
||||
{
|
||||
if (write(dd, buffer.begin(), n) != n)
|
||||
handleLastErrorImpl(path);
|
||||
}
|
||||
if (n < 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
close(sd);
|
||||
close(dd);
|
||||
throw;
|
||||
}
|
||||
close(sd);
|
||||
close(dd);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::renameToImpl(const std::string& path)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
if (rename(_path.c_str(), path.c_str()) != 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::removeImpl()
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
int rc;
|
||||
if (!isLinkImpl() && isDirectoryImpl())
|
||||
rc = rmdir(_path.c_str());
|
||||
else
|
||||
rc = unlink(const_cast<char*>(_path.c_str()));
|
||||
if (rc) handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::createFileImpl()
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
int n = open(_path.c_str(), O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
|
||||
if (n != -1)
|
||||
{
|
||||
close(n);
|
||||
return true;
|
||||
}
|
||||
if (n == -1 && errno == EEXIST)
|
||||
return false;
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::createDirectoryImpl()
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
if (existsImpl() && isDirectoryImpl())
|
||||
return false;
|
||||
if (mkdir(_path.c_str()) != 0)
|
||||
handleLastErrorImpl(_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::handleLastErrorImpl(const std::string& path)
|
||||
{
|
||||
switch (errno)
|
||||
{
|
||||
case EIO:
|
||||
throw IOException(path);
|
||||
case EPERM:
|
||||
throw FileAccessDeniedException("insufficient permissions", path);
|
||||
case EACCES:
|
||||
throw FileAccessDeniedException(path);
|
||||
case ENOENT:
|
||||
throw FileNotFoundException(path);
|
||||
case ENOTDIR:
|
||||
throw OpenFileException("not a directory", path);
|
||||
case EISDIR:
|
||||
throw OpenFileException("not a file", path);
|
||||
case EROFS:
|
||||
throw FileReadOnlyException(path);
|
||||
case EEXIST:
|
||||
throw FileExistsException(path);
|
||||
case ENOSPC:
|
||||
throw FileException("no space left on device", path);
|
||||
case ENOTEMPTY:
|
||||
throw FileException("directory not empty", path);
|
||||
case ENAMETOOLONG:
|
||||
throw PathSyntaxException(path);
|
||||
case ENFILE:
|
||||
case EMFILE:
|
||||
throw FileException("too many open files", path);
|
||||
default:
|
||||
throw FileException(std::strerror(errno), path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
423
Foundation/src/File_WINCE.cpp
Normal file
423
Foundation/src/File_WINCE.cpp
Normal file
@ -0,0 +1,423 @@
|
||||
//
|
||||
// File_WIN32U.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/File_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
// Module: File
|
||||
//
|
||||
// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/File_WINCE.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/String.h"
|
||||
#include "Poco/UnicodeConverter.h"
|
||||
#include "Poco/Path.h"
|
||||
#include "Poco/UnWindows.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
class FileHandle
|
||||
{
|
||||
public:
|
||||
FileHandle(const std::string& path, const std::wstring& upath, DWORD access, DWORD share, DWORD disp)
|
||||
{
|
||||
_h = CreateFileW(upath.c_str(), access, share, 0, disp, 0, 0);
|
||||
if (_h == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
FileImpl::handleLastErrorImpl(path);
|
||||
}
|
||||
}
|
||||
|
||||
~FileHandle()
|
||||
{
|
||||
if (_h != INVALID_HANDLE_VALUE) CloseHandle(_h);
|
||||
}
|
||||
|
||||
HANDLE get() const
|
||||
{
|
||||
return _h;
|
||||
}
|
||||
|
||||
private:
|
||||
HANDLE _h;
|
||||
};
|
||||
|
||||
|
||||
FileImpl::FileImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
FileImpl::FileImpl(const std::string& path): _path(path)
|
||||
{
|
||||
std::string::size_type n = _path.size();
|
||||
if (n > 1 && (_path[n - 1] == '\\' || _path[n - 1] == '/') && !((n == 3 && _path[1]==':')))
|
||||
{
|
||||
_path.resize(n - 1);
|
||||
}
|
||||
UnicodeConverter::toUTF16(_path, _upath);
|
||||
}
|
||||
|
||||
|
||||
FileImpl::~FileImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::swapImpl(FileImpl& file)
|
||||
{
|
||||
std::swap(_path, file._path);
|
||||
std::swap(_upath, file._upath);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setPathImpl(const std::string& path)
|
||||
{
|
||||
_path = path;
|
||||
std::string::size_type n = _path.size();
|
||||
if (n > 1 && (_path[n - 1] == '\\' || _path[n - 1] == '/') && !((n == 3 && _path[1]==':')))
|
||||
{
|
||||
_path.resize(n - 1);
|
||||
}
|
||||
UnicodeConverter::toUTF16(_path, _upath);
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::existsImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
DWORD attr = GetFileAttributesW(_upath.c_str());
|
||||
if (attr == 0xFFFFFFFF)
|
||||
{
|
||||
switch (GetLastError())
|
||||
{
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
case ERROR_PATH_NOT_FOUND:
|
||||
case ERROR_NOT_READY:
|
||||
case ERROR_INVALID_DRIVE:
|
||||
return false;
|
||||
default:
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::canReadImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
DWORD attr = GetFileAttributesW(_upath.c_str());
|
||||
if (attr == 0xFFFFFFFF)
|
||||
{
|
||||
switch (GetLastError())
|
||||
{
|
||||
case ERROR_ACCESS_DENIED:
|
||||
return false;
|
||||
default:
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::canWriteImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
DWORD attr = GetFileAttributesW(_upath.c_str());
|
||||
if (attr == 0xFFFFFFFF)
|
||||
handleLastErrorImpl(_path);
|
||||
return (attr & FILE_ATTRIBUTE_READONLY) == 0;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::canExecuteImpl() const
|
||||
{
|
||||
Path p(_path);
|
||||
return icompare(p.getExtension(), "exe") == 0;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isFileImpl() const
|
||||
{
|
||||
return !isDirectoryImpl() && !isDeviceImpl();
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isDirectoryImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
DWORD attr = GetFileAttributesW(_upath.c_str());
|
||||
if (attr == 0xFFFFFFFF)
|
||||
handleLastErrorImpl(_path);
|
||||
return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isLinkImpl() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isDeviceImpl() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::isHiddenImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
DWORD attr = GetFileAttributesW(_upath.c_str());
|
||||
if (attr == 0xFFFFFFFF)
|
||||
handleLastErrorImpl(_path);
|
||||
return (attr & FILE_ATTRIBUTE_HIDDEN) != 0;
|
||||
}
|
||||
|
||||
|
||||
Timestamp FileImpl::createdImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
WIN32_FILE_ATTRIBUTE_DATA fad;
|
||||
if (GetFileAttributesExW(_upath.c_str(), GetFileExInfoStandard, &fad) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
return Timestamp::fromFileTimeNP(fad.ftCreationTime.dwLowDateTime, fad.ftCreationTime.dwHighDateTime);
|
||||
}
|
||||
|
||||
|
||||
Timestamp FileImpl::getLastModifiedImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
WIN32_FILE_ATTRIBUTE_DATA fad;
|
||||
if (GetFileAttributesExW(_upath.c_str(), GetFileExInfoStandard, &fad) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
return Timestamp::fromFileTimeNP(fad.ftLastWriteTime.dwLowDateTime, fad.ftLastWriteTime.dwHighDateTime);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setLastModifiedImpl(const Timestamp& ts)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
UInt32 low;
|
||||
UInt32 high;
|
||||
ts.toFileTimeNP(low, high);
|
||||
FILETIME ft;
|
||||
ft.dwLowDateTime = low;
|
||||
ft.dwHighDateTime = high;
|
||||
FileHandle fh(_path, _upath, GENERIC_WRITE, FILE_SHARE_WRITE, OPEN_EXISTING);
|
||||
if (SetFileTime(fh.get(), 0, &ft, &ft) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
FileImpl::FileSizeImpl FileImpl::getSizeImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
WIN32_FILE_ATTRIBUTE_DATA fad;
|
||||
if (GetFileAttributesExW(_upath.c_str(), GetFileExInfoStandard, &fad) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
LARGE_INTEGER li;
|
||||
li.LowPart = fad.nFileSizeLow;
|
||||
li.HighPart = fad.nFileSizeHigh;
|
||||
return li.QuadPart;
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setSizeImpl(FileSizeImpl size)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
FileHandle fh(_path, _upath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING);
|
||||
LARGE_INTEGER li;
|
||||
li.QuadPart = size;
|
||||
if (SetFilePointer(fh.get(), li.LowPart, &li.HighPart, FILE_BEGIN) == -1)
|
||||
handleLastErrorImpl(_path);
|
||||
if (SetEndOfFile(fh.get()) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setWriteableImpl(bool flag)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
DWORD attr = GetFileAttributesW(_upath.c_str());
|
||||
if (attr == -1)
|
||||
handleLastErrorImpl(_path);
|
||||
if (flag)
|
||||
attr &= ~FILE_ATTRIBUTE_READONLY;
|
||||
else
|
||||
attr |= FILE_ATTRIBUTE_READONLY;
|
||||
if (SetFileAttributesW(_upath.c_str(), attr) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::setExecutableImpl(bool flag)
|
||||
{
|
||||
// not supported
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::copyToImpl(const std::string& path) const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
std::wstring upath;
|
||||
UnicodeConverter::toUTF16(path, upath);
|
||||
if (CopyFileW(_upath.c_str(), upath.c_str(), FALSE) != 0)
|
||||
{
|
||||
FileImpl copy(path);
|
||||
copy.setWriteableImpl(true);
|
||||
}
|
||||
else handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::renameToImpl(const std::string& path)
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
std::wstring upath;
|
||||
UnicodeConverter::toUTF16(path, upath);
|
||||
if (MoveFileW(_upath.c_str(), upath.c_str()) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::removeImpl()
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
if (isDirectoryImpl())
|
||||
{
|
||||
if (RemoveDirectoryW(_upath.c_str()) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DeleteFileW(_upath.c_str()) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::createFileImpl()
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
HANDLE hFile = CreateFileW(_upath.c_str(), GENERIC_WRITE, 0, 0, CREATE_NEW, 0, 0);
|
||||
if (hFile != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CloseHandle(hFile);
|
||||
return true;
|
||||
}
|
||||
else if (GetLastError() == ERROR_FILE_EXISTS)
|
||||
return false;
|
||||
else
|
||||
handleLastErrorImpl(_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool FileImpl::createDirectoryImpl()
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
||||
if (existsImpl() && isDirectoryImpl())
|
||||
return false;
|
||||
if (CreateDirectoryW(_upath.c_str(), 0) == 0)
|
||||
handleLastErrorImpl(_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void FileImpl::handleLastErrorImpl(const std::string& path)
|
||||
{
|
||||
switch (GetLastError())
|
||||
{
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
throw FileNotFoundException(path);
|
||||
case ERROR_PATH_NOT_FOUND:
|
||||
case ERROR_BAD_NETPATH:
|
||||
case ERROR_CANT_RESOLVE_FILENAME:
|
||||
case ERROR_INVALID_DRIVE:
|
||||
throw PathNotFoundException(path);
|
||||
case ERROR_ACCESS_DENIED:
|
||||
throw FileAccessDeniedException(path);
|
||||
case ERROR_ALREADY_EXISTS:
|
||||
case ERROR_FILE_EXISTS:
|
||||
throw FileExistsException(path);
|
||||
case ERROR_INVALID_NAME:
|
||||
case ERROR_DIRECTORY:
|
||||
case ERROR_FILENAME_EXCED_RANGE:
|
||||
case ERROR_BAD_PATHNAME:
|
||||
throw PathSyntaxException(path);
|
||||
case ERROR_FILE_READ_ONLY:
|
||||
throw FileReadOnlyException(path);
|
||||
case ERROR_CANNOT_MAKE:
|
||||
throw CreateFileException(path);
|
||||
case ERROR_DIR_NOT_EMPTY:
|
||||
throw FileException("directory not empty", path);
|
||||
case ERROR_WRITE_FAULT:
|
||||
throw WriteFileException(path);
|
||||
case ERROR_READ_FAULT:
|
||||
throw ReadFileException(path);
|
||||
case ERROR_SHARING_VIOLATION:
|
||||
throw FileException("sharing violation", path);
|
||||
case ERROR_LOCK_VIOLATION:
|
||||
throw FileException("lock violation", path);
|
||||
case ERROR_HANDLE_EOF:
|
||||
throw ReadFileException("EOF reached", path);
|
||||
case ERROR_HANDLE_DISK_FULL:
|
||||
case ERROR_DISK_FULL:
|
||||
throw WriteFileException("disk is full", path);
|
||||
case ERROR_NEGATIVE_SEEK:
|
||||
throw FileException("negative seek", path);
|
||||
default:
|
||||
throw FileException(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
79
Foundation/src/MemoryStream.cpp
Normal file
79
Foundation/src/MemoryStream.cpp
Normal file
@ -0,0 +1,79 @@
|
||||
//
|
||||
// MemoryStream.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/MemoryStream.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Streams
|
||||
// Module: MemoryStream
|
||||
//
|
||||
// Copyright (c) 2009, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/MemoryStream.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
MemoryIOS::MemoryIOS(char* pBuffer, std::streamsize bufferSize):
|
||||
_buf(pBuffer, bufferSize)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
MemoryIOS::~MemoryIOS()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MemoryInputStream::MemoryInputStream(const char* pBuffer, std::streamsize bufferSize):
|
||||
MemoryIOS(const_cast<char*>(pBuffer), bufferSize),
|
||||
std::istream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MemoryInputStream::~MemoryInputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MemoryOutputStream::MemoryOutputStream(char* pBuffer, std::streamsize bufferSize):
|
||||
MemoryIOS(pBuffer, bufferSize),
|
||||
std::ostream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MemoryOutputStream::~MemoryOutputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
102
Foundation/src/Mutex_WINCE.cpp
Normal file
102
Foundation/src/Mutex_WINCE.cpp
Normal file
@ -0,0 +1,102 @@
|
||||
//
|
||||
// Mutex_WINCE.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Mutex_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Threading
|
||||
// Module: Mutex
|
||||
//
|
||||
// Copyright (c) 2004-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Mutex_WINCE.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
MutexImpl::MutexImpl()
|
||||
{
|
||||
_mutex = CreateMutexW(NULL, FALSE, NULL);
|
||||
if (!_mutex) throw SystemException("cannot create mutex");
|
||||
}
|
||||
|
||||
|
||||
MutexImpl::~MutexImpl()
|
||||
{
|
||||
CloseHandle(_mutex);
|
||||
}
|
||||
|
||||
|
||||
void MutexImpl::lockImpl()
|
||||
{
|
||||
switch (WaitForSingleObject(_mutex, INFINITE))
|
||||
{
|
||||
case WAIT_OBJECT_0:
|
||||
return;
|
||||
default:
|
||||
throw SystemException("cannot lock mutex");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool MutexImpl::tryLockImpl()
|
||||
{
|
||||
switch (WaitForSingleObject(_mutex, 0))
|
||||
{
|
||||
case WAIT_TIMEOUT:
|
||||
return false;
|
||||
case WAIT_OBJECT_0:
|
||||
return true;
|
||||
default:
|
||||
throw SystemException("cannot lock mutex");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool MutexImpl::tryLockImpl(long milliseconds)
|
||||
{
|
||||
switch (WaitForSingleObject(_mutex, milliseconds + 1))
|
||||
{
|
||||
case WAIT_TIMEOUT:
|
||||
return false;
|
||||
case WAIT_OBJECT_0:
|
||||
return true;
|
||||
default:
|
||||
throw SystemException("cannot lock mutex");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MutexImpl::unlockImpl()
|
||||
{
|
||||
ReleaseMutex(_mutex);
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
145
Foundation/src/Path_WINCE.cpp
Normal file
145
Foundation/src/Path_WINCE.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
//
|
||||
// Path_WIN32U.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Path_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
// Module: Path
|
||||
//
|
||||
// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Path_WINCE.h"
|
||||
#include "Poco/Environment_WINCE.h"
|
||||
#include "Poco/UnicodeConverter.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include "Poco/Environment.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/UnWindows.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
std::string PathImpl::currentImpl()
|
||||
{
|
||||
return("\\");
|
||||
}
|
||||
|
||||
|
||||
std::string PathImpl::homeImpl()
|
||||
{
|
||||
return("\\");
|
||||
}
|
||||
|
||||
|
||||
std::string PathImpl::tempImpl()
|
||||
{
|
||||
Buffer<wchar_t> buffer(MAX_PATH_LEN);
|
||||
DWORD n = GetTempPathW(static_cast<DWORD>(buffer.size()), buffer.begin());
|
||||
if (n > 0)
|
||||
{
|
||||
std::string result;
|
||||
UnicodeConverter::toUTF8(buffer.begin(), result);
|
||||
if (result[n - 1] != '\\')
|
||||
result.append("\\");
|
||||
return result;
|
||||
}
|
||||
throw SystemException("Cannot get current directory");
|
||||
}
|
||||
|
||||
|
||||
std::string PathImpl::nullImpl()
|
||||
{
|
||||
return "NUL:";
|
||||
}
|
||||
|
||||
|
||||
std::string PathImpl::expandImpl(const std::string& path)
|
||||
{
|
||||
std::string result;
|
||||
std::string::const_iterator it = path.begin();
|
||||
std::string::const_iterator end = path.end();
|
||||
while (it != end)
|
||||
{
|
||||
if (*it == '%')
|
||||
{
|
||||
++it;
|
||||
if (it != end && *it == '%')
|
||||
{
|
||||
result += '%';
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string var;
|
||||
while (it != end && *it != '%') var += *it++;
|
||||
if (it != end) ++it;
|
||||
result += Environment::get(var, "");
|
||||
}
|
||||
}
|
||||
else result += *it++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void PathImpl::listRootsImpl(std::vector<std::string>& roots)
|
||||
{
|
||||
roots.clear();
|
||||
roots.push_back("\\");
|
||||
|
||||
WIN32_FIND_DATAW fd;
|
||||
HANDLE hFind = FindFirstFileW(L"\\*.*", &fd);
|
||||
if (hFind != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
do
|
||||
{
|
||||
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||
(fd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY))
|
||||
{
|
||||
std::wstring name(fd.cFileName);
|
||||
name += L"\\Vol:";
|
||||
HANDLE h = CreateFileW(name.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (h != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
// its a device volume
|
||||
CloseHandle(h);
|
||||
std::string name;
|
||||
UnicodeConverter::toUTF8(fd.cFileName, name);
|
||||
std::string root = "\\" + name;
|
||||
roots.push_back(root);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (FindNextFileW(hFind, &fd));
|
||||
FindClose(hFind);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
104
Foundation/src/Process_VX.cpp
Normal file
104
Foundation/src/Process_VX.cpp
Normal file
@ -0,0 +1,104 @@
|
||||
//
|
||||
// Process_VX.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Process_VX.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Processes
|
||||
// Module: Process
|
||||
//
|
||||
// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Process_VX.h"
|
||||
#include "Poco/Exception.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
//
|
||||
// ProcessHandleImpl
|
||||
//
|
||||
ProcessHandleImpl::ProcessHandleImpl(int pid):
|
||||
_pid(pid)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ProcessHandleImpl::~ProcessHandleImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int ProcessHandleImpl::id() const
|
||||
{
|
||||
return _pid;
|
||||
}
|
||||
|
||||
|
||||
int ProcessHandleImpl::wait() const
|
||||
{
|
||||
throw Poco::NotImplementedException("Process::wait()");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// ProcessImpl
|
||||
//
|
||||
ProcessImpl::PIDImpl ProcessImpl::idImpl()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void ProcessImpl::timesImpl(long& userTime, long& kernelTime)
|
||||
{
|
||||
userTime = 0;
|
||||
kernelTime = 0;
|
||||
}
|
||||
|
||||
|
||||
ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const ArgsImpl& args, Pipe* inPipe, Pipe* outPipe, Pipe* errPipe)
|
||||
{
|
||||
throw Poco::NotImplementedException("Process::launch()");
|
||||
}
|
||||
|
||||
|
||||
void ProcessImpl::killImpl(PIDImpl pid)
|
||||
{
|
||||
throw Poco::NotImplementedException("Process::kill()");
|
||||
}
|
||||
|
||||
|
||||
void ProcessImpl::requestTerminationImpl(PIDImpl pid)
|
||||
{
|
||||
throw Poco::NotImplementedException("Process::requestTermination()");
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
197
Foundation/src/Process_WINCE.cpp
Normal file
197
Foundation/src/Process_WINCE.cpp
Normal file
@ -0,0 +1,197 @@
|
||||
//
|
||||
// Process_WINCE.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Process_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Processes
|
||||
// Module: Process
|
||||
//
|
||||
// Copyright (c) 2004-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Process_WINCE.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/NumberFormatter.h"
|
||||
#include "Poco/NamedEvent.h"
|
||||
#include "Poco/UnicodeConverter.h"
|
||||
#include "Poco/Pipe.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
//
|
||||
// ProcessHandleImpl
|
||||
//
|
||||
ProcessHandleImpl::ProcessHandleImpl(HANDLE hProcess, UInt32 pid):
|
||||
_hProcess(hProcess),
|
||||
_pid(pid)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ProcessHandleImpl::~ProcessHandleImpl()
|
||||
{
|
||||
CloseHandle(_hProcess);
|
||||
}
|
||||
|
||||
|
||||
UInt32 ProcessHandleImpl::id() const
|
||||
{
|
||||
return _pid;
|
||||
}
|
||||
|
||||
|
||||
int ProcessHandleImpl::wait() const
|
||||
{
|
||||
DWORD rc = WaitForSingleObject(_hProcess, INFINITE);
|
||||
if (rc != WAIT_OBJECT_0)
|
||||
throw SystemException("Wait failed for process", NumberFormatter::format(_pid));
|
||||
|
||||
DWORD exitCode;
|
||||
if (GetExitCodeProcess(_hProcess, &exitCode) == 0)
|
||||
throw SystemException("Cannot get exit code for process", NumberFormatter::format(_pid));
|
||||
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// ProcessImpl
|
||||
//
|
||||
ProcessImpl::PIDImpl ProcessImpl::idImpl()
|
||||
{
|
||||
return GetCurrentProcessId();
|
||||
}
|
||||
|
||||
|
||||
void ProcessImpl::timesImpl(long& userTime, long& kernelTime)
|
||||
{
|
||||
FILETIME ftCreation;
|
||||
FILETIME ftExit;
|
||||
FILETIME ftKernel;
|
||||
FILETIME ftUser;
|
||||
|
||||
if (GetThreadTimes(GetCurrentThread(), &ftCreation, &ftExit, &ftKernel, &ftUser) != 0)
|
||||
{
|
||||
ULARGE_INTEGER time;
|
||||
time.LowPart = ftKernel.dwLowDateTime;
|
||||
time.HighPart = ftKernel.dwHighDateTime;
|
||||
kernelTime = long(time.QuadPart/10000000L);
|
||||
time.LowPart = ftUser.dwLowDateTime;
|
||||
time.HighPart = ftUser.dwHighDateTime;
|
||||
userTime = long(time.QuadPart/10000000L);
|
||||
}
|
||||
else
|
||||
{
|
||||
userTime = kernelTime = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const ArgsImpl& args, Pipe* inPipe, Pipe* outPipe, Pipe* errPipe)
|
||||
{
|
||||
std::wstring ucommand;
|
||||
UnicodeConverter::toUTF16(command, ucommand);
|
||||
|
||||
std::string commandLine;
|
||||
for (ArgsImpl::const_iterator it = args.begin(); it != args.end(); ++it)
|
||||
{
|
||||
if (it != args.begin()) commandLine.append(" ");
|
||||
commandLine.append(*it);
|
||||
}
|
||||
|
||||
std::wstring ucommandLine;
|
||||
UnicodeConverter::toUTF16(commandLine, ucommandLine);
|
||||
|
||||
PROCESS_INFORMATION processInfo;
|
||||
BOOL rc = CreateProcessW(
|
||||
ucommand.c_str(),
|
||||
const_cast<wchar_t*>(ucommandLine.c_str()),
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL/*&startupInfo*/,
|
||||
&processInfo
|
||||
);
|
||||
|
||||
if (rc)
|
||||
{
|
||||
CloseHandle(processInfo.hThread);
|
||||
return new ProcessHandleImpl(processInfo.hProcess, processInfo.dwProcessId);
|
||||
}
|
||||
else throw SystemException("Cannot launch process", command);
|
||||
}
|
||||
|
||||
|
||||
void ProcessImpl::killImpl(PIDImpl pid)
|
||||
{
|
||||
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
|
||||
if (hProc)
|
||||
{
|
||||
if (TerminateProcess(hProc, 0) == 0)
|
||||
{
|
||||
CloseHandle(hProc);
|
||||
throw SystemException("cannot kill process");
|
||||
}
|
||||
CloseHandle(hProc);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (GetLastError())
|
||||
{
|
||||
case ERROR_ACCESS_DENIED:
|
||||
throw NoPermissionException("cannot kill process");
|
||||
case ERROR_NOT_FOUND:
|
||||
throw NotFoundException("cannot kill process");
|
||||
default:
|
||||
throw SystemException("cannot kill process");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ProcessImpl::requestTerminationImpl(PIDImpl pid)
|
||||
{
|
||||
NamedEvent ev(terminationEventName(pid));
|
||||
ev.set();
|
||||
}
|
||||
|
||||
|
||||
std::string ProcessImpl::terminationEventName(PIDImpl pid)
|
||||
{
|
||||
std::string evName("POCOTRM");
|
||||
NumberFormatter::appendHex(evName, pid, 8);
|
||||
return evName;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
70
Foundation/src/RWLock_VX.cpp
Normal file
70
Foundation/src/RWLock_VX.cpp
Normal file
@ -0,0 +1,70 @@
|
||||
//
|
||||
// RWLock_VX.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/RWLock_VX.cpp#2 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Threading
|
||||
// Module: RWLock
|
||||
//
|
||||
// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/RWLock_VX.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
RWLockImpl::RWLockImpl()
|
||||
{
|
||||
#if defined(POCO_VXWORKS)
|
||||
// This workaround is for VxWorks 5.x where
|
||||
// pthread_mutex_init() won't properly initialize the mutex
|
||||
// resulting in a subsequent freeze in pthread_mutex_destroy()
|
||||
// if the mutex has never been used.
|
||||
std::memset(&_mutex, 0, sizeof(_mutex));
|
||||
#endif
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
if (pthread_mutex_init(&_mutex, &attr))
|
||||
{
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
throw SystemException("cannot create mutex");
|
||||
}
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
}
|
||||
|
||||
|
||||
RWLockImpl::~RWLockImpl()
|
||||
{
|
||||
pthread_mutex_destroy(&_mutex);
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
196
Foundation/src/RWLock_WINCE.cpp
Normal file
196
Foundation/src/RWLock_WINCE.cpp
Normal file
@ -0,0 +1,196 @@
|
||||
//
|
||||
// RWLock_WINCE.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/RWLock_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Threading
|
||||
// Module: RWLock
|
||||
//
|
||||
// Copyright (c) 2009-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/RWLock_WINCE.h"
|
||||
#include "Poco/Thread.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
RWLockImpl::RWLockImpl():
|
||||
_readerCount(0),
|
||||
_readerWaiting(0),
|
||||
_writerCount(0),
|
||||
_writerWaiting(0),
|
||||
_writeLock(false)
|
||||
|
||||
{
|
||||
InitializeCriticalSection(&_cs);
|
||||
_readerGreen = CreateEventW(NULL, FALSE, TRUE, NULL);
|
||||
if (!_readerGreen) throw SystemException("Cannot create RWLock");
|
||||
_writerGreen = CreateEventW(NULL, FALSE, TRUE, NULL);
|
||||
if (!_writerGreen)
|
||||
{
|
||||
CloseHandle(_readerGreen);
|
||||
throw SystemException("Cannot create RWLock");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RWLockImpl::~RWLockImpl()
|
||||
{
|
||||
CloseHandle(_readerGreen);
|
||||
CloseHandle(_writerGreen);
|
||||
DeleteCriticalSection(&_cs);
|
||||
}
|
||||
|
||||
|
||||
void RWLockImpl::readLockImpl()
|
||||
{
|
||||
tryReadLockImpl(INFINITE);
|
||||
}
|
||||
|
||||
|
||||
bool RWLockImpl::tryReadLockImpl(DWORD timeout)
|
||||
{
|
||||
bool wait = false;
|
||||
do
|
||||
{
|
||||
EnterCriticalSection(&_cs);
|
||||
if (!_writerCount && !_writerWaiting)
|
||||
{
|
||||
if (wait)
|
||||
{
|
||||
_readerWaiting--;
|
||||
wait = false;
|
||||
}
|
||||
_readerCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!wait)
|
||||
{
|
||||
_readerWaiting++;
|
||||
wait = true;
|
||||
}
|
||||
ResetEvent(_readerGreen);
|
||||
}
|
||||
LeaveCriticalSection(&_cs);
|
||||
if (wait)
|
||||
{
|
||||
if (WaitForSingleObject(_readerGreen, timeout) != WAIT_OBJECT_0)
|
||||
{
|
||||
EnterCriticalSection(&_cs);
|
||||
_readerWaiting--;
|
||||
SetEvent(_readerGreen);
|
||||
SetEvent(_writerGreen);
|
||||
LeaveCriticalSection(&_cs);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (wait);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void RWLockImpl::writeLockImpl()
|
||||
{
|
||||
tryWriteLockImpl(INFINITE);
|
||||
}
|
||||
|
||||
|
||||
bool RWLockImpl::tryWriteLockImpl(DWORD timeout)
|
||||
{
|
||||
bool wait = false;
|
||||
|
||||
do
|
||||
{
|
||||
EnterCriticalSection(&_cs);
|
||||
if (!_readerCount && !_writerCount)
|
||||
{
|
||||
if (wait)
|
||||
{
|
||||
_writerWaiting--;
|
||||
wait = false;
|
||||
}
|
||||
_writerCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!wait)
|
||||
{
|
||||
_writerWaiting++;
|
||||
wait = true;
|
||||
}
|
||||
ResetEvent(_writerGreen);
|
||||
}
|
||||
LeaveCriticalSection(&_cs);
|
||||
if (wait)
|
||||
{
|
||||
if (WaitForSingleObject(_writerGreen, timeout) != WAIT_OBJECT_0)
|
||||
{
|
||||
EnterCriticalSection(&_cs);
|
||||
_writerWaiting--;
|
||||
SetEvent(_readerGreen);
|
||||
SetEvent(_writerGreen);
|
||||
LeaveCriticalSection(&_cs);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (wait);
|
||||
|
||||
_writeLock = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void RWLockImpl::unlockImpl()
|
||||
{
|
||||
EnterCriticalSection(&_cs);
|
||||
|
||||
if (_writeLock)
|
||||
{
|
||||
_writeLock = false;
|
||||
_writerCount--;
|
||||
}
|
||||
else
|
||||
{
|
||||
_readerCount--;
|
||||
}
|
||||
if (_writerWaiting)
|
||||
SetEvent(_writerGreen);
|
||||
else if (_readerWaiting)
|
||||
SetEvent(_readerGreen);
|
||||
|
||||
LeaveCriticalSection(&_cs);
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
157
Foundation/src/SharedLibrary_VX.cpp
Normal file
157
Foundation/src/SharedLibrary_VX.cpp
Normal file
@ -0,0 +1,157 @@
|
||||
//
|
||||
// SharedLibrary_VX.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/SharedLibrary_VX.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: SharedLibrary
|
||||
// Module: SharedLibrary
|
||||
//
|
||||
// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/SharedLibrary_VX.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/Format.h"
|
||||
#include <loadLib.h>
|
||||
#include <unldLib.h>
|
||||
#include <ioLib.h>
|
||||
#include <symLib.h>
|
||||
#include <sysSymTbl.h>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
struct SymLookup
|
||||
{
|
||||
const char* name;
|
||||
int group;
|
||||
void* addr;
|
||||
};
|
||||
|
||||
|
||||
extern "C" bool lookupFunc(char* name, int val, SYM_TYPE type, int arg, UINT16 group)
|
||||
{
|
||||
SymLookup* symLookup = reinterpret_cast<SymLookup*>(arg);
|
||||
if (group == symLookup->group && std::strcmp(name, symLookup->name) == 0)
|
||||
{
|
||||
symLookup->addr = reinterpret_cast<void*>(val);
|
||||
return TRUE;
|
||||
}
|
||||
else return FALSE;
|
||||
}
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
FastMutex SharedLibraryImpl::_mutex;
|
||||
|
||||
|
||||
SharedLibraryImpl::SharedLibraryImpl():
|
||||
_moduleId(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SharedLibraryImpl::~SharedLibraryImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SharedLibraryImpl::loadImpl(const std::string& path)
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
|
||||
if (_moduleId) throw LibraryAlreadyLoadedException(path);
|
||||
int fd = open(const_cast<char*>(path.c_str()), O_RDONLY, 0);
|
||||
if (fd)
|
||||
{
|
||||
_moduleId = loadModule(fd, LOAD_GLOBAL_SYMBOLS);
|
||||
if (!_moduleId)
|
||||
{
|
||||
int err = errno;
|
||||
close(fd);
|
||||
throw LibraryLoadException(Poco::format("error %d", err));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int err = errno;
|
||||
throw LibraryLoadException(Poco::format("cannot open library (error %d)", err));
|
||||
}
|
||||
_path = path;
|
||||
}
|
||||
|
||||
|
||||
void SharedLibraryImpl::unloadImpl()
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
|
||||
if (_moduleId)
|
||||
{
|
||||
unldByModuleId(_moduleId, 0);
|
||||
_moduleId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool SharedLibraryImpl::isLoadedImpl() const
|
||||
{
|
||||
return _moduleId != 0;
|
||||
}
|
||||
|
||||
|
||||
void* SharedLibraryImpl::findSymbolImpl(const std::string& name)
|
||||
{
|
||||
poco_assert (_moduleId != 0);
|
||||
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
|
||||
MODULE_INFO mi;
|
||||
if (!moduleInfoGet(_moduleId, &mi)) return 0;
|
||||
SymLookup symLookup;
|
||||
symLookup.name = name.c_str();
|
||||
symLookup.group = mi.group;
|
||||
symLookup.addr = 0;
|
||||
symEach(sysSymTbl, reinterpret_cast<FUNCPTR>(lookupFunc), reinterpret_cast<int>(&symLookup));
|
||||
return symLookup.addr;
|
||||
}
|
||||
|
||||
|
||||
const std::string& SharedLibraryImpl::getPathImpl() const
|
||||
{
|
||||
return _path;
|
||||
}
|
||||
|
||||
|
||||
std::string SharedLibraryImpl::suffixImpl()
|
||||
{
|
||||
return ".out";
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
200
Foundation/src/TextBufferIterator.cpp
Normal file
200
Foundation/src/TextBufferIterator.cpp
Normal file
@ -0,0 +1,200 @@
|
||||
//
|
||||
// TextBufferIterator.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/TextBufferIterator.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Text
|
||||
// Module: TextBufferIterator
|
||||
//
|
||||
// Copyright (c) 2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/TextBufferIterator.h"
|
||||
#include "Poco/TextEncoding.h"
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
TextBufferIterator::TextBufferIterator():
|
||||
_pEncoding(0),
|
||||
_it(0),
|
||||
_end(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator::TextBufferIterator(const char* begin, const TextEncoding& encoding):
|
||||
_pEncoding(&encoding),
|
||||
_it(begin),
|
||||
_end(begin + std::strlen(begin))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator::TextBufferIterator(const char* begin, std::size_t size, const TextEncoding& encoding):
|
||||
_pEncoding(&encoding),
|
||||
_it(begin),
|
||||
_end(begin + size)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator::TextBufferIterator(const char* begin, const char* end, const TextEncoding& encoding):
|
||||
_pEncoding(&encoding),
|
||||
_it(begin),
|
||||
_end(end)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator::TextBufferIterator(const char* end):
|
||||
_pEncoding(0),
|
||||
_it(end),
|
||||
_end(end)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator::~TextBufferIterator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator::TextBufferIterator(const TextBufferIterator& it):
|
||||
_pEncoding(it._pEncoding),
|
||||
_it(it._it),
|
||||
_end(it._end)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator& TextBufferIterator::operator = (const TextBufferIterator& it)
|
||||
{
|
||||
if (&it != this)
|
||||
{
|
||||
_pEncoding = it._pEncoding;
|
||||
_it = it._it;
|
||||
_end = it._end;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
void TextBufferIterator::swap(TextBufferIterator& it)
|
||||
{
|
||||
std::swap(_pEncoding, it._pEncoding);
|
||||
std::swap(_it, it._it);
|
||||
std::swap(_end, it._end);
|
||||
}
|
||||
|
||||
|
||||
int TextBufferIterator::operator * () const
|
||||
{
|
||||
poco_check_ptr (_pEncoding);
|
||||
poco_assert (_it != _end);
|
||||
const char* it = _it;
|
||||
|
||||
unsigned char buffer[TextEncoding::MAX_SEQUENCE_LENGTH];
|
||||
unsigned char* p = buffer;
|
||||
|
||||
if (it != _end)
|
||||
*p++ = *it++;
|
||||
else
|
||||
*p++ = 0;
|
||||
|
||||
int read = 1;
|
||||
int n = _pEncoding->queryConvert(buffer, 1);
|
||||
|
||||
while (-1 > n && (_end - it) >= -n - read)
|
||||
{
|
||||
while (read < -n && it != _end)
|
||||
{
|
||||
*p++ = *it++;
|
||||
read++;
|
||||
}
|
||||
n = _pEncoding->queryConvert(buffer, read);
|
||||
}
|
||||
|
||||
if (-1 > n)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator& TextBufferIterator::operator ++ ()
|
||||
{
|
||||
poco_check_ptr (_pEncoding);
|
||||
poco_assert (_it != _end);
|
||||
|
||||
unsigned char buffer[TextEncoding::MAX_SEQUENCE_LENGTH];
|
||||
unsigned char* p = buffer;
|
||||
|
||||
if (_it != _end)
|
||||
*p++ = *_it++;
|
||||
else
|
||||
*p++ = 0;
|
||||
|
||||
int read = 1;
|
||||
int n = _pEncoding->sequenceLength(buffer, 1);
|
||||
|
||||
while (-1 > n && (_end - _it) >= -n - read)
|
||||
{
|
||||
while (read < -n && _it != _end)
|
||||
{
|
||||
*p++ = *_it++;
|
||||
read++;
|
||||
}
|
||||
n = _pEncoding->sequenceLength(buffer, read);
|
||||
}
|
||||
while (read < n && _it != _end)
|
||||
{
|
||||
_it++;
|
||||
read++;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
TextBufferIterator TextBufferIterator::operator ++ (int)
|
||||
{
|
||||
TextBufferIterator prev(*this);
|
||||
operator ++ ();
|
||||
return prev;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
227
Foundation/src/Thread_WINCE.cpp
Normal file
227
Foundation/src/Thread_WINCE.cpp
Normal file
@ -0,0 +1,227 @@
|
||||
//
|
||||
// Thread_WINCE.h
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Thread_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Threading
|
||||
// Module: Thread
|
||||
//
|
||||
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Thread_WINCE.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/ErrorHandler.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
ThreadImpl::CurrentThreadHolder ThreadImpl::_currentThreadHolder;
|
||||
|
||||
|
||||
ThreadImpl::ThreadImpl():
|
||||
_pRunnableTarget(0),
|
||||
_thread(0),
|
||||
_threadId(0),
|
||||
_prio(PRIO_NORMAL_IMPL),
|
||||
_stackSize(POCO_THREAD_STACK_SIZE)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ThreadImpl::~ThreadImpl()
|
||||
{
|
||||
if (_thread) CloseHandle(_thread);
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::setPriorityImpl(int prio)
|
||||
{
|
||||
if (prio != _prio)
|
||||
{
|
||||
_prio = prio;
|
||||
if (_thread)
|
||||
{
|
||||
if (SetThreadPriority(_thread, _prio) == 0)
|
||||
throw SystemException("cannot set thread priority");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::setOSPriorityImpl(int prio)
|
||||
{
|
||||
setPriorityImpl(prio);
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::startImpl(Runnable& target)
|
||||
{
|
||||
if (isRunningImpl())
|
||||
throw SystemException("thread already running");
|
||||
|
||||
_pRunnableTarget = ⌖
|
||||
|
||||
createImpl(runnableEntry, this);
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::startImpl(Callable target, void* pData)
|
||||
{
|
||||
if (isRunningImpl())
|
||||
throw SystemException("thread already running");
|
||||
|
||||
_callbackTarget.callback = target;
|
||||
_callbackTarget.pData = pData;
|
||||
|
||||
createImpl(callableEntry, this);
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::createImpl(Entry ent, void* pData)
|
||||
{
|
||||
_thread = CreateThread(NULL, _stackSize, ent, pData, 0, &_threadId);
|
||||
|
||||
if (!_thread)
|
||||
throw SystemException("cannot create thread");
|
||||
if (_prio != PRIO_NORMAL_IMPL && !SetThreadPriority(_thread, _prio))
|
||||
throw SystemException("cannot set thread priority");
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::joinImpl()
|
||||
{
|
||||
if (!_thread) return;
|
||||
|
||||
switch (WaitForSingleObject(_thread, INFINITE))
|
||||
{
|
||||
case WAIT_OBJECT_0:
|
||||
threadCleanup();
|
||||
return;
|
||||
default:
|
||||
throw SystemException("cannot join thread");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool ThreadImpl::joinImpl(long milliseconds)
|
||||
{
|
||||
if (!_thread) return true;
|
||||
|
||||
switch (WaitForSingleObject(_thread, milliseconds + 1))
|
||||
{
|
||||
case WAIT_TIMEOUT:
|
||||
return false;
|
||||
case WAIT_OBJECT_0:
|
||||
threadCleanup();
|
||||
return true;
|
||||
default:
|
||||
throw SystemException("cannot join thread");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool ThreadImpl::isRunningImpl() const
|
||||
{
|
||||
if (_thread)
|
||||
{
|
||||
DWORD ec = 0;
|
||||
return GetExitCodeThread(_thread, &ec) && ec == STILL_ACTIVE;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void ThreadImpl::threadCleanup()
|
||||
{
|
||||
if (!_thread) return;
|
||||
if (CloseHandle(_thread)) _thread = 0;
|
||||
}
|
||||
|
||||
|
||||
ThreadImpl* ThreadImpl::currentImpl()
|
||||
{
|
||||
return _currentThreadHolder.get();
|
||||
}
|
||||
|
||||
|
||||
ThreadImpl::TIDImpl ThreadImpl::currentTidImpl()
|
||||
{
|
||||
return GetCurrentThreadId();
|
||||
}
|
||||
|
||||
|
||||
DWORD WINAPI ThreadImpl::runnableEntry(LPVOID pThread)
|
||||
{
|
||||
_currentThreadHolder.set(reinterpret_cast<ThreadImpl*>(pThread));
|
||||
try
|
||||
{
|
||||
reinterpret_cast<ThreadImpl*>(pThread)->_pRunnableTarget->run();
|
||||
}
|
||||
catch (Exception& exc)
|
||||
{
|
||||
ErrorHandler::handle(exc);
|
||||
}
|
||||
catch (std::exception& exc)
|
||||
{
|
||||
ErrorHandler::handle(exc);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
ErrorHandler::handle();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
DWORD WINAPI ThreadImpl::callableEntry(LPVOID pThread)
|
||||
{
|
||||
_currentThreadHolder.set(reinterpret_cast<ThreadImpl*>(pThread));
|
||||
try
|
||||
{
|
||||
ThreadImpl* pTI = reinterpret_cast<ThreadImpl*>(pThread);
|
||||
pTI->_callbackTarget.callback(pTI->_callbackTarget.pData);
|
||||
}
|
||||
catch (Exception& exc)
|
||||
{
|
||||
ErrorHandler::handle(exc);
|
||||
}
|
||||
catch (std::exception& exc)
|
||||
{
|
||||
ErrorHandler::handle(exc);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
ErrorHandler::handle();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
100
Foundation/src/Timezone_VX.cpp
Normal file
100
Foundation/src/Timezone_VX.cpp
Normal file
@ -0,0 +1,100 @@
|
||||
//
|
||||
// Timezone_VXX.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Timezone_VX.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: DateTime
|
||||
// Module: Timezone
|
||||
//
|
||||
// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Timezone.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/Environment.h"
|
||||
#include <ctime>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
int Timezone::utcOffset()
|
||||
{
|
||||
std::time_t now = std::time(NULL);
|
||||
struct std::tm t;
|
||||
gmtime_r(&now, &t);
|
||||
std::time_t utc = std::mktime(&t);
|
||||
return now - utc;
|
||||
}
|
||||
|
||||
|
||||
int Timezone::dst()
|
||||
{
|
||||
std::time_t now = std::time(NULL);
|
||||
struct std::tm t;
|
||||
if (!localtime_r(&now, &t))
|
||||
throw Poco::SystemException("cannot get local time DST offset");
|
||||
return t.tm_isdst == 1 ? 3600 : 0;
|
||||
}
|
||||
|
||||
|
||||
bool Timezone::isDst(const Timestamp& timestamp)
|
||||
{
|
||||
std::time_t time = timestamp.epochTime();
|
||||
struct std::tm* tms = std::localtime(&time);
|
||||
if (!tms) throw Poco::SystemException("cannot get local time DST flag");
|
||||
return tms->tm_isdst > 0;
|
||||
}
|
||||
|
||||
|
||||
std::string Timezone::name()
|
||||
{
|
||||
// format of TIMEZONE environment variable:
|
||||
// name_of_zone:<(unused)>:time_in_minutes_from_UTC:daylight_start:daylight_end
|
||||
std::string tz = Environment::get("TIMEZONE", "UTC");
|
||||
std::string::size_type pos = tz.find(':');
|
||||
if (pos != std::string::npos)
|
||||
return tz.substr(0, pos);
|
||||
else
|
||||
return tz;
|
||||
}
|
||||
|
||||
|
||||
std::string Timezone::standardName()
|
||||
{
|
||||
return name();
|
||||
}
|
||||
|
||||
|
||||
std::string Timezone::dstName()
|
||||
{
|
||||
return name();
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
106
Foundation/src/Timezone_WINCE.cpp
Normal file
106
Foundation/src/Timezone_WINCE.cpp
Normal file
@ -0,0 +1,106 @@
|
||||
//
|
||||
// Timezone_WINCE.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/Timezone_WINCE.cpp#1 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: DateTime
|
||||
// Module: Timezone
|
||||
//
|
||||
// Copyright (c) 2004-2010, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Timezone.h"
|
||||
#include "Poco/UnicodeConverter.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/UnWindows.h"
|
||||
#include <ctime>
|
||||
#include "wce_time.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
int Timezone::utcOffset()
|
||||
{
|
||||
TIME_ZONE_INFORMATION tzInfo;
|
||||
DWORD dstFlag = GetTimeZoneInformation(&tzInfo);
|
||||
return -tzInfo.Bias*60;
|
||||
}
|
||||
|
||||
|
||||
int Timezone::dst()
|
||||
{
|
||||
TIME_ZONE_INFORMATION tzInfo;
|
||||
DWORD dstFlag = GetTimeZoneInformation(&tzInfo);
|
||||
return dstFlag == TIME_ZONE_ID_DAYLIGHT ? -tzInfo.DaylightBias*60 : 0;
|
||||
}
|
||||
|
||||
|
||||
bool Timezone::isDst(const Timestamp& timestamp)
|
||||
{
|
||||
std::time_t time = timestamp.epochTime();
|
||||
struct std::tm* tms = wceex_localtime(&time);
|
||||
if (!tms) throw SystemException("cannot get local time DST flag");
|
||||
return tms->tm_isdst > 0;
|
||||
}
|
||||
|
||||
|
||||
std::string Timezone::name()
|
||||
{
|
||||
std::string result;
|
||||
TIME_ZONE_INFORMATION tzInfo;
|
||||
DWORD dstFlag = GetTimeZoneInformation(&tzInfo);
|
||||
WCHAR* ptr = dstFlag == TIME_ZONE_ID_DAYLIGHT ? tzInfo.DaylightName : tzInfo.StandardName;
|
||||
UnicodeConverter::toUTF8(ptr, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
std::string Timezone::standardName()
|
||||
{
|
||||
std::string result;
|
||||
TIME_ZONE_INFORMATION tzInfo;
|
||||
DWORD dstFlag = GetTimeZoneInformation(&tzInfo);
|
||||
WCHAR* ptr = tzInfo.StandardName;
|
||||
UnicodeConverter::toUTF8(ptr, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
std::string Timezone::dstName()
|
||||
{
|
||||
std::string result;
|
||||
TIME_ZONE_INFORMATION tzInfo;
|
||||
DWORD dstFlag = GetTimeZoneInformation(&tzInfo);
|
||||
WCHAR* ptr = tzInfo.DaylightName;
|
||||
UnicodeConverter::toUTF8(ptr, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
Loading…
Reference in New Issue
Block a user