This repository has been archived by the owner on Oct 6, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplug_export.h
303 lines (255 loc) · 10.6 KB
/
plug_export.h
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/*
nazwa="Plug Export"
info="Nagłówek wymagany w każdej wtyczce (załącza plug.h)."
*/
/**
\file
Nagłówek eksportujący deklaracje funkcji wymagane przez rdzeń do poprawnej komunikacji.
Od razu importuje plug_shared.h.
Dodatkowo kilka funkcji / makr dla Waszej wygody :)
*/
#ifndef PLUGEXPORTH
#define PLUGEXPORTH
#include "plug.h"
#pragma pack(push, 1)
extern cCtrl * Ctrl;
#ifndef KONNEKT_SDK_NOEXPORT
/**< Wskaznik do struktury #cCtrl.
Przy jej pomocy możliwy jest dostęp do funkcji rdzenia.
*/
/*
Funkcje eksportowane
*/
/**
Deklaracja jedynej eksportowanej z wtyczki funkcji.
*/
extern "C"
__declspec(dllexport) int __stdcall IMessageProc(sIMessage_base * msgBase);
#endif
/*
Wszystkie nastepne funkcje sa funkcjami TYLKO pomocniczymi ... Mozna je usunac , ale
najwygodniej jest z nich po prostu korzystac :)
*/
/**
\brief Jeżeli program działa w trybie Debug loguje treść wiadomości do pliku konnekt.log (i do okna).
\param format Format dokładnie taki sam jak przy funkcjach printf
\param parametry Parametry potrzebne do utworzenia wiadomości
Funkcja wysyła do rdzenia #IMessage #IMC_LOG (która nic nie robi, ale jej treść może zostać zalogowana
w trybie Debug).
\attention W trybie \i Debug dostępne jest okno debugowania (IMLOG) w którym pokazywana jest treść IMLOG!
*/
void IMLOG(const char *format, ...);
/** Wysyła IMLOG z komunikatem ostatniego błędu systemu Windows (GetLastError())
*/
void IMERROR();
/** Wysyła wiadomość . Wywołuje bezpośrednio cCtrl::IMessage .
\param id Identyfikator wiadomości
\param net Docelowa sieć wtyczek
\param type Docelowy typ wtyczek
\param p1,p2 Parametry
\sa gr_im net_ imt_
*/
inline int IMessage(unsigned int id , signed int net=0 , unsigned int type=-1 , int p1=0 , int p2=0);
/** Wysyła wiadomość . Wywołuje bezpośrednio cCtrl::IMessage .
*/
inline int IMessage(sIMessage_base * msg);
/** Wysyła wiadomość bezpośrednio do rdzenia/ui (net = 0 , type = 0) .
\param id Identyfikator wiadomości
\param p1,p2 Parametry
\sa im_
*/
inline int ICMessage(unsigned int id , int p1=0 , int p2=0);
/** Wysyła wiadomość bezpośrednio do wtyczki.
\param id Identyfikator wiadomości
\param plug ID wtyczki
\param p1,p2 Parametry
\sa im_ imc_plug_
*/
inline int IMessageDirect(unsigned int id , unsigned int plug=0, int p1=0 , int p2=0);
/** Wysyła wiadomość bezpośrednio do wtyczki.*/
inline int IMessageDirect(unsigned int plug , sIMessage_base * msg);
void WMProcess(void);
// ****************** THREAD SAFE
/// \defgroup ThreadSafe Makra do przełączania wątków.
/// \{
/** Przełączanie wiadomości do prawidłowych wątków.
Jeżeli wiadomość zawiera kod , który \b MUSI być wykonany
w głównym wątku (np. tworzenie okien) można na początku
kodu akcji wstawić #THREADSAFE. <br>
Sposób działania (wątek "prawidłowy" to wątek w którym powinna działać wiadomość) :
- Makro sprawdza ID aktualnego wątku
- Jeżeli jest równe ID \i prawidłowego wątku wykonuje dalej...
- Jeżeli jest różne , kolejkuje procedurę APC w \i prawidłowym
wątku i oczekuje na zwrócenie wartości.
<br><br>
Przykład:
\code
int __stdcall IMessageProc(sIMessage_base * msg) {
switch (msg->id) {
case IM_NIEZABEZPIECZANA:
return 1;
case IM_ZABEZPIECZANA:
IMESSAGE_TS();
// Potencjalnie niebezpieczne operacje...
return 1;
}
if (Ctrl) Ctrl->setError(IMERROR_NORESULT);
// Jeżeli wiadomość nie zwraca konkretnego wyniku
// MUSI to zaznaczyć!
return 0;
}
\endcode
\attention Użycie makra jest dozwolone tylko jeżeli nie został
jeszcze wykonany \b żaden fragment kodu należący do wiadomości. (powinien
być wstawiony \b od \b razu po \b case IM_...: .
\attention "Przełączanie" odbywa się poprzez procedury APC (patrz: MSDN)
Aby nie powiesić całego programu wszystkie zdarzenia oczekujące
(Sleep , Wait itp.) muszą być wykonywane w trybie Alertable
(SleepEx , Wait...Ex itp.) , tak żeby procedura APC mogła być wykonana ...
\attention Jeżeli zdaje ci się że wieszasz kolejki APC głównego wątku
włącz Test w oknie @Dev...
*/
#define IMESSAGE_TS() \
if (Ctrl->Is_TUS(0)) return Ctrl->RecallTS()
/**
To samo co #IMESSAGE_TS tyle, że bez oczekiwania na wynik.
\warning Opcja potencjalnie niebezpieczna. Może być używana tylko przy prostych
wiadomościach, najlepiej nie przechowujących w swoich parametrach \b żadnych
wskaźników (w momencie gdy wiadomość zostanie przetworzona, wskaźniki mogą już
prowadzić do zwolnionych obszarów pamięci).
*/
#define IMESSAGE_TS_NOWAIT(ret) \
if (Ctrl->Is_TUS(0)) {Ctrl->RecallTS(0,0);return ret;}
/// \}
/**@defgroup gr_cfg Korzystanie z tablic ustawień.
@{*/
const char * SAFECHAR(const char * ch); ///< Sprawdza czy \a ch nie jest == 0. Jeśli jest - zwraca pusty ciąg znaków.
/// \param ch (char *)
/**Zwraca wartość tekstową z tablicy kontaktów.
\param row (int) ID kontaktu
\param id (int) ID kolumny
\param buff Bufor do którego ma zostać zapisana wartość.
\param size Rozmiar bufora.
\return (const char *)
Jeżeli jako \a buff i \a size podamy 0, otrzymamy wskaźnik do kopii wartości
przechowywanej w buforze tymczasowym (cCtrl::GetTempBuff). Jeżeli wcześniej
zablokujemy tablicę, otrzymamy najprawdopodobniej wskaźnik bezpośredni.
Jeżeli \a buff będzie równy 0, a \a size -1, otrzymamy kopię wartości
w świeżo zaalokowanej strukturze, którą należy zwolnić przez cCtrl::free.
\sa #GETCNTCA
*/
const char * GETCNTC(int row , int id , char * buff = 0 , unsigned int size = 0);
/**Zwraca wartość tekstową (w nowym buforze) z tablicy kontaktów.
\param row (int) ID kontaktu
\param id (int) ID kolumny
\return (const char *)
\attention Zwrócony bufor trzeba zwolnić przy pomocy cCtrl::free !
*/
#define GETCNTCA(row , id) GETCNTC(row , id , 0 , -1)
/**Zwraca wartość liczbową (4 bajty) z tablicy kontaktów.
\param row (int) ID kontaktu
\param id (int) ID kolumny
\return (int)*/
int GETCNTI(int row , int id);
__int64 GETCNTI64(int row , int id);
/**Ustawia wartość tekstową w tablicy kontaktów.
\param row (int) ID kontaktu
\param id (int) ID kolumny
\param val (char*) wartość do ustawienia
*/
bool SETCNTC(int row , int id , const char * val);
/**Ustawia wartość liczbową (4 bajty) w tablicy kontaktów.
\param row (int) ID kontaktu
\param id (int) ID kolumny
\param val (int) wartość do ustawienia
\param mask (int) maska ustawianych bitów
*/
bool SETCNTI(int row , int id , int val, int mask=-1);
bool SETCNTI64(int row , int id , __int64 val, __int64 mask=-1);
/**Ustawia wartość liczbową (4 bajty) z użyciem maski w tablicy kontaktów.
\param row (int) ID kontaktu
\param id (int) ID kolumny
\param val (char*) wartość do ustawienia
\param mask (int) Maska, wskazująca które bity mają być zmodyfikowane.
*/
/**Sprawdza czy \a row jest identyfikatorem, czy numerem wiersza.
\param row (int) wartość do sprawdzenia
\return (bool) true/false
*/
#define ISCNTID(row) (((row)!=0xFFFFFFFF)&&((row)&DT_ROWID_MASK)) // Sprawdza czy row jest identyfikatorem
/**Zwraca identyfikator kontaktu.
\param row (int) Numer wiersza z kontaktem w tablicy (ale może być też identyfikator)
\return (int) identyfikator kontaktu.
*/
#define GETCNTID(row) (ISCNTID(row)?row:Ctrl->DTgetID(DTCNT , (row)))
/**Zwraca wiersz w tablicy z kontaktem.
\param row (int) Identyfikator kontaktu (ale może być też numer wiersza)
\return (int) Numer wiersza kontaktu.
*/
#define GETCNTPOS(row) (ISCNTID(row)?Ctrl->DTgetPos(DTCNT , (row)):row)
#ifndef _DTABLE_
#define DT_ISROWID(row) (((row)!=0xFFFFFFFF)&&((row)&DT_ROWID_MASK)) // Sprawdza czy row jest identyfikatorem
#define DT_MASKID(row) ((row)|DT_ROWID_MASK)
#define DT_UNMASKID(row) (row&(~DT_ROWID_MASK)) // Zdejumuje maske z identyfikatora
#endif
/**Zwraca wartość liczbową (4 bajty) z tablicy ustawień.
\param id (int) ID kolumny
\return (int)*/
int GETINT(int id);
/**Zwraca wartość tekstową z tablicy ustawień.
\param id (int) ID kolumny
\param buff Bufor do którego ma zostać zapisana wartość.
\param size Rozmiar bufora.
\return (const char *)
Jeżeli jako \a buff i \a size podamy 0, otrzymamy wskaźnik do kopii wartości
przechowywanej w buforze tymczasowym (cCtrl::GetTempBuff). Jeżeli wcześniej
zablokujemy tablicę, otrzymamy najprawdopodobniej wskaźnik bezpośredni.
Jeżeli \a buff będzie równy 0, a \a size -1, otrzymamy kopię wartości
w świeżo zaalokowanej strukturze, którą należy zwolnić przez cCtrl::free.
\sa #GETSTRA
*/
const char * GETSTR(int id , char * buff = 0 , unsigned int size = 0);
#define GETSTRA(id) GETSTR(id , 0 , -1)
/**Ustawia wartość liczbową (4 bajty) w tablicy ustawień.
\param id (int) ID kolumny
\param val (int) wartość
\param mask (int) maska ustawianych bitów
*/
bool SETINT(int id , int val , int mask = -1);
/**Ustawia wartość tekstową (char*) w tablicy ustawień.
\param id (int) ID kolumny
\param val (char*) wartość
*/
bool SETSTR(int id , const char * val);
#ifdef _STRING_
#define GETCNTS(row , id) (string(GETCNTC(row,id)))
#define GETSTRING(id) (string(GETSTR(id)))
#endif
/** @} */
// *******************************************
/** Ta funkcja powinna być użyta w #IM_INIT .
Parametrami są \a p1 i \a p2 przesłane razem z #IM_INIT
*/
int Plug_Init(int p1 , int p2);
/** Ta funkcja powinna być użyta w #IM_DEINIT .
Parametrami są \a p1 i \a p2 przesłane razem z #IM_DEINIT
*/
void Plug_Deinit(int p1 , int p2);
// ********************************************
#ifdef __BORLANDC__
#define VSNPRINTF vsnprintf
#else
#define VSNPRINTF _vsnprintf
#endif
#ifdef IMLOG_AUTOALLOC
char * __vsaprintf(const char *format, va_list ap);
#endif
/** @sa cCtrl::IMLOG() */
void IMLOG(const char *format, ...);
/** @sa cCtrl::IMDEBUG() */
void IMDEBUG(enDebugLevel level , const char *format, ...);
#ifdef _WINDOWS_
void IMERROR();
#endif
#pragma pack(pop)
#endif