/* * 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 Yahoo or MSN (Hotmail notify) * * (c) majvan 2002-2004 */ #ifndef __ACCOUNT_H #define __ACCOUNT_H #include #include #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 }; typedef struct CNotification { //#define YAMN_NOTIFICATIONVERSION is not implemented, use YAMN_ACCOUNTVERSION instead CNotification(): PopUpB(0), PopUpT(0), PopUpTime(0), App(NULL), AppParam(NULL), Sound(NULL), TrayIcon1(NULL), TrayIcon2(NULL) {} #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 //(1) - usable only in newmail notification DWORD Flags; COLORREF PopUpB; COLORREF PopUpT; DWORD PopUpTime; WCHAR *App; WCHAR *AppParam; //These parameters are not stored in standard YAMN book file and therefore must be set by plugin char *Sound; HICON TrayIcon1; HICON TrayIcon2; } YAMN_NOTIFICATION,*PYAMN_NOTIFICATION; typedef struct CServer { CServer(): Name(NULL),Login(NULL),Passwd(NULL) {} char *Name; DWORD Port; char *Login; // Password encryption definitions #define STARTCODEPSW 0x50 #define ADDCODEPSW 0x0 char *Passwd; } *PSERVER; // //================================== 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 // DWORD Abilities; //access only through AccountAccessSO PSERVER 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 N/A #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 Free for chat #define YAMN_ACC_ST7 0x00000080 //Check (countdown) when Invisible #define YAMN_ACC_ST8 0x00000100 //Check (countdown) when On the phone #define YAMN_ACC_ST9 0x00000200 //Check (countdown) when Out to lunch #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 HANDLE hContact; BOOL isCounting; struct CAccount *Next; } *HACCOUNT; // //================================== FUNCTIONS DEFINITIONS ======================================== // typedef void (WINAPI *YAMN_SETSTATUSFCN)(HACCOUNT,TCHAR *); typedef void (WINAPI *YAMN_GETSTATUSFCN)(HACCOUNT,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