318 lines
11 KiB
C++
318 lines
11 KiB
C++
/*************************************************************************/
|
|
/* File : CKPluginManager.h */
|
|
/* Author : Aymeric Bard */
|
|
/* */
|
|
/* Virtools SDK */
|
|
/* Copyright (c) Virtools 2000, All Rights Reserved. */
|
|
/*************************************************************************/
|
|
#ifndef CKPLUGINMANAGER_H
|
|
|
|
#define CKPLUGINMANAGER_H "$Id:$"
|
|
|
|
#define CKPLUGIN_BITMAP "Bitmap Readers"
|
|
#define CKPLUGIN_SOUND "Sound Readers"
|
|
#define CKPLUGIN_MODEL "Model Readers"
|
|
#define CKPLUGIN_MANAGER "Managers"
|
|
#define CKPLUGIN_BEHAVIOR "BuildingBlocks"
|
|
#define CKPLUGIN_RENDERENGINE "Render Engines"
|
|
#define CKPLUGIN_MOVIE "Movie Readers"
|
|
#define CKPLUGIN_EXTENSIONS "Extensions"
|
|
|
|
#ifdef CK_LIB
|
|
/*******************************************
|
|
+ There is only one function a rasterizer Dll is supposed
|
|
to export :"CKRasterizerGetInfo", it will be used by the render engine
|
|
to retrieve information about the plugin :
|
|
{secret}
|
|
******************************************/
|
|
struct CKRasterizerInfo;
|
|
|
|
typedef void (*CKRST_GETINFO)(CKRasterizerInfo*);
|
|
#endif
|
|
|
|
/********************************************************
|
|
Summary: Short description of a DLL that declared plugins
|
|
|
|
Remarks:
|
|
|
|
{html:<table width="90%" border="1" align="center" bordercolorlight="#FFFFFF" bordercolordark="#FFFFFF" bgcolor="#FFFFFF" bordercolor="#FFFFFF"><tr bgcolor="#E6E6E6" bordercolor="#000000"><td>}
|
|
|
|
struct CKPluginDll
|
|
{
|
|
XString m_DllFileName;
|
|
INSTANCE_HANDLE m_DllInstance;
|
|
int m_PluginInfoCount;
|
|
};
|
|
|
|
{html:</td></tr></table>}
|
|
|
|
See Also: CKPluginManager::GetPluginDllInfo
|
|
*************************************************************/
|
|
struct CKPluginDll
|
|
{
|
|
XString m_DllFileName; // DLL Path
|
|
INSTANCE_HANDLE m_DllInstance; // Instance of the Loaded Dll (as HINSTANCE on windows)
|
|
int m_PluginInfoCount; // Number of plugins declared by this DLL
|
|
|
|
|
|
CKPluginDll() {
|
|
m_DllFileName = "";
|
|
m_DllInstance=0;
|
|
}
|
|
|
|
//Summary: Returns a pointer to a function inside the plugin.
|
|
//Arguments:
|
|
// FunctionName: Name of the function which should be returned
|
|
//Return Value:
|
|
// A Pointer to the function or NULL if the function was not found in the DLL.
|
|
void* GetFunctionPtr(CKSTRING FunctionName) {
|
|
VxSharedLibrary shl;
|
|
shl.Attach(m_DllInstance);
|
|
return shl.GetFunctionPtr(FunctionName);
|
|
}
|
|
};
|
|
|
|
|
|
// Summary: Reader plugin creation function prototype
|
|
//
|
|
// See Also:Creating New Plugins
|
|
typedef CKDataReader *(*CKReaderGetReaderFunction)(int);
|
|
|
|
|
|
// Summary: Data Reader (Movie,Bitmap,Sound,Models...) specific options
|
|
//
|
|
struct CKPluginEntryReadersData
|
|
{
|
|
CKGUID m_SettingsParameterGuid; // Parameter type for options
|
|
int m_OptionCount; // Number of options for the reader
|
|
CK_DATAREADER_FLAGS m_ReaderFlags; // Reader Save/Load options
|
|
CKReaderGetReaderFunction m_GetReaderFct; // A pointer to the function that will create a reader.
|
|
|
|
|
|
CKPluginEntryReadersData() {
|
|
m_GetReaderFct = NULL;
|
|
m_OptionCount = 0;
|
|
m_ReaderFlags = (CK_DATAREADER_FLAGS)0;
|
|
m_SettingsParameterGuid = CKGUID(0,0);
|
|
}
|
|
};
|
|
|
|
// Summary: List of behavior GUID declared by a plugin
|
|
//
|
|
//See Also:CKPluginEntry
|
|
struct CKPluginEntryBehaviorsData
|
|
{
|
|
XArray<CKGUID> m_BehaviorsGUID;
|
|
};
|
|
|
|
/******************************************************
|
|
Summary: Plugin Description structure
|
|
|
|
Remarks:
|
|
+ This structure described a registred Virtools plugin :
|
|
|
|
{html:<table width="90%" border="1" align="center" bordercolorlight="#FFFFFF" bordercolordark="#FFFFFF" bgcolor="#FFFFFF" bordercolor="#FFFFFF"><tr bgcolor="#E6E6E6" bordercolor="#000000"><td>}
|
|
|
|
struct CKPluginEntry
|
|
{
|
|
int m_PluginDllIndex;
|
|
int m_PositionInDll;
|
|
CKPluginInfo m_PluginInfo;
|
|
(According to the type of plugin )
|
|
CKPluginEntryReadersData* m_ReadersInfo;
|
|
CKPluginEntryBehaviorsData* m_BehaviorsInfo;
|
|
CKBOOL m_Active;
|
|
int m_IndexInCategory;
|
|
CKBOOL m_NeededByFile;
|
|
}
|
|
|
|
{html:</td></tr></table>}
|
|
|
|
See Also:CKPluginManager::GetPluginInfo
|
|
********************************************************/
|
|
struct CKPluginEntry
|
|
{
|
|
int m_PluginDllIndex; // Index of the owner Dll in the list of Dlls
|
|
int m_PositionInDll; // Position of the PluginInfo inside the DLL (when thery are several plugins inside a same DLL)
|
|
CKPluginInfo m_PluginInfo; // Base Info on the plugin (Type, Name,Description)
|
|
|
|
//--- According to the type of plugin
|
|
|
|
CKPluginEntryReadersData* m_ReadersInfo; // Reader plugins specific info (optionnal settings + load/save capabilities)
|
|
CKPluginEntryBehaviorsData* m_BehaviorsInfo; // Behavior plugins specific info (list of declared behavior GUIDS)
|
|
|
|
CKBOOL m_Active; // For manager and Render engines TRUE if a manager was created, for other plugins this value is not used.
|
|
int m_IndexInCategory; // Index of this entry in its category
|
|
CKBOOL m_NeededByFile; // When saving a file TRUE if at least one object needs this plugin
|
|
|
|
|
|
CKPluginEntry& operator = (const CKPluginEntry& ent);
|
|
|
|
CKPluginEntry();
|
|
|
|
CKPluginEntry(const CKPluginEntry& ent);
|
|
|
|
~CKPluginEntry();
|
|
};
|
|
|
|
|
|
|
|
struct CKPluginCategory
|
|
{
|
|
XString m_Name;
|
|
XArray<CKPluginEntry*> m_Entries;
|
|
|
|
CKPluginCategory(){}
|
|
CKPluginCategory(const CKPluginCategory& s){
|
|
m_Name = s.m_Name;
|
|
m_Entries = s.m_Entries;
|
|
}
|
|
|
|
// Operator
|
|
CKPluginCategory& operator=(const CKPluginCategory& s){
|
|
if (&s != this){
|
|
m_Name = s.m_Name;
|
|
m_Entries = s.m_Entries;
|
|
}
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
|
|
// Summary: Plugin declaration count function prototype
|
|
//
|
|
// See Also:Creating New Plugins
|
|
typedef int (*CKPluginGetInfoCountFunction)();
|
|
|
|
// Summary: Plugin declaration function prototype
|
|
//
|
|
// See Also:Creating New Plugins
|
|
typedef CKPluginInfo* (*CKPluginGetInfoFunction)(int Index);
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
Summary: Plugins Manager
|
|
|
|
Remarks:
|
|
|
|
+ CKPluginManager does not derive from CKBaseManager and there is
|
|
only one instance of the plugin per process (even if there are several CKContext)
|
|
|
|
+ PluginManager init functions must be call before creating any CKContext to
|
|
find the available plugins (ParsePlugins or RegisterPlugin).
|
|
|
|
+ The plugin manager can be retrieve with the CKGetPluginManager function.
|
|
|
|
+ Plugins are sorted by their category, many methods asks to be given a
|
|
category which must be a valid CK_PLUGIN_TYPE identifier or -1 to use all categories.
|
|
|
|
+ Since a Dll can contain several plugins the plugin manager give acces to either
|
|
the list of plugin per category (GetPluginCount,GetPluginInfo) or to the list of Dll
|
|
that were loaded (GetPluginDllCount,GetPluginDllInfo). A plugin is identified by its
|
|
CKPluginEntry which contains its type and other informations along with the index of
|
|
the DLL that declared it.
|
|
|
|
See Also: CKPluginEntry,CKPluginDll,Creating New Plugins
|
|
**********************************************************************************/
|
|
class CKPluginManager {
|
|
public:
|
|
CKPluginManager();
|
|
virtual ~CKPluginManager();
|
|
|
|
//----- Parse a directory for plugins and returns the number of valid plugins enumerated
|
|
int ParsePlugins(CKSTRING Directory);
|
|
//------ Registers a specific plugin Dll
|
|
CKERROR RegisterPlugin(CKSTRING str);
|
|
|
|
CKPluginEntry* FindComponent(CKGUID Component,int catIdx=-1); // Search for behaviors,managers,readers,etc.. to see if they exists
|
|
|
|
|
|
//---- Category Functions
|
|
int AddCategory(CKSTRING cat); // Adds a category, category name must be unique
|
|
CKERROR RemoveCategory(int catIdx); // Removes a category, category name must be unique
|
|
int GetCategoryCount(); // Gets the number of categories
|
|
CKSTRING GetCategoryName(int catIdx); // Gets the category name at specified index
|
|
int GetCategoryIndex(CKSTRING cat); // Gets the category Index in List
|
|
CKERROR RenameCategory(int catIdx, CKSTRING newName); // Renames a category
|
|
|
|
//---- PluginDll Functions
|
|
int GetPluginDllCount(); // Gets the Plugin count
|
|
CKPluginDll* GetPluginDllInfo(int PluginDllIdx); // Gets the Plugin at index
|
|
CKPluginDll* GetPluginDllInfo(CKSTRING PluginName,int *idx = NULL); // Search for a Plugin by name
|
|
CKERROR UnLoadPluginDll(int PluginDllIdx);
|
|
CKERROR ReLoadPluginDll(int PluginDllIdx);
|
|
|
|
//---- Plugin Functions
|
|
int GetPluginCount(int catIdx); // Gets the Plugin count for a category
|
|
CKPluginEntry* GetPluginInfo(int catIdx, int PluginIdx); // Gets the Plugin at index PluginIdx for a category
|
|
|
|
//---- Bitmap,Sound,Model or Movie Reader Access
|
|
BOOL SetReaderOptionData(CKContext* context,void* memdata,CKParameterOut* Param,CKFileExtension ext,CKGUID* guid=NULL);
|
|
CKParameterOut* GetReaderOptionData(CKContext* context,void* memdata,CKFileExtension ext,CKGUID* guid=NULL);
|
|
|
|
CKBitmapReader* GetBitmapReader(CKFileExtension& ext,CKGUID *preferedGUID = NULL);
|
|
CKSoundReader* GetSoundReader(CKFileExtension& ext,CKGUID *preferedGUID = NULL);
|
|
CKModelReader* GetModelReader(CKFileExtension& ext,CKGUID *preferedGUID = NULL);
|
|
CKMovieReader* GetMovieReader(CKFileExtension& ext,CKGUID *preferedGUID = NULL);
|
|
|
|
//---- Model and Virtools Loading access {secret}
|
|
|
|
|
|
CKERROR Load(CKContext* context,CKSTRING FileName,CKObjectArray *liste,CK_LOAD_FLAGS LoadFlags,CKCharacter *carac=NULL,CKGUID* Readerguid=NULL); // {secret}
|
|
CKERROR Save(CKContext* context,CKSTRING FileName,CKObjectArray *liste,CKDWORD SaveFlags,CKGUID* Readerguid=NULL); // {secret}
|
|
|
|
//---- Init {secret}
|
|
void ReleaseAllPlugins();
|
|
void InitializePlugins(CKContext* context);
|
|
void DeInitializePlugins(CKContext* context);
|
|
void ComputeDependenciesList(CKFile* file);
|
|
void MarkComponentAsNeeded(CKGUID Component,int catIdx);
|
|
|
|
#ifdef CK_LIB
|
|
|
|
//-------------------------------------------------------------------
|
|
#ifdef DOCJETDUMMY // Docjet secret macro
|
|
#else
|
|
|
|
//---------------- for additionnal plugins to link statically
|
|
void RegisterPluginInfo(int PositionInDll,CKPluginInfo* info,CKDLL_OBJECTDECLARATIONFUNCTION InfoFct,CKReaderGetReaderFunction GetReaderFunc);
|
|
void RegisterNewStaticLibAsDll(char* Name,int PluginInfoCount);
|
|
void AddRenderEngineRasterizer(CKRST_GETINFO RasterizerInfoFunction) { m_StaticRasterizers.PushBack(RasterizerInfoFunction); }
|
|
const XArray<CKRST_GETINFO>& GetRegistredRasterizers() { return m_StaticRasterizers; }
|
|
#endif // Docjet secret macro
|
|
|
|
#endif
|
|
|
|
protected:
|
|
//--- Utils
|
|
void InitInstancePluginEntry(CKPluginEntry* entry,CKContext* context);
|
|
void ExitInstancePluginEntry(CKPluginEntry* entry,CKContext* context);
|
|
void InitializeBehaviors(VxSharedLibrary& lib,CKPluginEntry& entry);
|
|
void InitializeBehaviors(CKDLL_OBJECTDECLARATIONFUNCTION Fct,CKPluginEntry& entry);
|
|
void RemoveBehaviors(int PluginIndex);
|
|
|
|
#ifdef CK_LIB
|
|
|
|
XArray<CKRST_GETINFO> m_StaticRasterizers;
|
|
#endif
|
|
|
|
int AddPlugin(int catIdx, CKPluginEntry& Plugin); // Adds a Plugin to a category
|
|
CKERROR RemovePlugin(int catIdx, int PluginIdx); // Removes a Plugin in a category
|
|
|
|
CKPluginEntry* EXTFindEntry(CKFileExtension& ext,int Category=-1);
|
|
CKDataReader *EXTFindReader(CKFileExtension& ext,int Category=-1);
|
|
CKDataReader *GUIDFindReader(CKGUID& guid,int Category=-1);
|
|
|
|
|
|
XClassArray<CKPluginCategory> m_PluginCategories;
|
|
XClassArray<CKPluginDll> m_PluginDlls;
|
|
XClassArray<VxSharedLibrary*> m_RunTimeDlls;
|
|
|
|
void Clean();
|
|
void Init();
|
|
|
|
};
|
|
|
|
#endif
|
|
|