summaryrefslogtreecommitdiff
path: root/plugins/Sessions/Src
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Sessions/Src')
-rw-r--r--plugins/Sessions/Src/Main.cpp1089
-rw-r--r--plugins/Sessions/Src/Options.cpp572
-rw-r--r--plugins/Sessions/Src/Sessions.h92
-rw-r--r--plugins/Sessions/Src/Utils.cpp571
-rw-r--r--plugins/Sessions/Src/Utils.h45
5 files changed, 2369 insertions, 0 deletions
diff --git a/plugins/Sessions/Src/Main.cpp b/plugins/Sessions/Src/Main.cpp
new file mode 100644
index 0000000000..47ec1b98bb
--- /dev/null
+++ b/plugins/Sessions/Src/Main.cpp
@@ -0,0 +1,1089 @@
+/*
+Sessions Management plugin for Miranda IM
+
+Copyright (C) 2007-2008 Danil Mozhar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "sessions.h"
+
+HINSTANCE hinstance = NULL;
+
+WNDPROC mainProc;
+
+HANDLE hEventDbWindowEvent,hEventDbOkToExit, hEventDbOptionsInit, hEventDbPluginsLoaded,
+hEventDbPreShutdown,hServiceOpenManager,hServiceShowFavMenu,hServiceCloseCurrentSession,hServiceSaveUserSession,
+hServiceLoadLastSession,hmSaveCurrentSession,
+hmLoadLastSession,hmLoadSession,hmSessionsManager,hibSessionsLoad,hibSessionsSave,hibSessionsLoadLast,hibChecked,hibNotChecked ;
+
+HICON hiChecked,hiNotChecked,hiSessions,hiSessionsLoad ,hiSessionsSave,hiSessionsLoadLast;
+
+
+HANDLE hmTBButton[2],hiTBbutton[2],iTBbutton[2];
+
+BOOL g_hghostw;
+
+HWND hClistControl;
+
+unsigned int ses_limit;
+unsigned int g_ses_count;
+BOOL g_bExclHidden;
+BOOL g_bWarnOnHidden;
+BOOL g_bOtherWarnings;
+BOOL g_bCrashRecovery;
+BOOL g_bIncompletedSave;
+
+struct MM_INTERFACE mmi;
+HWND g_hDlg;
+HWND g_hSDlg;
+BOOL DONT = FALSE;
+BOOL StartUp,isLastTRUE = FALSE,g_mode,bSC = FALSE;
+
+DWORD session_list[255] = {0};
+DWORD user_session_list[255] = {0};
+DWORD session_list_recovered[255];
+
+int count = 0;
+unsigned int ses_count = 0;
+
+PLUGINLINK *pluginLink;
+int hLangpack;
+
+int OptionsInit(WPARAM,LPARAM);
+
+PLUGININFOEX pluginInfo = {
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
+ __DESCRIPTION,
+ __AUTHOR,
+ __AUTHOREMAIL,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ 0,
+#ifdef _UNICODE
+ // {60558872-2AAB-45aa-888D-097691C9B683}
+ { 0x60558872, 0x2aab, 0x45aa, { 0x88, 0x8d, 0x9, 0x76, 0x91, 0xc9, 0xb6, 0x83 } }
+#else
+ // {F929B07B-DC4D-43d6-A6F3-3AA51F9FF81A}
+ { 0xf929b07b, 0xdc4d, 0x43d6, { 0xa6, 0xf3, 0x3a, 0xa5, 0x1f, 0x9f, 0xf8, 0x1a } }
+#endif
+};
+
+
+INT_PTR CALLBACK ExitDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hdlg);
+ LoadPosition(hdlg, "ExitDlg");
+ ShowWindow(hdlg,SW_SHOW);
+ }break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wparam))
+ {
+ case IDOK:
+ {
+ SavePosition(hdlg, "ExitDlg");
+ SaveSessionDate();
+ SaveSessionHandles(0,0);
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastempty", 0);
+ DestroyWindow(hdlg);
+ }break;
+
+ case IDCANCEL:
+ {
+ SavePosition(hdlg, "ExitDlg");
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastempty", 1);
+ DestroyWindow(hdlg);
+ }break;
+ }
+
+ case WM_CLOSE:
+ DestroyWindow(hdlg);
+ break;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+INT_PTR CALLBACK SaveSessionDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ g_hSDlg = hdlg;
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ HWND hList;
+ hList = GetDlgItem(hdlg, IDC_LIST);
+ TranslateDialogDefault(hdlg);
+ LoadSessionToCombobox(hdlg, 1, 5, "UserSessionDsc", 0);
+
+ LoadPosition(hdlg, "SaveDlg");
+ ShowWindow(hdlg, SW_SHOW);
+ }break;
+
+ case WM_CLOSE:
+ DestroyWindow(hdlg);
+ g_hSDlg = 0;
+ break;
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR) lparam)->idFrom)
+ {
+ case IDC_CLIST:
+ switch (((LPNMHDR)lparam)->code)
+ {
+ case CLN_CHECKCHANGED:
+ {
+ bSC = TRUE;
+ memcpy(user_session_list, session_list, SIZEOF(user_session_list));
+ }break;
+
+ }
+ }break;
+ }break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wparam))
+ {
+ case IDC_SELCONTACTS:
+ {
+ HANDLE hItem;
+ RECT rWnd;
+ int i=0, x=0,y=0,dy=0,dx=0,dd=0;
+
+ GetWindowRect(hdlg, &rWnd);
+ x=rWnd.right-rWnd.left;
+ y=rWnd.bottom-rWnd.top;
+ if(IsDlgButtonChecked(hdlg,IDC_SELCONTACTS))
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_SANDCCHECK),FALSE);
+ dy=20;
+ dx=150;
+ dd=5;
+ hClistControl = CreateWindowEx(WS_EX_CLIENTEDGE,CLISTCONTROL_CLASS, _T(""),
+ WS_TABSTOP |WS_VISIBLE | WS_CHILD ,
+ x, y, dx, dy, hdlg, (HMENU)IDC_CLIST, hinstance, 0);
+
+ SetWindowLongPtr(hClistControl, GWL_STYLE,
+ GetWindowLongPtr(hClistControl, GWL_STYLE)|CLS_CHECKBOXES|CLS_HIDEEMPTYGROUPS|CLS_USEGROUPS|CLS_GREYALTERNATE|CLS_GROUPCHECKBOXES);
+ SendMessage(hClistControl, CLM_SETEXSTYLE, CLS_EX_DISABLEDRAGDROP|CLS_EX_TRACKSELECT, 0);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_SANDCCHECK),TRUE);
+ dy=-20;
+ dx=-150;
+ dd=5;
+ DestroyWindow(hClistControl);
+ }
+
+ SetWindowPos(hdlg, NULL, rWnd.left,rWnd.top, x+dx, y+(dx/3), SWP_NOZORDER | SWP_NOOWNERZORDER|SWP_NOMOVE);
+
+ SetWindowPos(hClistControl,0,x-dd,dd,dx-dd,y+(dx/12),SWP_NOZORDER/*|SWP_NOSIZE|SWP_SHOWWINDOW*/);
+ SendMessage(hClistControl,WM_TIMER,TIMERID_REBUILDAFTER,0);
+
+ for ( i = 0; session_list[i] > 0; i++)
+ {
+ hItem=(HANDLE)SendMessage(hClistControl,CLM_FINDCONTACT, (WPARAM)session_list[i], 0);
+ SendMessage(hClistControl, CLM_SETCHECKMARK, (WPARAM)hItem,1);
+ }
+
+ OffsetWindow(hdlg, GetDlgItem(hdlg,IDC_LIST), 0, dy);
+ OffsetWindow(hdlg, GetDlgItem(hdlg,IDC_STATIC), 0, dy);
+ OffsetWindow(hdlg, GetDlgItem(hdlg,IDC_SANDCCHECK), 0, dy);
+ OffsetWindow(hdlg, GetDlgItem(hdlg,IDOK), 0, dy);
+ OffsetWindow(hdlg, GetDlgItem(hdlg,IDCANCEL), 0, dy);
+
+ }break;
+
+ case IDOK:
+ {
+ DWORD session_list_temp[255]={0};
+ int lenght,i;
+ TCHAR szUserSessionName[MAX_PATH];
+ lenght = GetWindowTextLength(GetDlgItem(hdlg, IDC_LIST));
+ SavePosition(hdlg, "SaveDlg");
+ if (lenght>0)
+ {
+ GetWindowText(GetDlgItem(hdlg, IDC_LIST), szUserSessionName, SIZEOF(szUserSessionName));
+ szUserSessionName[lenght+1]='\0';
+ if(IsDlgButtonChecked(hdlg,IDC_SELCONTACTS)&&bSC)
+ {
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ for (i=0; hContact; hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ BYTE res =(BYTE)SendMessage(hClistControl, CLM_GETCHECKMARK, SendMessage(hClistControl, CLM_FINDCONTACT, (WPARAM)hContact, 0), 0);
+ if (res)
+ {
+ user_session_list[i]=(DWORD)hContact;
+ i++;
+ }
+ }
+ memcpy(session_list_temp,session_list,SIZEOF(session_list_temp));
+ memcpy(session_list,user_session_list,SIZEOF(session_list));
+ SaveSessionHandles(0,1);
+ SaveUserSessionName(szUserSessionName);
+ memcpy(session_list,session_list_temp,SIZEOF(session_list));
+ DestroyWindow(hdlg);
+ g_hSDlg=0;
+ }
+ else if(!SaveUserSessionName(szUserSessionName))
+ {
+ SaveSessionHandles(0,1);
+
+ if(IsDlgButtonChecked(hdlg,IDC_SANDCCHECK))
+ CloseCurrentSession(0,0);
+ DestroyWindow(hdlg);
+ g_hSDlg=0;
+ }
+ else
+ MessageBox(NULL,TranslateT("Current session is empty!"),TranslateT("Sessions Manager"),MB_OK|MB_ICONWARNING);
+ }
+ else
+ MessageBox(NULL,TranslateT("Session name is empty, enter the name and try again"),TranslateT("Sessions Manager"),MB_OK|MB_ICONWARNING);
+ }break;
+
+ case IDCANCEL:
+ {
+ SavePosition(hdlg, "SaveDlg");
+ DestroyWindow(hdlg);
+ g_hSDlg=0;
+ }break;
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+INT_PTR CALLBACK LoadSessionDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ g_hDlg=hdlg;
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ int iDelay=DBGetContactSettingWord(NULL, __INTERNAL_NAME, "StartupModeDelay", 1500);
+ if(g_hghostw==TRUE)
+ SetTimer(hdlg, TIMERID_LOAD, iDelay, NULL);
+ else
+ {
+ ses_count=0;
+ TranslateDialogDefault(hdlg);
+ if((ses_count=LoadSessionToCombobox(hdlg,0,ses_limit,"SessionDate",0))==ses_limit)
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE);
+
+ if(LoadSessionToCombobox(hdlg,0,255,"UserSessionDsc",ses_limit)==0 && ses_count!=0)
+ ses_count=0;
+
+ if(session_list_recovered[0])
+ ses_count=256;
+
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, (WPARAM)0, 0);
+ LoadPosition(hdlg, "LoadDlg");
+ if(StartUp)
+ SetTimer(hdlg, TIMERID_SHOW, iDelay, NULL);
+ else
+ ShowWindow(g_hDlg,SW_SHOW);
+ }
+ }break;
+
+ case WM_TIMER:
+ if(wparam == TIMERID_SHOW)
+ {
+ KillTimer(hdlg, TIMERID_SHOW);
+ ShowWindow(hdlg,SW_SHOW);
+ StartUp=FALSE;
+ }
+ else
+ {
+ KillTimer(hdlg, TIMERID_LOAD);
+ LoadSession(0,0);
+ g_hghostw=StartUp=FALSE;
+ DestroyWindow(hdlg);
+ g_hDlg=0;
+ }
+ break;
+
+ case WM_CLOSE:
+ SavePosition(hdlg, "LoadDlg");
+ DestroyWindow(hdlg);
+ g_hDlg=0;
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wparam))
+ {
+ case IDC_LIST:
+ {
+ switch(HIWORD(wparam))
+ {
+ case CBN_SELCHANGE:
+ {
+ HWND hCombo = GetDlgItem(hdlg, IDC_LIST);
+ int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if(index != CB_ERR)
+ ses_count = SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)index, 0);
+ }break;
+ }break;
+ }break;
+
+ case IDC_SESSDEL:
+ {
+ if(session_list_recovered[0]&&ses_count==256)
+ {
+ int i=0;
+ while(session_list_recovered[i])
+ {
+ DBWriteContactSettingByte((HANDLE)session_list_recovered[i], __INTERNAL_NAME, "wasInLastSession", 0);
+ i++;
+ }
+ ZeroMemory(session_list_recovered,SIZEOF(session_list_recovered));
+ g_bIncompletedSave=0;
+
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0);
+
+ if((ses_count=LoadSessionToCombobox(hdlg,1,ses_limit,"SessionDate",0))==ses_limit)
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE);
+
+ if(LoadSessionToCombobox(hdlg,1,255,"UserSessionDsc",ses_limit)==0 && ses_count!=0)
+ ses_count=0;
+
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, (WPARAM)0, 0);
+
+ }
+ else if (ses_count>=ses_limit)
+ {
+ ses_count-=ses_limit;
+ DelUserDefSession(ses_count);
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0);
+
+ if((ses_count=LoadSessionToCombobox(hdlg,0,ses_limit,"SessionDate",0))==ses_limit)
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE);
+
+ if(LoadSessionToCombobox(hdlg,0,255,"UserSessionDsc",ses_limit)==0 && ses_count!=0)
+ ses_count=0;
+
+ if(session_list_recovered[0]) ses_count=256;
+
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, (WPARAM)0, 0);
+ }
+ else
+ {
+ DeleteAutoSession(ses_count);
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0);
+ if((ses_count=LoadSessionToCombobox(hdlg,0,ses_limit,"SessionDate",0))==ses_limit)
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE);
+
+ if(LoadSessionToCombobox(hdlg,0,255,"UserSessionDsc",ses_limit)==0 && ses_count!=0)
+ ses_count=0;
+
+ if(session_list_recovered[0]) ses_count=256;
+
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, (WPARAM)0, 0);
+ }
+ if (SendDlgItemMessage(hdlg, IDC_LIST, CB_GETCOUNT, 0, 0))
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE);
+ else
+ EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE);
+ }break;
+
+ case IDOK:
+ {
+ if(!LoadSession(0,ses_count))
+ {
+ SavePosition(hdlg, "LoadDlg");
+ DestroyWindow(hdlg);
+ g_hDlg=0;
+ }
+ }break;
+
+ case IDCANCEL:
+ {
+ SavePosition(hdlg, "LoadDlg");
+ DestroyWindow(hdlg);
+ g_hDlg=0;
+ }break;
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+INT_PTR CloseCurrentSession(WPARAM wparam,LPARAM lparam)
+{
+ HWND hWnd;
+ int i=0;
+ MessageWindowInputData mwid;
+ MessageWindowData mwd;
+
+ while(session_list[0]!=0)
+ {
+ mwid.cbSize = sizeof(MessageWindowInputData);
+ mwid.hContact=(HANDLE)session_list[i];
+ mwid.uFlags=MSG_WINDOW_UFLAG_MSG_BOTH;
+
+ mwd.cbSize = sizeof(MessageWindowData);
+ mwd.hContact = mwid.hContact;
+ mwd.uFlags=MSG_WINDOW_UFLAG_MSG_BOTH;
+ CallService(MS_MSG_GETWINDOWDATA, (WPARAM)&mwid,(LPARAM)&mwd);
+
+ if (g_mode)
+ {
+ hWnd=GetAncestor(mwd.hwndWindow,GA_ROOT);
+ SendMessage(hWnd,WM_CLOSE,0,1);
+ }
+ else
+ SendMessage(mwd.hwndWindow, WM_CLOSE, 0, 0);
+ }
+ ZeroMemory(session_list,SIZEOF(session_list));
+ return 0;
+}
+
+int SaveSessionHandles(WPARAM wparam,LPARAM lparam)
+{
+ int k=0;
+
+ if(session_list[0]!=0)
+ {
+ for (HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact;
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ if ((k=CheckForDuplicate(session_list,(DWORD)hContact))!=-1
+ &&!(g_bExclHidden&&!CheckContactVisibility(hContact)))
+ {
+ AddSessionMark((HANDLE)hContact,lparam,'1');
+ AddInSessionOrder((HANDLE)hContact,lparam,k,1);
+ }
+ else
+ {
+ AddSessionMark((HANDLE)hContact,lparam,'0');
+ AddInSessionOrder((HANDLE)hContact,lparam,0,0);
+ }
+ }
+ if(lparam==1)
+ {
+ g_ses_count++;
+ DBWriteContactSettingByte(0, __INTERNAL_NAME, "UserSessionsCount", (BYTE)g_ses_count);
+ }
+ return 0;
+ }
+ else
+ return 1;
+}
+
+INT_PTR SaveUserSessionHandles(WPARAM wparam,LPARAM lparam)
+{
+ if (g_hSDlg)
+ {
+ ShowWindow(g_hSDlg,SW_SHOW);
+ return 1;
+ }
+ else
+ g_hSDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_SAVEDIALOG), 0, SaveSessionDlgProc);
+
+ return 0;
+}
+
+INT_PTR OpenSessionsManagerWindow(WPARAM wparam,LPARAM lparam)
+{
+ if (g_hDlg)
+ {
+ ShowWindow(g_hDlg,SW_SHOW);
+ return 0;
+ }
+ if(g_bIncompletedSave||DBGetStringT(NULL, __INTERNAL_NAME, "SessionDate_0")||DBGetStringT(NULL, __INTERNAL_NAME, "UserSessionDsc_0"))
+ {
+ g_hDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_WLCMDIALOG), 0, LoadSessionDlgProc);
+ return 0;
+ }
+ if (g_bOtherWarnings)
+ MessageBox(NULL, TranslateT("No sessions to open"), TranslateT("Sessions Manager"), MB_OK|MB_ICONWARNING);
+ return 1;
+}
+
+int SaveSessionDate()
+{
+ if(session_list[0]!=0)
+ {
+ int TimeSize = GetTimeFormat(LOCALE_USER_DEFAULT, 0/*TIME_NOSECONDS*/, NULL, NULL, NULL, 0);
+ TCHAR *szTimeBuf = (TCHAR*)mir_alloc((TimeSize+1)*sizeof(TCHAR));
+
+ GetTimeFormat(LOCALE_USER_DEFAULT, 0/*TIME_NOSECONDS*/, NULL, NULL, szTimeBuf, TimeSize);
+
+ int DateSize = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, NULL, 0);
+ TCHAR *szDateBuf = (TCHAR*)mir_alloc((DateSize+1)*sizeof(TCHAR));
+
+ GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, szDateBuf, DateSize );
+ TCHAR *szSessionTime = (TCHAR*)mir_alloc((DateSize+TimeSize+5)*sizeof(TCHAR));
+ int lenn = (int)_tcslen(szSessionTime);
+ mir_sntprintf(szSessionTime, lenn, _T("%s - %s"), szTimeBuf, szDateBuf);
+
+ char szSessionDate[256];
+ DBVARIANT dbv = {0};
+ mir_snprintf(szSessionDate, SIZEOF(szSessionDate), "%s_%d", "SessionDate", 0);
+ DBGetContactSettingTString(NULL, __INTERNAL_NAME, szSessionDate, &dbv);
+ TCHAR *szSessionDateBuf_1 = mir_tstrdup(dbv.ptszVal);
+ DBFreeVariant(&dbv);
+
+ DBWriteContactSettingTString(NULL, __INTERNAL_NAME, szSessionDate, szSessionTime);
+ mir_free(szSessionTime);
+ ResaveSettings("SessionDate", 1, ses_limit, szSessionDateBuf_1);
+
+ if(szTimeBuf)
+ mir_free(szTimeBuf);
+ if(szDateBuf)
+ mir_free(szDateBuf);
+ }
+ if(g_bCrashRecovery)
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastSaveCompleted", 1);
+ return 0;
+}
+
+int SaveUserSessionName(TCHAR *szUSessionName)
+{
+ int i=0;
+ DBVARIANT dbv={0};
+ char szUserSessionNameBuf[256]={0};
+ TCHAR *szUserSessionNameBuf_1=NULL;
+ TCHAR *szUserSessionName=NULL;
+ TCHAR *ptr=NULL;
+
+ if(session_list[0]!=0)
+ {
+ szUserSessionName = mir_tstrdup(szUSessionName);
+ mir_snprintf(szUserSessionNameBuf, SIZEOF(szUserSessionNameBuf), "%s_%u", "UserSessionDsc", 0);
+ if(!DBGetContactSettingTString(NULL, __INTERNAL_NAME, szUserSessionNameBuf, &dbv))
+ {
+ szUserSessionNameBuf_1 = mir_tstrdup(dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ ResaveSettings("UserSessionDsc",1,255,szUserSessionNameBuf_1);
+ }
+
+ DBWriteContactSettingTString(NULL, __INTERNAL_NAME, szUserSessionNameBuf, szUserSessionName);
+
+ //free(szUserSessionNameBuf_1);
+ mir_free(szUserSessionName);
+ return 0;
+ }
+
+ return 1;
+}
+
+INT_PTR LoadLastSession(WPARAM wparam,LPARAM lparam)
+{
+ int ret=0;
+ if(isLastTRUE)
+ ret=LoadSession(wparam,lparam);
+ else if (g_bOtherWarnings)
+ MessageBox(NULL, TranslateT("Last Sessions is empty"), TranslateT("Sessions Manager"), MB_OK);
+ return ret;
+}
+
+int LoadSession(WPARAM wparam,LPARAM lparam)
+{
+ int dup=0;
+ int hidden[255]={'0'};
+ HANDLE hContact;
+ DWORD session_list_t[255]={0};
+ int mode=0;
+ int i=0,j=0;
+ if ((UINT)lparam>=ses_limit&&lparam!=256)
+ {
+ mode=1;
+ lparam-=ses_limit;
+ }
+ if(session_list_recovered[0]&&lparam==256&&mode==0)
+ memcpy(session_list_t,session_list_recovered,SIZEOF(session_list_t));
+ else
+ for (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact;
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ if(LoadContactsFromMask(hContact,mode,lparam))
+ {
+ i=GetInSessionOrder(hContact,mode, lparam);
+ session_list_t[i]=(DWORD)hContact;
+ }
+ }
+ i=0;
+ //TODO: change to "switch"
+ while(session_list_t[i]!=0)
+ {
+ if (CheckForDuplicate(session_list,session_list_t[i])==-1)
+ CallService(MS_CLIST_CONTACTDOUBLECLICKED, (WPARAM)session_list_t[i], 0);
+ else if(g_bWarnOnHidden)
+ {
+ if(!CheckContactVisibility((HANDLE)session_list_t[i]))
+ {
+ hidden[j]=i+1;
+ j++;
+ }
+ dup++;
+ }
+ i++;
+ }
+
+ if(i==0)
+ {
+ if(g_bOtherWarnings)
+ MessageBox(NULL, TranslateT("No contacts to open"), TranslateT("Sessions Manager"), MB_OK|MB_ICONWARNING);
+ return 1;
+ }
+ else if(dup==i)
+ {
+ if(!hidden)
+ {
+ if(g_bOtherWarnings)
+ MessageBox(NULL, TranslateT("This Session already opened"), TranslateT("Sessions Manager"), MB_OK|MB_ICONWARNING);
+ return 1;
+ }
+ else if(!g_bWarnOnHidden&&g_bOtherWarnings)
+ {
+ MessageBox(NULL, TranslateT("This Session already opened"), TranslateT("Sessions Manager"), MB_OK|MB_ICONWARNING);
+ return 1;
+ }
+ else if(g_bWarnOnHidden)
+ {
+ if(MessageBox(NULL, TranslateT("This Session already opened(but probably hidden)\nDo you want to show hidden contacts?"), TranslateT("Sessions Manager"), MB_YESNO|MB_ICONQUESTION)==IDYES)
+ {
+ j=0;
+ while(hidden[j]!=0)
+ {
+ CallService(MS_CLIST_CONTACTDOUBLECLICKED, (WPARAM)session_list_t[hidden[j]-1], 0);
+ j++;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int DelUserDefSession(int ses_count)
+{
+ int i=0;
+ HANDLE hContact;
+ char szSessionName[256]={0};
+ TCHAR *szSessionNameBuf=NULL;
+
+ for (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact;
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ RemoveSessionMark(hContact,1,ses_count);
+ SetInSessionOrder(hContact,1,ses_count,0);
+ }
+
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "UserSessionDsc", ses_count);
+ DBDeleteContactSetting(NULL, __INTERNAL_NAME, szSessionName);
+
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "FavUserSession", ses_count);
+ DBDeleteContactSetting(NULL, __INTERNAL_NAME, szSessionName);
+
+ for (i=(ses_count+1);;i++)
+ {
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "UserSessionDsc", i);
+
+ if ((szSessionNameBuf=DBGetStringT(NULL, __INTERNAL_NAME, szSessionName))/*&&(szSessionHandlesBuf=DBGetStringT(NULL,PLGNAME,szSessionHandles))*/)
+ {
+ MarkUserDefSession(i-1,IsMarkedUserDefSession(i));
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "UserSessionDsc", i-1);
+ DBWriteContactSettingTString(NULL, __INTERNAL_NAME, szSessionName, szSessionNameBuf);
+ }
+ else
+ {
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "UserSessionDsc", i-1);
+ DBDeleteContactSetting(NULL, __INTERNAL_NAME, szSessionName);
+
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "FavUserSession", i-1);
+ DBDeleteContactSetting(NULL, __INTERNAL_NAME, szSessionName);
+ break;
+ }
+ }
+ g_ses_count--;
+ DBWriteContactSettingByte(0, __INTERNAL_NAME, "UserSessionsCount", (BYTE)g_ses_count);
+ mir_free(szSessionNameBuf);
+ return 0;
+}
+
+int DeleteAutoSession(int ses_count)
+{
+ int i=0;
+ HANDLE hContact;
+ char szSessionName[256]={0};
+
+ TCHAR *szSessionNameBuf=NULL;
+
+ for (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact;
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ RemoveSessionMark(hContact,0,ses_count);
+ SetInSessionOrder(hContact,0,ses_count,0);
+ }
+
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "SessionDate", ses_count);
+ DBDeleteContactSetting(NULL, __INTERNAL_NAME, szSessionName);
+
+ for (i=(ses_count+1);;i++)
+ {
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "SessionDate", i);
+
+ if ((szSessionNameBuf=DBGetStringT(NULL, __INTERNAL_NAME, szSessionName))/*&&(szSessionHandlesBuf=DBGetStringT(NULL,PLGNAME,szSessionHandles))*/)
+ {
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "SessionDate", i-1);
+ DBWriteContactSettingTString(NULL, __INTERNAL_NAME, szSessionName, szSessionNameBuf);
+
+ }
+ else
+ {
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "SessionDate", i-1);
+ DBDeleteContactSetting(NULL, __INTERNAL_NAME, szSessionName);
+ break;
+ }
+ }
+ mir_free(szSessionNameBuf);
+ return 0;
+}
+
+int SessionPreShutdown(WPARAM wparam,LPARAM lparam)
+{
+ DONT=1;
+ if (hEventDbWindowEvent) UnhookEvent(hEventDbWindowEvent);
+ DestroyServiceFunction(hServiceOpenManager);
+ DestroyServiceFunction(hServiceCloseCurrentSession);
+ DestroyServiceFunction(hServiceShowFavMenu);
+ DestroyServiceFunction(hServiceLoadLastSession);
+ DestroyServiceFunction(hServiceSaveUserSession);
+
+ if (hEventDbPluginsLoaded) UnhookEvent(hEventDbPluginsLoaded);
+
+ if (hEventDbOptionsInit) UnhookEvent(hEventDbOptionsInit);
+ if (hEventDbOkToExit) UnhookEvent(hEventDbOkToExit);
+ if (hEventDbPreShutdown) UnhookEvent(hEventDbPreShutdown);
+
+ if (g_hDlg) DestroyWindow(g_hDlg);
+ if (g_hSDlg) DestroyWindow(g_hSDlg);
+
+ DestroyIcon(hiSessions);
+ DestroyIcon(hiSessionsLoad);
+ DestroyIcon(hiSessionsSave);
+ DestroyIcon(hiSessionsLoadLast);
+ DestroyIcon(hiChecked);
+ DestroyIcon(hiNotChecked);
+
+ if(g_bIncompletedSave)
+ {
+ int i=0;
+ while(session_list_recovered[i])
+ {
+ DBWriteContactSettingByte((HANDLE)session_list_recovered[i], __INTERNAL_NAME, "wasInLastSession", 0);
+ i++;
+ }
+ }
+
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastSaveCompleted", 1);
+ return 0;
+}
+
+int OkToExit(WPARAM wparam,LPARAM lparam)
+{
+ int exitmode=DBGetContactSettingByte(NULL, __INTERNAL_NAME, "ShutdownMode", 2);
+ DONT=1;
+ if(exitmode==2&&session_list[0]!=0)
+ {
+ SaveSessionDate();
+ SaveSessionHandles(0,0);
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastempty", 0);
+ }
+ else if(exitmode==1&&session_list[0]!=0)
+ {
+ DialogBox(hinstance,MAKEINTRESOURCE(IDD_EXDIALOG), 0, ExitDlgProc);
+ }
+ else DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastempty", 1);
+ return 0;
+}
+
+static int GetContactHandle(WPARAM wparam,LPARAM lParam)
+{
+ MessageWindowEventData *MWeventdata = (MessageWindowEventData*)lParam;
+
+ if(MWeventdata->uType == MSG_WINDOW_EVT_OPEN)
+ {
+ if (strstr(MWeventdata->szModule,"tabSRMsg")) g_mode=1;
+ AddToCurSession((DWORD)MWeventdata->hContact,0);
+ if(g_bCrashRecovery) DBWriteContactSettingByte(MWeventdata->hContact, __INTERNAL_NAME, "wasInLastSession", 1);
+ }
+ else if(MWeventdata->uType == MSG_WINDOW_EVT_CLOSE)
+ {
+ if(!DONT) DelFromCurSession((DWORD)MWeventdata->hContact,0);
+ if(g_bCrashRecovery) DBWriteContactSettingByte(MWeventdata->hContact, __INTERNAL_NAME, "wasInLastSession", 0);
+ }
+
+ return 0;
+}
+
+INT_PTR BuildFavMenu(WPARAM wparam,LPARAM lparam)
+{
+ HMENU hMenu=NULL;
+ POINT pt;
+ int res=0;
+ hMenu = CreatePopupMenu();
+ GetCursorPos(&pt);
+ FillFavoritesMenu(hMenu,g_ses_count);
+ res = TrackPopupMenu(hMenu, TPM_RETURNCMD|TPM_NONOTIFY, pt.x, pt.y, 0, GetActiveWindow(), NULL);
+ if(res==0) return 1;
+ LoadSession(0,(res-1)+ses_limit);
+ return 0;
+}
+
+static int PluginInit(WPARAM wparam,LPARAM lparam)
+{
+ int startup=0;
+
+ hEventDbWindowEvent=HookEvent(ME_MSG_WINDOWEVENT, GetContactHandle);
+ hEventDbOptionsInit=HookEvent(ME_OPT_INITIALISE, OptionsInit);
+
+ hServiceShowFavMenu=CreateServiceFunction(MS_SESSIONS_SHOWFAVORITESMENU, BuildFavMenu);
+ hServiceOpenManager=CreateServiceFunction(MS_SESSIONS_OPENMANAGER, OpenSessionsManagerWindow);
+ hServiceLoadLastSession=CreateServiceFunction(MS_SESSIONS_RESTORELASTSESSION, LoadLastSession/*LoadSession*/);
+ hServiceSaveUserSession=CreateServiceFunction(MS_SESSIONS_SAVEUSERSESSION, SaveUserSessionHandles);
+ hServiceCloseCurrentSession=CreateServiceFunction(MS_SESSIONS_CLOSESESSION, CloseCurrentSession);
+
+ g_ses_count=DBGetContactSettingByte(0, __INTERNAL_NAME, "UserSessionsCount", 0);
+ if (!g_ses_count) g_ses_count=DBGetContactSettingByte(0, "Sessions (Unicode)", "UserSessionsCount", 0);
+ ses_limit=DBGetContactSettingByte(0, __INTERNAL_NAME, "TrackCount", 10);
+ g_bExclHidden=DBGetContactSettingByte(NULL, __INTERNAL_NAME, "ExclHidden", 0);
+ g_bWarnOnHidden=DBGetContactSettingByte(NULL, __INTERNAL_NAME, "WarnOnHidden", 0);
+ g_bOtherWarnings=DBGetContactSettingByte(NULL, __INTERNAL_NAME, "OtherWarnings", 1);
+ g_bCrashRecovery=DBGetContactSettingByte(NULL, __INTERNAL_NAME, "CrashRecovery", 0);
+
+
+ if(g_bCrashRecovery)
+ g_bIncompletedSave=!DBGetContactSettingByte(NULL, __INTERNAL_NAME, "lastSaveCompleted", 0);
+
+ if(g_bIncompletedSave)
+ {
+ int i=0;
+ HANDLE hContact;
+ ZeroMemory(session_list_recovered,255);
+
+ for (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact;
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ if(DBGetContactSettingByte(hContact, __INTERNAL_NAME, "wasInLastSession", 0))
+ session_list_recovered[i++]=(DWORD)hContact;
+ }
+ }
+ if(!session_list_recovered[0]) g_bIncompletedSave=FALSE;
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "lastSaveCompleted", 0);
+
+ if (!DBGetContactSettingByte(NULL, __INTERNAL_NAME, "lastempty", 1)||g_bIncompletedSave) isLastTRUE=TRUE;
+
+ startup=DBGetContactSettingByte(NULL, __INTERNAL_NAME, "StartupMode", 3);
+
+ if (startup==1||(startup==3&&isLastTRUE==TRUE))
+ {
+ StartUp=TRUE;
+ g_hDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_WLCMDIALOG), 0, LoadSessionDlgProc);
+ }
+ else if (startup==2&&isLastTRUE==TRUE)
+ {
+ g_hghostw=TRUE;
+ g_hDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_WLCMDIALOG), 0, LoadSessionDlgProc);
+ }
+
+ HOTKEYDESC hkd = {0};
+ hkd.cbSize = sizeof(hkd);
+ hkd.dwFlags = HKD_TCHAR;
+ hkd.ptszSection = _T("Sessions");
+ hkd.pszName = "OpenSessionsManager";
+ hkd.ptszDescription = _T("Open Sessions Manager");
+ hkd.pszService = MS_SESSIONS_OPENMANAGER;
+ CallService(MS_HOTKEY_REGISTER, 0, (LPARAM)&hkd);
+
+ hkd.pszName = "RestoreLastSession";
+ hkd.ptszDescription = _T("Restore last Session");
+ hkd.pszService = MS_SESSIONS_RESTORELASTSESSION;
+ CallService(MS_HOTKEY_REGISTER, 0, (LPARAM)&hkd);
+
+ hkd.pszName = "SaveSession";
+ hkd.ptszDescription = _T("Save Session");
+ hkd.pszService = MS_SESSIONS_SAVEUSERSESSION;
+ CallService(MS_HOTKEY_REGISTER, 0, (LPARAM)&hkd);
+
+ hkd.pszName = "CloseSession";
+ hkd.ptszDescription = _T("Close Session");
+ hkd.pszService = MS_SESSIONS_CLOSESESSION;
+ CallService(MS_HOTKEY_REGISTER, 0, (LPARAM)&hkd);
+
+ hiChecked = LoadIcon(hinstance, MAKEINTRESOURCE(IDD_SESSION_CHECKED));
+ hiNotChecked = LoadIcon(hinstance, MAKEINTRESOURCE(IDD_SESSION_UNCHECKED));
+
+ hiSessions = LoadIcon(hinstance, MAKEINTRESOURCE(IDI_SESSIONS));
+ hiSessionsLoad = LoadIcon(hinstance, MAKEINTRESOURCE(IDI_SESSIONS_LOAD));
+ hiSessionsSave = LoadIcon(hinstance, MAKEINTRESOURCE(IDD_SESSIONS_SAVE));
+ hiSessionsLoadLast = LoadIcon(hinstance, MAKEINTRESOURCE(IDD_SESSIONS_LOADLAST));
+
+ hibChecked =(HANDLE)AddIcon(hiChecked, "SessionMarked", _T("Favorite Session"));
+ hibNotChecked =(HANDLE)AddIcon(hiNotChecked, "SessionUnMarked", _T("Not favorite Session"));
+
+ hibSessionsLoad =(HANDLE)AddIcon(hiSessionsLoad, "SessionsLoad", _T("Load Session"));
+ hibSessionsSave =(HANDLE)AddIcon(hiSessionsSave, "SessionsSave", _T("Save Session"));
+ hibSessionsLoadLast =(HANDLE)AddIcon(hiSessionsLoadLast, "SessionsLoadLast", _T("Load last Session"));
+
+ CLISTMENUITEM cl;
+ ZeroMemory(&cl, sizeof(cl));
+ cl.cbSize = sizeof(CLISTMENUITEM);
+ cl.position = 1000000000;
+ cl.flags = CMIM_ALL | CMIF_TCHAR;
+
+ cl.ptszName = _T("Save session...");
+ cl.ptszPopupName = _T("Sessions Manager");
+ cl.hIcon = hiSessions;
+ cl.pszService = MS_SESSIONS_SAVEUSERSESSION;
+ hmSaveCurrentSession = (HANDLE) CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM) &cl);
+
+ cl.ptszName = _T("Load session...");
+ cl.pszService = MS_SESSIONS_OPENMANAGER;
+ cl.hIcon = hiSessionsLoad;
+ hmLoadLastSession = (HANDLE) CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM) &cl);
+
+ cl.ptszName = _T("Close session");
+ cl.pszService = MS_SESSIONS_CLOSESESSION;
+ cl.hIcon = 0;
+ hmLoadSession = (HANDLE) CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM) &cl);
+
+ cl.ptszName = _T("Load last session");
+ cl.pszService = MS_SESSIONS_RESTORELASTSESSION;
+ cl.hIcon = hiSessionsLoadLast;
+ cl.position = 10100000;
+ hmLoadSession = (HANDLE) CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM) &cl);
+
+ ZeroMemory(&cl, sizeof(cl));
+ cl.cbSize = sizeof(cl);
+ cl.flags = CMIM_ICON;
+ cl.hIcon = hiSessionsSave;
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmSaveCurrentSession, (LPARAM)&cl);
+
+ if (ServiceExists(MS_TB_ADDBUTTON))
+ {
+ TBButton button = {0};
+ button.defPos = 102200;
+ button.tbbFlags = TBBF_SHOWTOOLTIP|TBBF_VISIBLE;
+
+ button.pszButtonID = MS_SESSIONS_OPENMANAGER;
+ button.pszServiceName = MS_SESSIONS_OPENMANAGER;
+ button.pszTooltipUp = button.pszTooltipUp = button.pszButtonName = "Open Sessions Manager";
+ button.hSecondaryIconHandle = button.hPrimaryIconHandle = hibSessionsLoad;
+ CallService(MS_TB_ADDBUTTON, 0, (LPARAM)&button);
+ button.defPos++;
+
+ button.pszButtonID = MS_SESSIONS_SAVEUSERSESSION;
+ button.pszServiceName = MS_SESSIONS_SAVEUSERSESSION;
+ button.pszTooltipUp = button.pszTooltipUp = button.pszButtonName = "Save Session";
+ button.hSecondaryIconHandle = button.hPrimaryIconHandle = hibSessionsSave;
+ CallService(MS_TB_ADDBUTTON, 0, (LPARAM)&button);
+ button.defPos++;
+
+ button.pszButtonID = MS_SESSIONS_RESTORELASTSESSION;
+ button.pszServiceName = MS_SESSIONS_RESTORELASTSESSION;
+ button.pszTooltipUp = button.pszTooltipUp = button.pszButtonName = "Restore Last Session";
+ button.hSecondaryIconHandle = button.hPrimaryIconHandle = hibSessionsLoadLast;
+ CallService(MS_TB_ADDBUTTON, 0, (LPARAM)&button);
+ button.defPos++;
+
+ button.pszButtonID = MS_SESSIONS_SHOWFAVORITESMENU;
+ button.pszServiceName = MS_SESSIONS_SHOWFAVORITESMENU;
+ button.pszTooltipUp = button.pszTooltipUp = button.pszButtonName = "Show Favorite Sessions Menu";
+ button.hSecondaryIconHandle = button.hPrimaryIconHandle = hibChecked;
+ CallService(MS_TB_ADDBUTTON, 0, (LPARAM)&button);
+ }
+
+ if(ServiceExists(MS_UPDATE_REGISTER))
+ {
+ char buffer[1024];
+ Update update = {0};
+ update.cbSize = sizeof(Update);
+ update.szComponentName = pluginInfo.shortName;
+ update.pbVersion = (BYTE *) CreateVersionString(pluginInfo.version, buffer);
+ update.cpbVersion = (int)strlen((char *) update.pbVersion);
+ //update.szUpdateURL = UPDATER_AUTOREGISTER;
+ update.szBetaVersionURL = SESSIONS_VERSION_URL;
+ update.szBetaUpdateURL = SESSIONS_UPDATE_URL;
+ update.pbBetaVersionPrefix = (BYTE *) SESSIONS_VERSION_PREFIX;
+ update.cpbBetaVersionPrefix = (int)strlen(SESSIONS_VERSION_PREFIX);
+ CallService(MS_UPDATE_REGISTER, 0, (LPARAM) &update);
+ }
+
+ return 0;
+}
+
+// {28EE6FE2-B005-4073-BA90-148203C807D0}
+static const MUUID interfaces[] = {{ 0x28ee6fe2, 0xb005, 0x4073, { 0xba, 0x90, 0x14, 0x82, 0x3, 0xc8, 0x7, 0xd0 } }, MIID_LAST};
+extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ if (mirandaVersion < PLUGIN_MAKE_VERSION(0, 9, 0, 0))
+ return NULL;
+
+ return &pluginInfo;
+}
+
+extern "C" __declspec(dllexport) int Unload(void)
+{
+ return 0;
+}
+
+BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hinstance=hinst;
+ return 1;
+}
+
+extern "C" __declspec(dllexport) int Load(PLUGINLINK *link)
+{
+ pluginLink=link;
+ mir_getMMI(&mmi);
+ mir_getLP(&pluginInfo);
+
+ hEventDbPluginsLoaded=HookEvent(ME_SYSTEM_MODULESLOADED,PluginInit);
+ hEventDbOkToExit=HookEvent(ME_SYSTEM_OKTOEXIT,OkToExit);
+ hEventDbPreShutdown=HookEvent(ME_SYSTEM_PRESHUTDOWN,SessionPreShutdown);
+ return 0;
+} \ No newline at end of file
diff --git a/plugins/Sessions/Src/Options.cpp b/plugins/Sessions/Src/Options.cpp
new file mode 100644
index 0000000000..3998f2de2c
--- /dev/null
+++ b/plugins/Sessions/Src/Options.cpp
@@ -0,0 +1,572 @@
+/*
+Sessions Management plugin for Miranda IM
+
+Copyright (C) 2007-2008 Danil Mozhar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "sessions.h"
+
+HICON hIcon;
+HICON hMarked,hNotMarked;
+
+HWND hComboBox=NULL;
+HWND hComboBoxEdit=NULL;
+
+WNDPROC oldComboProc=0;
+
+HWND hOpClistControl=NULL;
+
+static BOOL bOptionsInit;
+int opses_count;
+BOOL bSesssionNameChanged=0;
+
+DWORD session_list_t[255]={0};
+
+HWND g_opHdlg;
+
+int width;
+HDC hdc=NULL;
+RECT lprect;
+RECT rc;
+POINT pt;
+BOOL bChecked=FALSE;
+
+int OpLoadSessionContacts(WPARAM wparam,LPARAM lparam)
+{
+ HANDLE hContact;
+ int i=0;
+ ZeroMemory(session_list_t,SIZEOF(session_list_t));
+
+ for (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact;
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ if(LoadContactsFromMask(hContact,1,lparam))
+ {
+ i=GetInSessionOrder(hContact,1, lparam);
+ session_list_t[i]=(DWORD)hContact;
+ }
+ }
+
+ i=0;
+ while(session_list_t[i]!=0)
+ {
+ SendDlgItemMessage(g_opHdlg, IDC_OPCLIST, LB_ADDSTRING, 0,
+ (LPARAM)(TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,
+ (WPARAM)session_list_t[i], GCDNF_TCHAR));
+ i++;
+ }
+ return i;
+}
+
+static LRESULT CALLBACK ComboBoxSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_ERASEBKGND:
+ return TRUE;
+
+ case EM_SETSEL:
+ if(!hOpClistControl)
+ return HideCaret(hwnd);
+ break;
+
+ case WM_GETDLGCODE:
+ if(!hOpClistControl)
+ return DLGC_WANTARROWS;
+ break;
+
+ case WM_SETCURSOR:
+ {
+ if(!hOpClistControl)
+ {
+ SetCursor(LoadCursor(NULL, IDC_ARROW));
+ return TRUE;
+ }
+ }break;
+
+ case WM_LBUTTONDOWN:
+ if(hOpClistControl)
+ break;
+ HideCaret(hwnd);
+
+ case WM_LBUTTONDBLCLK:
+ case WM_MBUTTONDOWN:
+ case WM_MBUTTONDBLCLK:
+ SendMessage(hComboBox,CB_SHOWDROPDOWN,1,0);
+ return TRUE;
+
+ case WM_NCLBUTTONDBLCLK:
+ case WM_NCLBUTTONDOWN:
+ if(!bChecked)
+ {
+ MarkUserDefSession(opses_count,1);
+ hIcon=hMarked;
+ bChecked=TRUE;
+ RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_FRAME);
+ }
+ else
+ {
+ MarkUserDefSession(opses_count,0);
+ hIcon=hNotMarked;
+ bChecked=FALSE;
+ RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_FRAME);
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if(hOpClistControl)
+ break;
+
+ case WM_NCMOUSEMOVE:
+ return TRUE;
+
+ case WM_NCPAINT:
+ {
+ hdc=GetDC(hwnd);
+ GetClientRect(hwnd, &rc);
+ rc.left=rc.right;
+ rc.right=rc.left+16;
+
+ FillRect(hdc, &rc, (HBRUSH)GetSysColor(COLOR_WINDOW));
+ DrawIconEx(hdc, rc.left, 0, hIcon, 16, 16, 0, NULL, DI_NORMAL);
+ ReleaseDC(hwnd, hdc);
+ }break;
+
+ case WM_NCCALCSIZE:
+ {
+ NCCALCSIZE_PARAMS *ncsParam = (NCCALCSIZE_PARAMS*)lParam;
+ ncsParam->rgrc[ 0 ].right -= 16;
+ }break;
+
+ case WM_NCHITTEST:
+ {
+ LRESULT lr = CallWindowProc( oldComboProc, hwnd, msg, wParam, lParam );
+ if(lr==HTNOWHERE )
+ lr = HTOBJECT;
+ return lr;
+ }
+ }
+ return CallWindowProc(oldComboProc, hwnd, msg, wParam, lParam);
+}
+
+INT_PTR CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ int startupmode,exitmode;
+ COMBOBOXINFO cbi={0};
+ cbi.cbSize = sizeof(cbi);
+
+ opses_count=0;
+ g_opHdlg=hdlg;
+ bOptionsInit=TRUE;
+ TranslateDialogDefault(hdlg);
+ hMarked=(HICON)CallService(MS_SKIN2_GETICONBYHANDLE, 0, (LPARAM)hibChecked);
+ hNotMarked=(HICON)CallService(MS_SKIN2_GETICONBYHANDLE, 0, (LPARAM)hibNotChecked);
+
+ hIcon=(bChecked=IsMarkedUserDefSession(opses_count))?hMarked:hNotMarked;
+
+ SetDlgItemInt(hdlg, IDC_TRACK,ses_limit=DBGetContactSettingByte(0, __INTERNAL_NAME, "TrackCount", 10), FALSE);
+ SendDlgItemMessage(hdlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG(10, 1));
+ SendDlgItemMessage(hdlg, IDC_SPIN1, UDM_SETPOS, 0, GetDlgItemInt(hdlg, IDC_TRACK, NULL, FALSE));
+
+ SendDlgItemMessage(hdlg, IDC_OPCLIST, LB_RESETCONTENT, 0, 0);
+ SetDlgItemInt(hdlg, IDC_STARTDELAY, DBGetContactSettingWord(NULL, __INTERNAL_NAME, "StartupModeDelay", 1500), FALSE);
+ startupmode = DBGetContactSettingByte(NULL, __INTERNAL_NAME, "StartupMode", 3);
+ exitmode = DBGetContactSettingByte(NULL, __INTERNAL_NAME, "ShutdownMode", 2);
+
+ g_bExclHidden = DBGetContactSettingByte(NULL, __INTERNAL_NAME, "ExclHidden", 0);
+ g_bWarnOnHidden = DBGetContactSettingByte(NULL, __INTERNAL_NAME, "WarnOnHidden", 0);
+ g_bOtherWarnings = DBGetContactSettingByte(NULL, __INTERNAL_NAME, "OtherWarnings", 1);
+ g_bCrashRecovery = DBGetContactSettingByte(NULL, __INTERNAL_NAME, "CrashRecovery", 0);
+
+ CheckDlgButton(hdlg,IDC_EXCLHIDDEN,g_bExclHidden?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hdlg,IDC_LASTHIDDENWARN,g_bWarnOnHidden?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hdlg,IDC_WARNINGS,g_bOtherWarnings?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hdlg,IDC_CRASHRECOVERY,g_bCrashRecovery?BST_CHECKED:BST_UNCHECKED);
+
+
+ if(startupmode==1)
+ CheckDlgButton(hdlg,IDC_STARTDIALOG,BST_CHECKED);
+ else if (startupmode==3)
+ {
+ CheckDlgButton(hdlg,IDC_STARTDIALOG,BST_CHECKED);
+ CheckDlgButton(hdlg,IDC_CHECKLAST,BST_CHECKED);
+ }
+ else if (startupmode==2)
+ {
+ CheckDlgButton(hdlg,IDC_RLOADLAST,BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg, IDC_CHECKLAST), FALSE);
+ }
+ else if (startupmode==0)
+ {
+ CheckDlgButton(hdlg,IDC_RNOTHING,BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg, IDC_STARTDELAY), FALSE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICOP), FALSE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICMS), FALSE);
+ EnableWindow(GetDlgItem(hdlg, IDC_CHECKLAST), FALSE);
+ }
+ if(exitmode==0)
+ {
+ CheckDlgButton(hdlg,IDC_REXDSAVE,BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC1),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC2),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_TRACK),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_SPIN1),FALSE);
+ }
+ else if (exitmode==1) CheckDlgButton(hdlg,IDC_REXASK,BST_CHECKED);
+ else if (exitmode==2) CheckDlgButton(hdlg,IDC_REXSAVE,BST_CHECKED);
+
+ LoadSessionToCombobox (hdlg,1,255,"UserSessionDsc",0);
+ if(SendDlgItemMessage(hdlg, IDC_LIST, CB_GETCOUNT, (WPARAM)0, 0))
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_EDIT),TRUE);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, (WPARAM)0, 0);
+ if(!OpLoadSessionContacts(0,opses_count))
+ EnableWindow(GetDlgItem(hdlg,IDC_DEL),FALSE);
+ }
+
+ GetComboBoxInfo(GetDlgItem(hdlg,IDC_LIST),&cbi);
+ oldComboProc=(WNDPROC)SetWindowLongPtr(cbi.hwndItem, GWLP_WNDPROC, (LONG) ComboBoxSubclassProc);
+
+ hComboBoxEdit=cbi.hwndItem;
+ hComboBox=cbi.hwndCombo;
+
+ SetWindowPos( hComboBoxEdit, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED );
+
+ bOptionsInit=FALSE;
+ }break;
+
+ case WM_CTLCOLORLISTBOX:
+ {
+ switch(GetDlgCtrlID((HWND) lparam))
+ {
+ case IDC_OPCLIST:
+ SetBkMode((HDC) wparam, TRANSPARENT);
+ return (BOOL) CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+ default:
+ break;
+ }
+ }break;
+
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lparam)->code)
+ {
+ case PSN_APPLY:
+ {
+ int iDelay=GetDlgItemInt(hdlg, IDC_STARTDELAY,NULL, FALSE);
+ DBWriteContactSettingWord(0, __INTERNAL_NAME, "StartupModeDelay", (WORD)iDelay);
+
+ DBWriteContactSettingByte(0, __INTERNAL_NAME, "TrackCount", (BYTE)(ses_limit=GetDlgItemInt(hdlg, IDC_TRACK,NULL, FALSE)));
+ if(IsDlgButtonChecked(hdlg, IDC_REXSAVE)) DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "ShutdownMode", 2);
+ else if(IsDlgButtonChecked(hdlg, IDC_REXDSAVE)) DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "ShutdownMode", 0);
+ else if(IsDlgButtonChecked(hdlg, IDC_REXASK)) DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "ShutdownMode", 1);
+
+ if(IsDlgButtonChecked(hdlg, IDC_STARTDIALOG))
+ {
+ if(!IsDlgButtonChecked(hdlg, IDC_CHECKLAST))
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "StartupMode", 1);
+ else DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "StartupMode", 3);
+ }
+ else if(IsDlgButtonChecked(hdlg, IDC_RLOADLAST)) DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "StartupMode", 2);
+ else if(IsDlgButtonChecked(hdlg, IDC_RNOTHING)) DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "StartupMode", 0);
+
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "ExclHidden", (BYTE)(IsDlgButtonChecked(hdlg, IDC_EXCLHIDDEN) ? (g_bExclHidden = 1) : (g_bExclHidden = 0)));
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "WarnOnHidden", (BYTE)(IsDlgButtonChecked(hdlg, IDC_LASTHIDDENWARN) ? (g_bWarnOnHidden = 1) : (g_bWarnOnHidden = 0)));
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "OtherWarnings", (BYTE)(IsDlgButtonChecked(hdlg, IDC_WARNINGS) ? (g_bOtherWarnings = 1) : (g_bOtherWarnings = 0)));
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, "CrashRecovery", (BYTE)(IsDlgButtonChecked(hdlg, IDC_CRASHRECOVERY) ? (g_bCrashRecovery = 1) : (g_bCrashRecovery = 0)));
+
+ return 1;
+ }
+
+ case CLN_CHECKCHANGED:
+ {
+ if (((LPNMHDR)lparam)->idFrom ==IDC_EMCLIST)
+ {
+ int iSelection = (int)((NMCLISTCONTROL *)lparam)->hItem;
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ for ( ; hContact; hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ if (SendDlgItemMessage(hdlg, IDC_EMCLIST, CLM_FINDCONTACT, (WPARAM)hContact, 0) == iSelection)
+ break;
+ if (hContact)
+ EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
+ else
+ EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
+ }
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wparam))
+ {
+ case IDC_LIST:
+ switch(HIWORD(wparam))
+ {
+ case CBN_EDITCHANGE:
+ EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
+ bSesssionNameChanged=TRUE;
+ break;
+
+ case CBN_SELCHANGE:
+ {
+ HWND hCombo = GetDlgItem(hdlg, IDC_LIST);
+ int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if(index != CB_ERR)
+ {
+ opses_count = SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)index, 0);
+ SendDlgItemMessage(hdlg, IDC_OPCLIST, LB_RESETCONTENT, 0, 0);
+ if(IsMarkedUserDefSession(opses_count))
+ {
+ hIcon=hMarked;
+ bChecked=TRUE;
+ RedrawWindow(hComboBoxEdit, NULL, NULL, RDW_INVALIDATE|RDW_NOCHILDREN|RDW_UPDATENOW|RDW_FRAME);
+ }
+ else
+ {
+ hIcon=hNotMarked;
+ bChecked=FALSE;
+ RedrawWindow(hComboBoxEdit, NULL, NULL, RDW_INVALIDATE|RDW_NOCHILDREN|RDW_UPDATENOW|RDW_FRAME);
+ }
+ OpLoadSessionContacts(0,opses_count);
+ if(!hOpClistControl)
+ EnableWindow(GetDlgItem(hdlg,IDC_DEL),TRUE);
+ else
+ {
+ int i;
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+
+ for ( ; hContact; hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ SendMessage(hOpClistControl, CLM_SETCHECKMARK, (WPARAM)hContact,0);
+ for (i=0 ; session_list_t[i]>0; i++)
+ {
+ hContact=(HANDLE)SendMessage(hOpClistControl,CLM_FINDCONTACT, (WPARAM)session_list_t[i], 0);
+ //hItem=session_list[i];
+ SendMessage(hOpClistControl, CLM_SETCHECKMARK, (WPARAM)hContact,1);
+ }
+ EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
+ }
+ }
+ }break;
+ }break;
+
+ case IDC_EDIT:
+ {
+ if(!hOpClistControl)
+ {
+ int i;
+ HANDLE hItem;
+ ShowWindow(GetDlgItem(hdlg,IDC_OPCLIST),SW_HIDE);
+ EnableWindow(GetDlgItem(hdlg,IDC_DEL),FALSE);
+ //EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
+ SetWindowText(GetDlgItem(hdlg,IDC_EDIT),TranslateT("View"));
+ hOpClistControl = CreateWindowEx(WS_EX_STATICEDGE,CLISTCONTROL_CLASS, _T(""),
+ WS_TABSTOP |WS_VISIBLE | WS_CHILD ,
+ 14,198,161,163,hdlg, (HMENU)IDC_EMCLIST, hinstance, 0);
+
+ SetWindowLongPtr(hOpClistControl, GWL_STYLE,
+ GetWindowLongPtr(hOpClistControl, GWL_STYLE)|CLS_CHECKBOXES|CLS_HIDEEMPTYGROUPS|CLS_USEGROUPS|CLS_GREYALTERNATE|CLS_GROUPCHECKBOXES);
+ SendMessage(hOpClistControl, CLM_SETEXSTYLE, CLS_EX_DISABLEDRAGDROP|CLS_EX_TRACKSELECT, 0);
+
+ SendMessage(hOpClistControl,WM_TIMER,TIMERID_REBUILDAFTER,0);
+
+ for (i=0 ; session_list_t[i]>0; i++)
+ {
+ hItem=(HANDLE)SendMessage(hOpClistControl,CLM_FINDCONTACT, (WPARAM)session_list_t[i], 0);
+ //hItem=session_list[i];
+ SendMessage(hOpClistControl, CLM_SETCHECKMARK, (WPARAM)hItem,1);
+ }
+ }
+ else
+ {
+ ShowWindow(GetDlgItem(hdlg,IDC_OPCLIST),SW_SHOWNA);
+ EnableWindow(GetDlgItem(hdlg,IDC_DEL),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
+ SetWindowText(GetDlgItem(hdlg,IDC_EDIT),TranslateT("Edit"));
+ DestroyWindow(hOpClistControl);
+ hOpClistControl=NULL;
+ }
+ }break;
+
+ case IDC_SAVE:
+ {
+ int i;
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ for (i=0 ; hContact;hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ {
+ BYTE res =(BYTE)SendMessage(GetDlgItem(hdlg,IDC_EMCLIST), CLM_GETCHECKMARK,
+ SendMessage(GetDlgItem(hdlg,IDC_EMCLIST), CLM_FINDCONTACT, (WPARAM)hContact, 0), 0);
+ if (res)
+ {
+ SetSessionMark(hContact,1,'1',opses_count);
+ SetInSessionOrder(hContact,1,opses_count,i);
+ i++;
+ }
+ else
+ {
+ SetSessionMark(hContact,1,'0',opses_count);
+ SetInSessionOrder(hContact,1,opses_count,0);
+ }
+ }
+ if(bSesssionNameChanged)
+ {
+ if(GetWindowTextLength(hComboBoxEdit))
+ {
+ TCHAR szUserSessionName[MAX_PATH]={'\0'};
+ GetWindowText(hComboBoxEdit, szUserSessionName, SIZEOF(szUserSessionName));
+ RenameUserDefSession(opses_count,szUserSessionName);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT ,0,0);
+ LoadSessionToCombobox (hdlg,1,255,"UserSessionDsc",0);
+ }
+ bSesssionNameChanged=FALSE;
+ }
+ EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
+ }break;
+
+ case IDC_DEL:
+ {
+ int i=0,index=0;
+ DelUserDefSession(opses_count);
+
+ SendDlgItemMessage(hdlg, IDC_OPCLIST, LB_RESETCONTENT, 0, 0);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0);
+
+ LoadSessionToCombobox (hdlg,1,255,"UserSessionDsc",0);
+
+ opses_count=0;
+
+ if(SendDlgItemMessage(hdlg, IDC_LIST, CB_GETCOUNT, (WPARAM)0, 0))
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_EDIT),TRUE);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, (WPARAM)0, 0);
+ if(!OpLoadSessionContacts(0,opses_count))
+ EnableWindow(GetDlgItem(hdlg,IDC_DEL),FALSE);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_EDIT),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_DEL),FALSE);
+ }
+ }break;
+
+ case IDC_STARTDIALOG:
+ {
+ EnableWindow(GetDlgItem(hdlg, IDC_STARTDELAY), TRUE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICOP), TRUE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICMS), TRUE);
+ EnableWindow(GetDlgItem(hdlg, IDC_CHECKLAST), TRUE);
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ }break;
+
+ case IDC_RLOADLAST:
+ {
+ EnableWindow(GetDlgItem(hdlg, IDC_STARTDELAY), TRUE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICOP), TRUE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICMS), TRUE);
+ EnableWindow(GetDlgItem(hdlg, IDC_CHECKLAST), FALSE);
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ }break;
+
+ case IDC_RNOTHING:
+ {
+ EnableWindow(GetDlgItem(hdlg, IDC_STARTDELAY), FALSE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICOP), FALSE);
+ EnableWindow(GetDlgItem(hdlg, IDC_STATICMS), FALSE);
+ EnableWindow(GetDlgItem(hdlg, IDC_CHECKLAST), FALSE);
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ }break;
+
+ case IDC_REXSAVE:
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC1),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC2),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_TRACK),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_SPIN1),TRUE);
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ }break;
+
+ case IDC_REXDSAVE:
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC1),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC2),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_TRACK),FALSE);
+ EnableWindow(GetDlgItem(hdlg,IDC_SPIN1),FALSE);
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ }break;
+
+ case IDC_REXASK:
+ {
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC1),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_EXSTATIC2),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_TRACK),TRUE);
+ EnableWindow(GetDlgItem(hdlg,IDC_SPIN1),TRUE);
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ }break;
+ }
+
+ if (HIWORD(wparam)==CBN_DROPDOWN&&!hOpClistControl)
+ {
+ SendMessage(hComboBoxEdit,EM_SETSEL ,0,0);
+ SendMessage(hComboBoxEdit,EM_SCROLLCARET ,0,0);
+ SendMessage(hComboBoxEdit,WM_KILLFOCUS ,0,0);
+ HideCaret(hComboBoxEdit);
+ }
+
+ if((HIWORD(wparam)!=CBN_DROPDOWN)&&(LOWORD(wparam)==IDC_LIST)&&!hOpClistControl)
+ {
+ SendMessage(hComboBoxEdit,EM_SCROLLCARET ,0,0);
+ HideCaret(hComboBoxEdit);
+ }
+
+ if ((LOWORD(wparam) == IDC_STARTDELAY) && (HIWORD(wparam)!=EN_CHANGE || (HWND)lparam != GetFocus()))
+ return 0;
+
+ if (lparam&&!bOptionsInit&&(HIWORD(wparam)==BN_CLICKED)&& (GetFocus()==(HWND)lparam)
+ &&((LOWORD(wparam)==IDC_CHECKLAST)||((LOWORD(wparam)>=IDC_EXCLHIDDEN)&&(LOWORD(wparam)<=IDC_CRASHRECOVERY))))
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+
+ return 0;
+
+ case WM_NCDESTROY:
+ SetWindowLongPtr(hComboBoxEdit, GWLP_WNDPROC, (LONG)oldComboProc);
+ break;
+
+ case WM_CLOSE:
+ EndDialog(hdlg,0);
+ return 0;
+ }
+ return 0;
+}
+
+int OptionsInit(WPARAM wparam,LPARAM lparam)
+{
+ OPTIONSDIALOGPAGE odp={0};
+
+ odp.cbSize = sizeof(odp);
+ odp.position=955000000;
+ odp.hInstance=hinstance;
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPTIONS);
+ odp.ptszTitle=LPGENT(__INTERNAL_NAME);
+ odp.pfnDlgProc=OptionsProc;
+ odp.ptszGroup=LPGENT("Message Sessions");
+ odp.flags=ODPF_BOLDGROUPS | ODPF_TCHAR;
+
+ CallService(MS_OPT_ADDPAGE,wparam,(LPARAM)&odp);
+ return 0;
+} \ No newline at end of file
diff --git a/plugins/Sessions/Src/Sessions.h b/plugins/Sessions/Src/Sessions.h
new file mode 100644
index 0000000000..e4d5425c07
--- /dev/null
+++ b/plugins/Sessions/Src/Sessions.h
@@ -0,0 +1,92 @@
+/*
+Sessions Management plugin for Miranda IM
+
+Copyright (C) 2007-2008 Danil Mozhar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#define _WIN32_WINNT 0x0501
+
+#define MIRANDA_VER 0x0900
+#define MIRANDA_CUSTOM_LP
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include "newpluginapi.h"
+#include "m_utils.h"
+#include "m_system.h"
+#include "m_options.h"
+#include "m_clc.h"
+#include "m_database.h"
+#include "m_langpack.h"
+#include "m_icolib.h"
+#include "m_message.h"
+#include "m_clist.h"
+#include "m_hotkeys.h"
+#include "win2k.h"
+
+#include "m_updater.h"
+#include "m_toolbar.h"
+#include "m_sessions.h"
+
+#include "Utils.h"
+#include "../Version.h"
+#include "../Resource.h"
+
+extern HANDLE hibChecked;
+extern HANDLE hibNotChecked;
+
+#define MIIM_STRING 0x00000040
+
+int DelUserDefSession(int ses_count);
+int DeleteAutoSession(int ses_count);
+int LoadSession(WPARAM ,LPARAM );
+int SaveSessionHandles(WPARAM ,LPARAM );
+INT_PTR SaveUserSessionHandles(WPARAM ,LPARAM );
+int SaveUserSessionName(TCHAR*);
+INT_PTR CloseCurrentSession(WPARAM ,LPARAM );
+int SaveSessionDate();
+
+extern HINSTANCE hinstance;
+extern DWORD session_list_recovered[255];
+extern DWORD session_list[255];
+extern unsigned int ses_limit;
+extern unsigned int g_ses_count;
+extern BOOL g_bExclHidden;
+extern BOOL g_bWarnOnHidden;
+extern BOOL g_bOtherWarnings;
+extern BOOL g_bCrashRecovery;
+extern BOOL g_bIncompletedSave;
+
+#define TIMERID_LOAD 12
+#define TIMERID_SHOW 11
+#define TIMERID_REBUILDAFTER 14
+
+#ifdef _UNICODE
+#define SESSIONS_NAME "sessions_u"
+#else
+#define SESSIONS_NAME "sessions_a"
+#endif
+
+#define SESSIONS_VERSION_URL "http://miranda.radicaled.ru/public/updater/sessions.txt"
+
+#define SESSIONS_UPDATE_URL "http://miranda.radicaled.ru/public/sessions/"SESSIONS_NAME".zip"
+
+#define SESSIONS_UPDATE_URL "http://miranda.radicaled.ru/public/sessions/"SESSIONS_NAME".zip"
+
+#define SESSIONS_VERSION_PREFIX "Sessions "
diff --git a/plugins/Sessions/Src/Utils.cpp b/plugins/Sessions/Src/Utils.cpp
new file mode 100644
index 0000000000..4b5ba065a0
--- /dev/null
+++ b/plugins/Sessions/Src/Utils.cpp
@@ -0,0 +1,571 @@
+/*
+Sessions Management plugin for Miranda IM
+
+Copyright (C) 2007-2008 Danil Mozhar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "sessions.h"
+
+void AddSessionMark(HANDLE hContact,int mode,char bit)
+{
+ unsigned int i;
+ char temp_1[1]={'\0'},temp_2[1]={'\0'};
+ char szDst[256]={'\0'};
+ char* pszBuffer=NULL;
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ temp_1[0]=dbv.pszVal[0];
+ for (i=0;i<ses_limit;i++)
+ {
+ temp_2[0]=dbv.pszVal[i+1];
+ dbv.pszVal[i+1]=temp_1[0];
+ temp_1[0]=temp_2[0];
+ }
+ for (i=ses_limit;i<10;i++)
+ dbv.pszVal[i]='0';
+ dbv.pszVal[0]=bit;
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ else if(bit=='1') DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", "10000000000");
+ }
+
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ if(strlen(dbv.pszVal)<g_ses_count)
+ {
+ pszBuffer = (char*)mir_alloc(g_ses_count+1);
+ ZeroMemory(pszBuffer,g_ses_count+1);
+ strcpy(pszBuffer,dbv.pszVal);
+ }
+ else
+ pszBuffer = mir_strdup(dbv.pszVal);
+
+ DBFreeVariant(&dbv);
+
+ temp_1[0]=pszBuffer[0];
+ for (i=0;i<g_ses_count;i++)
+ {
+ temp_2[0]=pszBuffer[i+1];
+ pszBuffer[i+1]=temp_1[0];
+ temp_1[0]=temp_2[0];
+ }
+ pszBuffer[0]=bit;
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", pszBuffer);
+
+ mir_free(pszBuffer);
+ }
+ else if(bit=='1')DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", "10000000000");
+ else DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", "00000000000");
+ }
+}
+
+void RemoveSessionMark(HANDLE hContact,int mode,int marknum)
+{
+ unsigned int i=1;
+ char temp_1[1]={'\0'},temp_2[1]={'\0'};
+ char szDst[256]={'\0'};
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ for (i=marknum;i<ses_limit;i++)
+ dbv.pszVal[i]=dbv.pszVal[i+1];
+
+ for (i=ses_limit;i<10;i++)
+ dbv.pszVal[i]='0';
+
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ for (i=marknum;i<ses_limit;i++)
+ dbv.pszVal[i]=dbv.pszVal[i+1];
+
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+}
+
+void SetSessionMark(HANDLE hContact,int mode,char bit,unsigned int marknum)
+{
+ char* pszBuffer=NULL;
+
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ dbv.pszVal[marknum]=bit;
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", dbv.pszVal);
+
+ DBFreeVariant(&dbv);
+ }
+ }
+
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ pszBuffer = mir_strdup(dbv.pszVal);
+ pszBuffer[marknum]=bit;
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", pszBuffer);
+ mir_free(pszBuffer);
+ DBFreeVariant(&dbv);
+ }
+ }
+}
+
+BOOL LoadContactsFromMask(HANDLE hContact,int mode,int count)
+{
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ if (dbv.pszVal[count]=='1')
+ {
+ DBFreeVariant(&dbv);
+ return 1;
+ }
+ }
+ else
+ return 0;
+ }
+
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsMarks", &dbv) && dbv.pszVal)
+ {
+ if (dbv.pszVal[count]=='1')
+ {
+ DBFreeVariant(&dbv);
+ return 1;
+ }
+ }
+ else
+ return 0;
+ }
+ return 0;
+}
+
+void AddInSessionOrder(HANDLE hContact,int mode,int ordernum,int writemode)
+{
+ int i;
+ char temp_1[2]={'\0'},temp_2[2]={'\0'};
+ char szDst[256]={'\0'};
+ char* pszBuffer=NULL;
+ char szFormNumBuf[255]={'\0'};
+
+ if(ordernum<10)
+ mir_snprintf(szFormNumBuf, SIZEOF(szFormNumBuf), "%u%u", 0, ordernum);
+ else
+ mir_snprintf(szFormNumBuf, SIZEOF(szFormNumBuf), "%u", ordernum);
+
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsOrder", &dbv) && dbv.pszVal)
+ {
+ char* temp=NULL;
+ char* temp2=NULL;
+ int len= (int)strlen(dbv.pszVal);
+ if(!len)
+ len=20;
+
+ temp2 = (char*)mir_alloc(len-1);
+ ZeroMemory(temp2,len-1);
+ temp = (char*)mir_alloc(len+1);
+ ZeroMemory(temp,len+1);
+ if(ordernum<10)
+ {
+ strncpy( temp2, dbv.pszVal, len-2 );
+ temp2[len-2]='\0';
+ mir_snprintf(temp, len+1, "%u%u%s", 0, ordernum, temp2);
+ }
+ else
+ mir_snprintf(temp, len+1, "%u%s", ordernum, temp2);
+
+ for (i=(ses_limit*2);i<20;i++)
+ temp[i]='0';
+
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsOrder", temp);
+ mir_free(temp);
+ mir_free(temp2);
+ DBFreeVariant(&dbv);
+ }
+ else if(writemode==1)
+ {
+ ZeroMemory(szFormNumBuf,SIZEOF(szFormNumBuf));
+ if(ordernum<10)
+ mir_snprintf(szFormNumBuf, SIZEOF(szFormNumBuf), "%u%u%s", 0, ordernum, "000000000000000000");
+ else
+ mir_snprintf(szFormNumBuf, SIZEOF(szFormNumBuf), "%u%s", ordernum, "000000000000000000");
+
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsOrder", szFormNumBuf);
+ }
+ }
+
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ int advlen=0;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", &dbv) && dbv.pszVal)
+ {
+ char* temp=NULL;
+ char* temp2=NULL;
+ int len=0;
+ if(strlen(dbv.pszVal)<(g_ses_count*2))
+ {
+ pszBuffer = (char*)mir_alloc(g_ses_count*2+1);
+ ZeroMemory(pszBuffer,g_ses_count*2+1);
+ strcpy(pszBuffer,dbv.pszVal);
+ }
+ else
+ {
+ pszBuffer = mir_strdup(dbv.pszVal);
+ }
+ if(!(advlen=len= (int)strlen(pszBuffer)))
+ advlen=len=20;
+ else
+ advlen=len+2;
+
+ temp = (char*)mir_alloc(advlen+1);
+ ZeroMemory(temp,advlen+1);
+
+ if(ordernum<10)
+ mir_snprintf(temp, advlen+1, "%u%u%s", 0, ordernum, dbv.pszVal);
+ else
+ mir_snprintf(temp, advlen+1, "%u%s", ordernum, dbv.pszVal);
+
+ DBFreeVariant(&dbv);
+
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", temp);
+ mir_free(temp);
+ mir_free(pszBuffer);
+ }
+ else if(writemode==1)
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", szFormNumBuf);
+ else
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", "00");
+ }
+}
+
+int GetInSessionOrder(HANDLE hContact,int mode,int count)
+{
+ int iOrder=0;
+ char szTemp[3]={'\0'};
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsOrder", &dbv) && dbv.pszVal)
+ {
+ szTemp[0]=dbv.pszVal[count*2];
+ szTemp[1]=dbv.pszVal[count*2+1];
+ iOrder=atoi(szTemp);
+ DBFreeVariant(&dbv);
+ }
+ }
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", &dbv) && dbv.pszVal)
+ {
+ szTemp[0]=dbv.pszVal[count*2];
+ szTemp[1]=dbv.pszVal[count*2+1];
+ iOrder=atoi(szTemp);
+ DBFreeVariant(&dbv);
+ }
+ }
+ return iOrder;
+}
+
+void SetInSessionOrder(HANDLE hContact,int mode,int count,unsigned int ordernum)
+{
+ int iOrder=0;
+ char szTemp[3]={'\0'};
+
+ if(ordernum<10)
+ mir_snprintf(szTemp, SIZEOF(szTemp), "%u%u", 0, ordernum);
+ else
+ mir_snprintf(szTemp, SIZEOF(szTemp), "%u", ordernum);
+
+ if(mode==0)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsOrder", &dbv) && dbv.pszVal)
+ {
+ dbv.pszVal[count*2]=szTemp[0];
+ dbv.pszVal[count*2+1]=szTemp[1];
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "LastSessionsOrder", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+
+ if (mode==1)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", &dbv) && dbv.pszVal)
+ {
+ dbv.pszVal[count*2]=szTemp[0];
+ dbv.pszVal[count*2+1]=szTemp[1];
+ DBWriteContactSettingString(hContact, __INTERNAL_NAME, "UserSessionsOrder", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+}
+
+BOOL ResaveSettings(char* szName,int iFirst,int iLimit,TCHAR* szBuffer)
+{
+ BYTE marked,marked_t;
+ char szNameBuf[256]={0};
+
+ for (int i = iFirst; i < iLimit; i++)
+ {
+ if (szBuffer)
+ {
+ DBVARIANT dbv_temp = {0};
+ mir_snprintf(szNameBuf, SIZEOF(szNameBuf), "%s_%u", szName, i);
+ DBGetContactSettingTString(NULL, __INTERNAL_NAME, szNameBuf, &dbv_temp);
+ DBWriteContactSettingTString(NULL, __INTERNAL_NAME, szNameBuf, szBuffer);
+ marked=IsMarkedUserDefSession(i);
+ MarkUserDefSession(i,(BYTE)((i==iFirst)?IsMarkedUserDefSession(iFirst-1):marked_t));
+ marked_t=marked;
+ mir_free(szBuffer);
+ if (dbv_temp.ptszVal)
+ {
+ szBuffer = mir_tstrdup(dbv_temp.ptszVal);
+ DBFreeVariant(&dbv_temp);
+ }
+ else
+ return 0;
+ }
+ else
+ break;
+ }
+ return 1;
+}
+
+int AddToCurSession (DWORD wparam,LPARAM lparam)
+{
+ int i;
+ if (CheckForDuplicate(session_list,wparam)==-1)
+ {
+ for (i=0;;i++)
+ {
+ if(session_list[i]==0)
+ {
+ session_list[i]=wparam;
+ break;
+ }
+ }
+ }
+ return 0;
+}
+
+int DelFromCurSession(DWORD wparam,LPARAM lparam)
+{
+ int i=0;
+ while(session_list[i]!=0)
+ {
+ if(session_list[i]==wparam)
+ {
+ while(session_list[i+1]!=0)
+ {
+ session_list[i]=session_list[i+1];
+ i++;
+ }
+ session_list[i]=0;
+ }
+ i++;
+ }
+ return 0;
+}
+
+int CheckForDuplicate(DWORD contact_list[],DWORD lparam)
+{
+ int i=0;
+ DWORD s_list[255]={'0'};
+ memcpy(s_list, contact_list,SIZEOF(s_list));
+ for (i=0;;i++)
+ {
+ if (s_list[i]==lparam)
+ return i;
+ if (s_list[i]==0)
+ return -1;
+ }
+ return 0;
+}
+
+int LoadSessionToCombobox (HWND hdlg,BOOL mode,int iLimit,char* pszSetting,int iFirstNum)
+{
+ int ses_count=iFirstNum,i, index;
+ char szBuffer[256]={0};
+ TCHAR *pszBuffer=NULL;
+ if(session_list_recovered[0]&&!iFirstNum&&!mode)
+ {
+ index = SendDlgItemMessage(hdlg, IDC_LIST, CB_ADDSTRING, 0, (LPARAM)TranslateT("Session Before Last Crash"));
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETITEMDATA, (WPARAM)index, (LPARAM) 256);
+ }
+ for(i=0;i < iLimit; i++)
+ {
+ mir_snprintf(szBuffer, SIZEOF(szBuffer), "%s_%u", pszSetting, i);
+ pszBuffer = DBGetStringT(NULL, __INTERNAL_NAME, szBuffer);
+ if (pszBuffer)
+ {
+ if(!IsMarkedUserDefSession(i+iFirstNum)||mode==1)
+ {
+ index = SendDlgItemMessage(hdlg, IDC_LIST, CB_ADDSTRING, 0, (LPARAM)pszBuffer);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETITEMDATA, (WPARAM)index, (LPARAM) (DWORD)i+iFirstNum);
+ }
+ else
+ {
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_INSERTSTRING, 0, (LPARAM)pszBuffer);
+ SendDlgItemMessage(hdlg, IDC_LIST, CB_SETITEMDATA, (WPARAM)0, (LPARAM) (DWORD)i+iFirstNum);
+ }
+ mir_free(pszBuffer);
+ pszBuffer=NULL;
+ }
+ else
+ {
+ if (i==0) ses_count=iLimit-iFirstNum;
+ break;
+ }
+ }
+ if(pszBuffer)mir_free(pszBuffer);
+ return ses_count;
+}
+
+int FillFavoritesMenu (HMENU hMenu,int iLimit)
+{
+ int i, iItems=0;
+ char szBuffer[256]={0};
+ TCHAR *pszBuffer=NULL;
+
+ for(i=0;i < iLimit; i++)
+ {
+ if(IsMarkedUserDefSession(i))
+ {
+ mir_snprintf(szBuffer, SIZEOF(szBuffer), "%s_%u", "UserSessionDsc", i);
+ pszBuffer = DBGetStringT(NULL, __INTERNAL_NAME, szBuffer);
+ if ((pszBuffer = DBGetStringT(NULL, __INTERNAL_NAME, szBuffer)))
+ {
+ AppendMenu(hMenu,MF_STRING,i+1,pszBuffer);
+ iItems++;
+ //TODO: test this
+ mir_free(pszBuffer);
+ pszBuffer=NULL;
+ }
+ }
+ }
+ if(pszBuffer) mir_free(pszBuffer);
+ return iItems;
+}
+
+void OffsetWindow(HWND parent, HWND hwnd, int dx, int dy)
+{
+ POINT pt;
+ RECT rc;
+ GetWindowRect(hwnd, &rc);
+ pt.x = rc.left;
+ pt.y = rc.top;
+ ScreenToClient(parent, &pt);
+ rc.left =pt.x ;
+ rc.top =pt.y ;
+
+ OffsetRect(&rc, dx, dy);
+ SetWindowPos(hwnd, NULL, rc.left, rc.top,0, 0, SWP_NOZORDER |SWP_NOSIZE);
+}
+
+int CheckContactVisibility(HANDLE hContact)
+{
+ if (DBGetContactSettingByte(hContact, "CList", "Hidden", 0))
+ return 0;
+ return 1;
+}
+
+void RenameUserDefSession(int ses_count,TCHAR* ptszNewName)
+{
+ char szSession[256]={0};
+ mir_snprintf(szSession, SIZEOF(szSession), "%s_%u", "UserSessionDsc", ses_count);
+ DBWriteContactSettingTString(NULL, __INTERNAL_NAME, szSession, ptszNewName);
+}
+
+int MarkUserDefSession(int ses_count,BYTE bCheck)
+{
+ char szSessionName[256]={0};
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u", "FavUserSession", ses_count);
+ DBWriteContactSettingByte(NULL, __INTERNAL_NAME, szSessionName, bCheck);
+ return 0;
+}
+
+BYTE IsMarkedUserDefSession(int ses_count)
+{
+ char szSessionName[256]={0};
+ mir_snprintf(szSessionName, SIZEOF(szSessionName), "%s_%u","FavUserSession", ses_count);
+ return DBGetContactSettingByte(NULL, __INTERNAL_NAME, szSessionName, 0);
+}
+
+int AddIcon(HICON icon, char *name, TCHAR *description)
+{
+ SKINICONDESC sid = {0};
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.flags = SIDF_ALL_TCHAR;
+ sid.ptszSection = _T(__INTERNAL_NAME);
+ sid.cx = sid.cy = 16;
+ sid.ptszDescription = description;
+ sid.pszName = name;
+ sid.hDefaultIcon = icon;
+ return CallService(MS_SKIN2_ADDICON, 0, (LPARAM) &sid);
+}
+
+void SavePosition(HWND hwnd, char *wndName)
+{
+ RECT rc;
+ char buffer[512];
+ GetWindowRect(hwnd, &rc);
+ mir_snprintf(buffer, SIZEOF(buffer), "%sPosX", wndName);
+ DBWriteContactSettingDword(0, __INTERNAL_NAME, buffer, rc.left);
+ mir_snprintf(buffer, SIZEOF(buffer), "%sPosY", wndName);
+ DBWriteContactSettingDword(0, __INTERNAL_NAME, buffer, rc.top);
+}
+
+void LoadPosition(HWND hWnd, char *wndName)
+{
+ char buffer[512];
+ int x,y ;
+ mir_snprintf(buffer, SIZEOF(buffer), "%sPosX", wndName);
+ x = DBGetContactSettingDword(0, __INTERNAL_NAME, buffer, ((GetSystemMetrics(SM_CXSCREEN)) / 2)-130);
+ mir_snprintf(buffer, SIZEOF(buffer), "%sPosY", wndName);
+ y = DBGetContactSettingDword(0, __INTERNAL_NAME, buffer, ((GetSystemMetrics(SM_CYSCREEN))/ 2)-80);
+ SetWindowPos(hWnd, NULL, x, y, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSIZE);
+} \ No newline at end of file
diff --git a/plugins/Sessions/Src/Utils.h b/plugins/Sessions/Src/Utils.h
new file mode 100644
index 0000000000..ce4fe75a59
--- /dev/null
+++ b/plugins/Sessions/Src/Utils.h
@@ -0,0 +1,45 @@
+/*
+Sessions Management plugin for Miranda IM
+
+Copyright (C) 2007-2008 Danil Mozhar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __UTILS_H__
+# define __UTILS_H__
+
+void SetInSessionOrder(HANDLE hContact,int mode,int count,unsigned int ordernum);
+void AddInSessionOrder(HANDLE hContact,int mode,int ordernum,int writemode);
+int GetInSessionOrder(HANDLE hContact,int mode,int count);
+void AddSessionMark(HANDLE hContact,int mode,char bit);
+void RemoveSessionMark(HANDLE hContact,int mode,int marknum);
+void SetSessionMark(HANDLE hContact,int mode,char bit,unsigned int marknum);
+BOOL LoadContactsFromMask(HANDLE hContact,int mode,int count);
+int AddToCurSession (DWORD wparam,LPARAM lparam);
+int DelFromCurSession(DWORD wparam,LPARAM lparam);
+int CheckForDuplicate(DWORD contact_list[],DWORD lparam);
+BOOL ResaveSettings(char* szName,int iFirst,int iLimit,TCHAR* pszPrevSetting);
+void OffsetWindow(HWND parent, HWND hwnd, int dx, int dy);
+int LoadSessionToCombobox (HWND hdlg,BOOL mode,int iLimit,char* pszSetting,int iFirstNum);
+int AddIcon(HICON icon, char *name, TCHAR *description);
+int MarkUserDefSession(int ses_count,BYTE bCheck);
+BYTE IsMarkedUserDefSession(int ses_count);
+void SavePosition(HWND hWnd, char *wndName);
+void LoadPosition(HWND hWnd, char *wndName);
+int CheckContactVisibility(HANDLE hContact);
+void RenameUserDefSession(int ses_count,TCHAR* ptszNewName);
+int FillFavoritesMenu (HMENU hMenu,int iLimit);
+
+#endif // __UTILS_H__ \ No newline at end of file