mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-07-08 09:57:10 +02:00
bin
module
vendor
CPR
ConcurrentQueue
Fmt
POCO
ApacheConnector
CppParser
CppUnit
Crypto
Data
Encodings
Foundation
cmake
include
Poco
Dynamic
ASCIIEncoding.h
AbstractCache.h
AbstractDelegate.h
AbstractEvent.h
AbstractObserver.h
AbstractPriorityDelegate.h
AbstractStrategy.h
AccessExpirationDecorator.h
AccessExpireCache.h
AccessExpireLRUCache.h
AccessExpireStrategy.h
ActiveDispatcher.h
ActiveMethod.h
ActiveResult.h
ActiveRunnable.h
ActiveStarter.h
Activity.h
Alignment.h
Any.h
ArchiveStrategy.h
Array.h
Ascii.h
AsyncChannel.h
AtomicCounter.h
AtomicFlag.h
AutoPtr.h
AutoReleasePool.h
Base32Decoder.h
Base32Encoder.h
Base64Decoder.h
Base64Encoder.h
BasicEvent.h
BinaryReader.h
BinaryWriter.h
Buffer.h
BufferAllocator.h
BufferedBidirectionalStreamBuf.h
BufferedStreamBuf.h
Bugcheck.h
ByteOrder.h
Channel.h
Checksum.h
ClassLibrary.h
ClassLoader.h
Clock.h
Condition.h
Config.h
Configurable.h
ConsoleChannel.h
CountingStream.h
DataURIStream.h
DataURIStreamFactory.h
DateTime.h
DateTimeFormat.h
DateTimeFormatter.h
DateTimeParser.h
Debugger.h
DefaultStrategy.h
DeflatingStream.h
Delegate.h
DigestEngine.h
DigestStream.h
DirectoryIterator.h
DirectoryIteratorStrategy.h
DirectoryIterator_UNIX.h
DirectoryIterator_WIN32U.h
DirectoryWatcher.h
DynamicAny.h
DynamicAnyHolder.h
DynamicFactory.h
DynamicStruct.h
Environment.h
Environment_UNIX.h
Environment_VX.h
Environment_WIN32U.h
Environment_WINCE.h
Error.h
ErrorHandler.h
Event.h
EventArgs.h
EventChannel.h
EventLogChannel.h
Event_POSIX.h
Event_VX.h
Event_WIN32.h
Exception.h
ExpirationDecorator.h
Expire.h
ExpireCache.h
ExpireLRUCache.h
ExpireStrategy.h
FIFOBuffer.h
FIFOBufferStream.h
FIFOEvent.h
FIFOStrategy.h
FPEnvironment.h
FPEnvironment_C99.h
FPEnvironment_DEC.h
FPEnvironment_DUMMY.h
FPEnvironment_QNX.h
FPEnvironment_SUN.h
FPEnvironment_WIN32.h
File.h
FileChannel.h
FileStream.h
FileStreamFactory.h
FileStream_POSIX.h
FileStream_WIN32.h
File_UNIX.h
File_VX.h
File_WIN32U.h
File_WINCE.h
Format.h
Formatter.h
FormattingChannel.h
Foundation.h
FunctionDelegate.h
FunctionPriorityDelegate.h
Glob.h
HMACEngine.h
Hash.h
HashFunction.h
HashMap.h
HashSet.h
HashStatistic.h
HashTable.h
HexBinaryDecoder.h
HexBinaryEncoder.h
InflatingStream.h
Instantiator.h
JSONString.h
KeyValueArgs.h
LRUCache.h
LRUStrategy.h
Latin1Encoding.h
Latin2Encoding.h
Latin9Encoding.h
LineEndingConverter.h
LinearHashTable.h
ListMap.h
LocalDateTime.h
LogFile.h
LogFile_STD.h
LogFile_WIN32U.h
LogStream.h
Logger.h
LoggingFactory.h
LoggingRegistry.h
MD4Engine.h
MD5Engine.h
Manifest.h
MemoryPool.h
MemoryStream.h
Message.h
MetaObject.h
MetaProgramming.h
Mutex.h
Mutex_POSIX.h
Mutex_VX.h
Mutex_WIN32.h
Mutex_WINCE.h
NObserver.h
NamedEvent.h
NamedEvent_Android.h
NamedEvent_UNIX.h
NamedEvent_WIN32U.h
NamedMutex.h
NamedMutex_Android.h
NamedMutex_UNIX.h
NamedMutex_WIN32U.h
NamedTuple.h
NestedDiagnosticContext.h
Notification.h
NotificationCenter.h
NotificationQueue.h
NotificationStrategy.h
NullChannel.h
NullStream.h
Nullable.h
NumberFormatter.h
NumberParser.h
NumericString.h
ObjectPool.h
Observer.h
Optional.h
OrderedMap.h
OrderedSet.h
PBKDF2Engine.h
Path.h
Path_UNIX.h
Path_WIN32U.h
Path_WINCE.h
PatternFormatter.h
Pipe.h
PipeImpl.h
PipeImpl_DUMMY.h
PipeImpl_POSIX.h
PipeImpl_WIN32.h
PipeStream.h
Platform.h
Platform_POSIX.h
Platform_VX.h
Platform_WIN32.h
Poco.h
PriorityDelegate.h
PriorityEvent.h
PriorityExpire.h
PriorityNotificationQueue.h
PriorityStrategy.h
Process.h
Process_UNIX.h
Process_VX.h
Process_WIN32U.h
Process_WINCE.h
PurgeStrategy.h
RWLock.h
RWLock_Android.h
RWLock_POSIX.h
RWLock_VX.h
RWLock_WIN32.h
RWLock_WINCE.h
Random.h
RandomStream.h
RecursiveDirectoryIterator.h
RecursiveDirectoryIteratorImpl.h
RefCountedObject.h
RegularExpression.h
RotateStrategy.h
Runnable.h
RunnableAdapter.h
SHA1Engine.h
SHA2Engine.h
ScopedLock.h
ScopedUnlock.h
Semaphore.h
Semaphore_POSIX.h
Semaphore_VX.h
Semaphore_WIN32.h
SharedLibrary.h
SharedLibrary_HPUX.h
SharedLibrary_UNIX.h
SharedLibrary_VX.h
SharedLibrary_WIN32U.h
SharedMemory.h
SharedMemory_DUMMY.h
SharedMemory_POSIX.h
SharedMemory_WIN32.h
SharedPtr.h
SignalHandler.h
SimpleFileChannel.h
SimpleHashTable.h
SingletonHolder.h
SortedDirectoryIterator.h
SplitterChannel.h
Stopwatch.h
StrategyCollection.h
StreamChannel.h
StreamConverter.h
StreamCopier.h
StreamTokenizer.h
StreamUtil.h
String.h
StringTokenizer.h
SynchronizedObject.h
SyslogChannel.h
Task.h
TaskManager.h
TaskNotification.h
TeeStream.h
TemporaryFile.h
TextBufferIterator.h
TextConverter.h
TextEncoding.h
TextIterator.h
Thread.h
ThreadLocal.h
ThreadPool.h
ThreadTarget.h
Thread_POSIX.h
Thread_VX.h
Thread_WIN32.h
Thread_WINCE.h
TimedNotificationQueue.h
Timer.h
Timespan.h
Timestamp.h
Timezone.h
Token.h
Tuple.h
TypeList.h
Types.h
URI.h
URIStreamFactory.h
URIStreamOpener.h
UTF16Encoding.h
UTF32Encoding.h
UTF8Encoding.h
UTF8String.h
UTFString.h
UUID.h
UUIDGenerator.h
UnWindows.h
UnbufferedStreamBuf.h
Unicode.h
UnicodeConverter.h
UniqueAccessExpireCache.h
UniqueAccessExpireLRUCache.h
UniqueAccessExpireStrategy.h
UniqueExpireCache.h
UniqueExpireLRUCache.h
UniqueExpireStrategy.h
ValidArgs.h
Version.h
Void.h
Windows1250Encoding.h
Windows1251Encoding.h
Windows1252Encoding.h
WindowsConsoleChannel.h
ordered_hash.h
ordered_map.h
ordered_set.h
zconf.h
zlib.h
samples
src
testsuite
wcelibcex-1.0
CMakeLists.txt
Foundation_vs140.sln
Foundation_vs140.vcxproj
Foundation_vs140.vcxproj.filters
Foundation_vs150.sln
Foundation_vs150.vcxproj
Foundation_vs150.vcxproj.filters
Foundation_vs160.sln
Foundation_vs160.vcxproj
Foundation_vs160.vcxproj.filters
Makefile
extradirs
JSON
JWT
MongoDB
Net
NetSSL_OpenSSL
NetSSL_Win
PDF
PageCompiler
PocoDoc
ProGen
Redis
SevenZip
Util
XML
Zip
appveyor
build
cmake
contrib
doc
packaging
patches
release
travis
CHANGELOG
CMakeLists.txt
CODE_OF_CONDUCT.md
CONTRIBUTING.md
CONTRIBUTORS
LICENSE
Makefile
NEWS
README
README.md
VERSION
appveyor.yml
build_cmake.cmd
build_cmake.sh
build_vs140.cmd
build_vs150.cmd
build_vs160.cmd
buildwin.cmd
buildwin.ps1
components
configure
cppignore.lnx
cppignore.win
env.bat
env.sh
libversion
SimpleIni
Squirrel
TinyDir
CMakeLists.txt
.gitignore
.gitmodules
CMakeLists.txt
LICENSE
README.md
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
366 lines
9.4 KiB
C++
366 lines
9.4 KiB
C++
//
|
|
// ClassLoader.h
|
|
//
|
|
// Library: Foundation
|
|
// Package: SharedLibrary
|
|
// Module: ClassLoader
|
|
//
|
|
// Definition of the ClassLoader class.
|
|
//
|
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#ifndef Foundation_ClassLoader_INCLUDED
|
|
#define Foundation_ClassLoader_INCLUDED
|
|
|
|
|
|
#include "Poco/Foundation.h"
|
|
#include "Poco/MetaObject.h"
|
|
#include "Poco/Manifest.h"
|
|
#include "Poco/SharedLibrary.h"
|
|
#include "Poco/Mutex.h"
|
|
#include "Poco/Exception.h"
|
|
#include <map>
|
|
|
|
|
|
namespace Poco {
|
|
|
|
|
|
template <class Base>
|
|
class ClassLoader
|
|
/// The ClassLoader loads C++ classes from shared libraries
|
|
/// at runtime. It must be instantiated with a root class
|
|
/// of the loadable classes.
|
|
/// For a class to be loadable from a library, the library
|
|
/// must provide a Manifest of all the classes it contains.
|
|
/// The Manifest for a shared library can be easily built
|
|
/// with the help of the macros in the header file
|
|
/// "Foundation/ClassLibrary.h".
|
|
///
|
|
/// Starting with POCO release 1.3, a class library can
|
|
/// export multiple manifests. In addition to the default
|
|
/// (unnamed) manifest, multiple named manifests can
|
|
/// be exported, each having a different base class.
|
|
///
|
|
/// There is one important restriction: one instance of
|
|
/// ClassLoader can only load one manifest from a class
|
|
/// library.
|
|
{
|
|
public:
|
|
typedef AbstractMetaObject<Base> Meta;
|
|
typedef Manifest<Base> Manif;
|
|
typedef void (*InitializeLibraryFunc)();
|
|
typedef void (*UninitializeLibraryFunc)();
|
|
typedef bool (*BuildManifestFunc)(ManifestBase*);
|
|
|
|
struct LibraryInfo
|
|
{
|
|
SharedLibrary* pLibrary;
|
|
const Manif* pManifest;
|
|
int refCount;
|
|
};
|
|
typedef std::map<std::string, LibraryInfo> LibraryMap;
|
|
|
|
class Iterator
|
|
/// The ClassLoader's very own iterator class.
|
|
{
|
|
public:
|
|
typedef std::pair<std::string, const Manif*> Pair;
|
|
|
|
Iterator(const typename LibraryMap::const_iterator& it)
|
|
{
|
|
_it = it;
|
|
}
|
|
Iterator(const Iterator& it)
|
|
{
|
|
_it = it._it;
|
|
}
|
|
~Iterator()
|
|
{
|
|
}
|
|
Iterator& operator = (const Iterator& it)
|
|
{
|
|
_it = it._it;
|
|
return *this;
|
|
}
|
|
inline bool operator == (const Iterator& it) const
|
|
{
|
|
return _it == it._it;
|
|
}
|
|
inline bool operator != (const Iterator& it) const
|
|
{
|
|
return _it != it._it;
|
|
}
|
|
Iterator& operator ++ () // prefix
|
|
{
|
|
++_it;
|
|
return *this;
|
|
}
|
|
Iterator operator ++ (int) // postfix
|
|
{
|
|
Iterator result(_it);
|
|
++_it;
|
|
return result;
|
|
}
|
|
inline const Pair* operator * () const
|
|
{
|
|
_pair.first = _it->first;
|
|
_pair.second = _it->second.pManifest;
|
|
return &_pair;
|
|
}
|
|
inline const Pair* operator -> () const
|
|
{
|
|
_pair.first = _it->first;
|
|
_pair.second = _it->second.pManifest;
|
|
return &_pair;
|
|
}
|
|
|
|
private:
|
|
typename LibraryMap::const_iterator _it;
|
|
mutable Pair _pair;
|
|
};
|
|
|
|
ClassLoader()
|
|
/// Creates the ClassLoader.
|
|
{
|
|
}
|
|
|
|
virtual ~ClassLoader()
|
|
/// Destroys the ClassLoader.
|
|
{
|
|
for (auto& p: _map)
|
|
{
|
|
delete p.second.pLibrary;
|
|
delete p.second.pManifest;
|
|
}
|
|
}
|
|
|
|
void loadLibrary(const std::string& path, const std::string& manifest)
|
|
/// Loads a library from the given path, using the given manifest.
|
|
/// Does nothing if the library is already loaded.
|
|
/// Throws a LibraryLoadException if the library
|
|
/// cannot be loaded or does not have a Manifest.
|
|
/// If the library exports a function named "pocoInitializeLibrary",
|
|
/// this function is executed.
|
|
/// If called multiple times for the same library,
|
|
/// the number of calls to unloadLibrary() must be the same
|
|
/// for the library to become unloaded.
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
typename LibraryMap::iterator it = _map.find(path);
|
|
if (it == _map.end())
|
|
{
|
|
LibraryInfo li;
|
|
li.pLibrary = 0;
|
|
li.pManifest = 0;
|
|
li.refCount = 1;
|
|
try
|
|
{
|
|
li.pLibrary = new SharedLibrary(path);
|
|
li.pManifest = new Manif();
|
|
std::string pocoBuildManifestSymbol("pocoBuildManifest");
|
|
pocoBuildManifestSymbol.append(manifest);
|
|
if (li.pLibrary->hasSymbol("pocoInitializeLibrary"))
|
|
{
|
|
InitializeLibraryFunc initializeLibrary = (InitializeLibraryFunc) li.pLibrary->getSymbol("pocoInitializeLibrary");
|
|
initializeLibrary();
|
|
}
|
|
if (li.pLibrary->hasSymbol(pocoBuildManifestSymbol))
|
|
{
|
|
BuildManifestFunc buildManifest = (BuildManifestFunc) li.pLibrary->getSymbol(pocoBuildManifestSymbol);
|
|
if (buildManifest(const_cast<Manif*>(li.pManifest)))
|
|
_map[path] = li;
|
|
else
|
|
throw LibraryLoadException(std::string("Manifest class mismatch in ") + path, manifest);
|
|
}
|
|
else throw LibraryLoadException(std::string("No manifest in ") + path, manifest);
|
|
}
|
|
catch (...)
|
|
{
|
|
delete li.pLibrary;
|
|
delete li.pManifest;
|
|
throw;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
++it->second.refCount;
|
|
}
|
|
}
|
|
|
|
void loadLibrary(const std::string& path)
|
|
/// Loads a library from the given path. Does nothing
|
|
/// if the library is already loaded.
|
|
/// Throws a LibraryLoadException if the library
|
|
/// cannot be loaded or does not have a Manifest.
|
|
/// If the library exports a function named "pocoInitializeLibrary",
|
|
/// this function is executed.
|
|
/// If called multiple times for the same library,
|
|
/// the number of calls to unloadLibrary() must be the same
|
|
/// for the library to become unloaded.
|
|
///
|
|
/// Equivalent to loadLibrary(path, "").
|
|
{
|
|
loadLibrary(path, "");
|
|
}
|
|
|
|
void unloadLibrary(const std::string& path)
|
|
/// Unloads the given library.
|
|
/// Be extremely cautious when unloading shared libraries.
|
|
/// If objects from the library are still referenced somewhere,
|
|
/// a total crash is very likely.
|
|
/// If the library exports a function named "pocoUninitializeLibrary",
|
|
/// this function is executed before it is unloaded.
|
|
/// If loadLibrary() has been called multiple times for the same
|
|
/// library, the number of calls to unloadLibrary() must be the same
|
|
/// for the library to become unloaded.
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
typename LibraryMap::iterator it = _map.find(path);
|
|
if (it != _map.end())
|
|
{
|
|
if (--it->second.refCount == 0)
|
|
{
|
|
if (it->second.pLibrary->hasSymbol("pocoUninitializeLibrary"))
|
|
{
|
|
UninitializeLibraryFunc uninitializeLibrary = (UninitializeLibraryFunc) it->second.pLibrary->getSymbol("pocoUninitializeLibrary");
|
|
uninitializeLibrary();
|
|
}
|
|
delete it->second.pManifest;
|
|
it->second.pLibrary->unload();
|
|
delete it->second.pLibrary;
|
|
_map.erase(it);
|
|
}
|
|
}
|
|
else throw NotFoundException(path);
|
|
}
|
|
|
|
const Meta* findClass(const std::string& className) const
|
|
/// Returns a pointer to the MetaObject for the given
|
|
/// class, or a null pointer if the class is not known.
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
for (const auto& p: _map)
|
|
{
|
|
const Manif* pManif = p.second.pManifest;
|
|
typename Manif::Iterator itm = pManif->find(className);
|
|
if (itm != pManif->end())
|
|
return *itm;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
const Meta& classFor(const std::string& className) const
|
|
/// Returns a reference to the MetaObject for the given
|
|
/// class. Throws a NotFoundException if the class
|
|
/// is not known.
|
|
{
|
|
const Meta* pMeta = findClass(className);
|
|
if (pMeta)
|
|
return *pMeta;
|
|
else
|
|
throw NotFoundException(className);
|
|
}
|
|
|
|
Base* create(const std::string& className) const
|
|
/// Creates an instance of the given class.
|
|
/// Throws a NotFoundException if the class
|
|
/// is not known.
|
|
{
|
|
return classFor(className).create();
|
|
}
|
|
|
|
Base& instance(const std::string& className) const
|
|
/// Returns a reference to the sole instance of
|
|
/// the given class. The class must be a singleton,
|
|
/// otherwise an InvalidAccessException will be thrown.
|
|
/// Throws a NotFoundException if the class
|
|
/// is not known.
|
|
{
|
|
return classFor(className).instance();
|
|
}
|
|
|
|
bool canCreate(const std::string& className) const
|
|
/// Returns true if create() can create new instances
|
|
/// of the class.
|
|
{
|
|
return classFor(className).canCreate();
|
|
}
|
|
|
|
void destroy(const std::string& className, Base* pObject) const
|
|
/// Destroys the object pObject points to.
|
|
/// Does nothing if object is not found.
|
|
{
|
|
classFor(className).destroy(pObject);
|
|
}
|
|
|
|
bool isAutoDelete(const std::string& className, Base* pObject) const
|
|
/// Returns true if the object is automatically
|
|
/// deleted by its meta object.
|
|
{
|
|
return classFor(className).isAutoDelete(pObject);
|
|
}
|
|
|
|
const Manif* findManifest(const std::string& path) const
|
|
/// Returns a pointer to the Manifest for the given
|
|
/// library, or a null pointer if the library has not been loaded.
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
typename LibraryMap::const_iterator it = _map.find(path);
|
|
if (it != _map.end())
|
|
return it->second.pManifest;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
const Manif& manifestFor(const std::string& path) const
|
|
/// Returns a reference to the Manifest for the given library
|
|
/// Throws a NotFoundException if the library has not been loaded.
|
|
{
|
|
const Manif* pManif = findManifest(path);
|
|
if (pManif)
|
|
return *pManif;
|
|
else
|
|
throw NotFoundException(path);
|
|
}
|
|
|
|
bool isLibraryLoaded(const std::string& path) const
|
|
/// Returns true if the library with the given name
|
|
/// has already been loaded.
|
|
{
|
|
return findManifest(path) != 0;
|
|
}
|
|
|
|
Iterator begin() const
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
return Iterator(_map.begin());
|
|
}
|
|
|
|
Iterator end() const
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
return Iterator(_map.end());
|
|
}
|
|
|
|
private:
|
|
LibraryMap _map;
|
|
mutable FastMutex _mutex;
|
|
};
|
|
|
|
|
|
} // namespace Poco
|
|
|
|
|
|
#endif // Foundation_ClassLoader_INCLUDED
|