summaryrefslogtreecommitdiff
path: root/src/modules/plugins/plugins.h
blob: 72e3087f4a58b6f4796774b4b8e0bdcfa57a30df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

// returns true if the API exports were good, otherwise, passed in data is returned
#define CHECKAPI_NONE 	 0
#define CHECKAPI_CLIST   1

// block these plugins
#define DEFMOD_REMOVED_UIPLUGINOPTS     21
#define DEFMOD_REMOVED_PROTOCOLNETLIB   22

// basic export prototypes
typedef int (__cdecl * Miranda_Plugin_Load) (void);
typedef int (__cdecl * Miranda_Plugin_Unload) (void);
// version control
typedef PLUGININFOEX * (__cdecl * Miranda_Plugin_InfoEx) (DWORD mirandaVersion);
// prototype for clists
typedef int (__cdecl * CList_Initialise) (void);

// can all be NULL
struct BASIC_PLUGIN_INFO
{
	HINSTANCE hInst;
	Miranda_Plugin_Load Load;
	Miranda_Plugin_Unload Unload;
	Miranda_Plugin_InfoEx InfoEx;
	CList_Initialise clistlink;
	PLUGININFOEX * pluginInfo;	 // must be freed if hInst = = NULL then its a copy
	MUUID *Interfaces;          // array of supported interfaces
};

#define PCLASS_FAILED     0x1   // not a valid plugin, or API is invalid, pluginname is valid
#define PCLASS_BASICAPI   0x2   // has Load, Unload, MirandaPluginInfo() -> PLUGININFO seems valid, this dll is in memory.
#define PCLASS_DB         0x4   // has DatabasePluginInfo() and is valid as can be, and PCLASS_BASICAPI has to be set too
#define PCLASS_LAST       0x8   // this plugin should be unloaded after everything else
#define PCLASS_OK        0x10   // plugin should be loaded, if DB means nothing
#define PCLASS_LOADED    0x20   // Load(void) has been called, Unload() should be called.
#define PCLASS_STOPPED   0x40   // wasn't loaded cos plugin name not on white list
#define PCLASS_CLIST     0x80   // a CList implementation
#define PCLASS_SERVICE  0x100   // has Service Mode implementation
#define PCLASS_CORE     0x200   // a plugin from the /Core directory

struct pluginEntry
{
	TCHAR pluginname[64];
	unsigned int pclass; // PCLASS_*
	int hLangpack;
	BASIC_PLUGIN_INFO bpi;
};

extern LIST<pluginEntry> pluginList, servicePlugins, clistPlugins;
extern MUUID miid_last;

int PluginOptionsInit(WPARAM, LPARAM);
void LoadPluginOptions();
void UnloadPluginOptions();

int isPluginOnWhiteList(const TCHAR* pluginname);
void SetPluginOnWhiteList(const TCHAR* pluginname, int allow);

int getDefaultPluginIdx(const MUUID& muuid);
bool hasMuuid(const BASIC_PLUGIN_INFO&, const MUUID&);
bool hasMuuid(const MUUID* pFirst, const MUUID&);
int equalUUID(const MUUID& u1, const MUUID& u2);
int checkAPI(TCHAR* plugin, BASIC_PLUGIN_INFO* bpi, DWORD mirandaVersion, int checkTypeAPI);

pluginEntry* OpenPlugin(TCHAR *tszFileName, TCHAR *dir, TCHAR *path);

bool TryLoadPlugin(pluginEntry *p, bool bDynamic);
void Plugin_Uninit(pluginEntry* p);
int  Plugin_UnloadDyn(pluginEntry* p);

typedef BOOL (*SCAN_PLUGINS_CALLBACK) (WIN32_FIND_DATA * fd, TCHAR *path, WPARAM wParam, LPARAM lParam);
void enumPlugins(SCAN_PLUGINS_CALLBACK cb, WPARAM wParam, LPARAM lParam);

struct MuuidReplacement
{
	MUUID uuid;  // default interface plugin
	TCHAR* stdplugname;
	pluginEntry* pImpl; // replacement plugin
};

bool LoadCorePlugin( MuuidReplacement& );

MUUID* GetPluginInterfaces(const TCHAR* ptszFileName, bool& bIsPlugin);