| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- //
- // TextEncoding.cpp
- //
- // $Id: //poco/1.4/Foundation/src/TextEncoding.cpp#1 $
- //
- // Library: Foundation
- // Package: Text
- // Module: TextEncoding
- //
- // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #include "Poco/TextEncoding.h"
- #include "Poco/Exception.h"
- #include "Poco/String.h"
- #include "Poco/ASCIIEncoding.h"
- #include "Poco/Latin1Encoding.h"
- #include "Poco/Latin2Encoding.h"
- #include "Poco/Latin9Encoding.h"
- #include "Poco/UTF32Encoding.h"
- #include "Poco/UTF16Encoding.h"
- #include "Poco/UTF8Encoding.h"
- #include "Poco/Windows1250Encoding.h"
- #include "Poco/Windows1251Encoding.h"
- #include "Poco/Windows1252Encoding.h"
- #include "Poco/RWLock.h"
- #include "Poco/SingletonHolder.h"
- #include <map>
- namespace Poco {
- //
- // TextEncodingManager
- //
- class TextEncodingManager
- {
- public:
- TextEncodingManager()
- {
- TextEncoding::Ptr pUtf8Encoding(new UTF8Encoding);
- add(pUtf8Encoding, TextEncoding::GLOBAL);
- add(new ASCIIEncoding);
- add(new Latin1Encoding);
- add(new Latin2Encoding);
- add(new Latin9Encoding);
- add(pUtf8Encoding);
- add(new UTF16Encoding);
- add(new UTF32Encoding);
- add(new Windows1250Encoding);
- add(new Windows1251Encoding);
- add(new Windows1252Encoding);
- }
- ~TextEncodingManager()
- {
- }
- void add(TextEncoding::Ptr pEncoding)
- {
- add(pEncoding, pEncoding->canonicalName());
- }
- void add(TextEncoding::Ptr pEncoding, const std::string& name)
- {
- RWLock::ScopedLock lock(_lock, true);
-
- _encodings[name] = pEncoding;
- }
- void remove(const std::string& name)
- {
- RWLock::ScopedLock lock(_lock, true);
-
- _encodings.erase(name);
- }
-
- TextEncoding::Ptr find(const std::string& name) const
- {
- RWLock::ScopedLock lock(_lock);
-
- EncodingMap::const_iterator it = _encodings.find(name);
- if (it != _encodings.end())
- return it->second;
-
- for (it = _encodings.begin(); it != _encodings.end(); ++it)
- {
- if (it->second->isA(name))
- return it->second;
- }
- return TextEncoding::Ptr();
- }
- private:
- TextEncodingManager(const TextEncodingManager&);
- TextEncodingManager& operator = (const TextEncodingManager&);
-
- typedef std::map<std::string, TextEncoding::Ptr, CILess> EncodingMap;
-
- EncodingMap _encodings;
- mutable RWLock _lock;
- };
- //
- // TextEncoding
- //
- const std::string TextEncoding::GLOBAL;
- TextEncoding::~TextEncoding()
- {
- }
- int TextEncoding::convert(const unsigned char* bytes) const
- {
- return static_cast<int>(*bytes);
- }
- int TextEncoding::convert(int ch, unsigned char* bytes, int length) const
- {
- return 0;
- }
- int TextEncoding::queryConvert(const unsigned char* bytes, int length) const
- {
- return (int) *bytes;
- }
- int TextEncoding::sequenceLength(const unsigned char* bytes, int length) const
- {
- return 1;
- }
- TextEncoding& TextEncoding::byName(const std::string& encodingName)
- {
- TextEncoding* pEncoding = manager().find(encodingName);
- if (pEncoding)
- return *pEncoding;
- else
- throw NotFoundException(encodingName);
- }
-
- TextEncoding::Ptr TextEncoding::find(const std::string& encodingName)
- {
- return manager().find(encodingName);
- }
- void TextEncoding::add(TextEncoding::Ptr pEncoding)
- {
- manager().add(pEncoding, pEncoding->canonicalName());
- }
- void TextEncoding::add(TextEncoding::Ptr pEncoding, const std::string& name)
- {
- manager().add(pEncoding, name);
- }
- void TextEncoding::remove(const std::string& encodingName)
- {
- manager().remove(encodingName);
- }
- TextEncoding::Ptr TextEncoding::global(TextEncoding::Ptr encoding)
- {
- TextEncoding::Ptr prev = find(GLOBAL);
- add(encoding, GLOBAL);
- return prev;
- }
- TextEncoding& TextEncoding::global()
- {
- return byName(GLOBAL);
- }
- namespace
- {
- static SingletonHolder<TextEncodingManager> sh;
- }
- TextEncodingManager& TextEncoding::manager()
- {
- return *sh.get();
- }
- } // namespace Poco
|