summaryrefslogtreecommitdiff
path: root/meta2/common.h
blob: 59378c94451763f1b1fadd5ac9b3a9bc140f7cf8 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef _COMMON_INC
#define _COMMON_INC

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER				// Allow use of features specific to Windows XP or later.
#define WINVER 0x0501		// Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
#endif						

#ifndef _WIN32_WINDOWS		// Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE			// Allow use of features specific to IE 6.0 or later.
#define _WIN32_IE 0x0600	// Change this to the appropriate value to target other versions of IE.
#endif

#if defined( UNICODE ) && !defined( _UNICODE )
#define _UNICODE
#endif

#include <tchar.h>

#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers

#include <windows.h>
#include <commctrl.h>

#define MIRANDA_VER		0x0800

#include <newpluginapi.h>
#include <m_plugins.h>
#include <m_system.h>
#include <m_database.h>
#include <m_langpack.h>
#include <m_options.h>
#include <m_protomod.h>
#include <m_protosvc.h>
#include <m_clist.h>
#include <m_clc.h>
#include <m_clui.h>
#include <m_message.h>
#include <m_icolib.h>
#include <m_skin.h>
#include <m_utils.h>
#include <m_ignore.h>

#include <m_yapp.h>
#include <m_updater.h>

#ifndef PF4_IMSENDOFFLINE
#define PF4_IMSENDOFFLINE 0x00000100 // protocol is able to send offline messages (v.0.8.0+ 2007/10/3)
#endif

#include "m_metacontacts.h"
#include "collection.h"

////////////
// included for backward compatibility
#ifndef CMIF_UNICODE
#define CMIF_UNICODE        512      //will return TCHAR* instead of char*
#if defined( _UNICODE )
	#define CMIF_TCHAR       CMIF_UNICODE      //will return TCHAR* instead of char*
#else
	#define CMIF_TCHAR       0       //will return char*, as usual
#endif
#endif
////////////

#define MODULE						"meta2"

extern HINSTANCE hInst;
extern PLUGINLINK *pluginLink;
extern MM_INTERFACE mmi;
extern UTF8_INTERFACE utfi;
extern HANDLE metaMainThread;
extern DWORD next_meta_id;
extern int codepage;

#ifndef MIID_META2
#define MIID_META2	{ 0x4415A85D, 0xD6DA, 0x4551, { 0xB2, 0xB8, 0x9B, 0xDD, 0x82, 0xE2, 0x4B, 0x50 } }
#endif

#define MAX_SUBCONTACTS		20

#define META_ID		"MetaID"

inline bool MetaEnabled() {
	return DBGetContactSettingByte(0, MODULE, "Enabled", 1) == 1;
}

inline bool IsMetacontact(HANDLE hContact) {
	return DBGetContactSettingDword(hContact, MODULE, META_ID, (DWORD)-1) != (DWORD)-1;
}

inline bool IsSubcontact(HANDLE hContact) {
	return DBGetContactSettingByte(hContact, MODULE, "IsSubcontact", 0) == 1;
}

inline char *ContactProto(HANDLE hContact) {
	return (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
}

inline TCHAR *ContactName(HANDLE hContact) {
	return (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR);
}

inline WORD ContactStatus(HANDLE hContact, char *proto) {
	if(!proto) return ID_STATUS_OFFLINE;
	return DBGetContactSettingWord(hContact, proto, "Status", ID_STATUS_OFFLINE);
}

class ContactHandle {
public:
	ContactHandle(const HANDLE &hCon): hContact(hCon) {}
	virtual ~ContactHandle() {}

	HANDLE handle() const {return hContact;}
	//operator HANDLE () const {return hContact;}

	bool operator==(const ContactHandle &other) const;
	bool operator<(const ContactHandle &other) const;
	const ContactHandle &operator=(HANDLE h) {hContact = h;}
protected:
	HANDLE hContact;
};

class SubcontactList: public SortedDynamicArray<ContactHandle> {
public:
	
	void add(HANDLE h) {
		SortedDynamicArray<ContactHandle>::add(ContactHandle(h));
	}

	void remove(HANDLE h) {
		SortedDynamicArray<ContactHandle>::remove(ContactHandle(h));
	}
	
};


#endif