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
|
/*
* This file defines all needed parameters for one account.
* Other plugin can use this (so YAMN does not check it and another plugin can inform YAMN about new mail e.g.),
* this can be usefull for plugins like MSN (Hotmail notify)
*
* (c) majvan 2002-2004
*/
#ifndef __ACCOUNT_H
#define __ACCOUNT_H
#include <windows.h>
#include <tchar.h>
#include "m_synchro.h" //include synchronizing objects. If you want to write protocol plugin, which works with YAMN accounts, it must use YAMN synchronizing objects
//
//================================== OTHER DEFINITIONS ========================================
//
enum
{
// Error codes returned from functions (services) working with account book files
EACC_SYSTEM = 1, //use GetLastError() to retrieve detailed information about error
EACC_ALLOC, //problem with memory allocation
EACC_FILECOMPATIBILITY, //file is corrupted
EACC_ENDOFFILE, //unexpected end of file occured
EACC_FILEVERSION, //file should be YAMN book format, but newer version that expected
EACC_FILESIZE, //file has wrong size
};
enum
{
// Status of account
// used in messages WM_YAMN_CHANGESTATUS
// used also in function GetStatus and SetStatus
ACC_IDLE = 0, //account is IDLE (no work is performed with account)
ACC_FINDING, //DNS lookup for account
ACC_CONNECTING, //connecting in progress
ACC_LOGGING, //logging in progress
ACC_WORKING, //working
ACC_DISCONNECTING, //disconnecting from server
};
#define YAMN_ACC_SND 0x00000001 // Plays sound (1)
#define YAMN_ACC_MSG 0x00000002 // Shows dialog
#define YAMN_ACC_ICO 0x00000004 // Shows system tray icon (1)
#define YAMN_ACC_ICOB 0x00000008 // not used now, enables tray icon flashing (1)
#define YAMN_ACC_APP 0x00000010 // Runs application (1)
#define YAMN_ACC_POP 0x00000020 // Shows popup
#define YAMN_ACC_POPC 0x00000040 // Use custom colors in popup
#define YAMN_ACC_MSGP 0x00000080 // Persistant messgage. This means, when an situation occurs (e.g. new mail) and message is displayed, it is not destroyed when YAMN_ACC_MSG is not set
#define YAMN_ACC_KBN 0x00000100 // Use Keyboard notify
#define YAMN_ACC_CONT 0x00000200 // Use Contact notify
#define YAMN_ACC_CONTNICK 0x00000400 // Use Contact Nick replacement
#define YAMN_ACC_CONTNOEVENT 0x00000800 // Suppress event for this contact
struct YAMN_NOTIFICATION
{
//(1) - usable only in newmail notification
DWORD Flags = 0;
COLORREF PopupB = 0;
COLORREF PopupT = 0;
DWORD PopupTime = 0;
WCHAR *App = nullptr;
WCHAR *AppParam = nullptr;
// These parameters are not stored in standard YAMN book file and therefore must be set by plugin
char *Sound = nullptr;
HICON TrayIcon1 = nullptr;
HICON TrayIcon2 = nullptr;
};
struct CServer
{
char *Name = nullptr;
DWORD Port = 0;
char *Login = nullptr;
// Password encryption definitions
#define STARTCODEPSW 0x50
#define ADDCODEPSW 0x0
char *Passwd = nullptr;
};
//
//================================== ACCOUNT DEFINITION ==================================
//
typedef struct CAccount
{
#define YAMN_ACCOUNTFILEVERSION 2 //version of standard file format (YAMN book file format)
#define YAMN_ACCOUNTVERSION 3
// If changes are made in this structure, version is changed.
// So then YAMN does not initialzie your structure, if version does not matches.
BOOL AbleToWork; // This is set to TRUE by default. When it is needed to stop working on this account, YAMN sets this to zero.
struct CYAMNProtoPlugin *Plugin; // free access, because this member should not be changed. The same as YAMN_PLUGIN structure
char *Name; // access only through AccountAccessSO
CServer *Server; //access only through AccountAccessSO
WORD Interval; //access only through AccountAccessSO
// YAMN account flags (set by user)
#define YAMN_ACC_ENA 0x00000001 //Enables account. If account is disabled, no countdown is performed
#define YAMN_ACC_POPN 0x00000002 //Shows one popup per one new mail or for N mails
#define YAMN_ACC_APOP 0x00000004 //Use APOP authentication
#define YAMN_ACC_SSL23 0x00000008 //Use SSLv2,3
#define YAMN_ACC_NOTLS 0x00000010 //Don't try StartTLS (STLS) even available
#define YAMN_ACC_BODY 0x00000020 //Always retrieve body of the message
DWORD Flags; //access only through AccountAccessSO
// YAMN account flags (set by plugin)
#define YAMN_ACC_BROWSE 0x00000001 //Can browse mails. On this account we can run mailbrowser window
#define YAMN_ACC_POPUP 0x00000002 //Popups of new mail belonging to this account can be showed
DWORD AbilityFlags;
// YAMN account status flags
#define YAMN_ACC_ST0 0x00000001 //Check (countdown) when Offline
#define YAMN_ACC_ST1 0x00000002 //Check (countdown) when Online
#define YAMN_ACC_ST2 0x00000004 //Check (countdown) when Away
#define YAMN_ACC_ST3 0x00000008 //Check (countdown) when Not available
#define YAMN_ACC_ST4 0x00000010 //Check (countdown) when Occupied
#define YAMN_ACC_ST5 0x00000020 //Check (countdown) when DND
#define YAMN_ACC_ST6 0x00000040 //Check (countdown) when Invisible
#define YAMN_ACC_STARTA 0x00010000 //Check on start anyway
#define YAMN_ACC_STARTS 0x00020000 //Check on start regarding to status setting
#define YAMN_ACC_FORCE 0x00040000 //Check when "check new mail" item pressed (it is called forced checking)
DWORD StatusFlags; //access only through AccountAccessSO
// Plugin flags. Use this DWORD if you want YAMN to store it to YAMN book file. You can set here any value
DWORD PluginFlags;
YAMN_NOTIFICATION NewMailN; //access only through AccountAccessSO
YAMN_NOTIFICATION NoNewMailN; //access only through AccountAccessSO
YAMN_NOTIFICATION BadConnectN; //access only through AccountAccessSO
SYSTEMTIME LastChecked; //last check, access only through AccountAccessSO
SYSTEMTIME LastSChecked; //last check (successfull), access only through AccountAccessSO
SYSTEMTIME LastSynchronised; //last synchronisation (successfull), access only through AccountAccessSO
SYSTEMTIME LastMail; //last check when new mail detected, access only through AccountAccessSO
TCHAR Status[255]; //access only through GetStatusFcn() and SetStatusFcn() functions
DWORD TimeLeft; //access only through AccountAccessSO
HANDLE Mails; //access only through MessagesAccessSO
// Account members are mostly the same, but there can be protocol (POP3,IMAP...) special features.
// To use them, only inherit this class and add your own features.
// First idea was to add pointer to void, where plugin can store its own values.
// But this solution is better in my opinion.
// This is event with counter. Event is signaled when no threads are using account (and will not be using)
// Very usefull for account delete operation
PSCOUNTER UsingThreads;
// We have to achieve, that only one thread can write to account and more threads can read.
// Writing to account means that we change account parameters
// Reading from account meands we read account parameters
// Use WaitToRead(), ReadDone(), WaitToWrite(), WriteDone() synchronization functions
// For plugins, this is a pointer to void. It does not matter for plugin what is this variable for,
// because plugin works only with synchronization routines. And why is this void * ? It is because
// plugin does not need to include headers for SWMRG structures...
PSWMRG AccountAccessSO;
// We have to achieve, that only one thread can write to account mails and more threads can read.
// While some thread writes mails, other thread can write to account. This can be small problem, but it never appears in YAMN.
// But you should think about this note if you want to add some features in the future
// Writing to messages means any changes to message queue or message data
// Reading from messages means reading message queue (browsing through all messages) or reading message data
// Use MsgsWaitToRead(),MsgsReadDone(),MsgsWaitToWrite(),MsgsWriteDone() synchronization functions
PSWMRG MessagesAccessSO;
//For clist contact notification
MCONTACT hContact;
BOOL isCounting;
CAccount *Next;
};
//
//================================== FUNCTIONS DEFINITIONS ========================================
//
typedef void (WINAPI *YAMN_SETSTATUSFCN)(CAccount*, TCHAR *);
typedef void (WINAPI *YAMN_GETSTATUSFCN)(CAccount*, TCHAR *);
//
//================================== QUICK FUNCTION CALL DEFINITIONS ========================================
//
//These are defininitions for YAMN exported functions. Your plugin can use them.
//pYAMNFcn is global variable, it is pointer to your structure containing YAMN functions.
//It is something similar like pluginLink variable in Miranda plugin. If you use
//this name of variable, you have already defined these functions and you can use them.
//It's similar to Miranda's CreateService function.
//How to use YAMN functions:
//Create a structure containing pointer to functions you want to use in your plugin
//This structure can look something like this:
//
// struct
// {
// YAMN_SETSTATUSFCN SetStatusFcn;
// YAMN_GETSTATUSFCN GetStatusFcn;
// } *pYAMNFcn;
//
//then you have to fill this structure with pointers...
//
// pYAMNFcn->SetStatusFcn=(YAMN_SETSTATUSFCN)CallService(MS_YAMN_GETFCNPTR,(WPARAM)YAMN_SETSTATUSID,0);
// pYAMNFcn->GetStatusFcn=(YAMN_GETSTATUSFCN)CallService(MS_YAMN_GETFCNPTR,(WPARAM)YAMN_GETSTATUSID,0);
//
//and in your plugin just simply use e.g.:
//
// SetAccountStatus(ActualAccount,ACC_CONNECTING); //this command set account status to "connecting to server"
//
#define YAMN_SETSTATUSID "YAMN/SetStatus"
#define YAMN_GETSTATUSID "YAMN/GetStatus"
#define SetAccountStatus(x,y) pYAMNFcn->SetStatusFcn(x,y)
#define GetAccountStatus(x,y) pYAMNFcn->GetStatusFcn(x,y)
#endif
|