changes from main repository
This commit is contained in:
Родитель
ab8d8e38e3
Коммит
b526dd81f2
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// AbstractDelegate.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/AbstractDelegate.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/AbstractDelegate.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Events
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// ExpireStrategy.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/ExpireStrategy.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/ExpireStrategy.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Cache
|
||||
|
@ -122,6 +122,8 @@ public:
|
|||
args.invalidate();
|
||||
}
|
||||
}
|
||||
else //not found: probably removed by onReplace
|
||||
args.invalidate();
|
||||
}
|
||||
|
||||
void onReplace(const void*, std::set<TKey>& elemsToRemove)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// File_UNIX.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_UNIX.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_UNIX.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
|
@ -63,8 +63,8 @@ protected:
|
|||
bool canExecuteImpl() const;
|
||||
bool isFileImpl() const;
|
||||
bool isDirectoryImpl() const;
|
||||
bool isHiddenImpl() const;
|
||||
bool isLinkImpl() const;
|
||||
bool isHiddenImpl() const;
|
||||
Timestamp createdImpl() const;
|
||||
Timestamp getLastModifiedImpl() const;
|
||||
void setLastModifiedImpl(const Timestamp& ts);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// File_VMS.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_VMS.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_VMS.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
|
@ -65,6 +65,7 @@ protected:
|
|||
bool isFileImpl() const;
|
||||
bool isDirectoryImpl() const;
|
||||
bool isLinkImpl() const;
|
||||
bool isHiddenImpl() const;
|
||||
Timestamp createdImpl() const;
|
||||
Timestamp getLastModifiedImpl() const;
|
||||
void setLastModifiedImpl(const Timestamp& ts);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// File_WIN32.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_WIN32.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_WIN32.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
|
@ -65,6 +65,7 @@ protected:
|
|||
bool isFileImpl() const;
|
||||
bool isDirectoryImpl() const;
|
||||
bool isLinkImpl() const;
|
||||
bool isHiddenImpl() const;
|
||||
Timestamp createdImpl() const;
|
||||
Timestamp getLastModifiedImpl() const;
|
||||
void setLastModifiedImpl(const Timestamp& ts);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// File_WIN32U.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_WIN32U.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/File_WIN32U.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// HashFunction.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/HashFunction.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/HashFunction.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Hashing
|
||||
|
@ -60,6 +60,19 @@ struct HashFunction
|
|||
};
|
||||
|
||||
|
||||
//@ deprecated
|
||||
template <>
|
||||
struct HashFunction<std::string>
|
||||
/// A generic hash function.
|
||||
{
|
||||
UInt32 operator () (const std::string& key, UInt32 maxValue) const
|
||||
/// Returns the hash value for the given key.
|
||||
{
|
||||
return ((UInt32) hash(key)) % maxValue;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
} // namespace Poco
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// URIStreamFactory.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/URIStreamFactory.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/URIStreamFactory.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: URI
|
||||
|
@ -66,6 +66,9 @@ public:
|
|||
///
|
||||
/// If the stream cannot be opened for whatever reason,
|
||||
/// an appropriate IOException must be thrown.
|
||||
///
|
||||
/// If opening the stream results in a redirect, a
|
||||
/// URIRedirection exception should be thrown.
|
||||
|
||||
protected:
|
||||
virtual ~URIStreamFactory();
|
||||
|
@ -79,6 +82,37 @@ private:
|
|||
};
|
||||
|
||||
|
||||
class Foundation_API URIRedirection
|
||||
/// An instance of URIRedirection is thrown by a URIStreamFactory::open()
|
||||
/// if opening the original URI resulted in a redirection response
|
||||
/// (such as a MOVED PERMANENTLY in HTTP).
|
||||
{
|
||||
public:
|
||||
URIRedirection(const std::string& uri);
|
||||
URIRedirection(const URIRedirection& redir);
|
||||
|
||||
URIRedirection& operator = (const URIRedirection& redir);
|
||||
void swap(URIRedirection& redir);
|
||||
|
||||
const std::string& uri() const;
|
||||
/// Returns the new URI.
|
||||
|
||||
private:
|
||||
URIRedirection();
|
||||
|
||||
std::string _uri;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline const std::string& URIRedirection::uri() const
|
||||
{
|
||||
return _uri;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// URIStreamOpener.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/URIStreamOpener.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/URIStreamOpener.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: URI
|
||||
|
@ -62,6 +62,11 @@ class Foundation_API URIStreamOpener
|
|||
/// A FileStreamFactory is automatically registered for file URIs.
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
MAX_REDIRECTS = 10
|
||||
};
|
||||
|
||||
URIStreamOpener();
|
||||
/// Creates the URIStreamOpener and registers a FileStreamFactory
|
||||
/// for file URIs.
|
||||
|
@ -133,6 +138,7 @@ public:
|
|||
|
||||
protected:
|
||||
std::istream* openFile(const Path& path) const;
|
||||
std::istream* openURI(const std::string& scheme, const URI& uri) const;
|
||||
|
||||
private:
|
||||
URIStreamOpener(const URIStreamOpener&);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// UniqueAccessExpireStrategy.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/UniqueAccessExpireStrategy.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/UniqueAccessExpireStrategy.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Cache
|
||||
|
@ -149,6 +149,8 @@ public:
|
|||
args.invalidate();
|
||||
}
|
||||
}
|
||||
else //not found: probably removed by onReplace
|
||||
args.invalidate();
|
||||
}
|
||||
|
||||
void onReplace(const void*, std::set<TKey>& elemsToRemove)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// UniqueExpireStrategy.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/include/Poco/UniqueExpireStrategy.h#2 $
|
||||
// $Id: //poco/svn/Foundation/include/Poco/UniqueExpireStrategy.h#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Cache
|
||||
|
@ -130,6 +130,8 @@ public:
|
|||
args.invalidate();
|
||||
}
|
||||
}
|
||||
else //not found: probably removed by onReplace
|
||||
args.invalidate();
|
||||
}
|
||||
|
||||
void onReplace(const void*, std::set<TKey>& elemsToRemove)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// Debugger.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/src/Debugger.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/src/Debugger.cpp#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Core
|
||||
|
@ -47,7 +47,7 @@
|
|||
#include <lib$routines.h>
|
||||
#include <ssdef.h>
|
||||
#endif
|
||||
#if defined(POCO_WIN32_UTF8)
|
||||
#if defined(POCO_WIN32_UTF8) && !defined(POCO_NO_WSTRING)
|
||||
#include "Poco/UnicodeConverter.h"
|
||||
#endif
|
||||
|
||||
|
@ -85,7 +85,7 @@ void Debugger::message(const std::string& msg)
|
|||
#if defined(POCO_OS_FAMILY_WINDOWS)
|
||||
if (IsDebuggerPresent())
|
||||
{
|
||||
#if defined(POCO_WIN32_UTF8)
|
||||
#if defined(POCO_WIN32_UTF8) && !defined(POCO_NO_WSTRING)
|
||||
std::wstring umsg;
|
||||
UnicodeConverter::toUTF16(msg, umsg);
|
||||
umsg += '\n';
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// File.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/src/File.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/src/File.cpp#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
|
@ -160,6 +160,12 @@ bool File::isLink() const
|
|||
}
|
||||
|
||||
|
||||
bool File::isHidden() const
|
||||
{
|
||||
return isHiddenImpl();
|
||||
}
|
||||
|
||||
|
||||
Timestamp File::created() const
|
||||
{
|
||||
return createdImpl();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// File_VMS.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/src/File_VMS.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/src/File_VMS.cpp#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Filesystem
|
||||
|
@ -174,6 +174,12 @@ bool FileImpl::isLinkImpl() const
|
|||
}
|
||||
|
||||
|
||||
bool FileImpl::isHiddenImpl() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Timestamp FileImpl::createdImpl() const
|
||||
{
|
||||
poco_assert (!_path.empty());
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// SharedMemory.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/src/SharedMemory.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/src/SharedMemory.cpp#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: Processes
|
||||
|
@ -42,7 +42,9 @@
|
|||
|
||||
#include "Poco/SharedMemory.h"
|
||||
#include "Poco/Exception.h"
|
||||
#if defined(POCO_OS_FAMILY_WINDOWS)
|
||||
#if defined(POCO_NO_SHAREDMEMORY)
|
||||
#include "SharedMemory_DUMMY.cpp"
|
||||
#elif defined(POCO_OS_FAMILY_WINDOWS)
|
||||
#include "SharedMemory_WIN32.cpp"
|
||||
#elif defined(POCO_OS_FAMILY_UNIX)
|
||||
#include "SharedMemory_POSIX.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// URIStreamFactory.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/src/URIStreamFactory.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/src/URIStreamFactory.cpp#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: URI
|
||||
|
@ -35,6 +35,7 @@
|
|||
|
||||
|
||||
#include "Poco/URIStreamFactory.h"
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
@ -50,4 +51,30 @@ URIStreamFactory::~URIStreamFactory()
|
|||
}
|
||||
|
||||
|
||||
URIRedirection::URIRedirection(const std::string& uri):
|
||||
_uri(uri)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
URIRedirection::URIRedirection(const URIRedirection& redir):
|
||||
_uri(redir._uri)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
URIRedirection& URIRedirection::operator = (const URIRedirection& redir)
|
||||
{
|
||||
URIRedirection tmp(redir);
|
||||
swap(tmp);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
void URIRedirection::swap(URIRedirection& redir)
|
||||
{
|
||||
std::swap(_uri, redir._uri);
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// URIStreamOpener.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/src/URIStreamOpener.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/src/URIStreamOpener.cpp#3 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: URI
|
||||
|
@ -68,11 +68,7 @@ std::istream* URIStreamOpener::open(const URI& uri) const
|
|||
scheme = "file";
|
||||
else
|
||||
scheme = uri.getScheme();
|
||||
FactoryMap::const_iterator it = _map.find(scheme);
|
||||
if (it != _map.end())
|
||||
return it->second->open(uri);
|
||||
else
|
||||
throw UnknownURISchemeException(scheme);
|
||||
return openURI(scheme, uri);
|
||||
}
|
||||
|
||||
|
||||
|
@ -86,7 +82,7 @@ std::istream* URIStreamOpener::open(const std::string& pathOrURI) const
|
|||
std::string scheme(uri.getScheme());
|
||||
FactoryMap::const_iterator it = _map.find(scheme);
|
||||
if (it != _map.end())
|
||||
return it->second->open(uri);
|
||||
return openURI(scheme, uri);
|
||||
}
|
||||
catch (Exception&)
|
||||
{
|
||||
|
@ -108,7 +104,7 @@ std::istream* URIStreamOpener::open(const std::string& basePathOrURI, const std:
|
|||
if (it != _map.end())
|
||||
{
|
||||
uri.resolve(pathOrURI);
|
||||
return it->second->open(uri);
|
||||
return openURI(scheme, uri);
|
||||
}
|
||||
}
|
||||
catch (Exception&)
|
||||
|
@ -170,5 +166,33 @@ std::istream* URIStreamOpener::openFile(const Path& path) const
|
|||
}
|
||||
|
||||
|
||||
std::istream* URIStreamOpener::openURI(const std::string& scheme, const URI& uri) const
|
||||
{
|
||||
std::string actualScheme(scheme);
|
||||
URI actualURI(uri);
|
||||
int redirects = 0;
|
||||
|
||||
while (redirects < MAX_REDIRECTS)
|
||||
{
|
||||
try
|
||||
{
|
||||
FactoryMap::const_iterator it = _map.find(actualScheme);
|
||||
if (it != _map.end())
|
||||
return it->second->open(actualURI);
|
||||
else if (redirects > 0)
|
||||
throw UnknownURISchemeException(actualURI.toString() + std::string("; redirected from ") + uri.toString());
|
||||
else
|
||||
throw UnknownURISchemeException(actualURI.toString());
|
||||
}
|
||||
catch (URIRedirection& redir)
|
||||
{
|
||||
actualURI = redir.uri();
|
||||
actualScheme = actualURI.getScheme();
|
||||
++redirects;
|
||||
}
|
||||
}
|
||||
throw IOException("Too many redirects while opening URI", uri.toString());
|
||||
}
|
||||
|
||||
|
||||
} // namespace Poco
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// ExpireCacheTest.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/testsuite/src/ExpireCacheTest.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/testsuite/src/ExpireCacheTest.cpp#3 $
|
||||
//
|
||||
// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
|
@ -196,6 +196,19 @@ void ExpireCacheTest::testAccessExpireN()
|
|||
assert (!aCache.has(3));
|
||||
}
|
||||
|
||||
|
||||
void ExpireCacheTest::testExpireWithHas()
|
||||
{
|
||||
// 3-1 represents the cache sorted by age, elements get replaced at the end of the list
|
||||
// 3-1|5 -> 5 gets removed
|
||||
ExpireCache<int, int> aCache(DURSLEEP);
|
||||
aCache.add(1, 2); // 1
|
||||
assert (aCache.has(1));
|
||||
Thread::sleep(DURWAIT);
|
||||
assert (!aCache.has(1));
|
||||
}
|
||||
|
||||
|
||||
void ExpireCacheTest::setUp()
|
||||
{
|
||||
}
|
||||
|
@ -215,6 +228,7 @@ CppUnit::Test* ExpireCacheTest::suite()
|
|||
CppUnit_addTest(pSuite, ExpireCacheTest, testExpireN);
|
||||
CppUnit_addTest(pSuite, ExpireCacheTest, testDuplicateAdd);
|
||||
CppUnit_addTest(pSuite, ExpireCacheTest, testAccessExpireN);
|
||||
CppUnit_addTest(pSuite, ExpireCacheTest, testExpireWithHas);
|
||||
|
||||
return pSuite;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// ExpireCacheTest.h
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/testsuite/src/ExpireCacheTest.h#2 $
|
||||
// $Id: //poco/svn/Foundation/testsuite/src/ExpireCacheTest.h#3 $
|
||||
//
|
||||
// Tests for ExpireCache
|
||||
//
|
||||
|
@ -50,6 +50,7 @@ public:
|
|||
void testExpire0();
|
||||
void testExpireN();
|
||||
void testAccessExpireN();
|
||||
void testExpireWithHas();
|
||||
|
||||
|
||||
void setUp();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// FileTest.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Foundation/testsuite/src/FileTest.cpp#2 $
|
||||
// $Id: //poco/svn/Foundation/testsuite/src/FileTest.cpp#3 $
|
||||
//
|
||||
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
|
@ -208,6 +208,7 @@ void FileTest::testCreateFile()
|
|||
File f("testfile.dat");
|
||||
bool created = f.createFile();
|
||||
assert (created);
|
||||
assert (!f.isHidden());
|
||||
created = f.createFile();
|
||||
assert (!created);
|
||||
}
|
||||
|
|
|
@ -1,226 +0,0 @@
|
|||
//
|
||||
// HashTest.cpp
|
||||
//
|
||||
// $Id: //poco/1.2/Foundation/testsuite/src/HashTest.cpp#2 $
|
||||
//
|
||||
// Copyright (c) 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 "HashTest.h"
|
||||
#include "CppUnit/TestCaller.h"
|
||||
#include "CppUnit/TestSuite.h"
|
||||
#include "Poco/HashTable.h"
|
||||
#include "Poco/NumberFormatter.h"
|
||||
|
||||
|
||||
using namespace Poco;
|
||||
|
||||
|
||||
HashTest::HashTest(const std::string& name): CppUnit::TestCase(name)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
HashTest::~HashTest()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void HashTest::testInsert()
|
||||
{
|
||||
std::string s1("str1");
|
||||
std::string s2("str2");
|
||||
HashTable<std::string, int> hashTable;
|
||||
assert (!hashTable.exists(s1));
|
||||
hashTable.insert(s1, 13);
|
||||
assert (hashTable.exists(s1));
|
||||
assert (hashTable.get(s1) == 13);
|
||||
int retVal = 0;
|
||||
|
||||
assert (hashTable.get(s1, retVal));
|
||||
assert (retVal == 13);
|
||||
try
|
||||
{
|
||||
hashTable.insert(s1, 22);
|
||||
failmsg ("duplicate insert must fail");
|
||||
}
|
||||
catch (Exception&){}
|
||||
try
|
||||
{
|
||||
hashTable.get(s2);
|
||||
failmsg ("getting a non inserted item must fail");
|
||||
}
|
||||
catch (Exception&){}
|
||||
|
||||
assert (!hashTable.exists(s2));
|
||||
hashTable.insert(s2, 13);
|
||||
assert (hashTable.exists(s2));
|
||||
}
|
||||
|
||||
|
||||
void HashTest::testUpdate()
|
||||
{
|
||||
// add code for second test here
|
||||
std::string s1("str1");
|
||||
std::string s2("str2");
|
||||
HashTable<std::string, int> hashTable;
|
||||
hashTable.insert(s1, 13);
|
||||
hashTable.update(s1, 14);
|
||||
assert (hashTable.exists(s1));
|
||||
assert (hashTable.get(s1) == 14);
|
||||
int retVal = 0;
|
||||
|
||||
assert (hashTable.get(s1, retVal));
|
||||
assert (retVal == 14);
|
||||
|
||||
// updating a non existing item must work too
|
||||
hashTable.update(s2, 15);
|
||||
assert (hashTable.get(s2) == 15);
|
||||
}
|
||||
|
||||
|
||||
void HashTest::testOverflow()
|
||||
{
|
||||
HashTable<std::string, int> hashTable(13);
|
||||
for (int i = 0; i < 1024; ++i)
|
||||
{
|
||||
hashTable.insert(Poco::NumberFormatter::format(i), i*i);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 1024; ++i)
|
||||
{
|
||||
std::string tmp = Poco::NumberFormatter::format(i);
|
||||
assert (hashTable.exists(tmp));
|
||||
assert (hashTable.get(tmp) == i*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void HashTest::testSize()
|
||||
{
|
||||
HashTable<std::string, int> hashTable(13);
|
||||
assert (hashTable.size() == 0);
|
||||
Poco::UInt32 h1 = hashTable.insert("1", 1);
|
||||
assert (hashTable.size() == 1);
|
||||
Poco::UInt32 h2 = hashTable.update("2", 2);
|
||||
assert (hashTable.size() == 2);
|
||||
hashTable.remove("1");
|
||||
assert (hashTable.size() == 1);
|
||||
hashTable.remove("3");
|
||||
assert (hashTable.size() == 1);
|
||||
hashTable.removeRaw("2", h2);
|
||||
assert (hashTable.size() == 0);
|
||||
hashTable.insert("1", 1);
|
||||
hashTable.insert("2", 2);
|
||||
assert (hashTable.size() == 2);
|
||||
hashTable.clear();
|
||||
assert (hashTable.size() == 0);
|
||||
}
|
||||
|
||||
|
||||
void HashTest::testResize()
|
||||
{
|
||||
HashTable<std::string, int> hashTable(13);
|
||||
assert (hashTable.size() == 0);
|
||||
hashTable.resize(19);
|
||||
for (int i = 0; i < 1024; ++i)
|
||||
{
|
||||
hashTable.insert(Poco::NumberFormatter::format(i), i*i);
|
||||
}
|
||||
hashTable.resize(1009);
|
||||
|
||||
for (int i = 0; i < 1024; ++i)
|
||||
{
|
||||
std::string tmp = Poco::NumberFormatter::format(i);
|
||||
assert (hashTable.exists(tmp));
|
||||
assert (hashTable.get(tmp) == i*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void HashTest::testStatistic()
|
||||
{
|
||||
double relax = 0.001;
|
||||
HashTable<std::string, int> hashTable(13);
|
||||
assert (hashTable.size() == 0);
|
||||
HashStatistic stat1(hashTable.currentState());
|
||||
assert (stat1.avgEntriesPerHash() < relax && stat1.avgEntriesPerHash() > -relax);
|
||||
assert (stat1.maxPositionsOfTable() == 13);
|
||||
assert (stat1.maxEntriesPerHash() == 0);
|
||||
|
||||
hashTable.resize(19);
|
||||
stat1 = hashTable.currentState(true);
|
||||
assert (stat1.avgEntriesPerHash() < relax && stat1.avgEntriesPerHash() > -relax);
|
||||
assert (stat1.maxPositionsOfTable() == 19);
|
||||
assert (stat1.maxEntriesPerHash() == 0);
|
||||
assert (stat1.detailedEntriesPerHash().size() == 19);
|
||||
|
||||
for (int i = 0; i < 1024; ++i)
|
||||
{
|
||||
hashTable.insert(Poco::NumberFormatter::format(i), i*i);
|
||||
}
|
||||
stat1 = hashTable.currentState(true);
|
||||
double expAvg = 1024.0/ 19;
|
||||
assert (stat1.avgEntriesPerHash() < (expAvg + relax) && stat1.avgEntriesPerHash() > (expAvg - relax));
|
||||
assert (stat1.maxPositionsOfTable() == 19);
|
||||
assert (stat1.maxEntriesPerHash() > expAvg);
|
||||
hashTable.resize(1009);
|
||||
stat1 = hashTable.currentState(true);
|
||||
|
||||
expAvg = 1024.0/ 1009;
|
||||
|
||||
assert (stat1.avgEntriesPerHash() < (expAvg + relax) && stat1.avgEntriesPerHash() > (expAvg - relax));
|
||||
assert (stat1.maxPositionsOfTable() == 1009);
|
||||
assert (stat1.maxEntriesPerHash() > expAvg);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void HashTest::setUp()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void HashTest::tearDown()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CppUnit::Test* HashTest::suite()
|
||||
{
|
||||
CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("HashTest");
|
||||
|
||||
CppUnit_addTest(pSuite, HashTest, testInsert);
|
||||
CppUnit_addTest(pSuite, HashTest, testUpdate);
|
||||
CppUnit_addTest(pSuite, HashTest, testOverflow);
|
||||
CppUnit_addTest(pSuite, HashTest, testSize);
|
||||
CppUnit_addTest(pSuite, HashTest, testResize);
|
||||
CppUnit_addTest(pSuite, HashTest, testStatistic);
|
||||
|
||||
return pSuite;
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
//
|
||||
// HashTest.h
|
||||
//
|
||||
// $Id: //poco/1.2/Foundation/testsuite/src/HashTest.h#1 $
|
||||
//
|
||||
// Definition of the HashTest class.
|
||||
//
|
||||
// Copyright (c) 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.
|
||||
//
|
||||
|
||||
|
||||
#ifndef HashTest_INCLUDED
|
||||
#define HashTest_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Foundation.h"
|
||||
#include "CppUnit/TestCase.h"
|
||||
|
||||
|
||||
class HashTest: public CppUnit::TestCase
|
||||
{
|
||||
public:
|
||||
HashTest(const std::string& name);
|
||||
~HashTest();
|
||||
|
||||
void testInsert();
|
||||
void testOverflow();
|
||||
void testUpdate();
|
||||
void testSize();
|
||||
void testResize();
|
||||
void testStatistic();
|
||||
|
||||
void setUp();
|
||||
void tearDown();
|
||||
|
||||
static CppUnit::Test* suite();
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
|
||||
#endif // HashTest_INCLUDED
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// Socket.h
|
||||
//
|
||||
// $Id: //poco/svn/Net/include/Poco/Net/Socket.h#2 $
|
||||
// $Id: //poco/svn/Net/include/Poco/Net/Socket.h#3 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: Sockets
|
||||
|
@ -272,6 +272,11 @@ public:
|
|||
/// Sets the socket in blocking mode if flag is true,
|
||||
/// disables blocking mode if flag is false.
|
||||
|
||||
bool getBlocking() const;
|
||||
/// Returns the blocking mode of the socket.
|
||||
/// This method will only work if the blocking modes of
|
||||
/// the socket are changed via the setBlocking method!
|
||||
|
||||
SocketAddress address() const;
|
||||
/// Returns the IP address and port number of the socket.
|
||||
|
||||
|
@ -543,6 +548,12 @@ inline void Socket::setBlocking(bool flag)
|
|||
}
|
||||
|
||||
|
||||
inline bool Socket::getBlocking() const
|
||||
{
|
||||
return _pImpl->getBlocking();
|
||||
}
|
||||
|
||||
|
||||
inline SocketImpl* Socket::impl() const
|
||||
{
|
||||
return _pImpl;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// SocketImpl.h
|
||||
//
|
||||
// $Id: //poco/svn/Net/include/Poco/Net/SocketImpl.h#2 $
|
||||
// $Id: //poco/svn/Net/include/Poco/Net/SocketImpl.h#3 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: Sockets
|
||||
|
@ -323,10 +323,15 @@ public:
|
|||
bool getBroadcast();
|
||||
/// Returns the value of the SO_BROADCAST socket option.
|
||||
|
||||
void setBlocking(bool flag);
|
||||
virtual void setBlocking(bool flag);
|
||||
/// Sets the socket in blocking mode if flag is true,
|
||||
/// disables blocking mode if flag is false.
|
||||
|
||||
virtual bool getBlocking() const;
|
||||
/// Returns the blocking mode of the socket.
|
||||
/// This method will only work if the blocking modes of
|
||||
/// the socket are changed via the setBlocking method!
|
||||
|
||||
int socketError();
|
||||
/// Returns the value of the SO_ERROR socket option.
|
||||
|
||||
|
@ -409,6 +414,7 @@ private:
|
|||
Poco::Timespan _recvTimeout;
|
||||
Poco::Timespan _sndTimeout;
|
||||
#endif
|
||||
bool _blocking;
|
||||
|
||||
friend class Socket;
|
||||
friend class SecureSocketImpl;
|
||||
|
@ -446,6 +452,12 @@ inline void SocketImpl::invalidate()
|
|||
}
|
||||
|
||||
|
||||
inline bool SocketImpl::getBlocking() const
|
||||
{
|
||||
return _blocking;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Net
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// HTTPStreamFactory.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Net/src/HTTPStreamFactory.cpp#2 $
|
||||
// $Id: //poco/svn/Net/src/HTTPStreamFactory.cpp#3 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: HTTP
|
||||
|
@ -78,14 +78,21 @@ std::istream* HTTPStreamFactory::open(const URI& uri)
|
|||
poco_assert (uri.getScheme() == "http");
|
||||
|
||||
URI resolvedURI(uri);
|
||||
URI proxyUri;
|
||||
HTTPClientSession* pSession = 0;
|
||||
bool retry = false;
|
||||
|
||||
try
|
||||
{
|
||||
int redirects = 0;
|
||||
do
|
||||
{
|
||||
pSession = new HTTPClientSession(resolvedURI.getHost(), resolvedURI.getPort());
|
||||
pSession->setProxy(_proxyHost, _proxyPort);
|
||||
|
||||
if (proxyUri.empty())
|
||||
pSession->setProxy(_proxyHost, _proxyPort);
|
||||
else
|
||||
pSession->setProxy(proxyUri.getHost(), proxyUri.getPort());
|
||||
|
||||
std::string path = resolvedURI.getPathAndQuery();
|
||||
if (path.empty()) path = "/";
|
||||
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
|
||||
|
@ -93,22 +100,35 @@ std::istream* HTTPStreamFactory::open(const URI& uri)
|
|||
HTTPResponse res;
|
||||
std::istream& rs = pSession->receiveResponse(res);
|
||||
bool moved = (res.getStatus() == HTTPResponse::HTTP_MOVED_PERMANENTLY ||
|
||||
res.getStatus() == HTTPResponse::HTTP_FOUND ||
|
||||
res.getStatus() == HTTPResponse::HTTP_SEE_OTHER);
|
||||
res.getStatus() == HTTPResponse::HTTP_FOUND ||
|
||||
res.getStatus() == HTTPResponse::HTTP_SEE_OTHER ||
|
||||
res.getStatus() == HTTPResponse::HTTP_TEMPORARY_REDIRECT);
|
||||
if (moved)
|
||||
{
|
||||
resolvedURI.resolve(res.get("Location"));
|
||||
delete pSession;
|
||||
if (resolvedURI.getScheme() != "http") throw UnsupportedRedirectException(uri.toString());
|
||||
++redirects;
|
||||
throw URIRedirection(resolvedURI.toString());
|
||||
}
|
||||
else if (res.getStatus() == HTTPResponse::HTTP_OK)
|
||||
{
|
||||
return new HTTPResponseStream(rs, pSession);
|
||||
}
|
||||
else throw HTTPException(res.getReason(), uri.toString());
|
||||
else if (res.getStatus() == HTTPResponse::HTTP_USEPROXY && !retry)
|
||||
{
|
||||
//The requested resource MUST be accessed through the proxy
|
||||
//given by the Location field. The Location field gives the
|
||||
//URI of the proxy. The recipient is expected to repeat this
|
||||
//single request via the proxy. 305 responses MUST only be generated by origin servers.
|
||||
// only use for one single request!
|
||||
proxyUri.resolve(res.get("Location"));
|
||||
delete pSession; pSession = 0;
|
||||
retry = true; //only allow useproxy once
|
||||
}
|
||||
else
|
||||
{
|
||||
throw HTTPException(res.getReason(), uri.toString());
|
||||
}
|
||||
}
|
||||
while (redirects < MAX_REDIRECTS);
|
||||
while(retry);
|
||||
throw HTTPException("Too many redirects", uri.toString());
|
||||
}
|
||||
catch (...)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// SocketImpl.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Net/src/SocketImpl.cpp#2 $
|
||||
// $Id: //poco/svn/Net/src/SocketImpl.cpp#3 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: Sockets
|
||||
|
@ -54,13 +54,15 @@ namespace Net {
|
|||
|
||||
|
||||
SocketImpl::SocketImpl():
|
||||
_sockfd(POCO_INVALID_SOCKET)
|
||||
_sockfd(POCO_INVALID_SOCKET),
|
||||
_blocking(true)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SocketImpl::SocketImpl(poco_socket_t sockfd):
|
||||
_sockfd(sockfd)
|
||||
_sockfd(sockfd),
|
||||
_blocking(true)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -718,6 +720,7 @@ void SocketImpl::setBlocking(bool flag)
|
|||
{
|
||||
int arg = flag ? 0 : 1;
|
||||
ioctl(FIONBIO, arg);
|
||||
_blocking = flag;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// HTTPStreamFactoryTest.cpp
|
||||
//
|
||||
// $Id: //poco/svn/Net/testsuite/src/HTTPStreamFactoryTest.cpp#2 $
|
||||
// $Id: //poco/svn/Net/testsuite/src/HTTPStreamFactoryTest.cpp#3 $
|
||||
//
|
||||
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
|
@ -36,6 +36,7 @@
|
|||
#include "Poco/Net/HTTPStreamFactory.h"
|
||||
#include "Poco/Net/NetException.h"
|
||||
#include "Poco/URI.h"
|
||||
#include "Poco/URIStreamOpener.h"
|
||||
#include "Poco/StreamCopier.h"
|
||||
#include "HTTPTestServer.h"
|
||||
#include <sstream>
|
||||
|
@ -88,10 +89,11 @@ void HTTPStreamFactoryTest::testEmptyPath()
|
|||
void HTTPStreamFactoryTest::testRedirect()
|
||||
{
|
||||
HTTPTestServer server;
|
||||
HTTPStreamFactory factory;
|
||||
Poco::URIStreamOpener opener;
|
||||
opener.registerStreamFactory("http", new HTTPStreamFactory);
|
||||
URI uri("http://localhost/redirect");
|
||||
uri.setPort(server.port());
|
||||
std::auto_ptr<std::istream> pStr(factory.open(uri));
|
||||
std::auto_ptr<std::istream> pStr(opener.open(uri));
|
||||
std::ostringstream ostr;
|
||||
StreamCopier::copyStream(*pStr.get(), ostr);
|
||||
assert (ostr.str() == HTTPTestServer::LARGE_BODY);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// DOMBuilder.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/DOMBuilder.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/DOMBuilder.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -81,6 +81,9 @@ public:
|
|||
virtual Document* parse(InputSource* pInputSource);
|
||||
/// Parse an XML document from a location identified by an InputSource.
|
||||
|
||||
virtual Document* parseMemoryNP(const char* xml, std::size_t size);
|
||||
/// Parses an XML document from memory.
|
||||
|
||||
protected:
|
||||
// DTDHandler
|
||||
void notationDecl(const XMLString& name, const XMLString* publicId, const XMLString* systemId);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// DOMParser.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/DOMParser.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/DOMParser.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -105,6 +105,9 @@ public:
|
|||
Document* parseString(const std::string& xml);
|
||||
/// Parse an XML document from a string.
|
||||
|
||||
Document* parseMemory(const char* xml, std::size_t size);
|
||||
/// Parse an XML document from memory.
|
||||
|
||||
EntityResolver* getEntityResolver() const;
|
||||
/// Returns the entity resolver used by the underlying SAXParser.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// DOMSerializer.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/DOMSerializer.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/DOMSerializer.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -109,6 +109,10 @@ protected:
|
|||
/// The DOMSerializer cannot parse from a system identifier,
|
||||
/// so this method simply throws an XMLException when invoked.
|
||||
|
||||
void parseMemoryNP(const char* xml, std::size_t size);
|
||||
/// The DOMSerializer cannot parse from a system identifier,
|
||||
/// so this method simply throws an XMLException when invoked.
|
||||
|
||||
void iterate(const Node* pNode) const;
|
||||
void handleNode(const Node* pNode) const;
|
||||
void handleElement(const Element* pElement) const;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// Element.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/Element.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/DOM/Element.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -101,6 +101,13 @@ public:
|
|||
/// Adds a new attribute. If an attribute with that name is already
|
||||
/// present in the element, it is replaced by the new one.
|
||||
|
||||
Attr* addAttributeNodeNP(Attr* oldAttr, Attr* newAttr);
|
||||
/// For internal use only.
|
||||
/// Adds a new attribute after oldAttr.
|
||||
/// If oldAttr is 0, newAttr is set as first attribute.
|
||||
/// Returns newAttr.
|
||||
/// Does not fire any events.
|
||||
|
||||
Attr* removeAttributeNode(Attr* oldAttr);
|
||||
/// Removes the specified attribute.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// Attributes.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/Attributes.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/Attributes.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -83,13 +83,13 @@ public:
|
|||
///
|
||||
/// Once you know the number of attributes, you can iterate through the list.
|
||||
|
||||
virtual XMLString getLocalName(int i) const = 0;
|
||||
virtual const XMLString& getLocalName(int i) const = 0;
|
||||
/// Look up a local attribute name by index.
|
||||
|
||||
virtual XMLString getQName(int i) const = 0;
|
||||
virtual const XMLString& getQName(int i) const = 0;
|
||||
/// Look up a qualified attribute name by index.
|
||||
|
||||
virtual XMLString getType(int i) const = 0;
|
||||
virtual const XMLString& getType(int i) const = 0;
|
||||
/// Look up an attribute type by index.
|
||||
///
|
||||
/// The attribute type is one of the strings "CDATA", "ID", "IDREF", "IDREFS", "NMTOKEN",
|
||||
|
@ -102,33 +102,33 @@ public:
|
|||
/// For an enumerated attribute that is not a notation, the parser will report the type
|
||||
/// as "NMTOKEN".
|
||||
|
||||
virtual XMLString getType(const XMLString& qname) const = 0;
|
||||
virtual const XMLString& getType(const XMLString& qname) const = 0;
|
||||
/// Look up an attribute type by a qualified name.
|
||||
///
|
||||
/// See getType(int) for a description of the possible types.
|
||||
|
||||
virtual XMLString getType(const XMLString& namespaceURI, const XMLString& localName) const = 0;
|
||||
virtual const XMLString& getType(const XMLString& namespaceURI, const XMLString& localName) const = 0;
|
||||
/// Look up an attribute type by a namespace name.
|
||||
///
|
||||
/// See getType(int) for a description of the possible types.
|
||||
|
||||
virtual XMLString getValue(int i) const = 0;
|
||||
virtual const XMLString& getValue(int i) const = 0;
|
||||
/// Look up an attribute value by index.
|
||||
///
|
||||
/// If the attribute value is a list of tokens (IDREFS, ENTITIES, or NMTOKENS), the tokens
|
||||
/// will be concatenated into a single string with each token separated by a single space.
|
||||
|
||||
virtual XMLString getValue(const XMLString& qname) const = 0;
|
||||
virtual const XMLString& getValue(const XMLString& qname) const = 0;
|
||||
/// Look up an attribute value by a qualified name.
|
||||
///
|
||||
/// See getValue(int) for a description of the possible values.
|
||||
|
||||
virtual XMLString getValue(const XMLString& uri, const XMLString& localName) const = 0;
|
||||
virtual const XMLString& getValue(const XMLString& uri, const XMLString& localName) const = 0;
|
||||
/// Look up an attribute value by a namespace name.
|
||||
///
|
||||
/// See getValue(int) for a description of the possible values.
|
||||
|
||||
virtual XMLString getURI(int i) const = 0;
|
||||
virtual const XMLString& getURI(int i) const = 0;
|
||||
/// Look up a namespace URI by index.
|
||||
|
||||
protected:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// AttributesImpl.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/AttributesImpl.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/AttributesImpl.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -58,6 +58,18 @@ class XML_API AttributesImpl: public Attributes
|
|||
/// 2. to construct or modify an Attributes object in a SAX2 driver or filter.
|
||||
{
|
||||
public:
|
||||
struct Attribute
|
||||
{
|
||||
XMLString localName;
|
||||
XMLString namespaceURI;
|
||||
XMLString qname;
|
||||
XMLString value;
|
||||
XMLString type;
|
||||
bool specified;
|
||||
};
|
||||
typedef std::vector<Attribute> AttributeVec;
|
||||
typedef AttributeVec::const_iterator iterator;
|
||||
|
||||
AttributesImpl();
|
||||
/// Creates the AttributesImpl.
|
||||
|
||||
|
@ -76,15 +88,15 @@ public:
|
|||
int getIndex(const XMLString& name) const;
|
||||
int getIndex(const XMLString& namespaceURI, const XMLString& localName) const;
|
||||
int getLength() const;
|
||||
XMLString getLocalName(int i) const;
|
||||
XMLString getQName(int i) const;
|
||||
XMLString getType(int i) const;
|
||||
XMLString getType(const XMLString& qname) const;
|
||||
XMLString getType(const XMLString& namespaceURI, const XMLString& localName) const;
|
||||
XMLString getValue(int i) const;
|
||||
XMLString getValue(const XMLString& qname) const;
|
||||
XMLString getValue(const XMLString& namespaceURI, const XMLString& localName) const;
|
||||
XMLString getURI(int i) const;
|
||||
const XMLString& getLocalName(int i) const;
|
||||
const XMLString& getQName(int i) const;
|
||||
const XMLString& getType(int i) const;
|
||||
const XMLString& getType(const XMLString& qname) const;
|
||||
const XMLString& getType(const XMLString& namespaceURI, const XMLString& localName) const;
|
||||
const XMLString& getValue(int i) const;
|
||||
const XMLString& getValue(const XMLString& qname) const;
|
||||
const XMLString& getValue(const XMLString& namespaceURI, const XMLString& localName) const;
|
||||
const XMLString& getURI(int i) const;
|
||||
|
||||
bool isSpecified(int i) const;
|
||||
/// Returns true unless the attribute value was provided by DTD defaulting.
|
||||
|
@ -122,6 +134,11 @@ public:
|
|||
void addAttribute(const XMLChar* namespaceURI, const XMLChar* localName, const XMLChar* qname, const XMLChar* type, const XMLChar* value, bool specified);
|
||||
/// Adds an attribute to the end of the list.
|
||||
|
||||
Attribute& addAttribute();
|
||||
/// Add an (empty) attribute to the end of the list.
|
||||
/// For internal use only.
|
||||
/// The returned Attribute element must be filled by the caller.
|
||||
|
||||
void removeAttribute(int i);
|
||||
/// Removes an attribute.
|
||||
|
||||
|
@ -133,6 +150,9 @@ public:
|
|||
|
||||
void clear();
|
||||
/// Removes all attributes.
|
||||
|
||||
void reserve(std::size_t capacity);
|
||||
/// Reserves capacity in the internal vector.
|
||||
|
||||
void setLocalName(int i, const XMLString& localName);
|
||||
/// Sets the local name of an attribute.
|
||||
|
@ -146,18 +166,6 @@ public:
|
|||
void setURI(int i, const XMLString& namespaceURI);
|
||||
/// Sets the namespace URI of an attribute.
|
||||
|
||||
struct Attribute
|
||||
{
|
||||
XMLString localName;
|
||||
XMLString namespaceURI;
|
||||
XMLString qname;
|
||||
XMLString value;
|
||||
XMLString type;
|
||||
bool specified;
|
||||
};
|
||||
typedef std::vector<Attribute> AttributeVec;
|
||||
typedef AttributeVec::const_iterator iterator;
|
||||
|
||||
iterator begin() const;
|
||||
/// Iterator support.
|
||||
|
||||
|
@ -170,6 +178,7 @@ protected:
|
|||
|
||||
private:
|
||||
AttributeVec _attributes;
|
||||
Attribute _empty;
|
||||
};
|
||||
|
||||
|
||||
|
@ -188,6 +197,121 @@ inline AttributesImpl::iterator AttributesImpl::end() const
|
|||
}
|
||||
|
||||
|
||||
inline AttributesImpl::Attribute& AttributesImpl::addAttribute()
|
||||
{
|
||||
_attributes.push_back(_empty);
|
||||
return _attributes.back();
|
||||
}
|
||||
|
||||
|
||||
inline int AttributesImpl::getLength() const
|
||||
{
|
||||
return (int) _attributes.size();
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getLocalName(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].localName;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getQName(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].qname;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getType(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].type;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getType(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->type;
|
||||
else
|
||||
return _empty.type;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getType(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->type;
|
||||
else
|
||||
return _empty.type;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getValue(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].value;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getValue(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->value;
|
||||
else
|
||||
return _empty.value;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getValue(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->value;
|
||||
else
|
||||
return _empty.value;
|
||||
}
|
||||
|
||||
|
||||
inline const XMLString& AttributesImpl::getURI(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].namespaceURI;
|
||||
}
|
||||
|
||||
|
||||
inline bool AttributesImpl::isSpecified(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].specified;
|
||||
}
|
||||
|
||||
|
||||
inline bool AttributesImpl::isSpecified(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->specified;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
inline bool AttributesImpl::isSpecified(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->specified;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::XML
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// SAXParser.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/SAXParser.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/SAXParser.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -98,6 +98,7 @@ public:
|
|||
void* getProperty(const XMLString& propertyId) const;
|
||||
void parse(InputSource* pSource);
|
||||
void parse(const XMLString& systemId);
|
||||
void parseMemoryNP(const char* xml, std::size_t size);
|
||||
|
||||
/// Extensions
|
||||
void parseString(const std::string& xml);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// XMLFilterImpl.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/XMLFilterImpl.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/XMLFilterImpl.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -94,6 +94,7 @@ public:
|
|||
void* getProperty(const XMLString& propertyId) const;
|
||||
void parse(InputSource* pSource);
|
||||
void parse(const XMLString& systemId);
|
||||
void parseMemoryNP(const char* xml, std::size_t size);
|
||||
|
||||
// EntityResolver
|
||||
InputSource* resolveEntity(const XMLString* publicId, const XMLString& systemId);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// XMLReader.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/XMLReader.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/SAX/XMLReader.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -199,6 +199,10 @@ public:
|
|||
virtual void parse(const XMLString& systemId) = 0;
|
||||
/// Parse an XML document from a system identifier.
|
||||
/// See also parse(InputSource*).
|
||||
|
||||
virtual void parseMemoryNP(const char* xml, std::size_t size) = 0;
|
||||
/// Parse an XML document from memory.
|
||||
/// See also parse(InputSource*).
|
||||
|
||||
// SAX Features
|
||||
static const XMLString FEATURE_VALIDATION;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// NamespaceStrategy.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/XML/NamespaceStrategy.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/XML/NamespaceStrategy.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: XML
|
||||
|
@ -43,6 +43,7 @@
|
|||
#include "Poco/XML/XML.h"
|
||||
#include "Poco/XML/XMLString.h"
|
||||
#include "Poco/SAX/NamespaceSupport.h"
|
||||
#include "Poco/SAX/AttributesImpl.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
@ -73,8 +74,6 @@ protected:
|
|||
static void splitName(const XMLChar* qname, XMLString& uri, XMLString& localName, XMLString& prefix);
|
||||
|
||||
static const XMLString NOTHING;
|
||||
static const XMLString CDATA;
|
||||
static const XMLString COLON;
|
||||
};
|
||||
|
||||
|
||||
|
@ -88,6 +87,10 @@ public:
|
|||
|
||||
void startElement(const XMLChar* name, const XMLChar** atts, int specifiedCount, ContentHandler* pContentHandler);
|
||||
void endElement(const XMLChar* name, ContentHandler* pContentHandler);
|
||||
|
||||
private:
|
||||
XMLString _name;
|
||||
AttributesImpl _attrs;
|
||||
};
|
||||
|
||||
|
||||
|
@ -101,6 +104,11 @@ public:
|
|||
|
||||
void startElement(const XMLChar* name, const XMLChar** atts, int specifiedCount, ContentHandler* pContentHandler);
|
||||
void endElement(const XMLChar* name, ContentHandler* pContentHandler);
|
||||
|
||||
private:
|
||||
XMLString _uri;
|
||||
XMLString _local;
|
||||
AttributesImpl _attrs;
|
||||
};
|
||||
|
||||
|
||||
|
@ -114,6 +122,12 @@ public:
|
|||
|
||||
void startElement(const XMLChar* name, const XMLChar** atts, int specifiedCount, ContentHandler* pContentHandler);
|
||||
void endElement(const XMLChar* name, ContentHandler* pContentHandler);
|
||||
|
||||
private:
|
||||
XMLString _uri;
|
||||
XMLString _local;
|
||||
XMLString _qname;
|
||||
AttributesImpl _attrs;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// ParserEngine.h
|
||||
//
|
||||
// $Id: //poco/svn/XML/include/Poco/XML/ParserEngine.h#2 $
|
||||
// $Id: //poco/svn/XML/include/Poco/XML/ParserEngine.h#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: XML
|
||||
|
@ -163,6 +163,9 @@ public:
|
|||
|
||||
void parse(InputSource* pInputSource);
|
||||
/// Parse an XML document from the given InputSource.
|
||||
|
||||
void parse(const char* pBuffer, std::size_t size);
|
||||
/// Parses an XML document from the given buffer.
|
||||
|
||||
// Locator
|
||||
XMLString getPublicId() const;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// AttributesImpl.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/AttributesImpl.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/AttributesImpl.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -43,18 +43,23 @@ namespace XML {
|
|||
|
||||
AttributesImpl::AttributesImpl()
|
||||
{
|
||||
_empty.specified = false;
|
||||
_empty.type = "CDATA";
|
||||
}
|
||||
|
||||
|
||||
AttributesImpl::AttributesImpl(const Attributes& attributes)
|
||||
{
|
||||
_empty.specified = false;
|
||||
_empty.type = "CDATA";
|
||||
setAttributes(attributes);
|
||||
}
|
||||
|
||||
|
||||
AttributesImpl::AttributesImpl(const AttributesImpl& attributes)
|
||||
AttributesImpl::AttributesImpl(const AttributesImpl& attributes):
|
||||
_attributes(attributes._attributes),
|
||||
_empty(attributes._empty)
|
||||
{
|
||||
setAttributes(attributes);
|
||||
}
|
||||
|
||||
|
||||
|
@ -99,114 +104,6 @@ int AttributesImpl::getIndex(const XMLString& namespaceURI, const XMLString& loc
|
|||
}
|
||||
|
||||
|
||||
int AttributesImpl::getLength() const
|
||||
{
|
||||
return (int) _attributes.size();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getLocalName(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].localName;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getQName(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].qname;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getType(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].type;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getType(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->type;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getType(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->type;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getValue(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].value;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getValue(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->value;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getValue(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->value;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getURI(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].namespaceURI;
|
||||
}
|
||||
|
||||
|
||||
bool AttributesImpl::isSpecified(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].specified;
|
||||
}
|
||||
|
||||
|
||||
bool AttributesImpl::isSpecified(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->specified;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool AttributesImpl::isSpecified(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->specified;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void AttributesImpl::setValue(int i, const XMLString& value)
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
|
@ -346,6 +243,12 @@ void AttributesImpl::clear()
|
|||
}
|
||||
|
||||
|
||||
void AttributesImpl::reserve(std::size_t capacity)
|
||||
{
|
||||
_attributes.reserve(capacity);
|
||||
}
|
||||
|
||||
|
||||
void AttributesImpl::setLocalName(int i, const XMLString& localName)
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// DOMBuilder.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/DOMBuilder.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/DOMBuilder.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -126,6 +126,28 @@ Document* DOMBuilder::parse(InputSource* pInputSource)
|
|||
}
|
||||
|
||||
|
||||
Document* DOMBuilder::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
setupParse();
|
||||
_pDocument->suspendEvents();
|
||||
try
|
||||
{
|
||||
_xmlReader.parseMemoryNP(xml, size);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
_pDocument->release();
|
||||
_pDocument = 0;
|
||||
_pParent = 0;
|
||||
_pPrevious = 0;
|
||||
throw;
|
||||
}
|
||||
_pDocument->resumeEvents();
|
||||
_pDocument->collectGarbage();
|
||||
return _pDocument;
|
||||
}
|
||||
|
||||
|
||||
void DOMBuilder::setupParse()
|
||||
{
|
||||
_pDocument = new Document(_pNamePool);
|
||||
|
@ -191,13 +213,11 @@ void DOMBuilder::startElement(const XMLString& uri, const XMLString& localName,
|
|||
AutoPtr<Element> pElem = _namespaces ? _pDocument->createElementNS(uri, qname.empty() ? localName : qname) : _pDocument->createElement(qname);
|
||||
|
||||
const AttributesImpl& attrs = dynamic_cast<const AttributesImpl&>(attributes);
|
||||
Attr* pPrevAttr = 0;
|
||||
for (AttributesImpl::iterator it = attrs.begin(); it != attrs.end(); ++it)
|
||||
{
|
||||
AutoPtr<Attr> pAttr = new Attr(_pDocument, 0, it->namespaceURI, it->localName, it->qname, it->value, it->specified);
|
||||
if (_namespaces)
|
||||
pElem->setAttributeNodeNS(pAttr);
|
||||
else
|
||||
pElem->setAttributeNode(pAttr);
|
||||
pPrevAttr = pElem->addAttributeNodeNP(pPrevAttr, pAttr);
|
||||
}
|
||||
appendNode(pElem);
|
||||
_pParent = pElem;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// DOMParser.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/DOMParser.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/DOMParser.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -135,9 +135,23 @@ Document* DOMParser::parse(InputSource* pInputSource)
|
|||
|
||||
Document* DOMParser::parseString(const std::string& xml)
|
||||
{
|
||||
std::istringstream istr(xml);
|
||||
InputSource src(istr);
|
||||
return parse(&src);
|
||||
return parseMemory(xml.data(), xml.size());
|
||||
}
|
||||
|
||||
|
||||
Document* DOMParser::parseMemory(const char* xml, std::size_t size)
|
||||
{
|
||||
if (_whitespace)
|
||||
{
|
||||
DOMBuilder builder(_saxParser, _pNamePool);
|
||||
return builder.parseMemoryNP(xml, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WhitespaceFilter filter(&_saxParser);
|
||||
DOMBuilder builder(filter, _pNamePool);
|
||||
return builder.parseMemoryNP(xml, size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// DOMSerializer.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/DOMSerializer.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/DOMSerializer.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -199,6 +199,12 @@ void DOMSerializer::parse(const XMLString& systemId)
|
|||
}
|
||||
|
||||
|
||||
void DOMSerializer::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
throw XMLException("The DOMSerializer cannot parse from memory");
|
||||
}
|
||||
|
||||
|
||||
void DOMSerializer::iterate(const Node* pNode) const
|
||||
{
|
||||
while (pNode)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// Element.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/Element.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/Element.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
|
@ -173,6 +173,27 @@ Attr* Element::removeAttributeNode(Attr* oldAttr)
|
|||
}
|
||||
|
||||
|
||||
Attr* Element::addAttributeNodeNP(Attr* oldAttr, Attr* newAttr)
|
||||
{
|
||||
newAttr->_pParent = this;
|
||||
if (oldAttr)
|
||||
{
|
||||
oldAttr->_pNext = newAttr;
|
||||
}
|
||||
else if (_pFirstAttr)
|
||||
{
|
||||
newAttr->_pNext = _pFirstAttr;
|
||||
_pFirstAttr = newAttr;
|
||||
}
|
||||
else
|
||||
{
|
||||
_pFirstAttr = newAttr;
|
||||
}
|
||||
newAttr->duplicate();
|
||||
return newAttr;
|
||||
}
|
||||
|
||||
|
||||
NodeList* Element::getElementsByTagName(const XMLString& name) const
|
||||
{
|
||||
return new ElementsByTagNameList(this, name);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// NamespaceStrategy.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/NamespaceStrategy.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/NamespaceStrategy.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: XML
|
||||
|
@ -46,8 +46,6 @@ namespace XML {
|
|||
|
||||
|
||||
const XMLString NamespaceStrategy::NOTHING;
|
||||
const XMLString NamespaceStrategy::CDATA = toXMLString("CDATA");
|
||||
const XMLString NamespaceStrategy::COLON = toXMLString(":");
|
||||
|
||||
|
||||
NamespaceStrategy::~NamespaceStrategy()
|
||||
|
@ -83,13 +81,21 @@ void NamespaceStrategy::splitName(const XMLChar* qname, XMLString& uri, XMLStrin
|
|||
localName.assign(loc, p - loc);
|
||||
if (*p)
|
||||
prefix.assign(++p);
|
||||
else
|
||||
prefix.assign("");
|
||||
}
|
||||
else localName = qname;
|
||||
else
|
||||
{
|
||||
uri.assign("");
|
||||
localName = qname;
|
||||
prefix.assign("");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NoNamespacesStrategy::NoNamespacesStrategy()
|
||||
{
|
||||
_attrs.reserve(32);
|
||||
}
|
||||
|
||||
|
||||
|
@ -102,14 +108,16 @@ void NoNamespacesStrategy::startElement(const XMLChar* name, const XMLChar** att
|
|||
{
|
||||
poco_assert_dbg (name && atts && pContentHandler);
|
||||
|
||||
AttributesImpl attributes;
|
||||
_attrs.clear();
|
||||
for (int i = 0; *atts; ++i)
|
||||
{
|
||||
const XMLChar* attrName = *atts++;
|
||||
const XMLChar* attrValue = *atts++;
|
||||
attributes.addAttribute(NOTHING, NOTHING, attrName, CDATA, attrValue, i < specifiedCount);
|
||||
AttributesImpl::Attribute& attr = _attrs.addAttribute();
|
||||
attr.qname.assign(*atts++);
|
||||
attr.value.assign(*atts++);
|
||||
attr.specified = i < specifiedCount;
|
||||
}
|
||||
pContentHandler->startElement(NOTHING, NOTHING, name, attributes);
|
||||
_name.assign(name);
|
||||
pContentHandler->startElement(NOTHING, NOTHING, _name, _attrs);
|
||||
}
|
||||
|
||||
|
||||
|
@ -117,12 +125,14 @@ void NoNamespacesStrategy::endElement(const XMLChar* name, ContentHandler* pCont
|
|||
{
|
||||
poco_assert_dbg (name && pContentHandler);
|
||||
|
||||
pContentHandler->endElement(NOTHING, NOTHING, name);
|
||||
_name.assign(name);
|
||||
pContentHandler->endElement(NOTHING, NOTHING, _name);
|
||||
}
|
||||
|
||||
|
||||
NoNamespacePrefixesStrategy::NoNamespacePrefixesStrategy()
|
||||
{
|
||||
_attrs.reserve(32);
|
||||
}
|
||||
|
||||
|
||||
|
@ -135,20 +145,18 @@ void NoNamespacePrefixesStrategy::startElement(const XMLChar* name, const XMLCha
|
|||
{
|
||||
poco_assert_dbg (name && atts && pContentHandler);
|
||||
|
||||
AttributesImpl attributes;
|
||||
_attrs.clear();
|
||||
for (int i = 0; *atts; ++i)
|
||||
{
|
||||
const XMLChar* attrName = *atts++;
|
||||
const XMLChar* attrValue = *atts++;
|
||||
XMLString attrURI;
|
||||
XMLString attrLocal;
|
||||
splitName(attrName, attrURI, attrLocal);
|
||||
attributes.addAttribute(attrURI, attrLocal, NOTHING, CDATA, attrValue, i < specifiedCount);
|
||||
AttributesImpl::Attribute& attr = _attrs.addAttribute();
|
||||
splitName(attrName, attr.namespaceURI, attr.localName);
|
||||
attr.value.assign(attrValue);
|
||||
attr.specified = i < specifiedCount;
|
||||
}
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
splitName(name, uri, local);
|
||||
pContentHandler->startElement(uri, local, NOTHING, attributes);
|
||||
splitName(name, _uri, _local);
|
||||
pContentHandler->startElement(_uri, _local, NOTHING, _attrs);
|
||||
}
|
||||
|
||||
|
||||
|
@ -156,15 +164,14 @@ void NoNamespacePrefixesStrategy::endElement(const XMLChar* name, ContentHandler
|
|||
{
|
||||
poco_assert_dbg (name && pContentHandler);
|
||||
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
splitName(name, uri, local);
|
||||
pContentHandler->endElement(uri, local, NOTHING);
|
||||
splitName(name, _uri, _local);
|
||||
pContentHandler->endElement(_uri, _local, NOTHING);
|
||||
}
|
||||
|
||||
|
||||
NamespacePrefixesStrategy::NamespacePrefixesStrategy()
|
||||
{
|
||||
_attrs.reserve(32);
|
||||
}
|
||||
|
||||
|
||||
|
@ -177,26 +184,22 @@ void NamespacePrefixesStrategy::startElement(const XMLChar* name, const XMLChar*
|
|||
{
|
||||
poco_assert_dbg (name && atts && pContentHandler);
|
||||
|
||||
AttributesImpl attributes;
|
||||
_attrs.clear();
|
||||
for (int i = 0; *atts; ++i)
|
||||
{
|
||||
const XMLChar* attrName = *atts++;
|
||||
const XMLChar* attrValue = *atts++;
|
||||
XMLString attrURI;
|
||||
XMLString attrLocal;
|
||||
XMLString attrQName;
|
||||
splitName(attrName, attrURI, attrLocal, attrQName);
|
||||
if (!attrQName.empty()) attrQName += ':';
|
||||
attrQName.append(attrLocal);
|
||||
attributes.addAttribute(attrURI, attrLocal, attrQName, CDATA, attrValue, i < specifiedCount);
|
||||
AttributesImpl::Attribute& attr = _attrs.addAttribute();
|
||||
splitName(attrName, attr.namespaceURI, attr.localName, attr.qname);
|
||||
if (!attr.qname.empty()) attr.qname += ':';
|
||||
attr.qname.append(attr.localName);
|
||||
attr.value.assign(attrValue);
|
||||
attr.specified = i < specifiedCount;
|
||||
}
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
XMLString qname;
|
||||
splitName(name, uri, local, qname);
|
||||
if (!qname.empty()) qname += ':';
|
||||
qname.append(local);
|
||||
pContentHandler->startElement(uri, local, qname, attributes);
|
||||
splitName(name, _uri, _local, _qname);
|
||||
if (!_qname.empty()) _qname += ':';
|
||||
_qname.append(_local);
|
||||
pContentHandler->startElement(_uri, _local, _qname, _attrs);
|
||||
}
|
||||
|
||||
|
||||
|
@ -204,13 +207,10 @@ void NamespacePrefixesStrategy::endElement(const XMLChar* name, ContentHandler*
|
|||
{
|
||||
poco_assert_dbg (name && pContentHandler);
|
||||
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
XMLString qname;
|
||||
splitName(name, uri, local, qname);
|
||||
if (!qname.empty()) qname += ':';
|
||||
qname.append(local);
|
||||
pContentHandler->endElement(uri, local, qname);
|
||||
splitName(name, _uri, _local, _qname);
|
||||
if (!_qname.empty()) _qname += ':';
|
||||
_qname.append(_local);
|
||||
pContentHandler->endElement(_uri, _local, _qname);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// ParserEngine.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/ParserEngine.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/ParserEngine.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: XML
|
||||
|
@ -249,6 +249,21 @@ void ParserEngine::parse(InputSource* pInputSource)
|
|||
}
|
||||
|
||||
|
||||
void ParserEngine::parse(const char* pBuffer, std::size_t size)
|
||||
{
|
||||
init();
|
||||
resetContext();
|
||||
InputSource src;
|
||||
pushContext(_parser, &src);
|
||||
if (_pContentHandler) _pContentHandler->setDocumentLocator(this);
|
||||
if (_pContentHandler) _pContentHandler->startDocument();
|
||||
if (!XML_Parse(_parser, pBuffer, static_cast<int>(size), 1))
|
||||
handleError(XML_GetErrorCode(_parser));
|
||||
if (_pContentHandler) _pContentHandler->endDocument();
|
||||
popContext();
|
||||
}
|
||||
|
||||
|
||||
void ParserEngine::parseByteInputStream(XMLByteInputStream& istr)
|
||||
{
|
||||
istr.read(_pBuffer, PARSE_BUFFER_SIZE);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// SAXParser.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/SAXParser.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/SAXParser.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -228,9 +228,14 @@ void SAXParser::parse(const XMLString& systemId)
|
|||
|
||||
void SAXParser::parseString(const std::string& xml)
|
||||
{
|
||||
std::istringstream istr(xml);
|
||||
InputSource src(istr);
|
||||
parse(&src);
|
||||
parseMemoryNP(xml.data(), xml.size());
|
||||
}
|
||||
|
||||
|
||||
void SAXParser::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
setupParse();
|
||||
_engine.parse(xml, size);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// XMLFilterImpl.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/XMLFilterImpl.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/XMLFilterImpl.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
|
@ -186,6 +186,13 @@ void XMLFilterImpl::parse(const XMLString& systemId)
|
|||
}
|
||||
|
||||
|
||||
void XMLFilterImpl::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
setupParse();
|
||||
_pParent->parseMemoryNP(xml, size);
|
||||
}
|
||||
|
||||
|
||||
InputSource* XMLFilterImpl::resolveEntity(const XMLString* publicId, const XMLString& systemId)
|
||||
{
|
||||
if (_pEntityResolver)
|
||||
|
|
Загрузка…
Ссылка в новой задаче