[ AmberSkyNet VR ]

Я кладу кирпичную стену, аккуратно, не спеша.
А куда спешить? У меня всего два кирпича.
(народный фольклор)

Пора переходить к плагинам. Иначе новые классы будут прирастать к главному и впоследствии "отдирать" их в отдельные загрузочные модули будет труднее

Собственно сам загрузочный модуль (dll,so) будет обеспечивать только вызов одной-единственной функции GetPlugin - создание экземпляра класса-генератора. Класс-генератор (интерфейс к нему IAsnGenerator) будет "генерировать", т.е. создавать экземпляры классов по их типу. Его функция GetClass с параметром, определяющим тип класса, создаёт экземпляр класса и возвращает указатель на него или NULL, если генератор не может создавать экземпляры классов указанного типа.


struct IAsnGeneratorInfo
{
	std::string name,         //имя загрузочного модуля
                type,             //поддерживаемые типы генерации экземлпяров классов
                author,           //автор плагина
                description,      //описание плагина
                plugin_version,   //версия плагина
                required_version; //требуемая версия движка, не ниже   //TODO

};

struct  IAsnGenerator
{
public:
...
// возвращаем экземпляр класса, на входе - имя класса
// NULL на выходе, если генератор не смог содать класс типа Type
    virtual void *GetClass(const std::string& Type);
 // передаём указатель на Engine
    virtual void Initialize(IEngine *vEngine);
 // получаем информацию о плагине 
    IAsnGeneratorInfo GetInfo();
}

Для более удобной работы с классами-генераторами и плагинами сделаем отдельный класс CPluginFactory, который и будет заниматься загрузкой/выгрузкой модулей и созданием классов.
Он будет сканировать директорию с плагинами, загружать их, получать классы-генераторы и определять экземлпляры каких типов они могут создавать.


class CPluginFactory {
public:
...
// сканируем директорию с плагинами классов-генераторов и загружаем их
void ScanDirectory(std::string DirName, bool Recursive);

// загрузить модуль класса-генератора IAsnGenerator, true - ошибка при загрузке
bool LoadASNModule(const std::string& ModuleName);

// выгрузить модуль плагина 
//bool UnloadModule(const std::string& ModuleName);

// создать класс с типом Type на основе всех известных классов-генераторов
void *CreateType(const std::string& Type);
...
}

Изменения в исходниках

include/: Добавлен файл os_deps.h в котором собраны платформозависимые решения по работе с файловой системой - получение информации о файле, директории.

src/asnCommon/: Добавлен файл утилитарных функций выделения имени и расширения файла. Они понадобились для определения имеет ли найденный при сканировании папки файл расширение загружаемого модуля (.dll,.so) и для занесения указателя на модуль в список с именем модуля, отбрасывая его путь.

src/asnMain/: Добавлен класс загрузки плагинов. Main с его помощью и загружает теперь экземпляр СEngine из отдельной dll под видом IEngine.

src/asnEngine/: В движке появился первый загрузочный модуль! В него вынесен из asnMain класс CEngine, созданный на предыдущем шаге.

Исходники этого шага выложены в SVN. Скачать их можно набрав команду:

svn co https://svn.sourceforge.net/svnroot/ambernet/tags/AmberSkyNet-0.3 ambernet_0.3
Powered by: SourceForge.net Logo