diff -rduN1 JabberG/gmail.cpp JGmail/gmail.cpp --- JabberG/gmail.cpp Thu Jan 1 01:00:00 1970 +++ JGmail/gmail.cpp Sat Apr 1 23:15:12 2006 @@ -0,0 +1,744 @@ +#include "jabber.h" +#include "jabber_iq.h" +#include +#include +#include +#include "resource.h" + +LRESULT CALLBACK PopupDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); +typedef struct { + char *username; + char *password; + __int64 tid; +} POPUP_ACCINFO; + + +void StringFromUnixTime(char* str, int length, unsigned long t) +{ + SYSTEMTIME st; + LONGLONG ll; + FILETIME ft; + ll = UInt32x32To64(CallService(MS_DB_TIME_TIMESTAMPTOLOCAL,t,0), 10000000) + 116444736000000000; + ft.dwLowDateTime = (DWORD)ll; + ft.dwHighDateTime = (DWORD)(ll >> 32); + FileTimeToSystemTime(&ft, &st); + GetDateFormatA(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, str, length); + int l = strlen(str); + str[l] = ' '; + GetTimeFormatA(LOCALE_USER_DEFAULT, 0, &st, NULL, str+l+1, length-l+1); +} + +static int sprint64u( char* buffer, unsigned __int64 x) { + unsigned __int64 quot = x / 1000; + int chars_written; + if ( quot != 0) { + chars_written = sprint64u( buffer, quot); + chars_written += sprintf( buffer + chars_written, "%03u", ( unsigned int)( x % 1000)); + } + else { + chars_written = sprintf( buffer, "%u", ( unsigned int)( x % 1000)); + } + return chars_written; +} + +int makeHead(char *target, int tSize, __int64 tid, __int64 time){ +// char sttemp[50]; + int l = 0; + target[0] = '\0'; + if (tid != -1){ + l = mir_snprintf(target,tSize,"MinTrhd: "); + StringFromUnixTime(target+l,tSize-l,(long)((tid>>20)/1000)); + l = strlen(target); + l += mir_snprintf(target+l,tSize-l,".%03d", + ((tid>>20)%1000) + ); + l += mir_snprintf(target+l,tSize-l," (%05X)", + (int)(tid&0xFFFFF) + ); + if (time != -1) l += mir_snprintf(target+l,tSize-l,"\n"); + } + if (time != -1){ + l += mir_snprintf(target+l,tSize-l,"MinTime: "); + StringFromUnixTime(target+l,tSize-l,(long)((time)/1000)); + l = strlen(target); + l += mir_snprintf(target+l,tSize-l,".%03d", + ((time)%1000) + ); + } + return l; +} + +void JabberDummyResult( XmlNode *iqNode, void *userdata ){ + JabberLog( "Received DummyResult. id: \"%s\", type: \"%s\"",JabberXmlGetAttrValue( iqNode, "id" ),JabberXmlGetAttrValue( iqNode, "type" )); +} +void JabberEnableNotifications(ThreadData *info){ + int iqId = JabberSerialNext(); + JabberIqAdd( iqId, IQ_PROC_NONE, JabberDummyResult ); + JabberSend( info->s, "", info->username, info->server, iqId); +} + +HANDLE fakeContact = NULL; +static HANDLE fakeContactFindCreate(){ + if (!fakeContact){ + HANDLE fcTemp = ( HANDLE ) JCallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); + while ( fcTemp != NULL ) { + char *szProto = ( char* )JCallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM ) fcTemp, 0 ); + if ( szProto!=NULL && !strcmp( jabberProtoName, szProto )) { + DBVARIANT dbv; + if ( !JGetStringUtf( fcTemp, "FakeContact", &dbv )) { + char *p = dbv.pszVal; + if ( !strncmp( p, "GMAIL", 5 )) { + JFreeVariant( &dbv ); + break; + } + JFreeVariant( &dbv ); + } } + fcTemp = ( HANDLE ) JCallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM ) fcTemp, 0 ); + } + if (!fcTemp){ //Still no FakeContact? Ok, Create one! + fcTemp = ( HANDLE ) JCallService( MS_DB_CONTACT_ADD, 0, 0 ); + JCallService( MS_PROTO_ADDTOCONTACT, ( WPARAM ) fcTemp, ( LPARAM )jabberProtoName ); + JSetString( fcTemp, "FakeContact", "GMAIL" ); + JSetStringUtf( fcTemp, "Nick", "NewMail" ); + DBWriteContactSettingStringUtf( fcTemp, "UserInfo", "MyNotes", "This is a dummy contact to collect new e-mail notifications history"); + JabberLog( "Create Jabber contact jid=%s, nick=%s", jabberProtoName, "NewMail" ); + } + return fcTemp; + } else return fakeContact; +} + +void MyNotification(POPUPDATAEX *ppd){ + unsigned short int gMailUse = (byte)JGetByte( NULL, "GMailUse",1); + BOOL usePopUps = ( gMailUse & 1) & ( ServiceExists(MS_POPUP_QUERY) != 0); + BOOL useFakeContact = (( gMailUse & 2)==2); + if (useFakeContact){ + if (!fakeContact) fakeContact = fakeContactFindCreate(); + // add the message to the fake contact's history + DBEVENTINFO dbei = { 0 }; + int l = strlen(ppd->lpzContactName)+strlen(ppd->lpzText)+2; + char * msg; + msg =( char* )mir_alloc(l); + mir_snprintf(msg,l,"%s\n%s",ppd->lpzContactName,ppd->lpzText); + dbei.cbSize = sizeof( dbei ); + dbei.szModule = jabberProtoName; + dbei.timestamp = time(NULL); + dbei.flags = usePopUps?DBEF_READ:0; // Do not notify twice + dbei.eventType = EVENTTYPE_MESSAGE; + dbei.cbBlob = l; + dbei.pBlob = ( PBYTE )msg; + JCallService( MS_DB_EVENT_ADD, ( WPARAM ) fakeContact, ( LPARAM )&dbei ); + mir_free(msg); + } + if (usePopUps) CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)ppd, 0); + if (!gMailUse) { + JabberLog( "Show PopUp: %s", ppd->lpzContactName); + JabberLog( "Text PopUp: %s", ppd->lpzText); + } +} + +static __int64 maxtid = 0; +static __int64 maxtime = 0; +char soundname[64]; +void __cdecl JabberRerequestMailBoxThread( JABBER_SOCKET s ){ + JabberLog("Re-requestMailBoxThread: %s","Entering"); + NETLIBSELECT nls = {0}; + + nls.cbSize = sizeof( NETLIBSELECT ); + nls.dwTimeout = 60000; // in 1 min in milliseconds + nls.hExceptConns[0] = s; + if ( JCallService( MS_NETLIB_SELECT, 0, ( LPARAM )&nls ) == 0 ) + JabberRequestMailBox(s); + JabberLog("Re-requestMailBoxThread: %s","Exitting"); +} + +static HWND hWndPopupError = 0; +void JabberRequestMailBox(HANDLE hConn){ + +// if(CallService(MS_POPUP_QUERY, PUQS_GETSTATUS, 0)){//will request mailbox only if popup is working + if (hWndPopupError) { + PUDeletePopUp(hWndPopupError); + } + + int iqId = JabberSerialNext(); + if (!maxtid) maxtid = ((__int64)DBGetContactSettingDword( NULL, jabberProtoName,"MaxTidHi",0)<<32)+ + ((__int64)DBGetContactSettingDword( NULL, jabberProtoName,"MaxTidLo",0)); + if (!maxtime) maxtime=((__int64)DBGetContactSettingDword( NULL, jabberProtoName,"MaxTimeHi",0)<<32)+ + ((__int64)DBGetContactSettingDword( NULL, jabberProtoName,"MaxTimeLo",0)); + + JabberIqAdd( iqId, IQ_PROC_NONE, JabberIqResultMailNotify ); + char stid[21]; sprint64u(stid,maxtid); + char stime[21];sprint64u(stime,maxtime); + JabberSend( hConn, "", + iqId, + stime, + stid + ); + if (JGetByte(NULL,"ShowRequest",0)) { + POPUPDATAEX ppd; + ZeroMemory((void *)&ppd, sizeof(ppd)); + ppd.lchContact = 0; + ppd.lchIcon = iconList[12]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: Maibox request",jabberProtoName); + ppd.colorText = JGetDword(NULL,"ColDebugText",0); + ppd.colorBack = JGetDword(NULL,"ColDebugBack",RGB(255,255,128)); + ppd.iSeconds = (WORD)(JGetDword(NULL,"PopUpTimeoutDebug",0xFFFF0000)&0xFFFF); + makeHead(ppd.lpzText, MAX_SECONDLINE - 5,maxtid,maxtime); + MyNotification(&ppd); + } +// } +} + +LRESULT CALLBACK PopupErrorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + switch(message) { + case UM_INITPOPUP: + hWndPopupError = hWnd; + break; + case WM_COMMAND: + if (HIWORD(wParam) != STN_CLICKED) break; + case WM_CONTEXTMENU: + PUDeletePopUp(hWnd); + break; + case UM_FREEPLUGINDATA: + hWndPopupError = 0; + default: + break; + } + return DefWindowProc(hWnd, message, wParam, lParam); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// JabberIqResultMailNotify - Receive the e-mails from gmail:mail:notify + +void JabberIqResultMailNotify( XmlNode *iqNode, void *userdata ) +{ + struct ThreadData *info = ( struct ThreadData * ) userdata; + XmlNode *queryNode; + char* type; + char* str; + + // RECVED: mailbox info + // ACTION: show popups with the received e-mails + //JabberLog( " mailbox" ); + if (( type=JabberXmlGetAttrValue( iqNode, "type" )) == NULL ) return; + + if (( queryNode=JabberXmlGetChild( iqNode, "error" )) ){ // error situation + char *errcode = JabberXmlGetAttrValue( queryNode, "code" ); + char *errtype = JabberXmlGetAttrValue( queryNode, "type" ); + if (((byte)JGetByte( NULL, "GMailUse",1) & 2)==2){ // we use Fake Contact + if (!fakeContact) fakeContact = fakeContactFindCreate(); + JSetWord( fakeContact, "Status", ID_STATUS_NA ); + } + int showresult = JGetByte(NULL,"ShowResult",0); + if (!(showresult & 2)){ // we do not suppress errors + POPUPDATAEX ppd; + ZeroMemory((void *)&ppd, sizeof(ppd)); + ppd.lchContact = 0; + //ppd.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE); + ppd.lchIcon = iconList[11]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: Error Code %s; Type %s.",jabberProtoName, + errcode?errcode:"Unknown", + errtype?errtype:"Unknown"); + XmlNode *textNode = JabberXmlGetChild( queryNode, "text" ); + int l = mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5, "Message: %s: %s\n", + queryNode->numChild?queryNode->child[0]->name:"none", + textNode?JabberUtf8Decode( textNode->text, 0 ):"none" + ); + textNode = JabberXmlGetChild( iqNode, "query" ); + if (textNode) { + __int64 tid = _atoi64(JabberXmlGetAttrValue( textNode, "newer-than-tid" )); + __int64 time = _atoi64(JabberXmlGetAttrValue( textNode, "newer-than-time" )); + l = makeHead(ppd.lpzText+l,MAX_SECONDLINE-5-l,tid,time); + } + + ppd.colorText = JGetDword(NULL,"ColErrorText",0); + ppd.colorBack = JGetDword(NULL,"ColErrorBack",RGB(255,128,128)); + ppd.iSeconds = (WORD)(JGetDword(NULL,"PopUpTimeoutDebug",0xFFFF0000)>>16); + ppd.PluginWindowProc = (WNDPROC)PopupErrorDlgProc; + //JabberLog( "Notify error: %s\n%s", ppd.lpzContactName, ppd.lpzText); + MyNotification(&ppd); + } + if (!(showresult & 4)){ // we do not suppress automatic re-request + if (strcmp(errtype,"cancel")) { // errortype <> cancel: We re-request the mailbox + JabberForkThread( JabberRerequestMailBoxThread, 0, info->s ); + } + } + return; + } + + if (( queryNode=JabberXmlGetChild( iqNode, "mailbox" )) == NULL ) { + //hm... returned result with no data... it happens some time + if (((byte)JGetByte( NULL, "GMailUse",1) & 2)==2){ // we use Fake Contact + if (!fakeContact) fakeContact = fakeContactFindCreate(); + JSetWord( fakeContact, "Status", ID_STATUS_AWAY ); + } + if (!(JGetByte(NULL,"ShowResult",0) & 4)){ // we do not suppress automatic re-request + JabberForkThread( JabberRerequestMailBoxThread, 0, info->s ); + } + return; + } + + if ( !strcmp( type, "result" )) { + str = JabberXmlGetAttrValue( queryNode, "xmlns" ); + if ( str!=NULL && !strcmp( str, "google:mail:notify" )) { + if (((byte)JGetByte( NULL, "GMailUse",1) & 2)==2){ // we use Fake Contact + if (!fakeContact) fakeContact = fakeContactFindCreate(); + JSetWord( fakeContact, "Status", ID_STATUS_ONLINE ); + } + __int64 rt = _atoi64(JabberXmlGetAttrValue( queryNode, "result-time" )); + BOOL syncTimeResult = false; + int drift = ((unsigned int)(rt/1000)) - time(NULL); + if (drift) if ( 0x1 & JGetByte(NULL,"SyncTime",0)){ + SYSTEMTIME st; + LONGLONG ll; + FILETIME ft; + ll = (rt*10000) + 116444736000000000; + ft.dwLowDateTime = (DWORD)ll; + ft.dwHighDateTime = (DWORD)(ll >> 32); + FileTimeToSystemTime(&ft, &st); + syncTimeResult = SetSystemTime(&st); + } + if (JGetByte(NULL,"ShowResult",0)) { + POPUPDATAEX ppd; + ZeroMemory((void *)&ppd, sizeof(ppd)); + ppd.lchContact = 0; + ppd.lchIcon = iconList[12]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: Maibox result: Matched %s", + jabberProtoName, + JabberXmlGetAttrValue( queryNode, "total-matched" ) + ); + ppd.colorText = JGetDword(NULL,"ColDebugText",0); + ppd.colorBack = JGetDword(NULL,"ColDebugBack",RGB(255,255,128)); + ppd.iSeconds = (WORD)(JGetDword(NULL,"PopUpTimeoutDebug",0xFFFF0000)&0xFFFF); + int pos = makeHead(ppd.lpzText, MAX_SECONDLINE - 5, + -1, + rt + ); + if (drift){ + pos += mir_snprintf(ppd.lpzText+pos, MAX_SECONDLINE - 5,"\nLocalDrift: %d seconds", + drift + ); + if (syncTimeResult) mir_snprintf(ppd.lpzText+pos, MAX_SECONDLINE - 5,"; Synchronized."); + } + MyNotification(&ppd); + } else { + if (drift) if ((0x2 & JGetByte(NULL,"SyncTime",0))==0){ + POPUPDATAEX ppd; + ZeroMemory((void *)&ppd, sizeof(ppd)); + ppd.lchContact = 0; + ppd.lchIcon = iconList[13]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: System clock %ssynchronized", + jabberProtoName,syncTimeResult?"":"NOT " + ); + ppd.colorText = JGetDword(NULL,"ColClockText",0); + ppd.colorBack = JGetDword(NULL,"ColClockBack",0); + ppd.iSeconds = (WORD)(JGetDword(NULL,"PopUpTimeout",0x0000FFFF)>>16); + mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5,"LocalDrift: %d seconds", + drift + ); + MyNotification(&ppd); + } + } + XmlNode *threadNode; + int i; + for ( i=0; inumChild; i++ ) { + threadNode = queryNode->child[i]; + __int64 gtstamp = _atoi64(JabberXmlGetAttrValue( threadNode, "tid" )); + if (gtstamp>maxtid)maxtid=gtstamp; + __int64 gmstamp = _atoi64(JabberXmlGetAttrValue( threadNode, "date" )); + if (gmstamp>maxtime)maxtime=gmstamp; + int numMesg = atoi(JabberXmlGetAttrValue( threadNode, "messages" )); + char mesgs[10]; + if (numMesg>1) mir_snprintf(mesgs,10," (%d)",numMesg); else mesgs[0] = '\0'; + char sttime[50]; + StringFromUnixTime(sttime,50,(long)(gmstamp/1000)); +// char stthread[50]; +// StringFromUnixTime(stthread,50,(long)((gtstamp>>20)/1000)); + XmlNode *sendersNode = JabberXmlGetChild( threadNode, "senders" ); + int k; char sendersList[150]; + sendersList[0] = '\0'; + mir_snprintf(sendersList,150,"%s: New mail from ",jabberProtoName); + if (sendersNode) for ( k=0; knumChild; k++ ) { + strncat(sendersList,k?", ":"",150); + char * senderName = JabberXmlGetAttrValue(sendersNode->child[k],"name"); + if (!senderName) senderName = JabberXmlGetAttrValue(sendersNode->child[k],"address"); + strncat(sendersList,JabberUtf8Decode(senderName,0),150); + } +// JabberLog( "Senders: %s",sendersList ); + { //create and show popup + POPUPDATAEX ppd; + ZeroMemory((void *)&ppd, sizeof(ppd)); + ppd.lchContact = 0; + ppd.lchIcon = iconList[10]; + strncpy(ppd.lpzContactName, sendersList, MAX_CONTACTNAME); + sendersNode = JabberXmlGetChild( threadNode, "subject" ); + XmlNode *snippetNode = JabberXmlGetChild( threadNode, "snippet" ); + mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5, "Subject%s: %s\n%Time: %s\n%s", + mesgs, + sendersNode?JabberUtf8Decode( sendersNode->text, 0 ):"none", + sttime, + snippetNode?JabberUtf8Decode( snippetNode->text, 0 ):"none" + ); + ppd.colorText = JGetDword(NULL,"ColMsgText",0); + ppd.colorBack = JGetDword(NULL,"ColMsgBack",0); + ppd.iSeconds = (WORD)(JGetDword(NULL,"PopUpTimeout",0x0000FFFF)&0xFFFF); + POPUP_ACCINFO * acci = NULL; + if (JGetByte("OnClick",1)){ + if ((JGetByte( NULL, "GMailUse",1) & 1) & ( ServiceExists(MS_POPUP_QUERY) != 0)){ + acci = (POPUP_ACCINFO*)malloc(sizeof(POPUP_ACCINFO)); + ZeroMemory(acci, sizeof(acci)); //This is always a good thing to do. + ppd.PluginWindowProc = (WNDPROC)PopupDlgProc; + acci->username = info->username; + acci->password = info->password; + acci->tid = gtstamp; + ppd.PluginData = (void *)acci; + } } + MyNotification(&ppd); + } + SkinPlaySound(soundname); + } + JSetDword(NULL,"MaxTidLo",(DWORD)maxtid); + JSetDword(NULL,"MaxTidHi",(DWORD)(maxtid>>32)); + JSetDword(NULL,"MaxTimeLo",(DWORD)maxtime); + JSetDword(NULL,"MaxTimeHi",(DWORD)(maxtime>>32)); + } + } +} + +LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + POPUP_ACCINFO * mpd = NULL; + switch(message) { + case WM_COMMAND: + if (HIWORD(wParam) == STN_CLICKED) { //It was a click on the Popup. + char url[MAX_PATH]; + mpd = (POPUP_ACCINFO * )PUGetPluginData(hWnd); + if ((mpd) && (int)mpd!=-1){ + mir_snprintf(url,MAX_PATH, +// "https://www.google.com/accounts/ServiceLoginAuth?service=mail&Email=%s&Passwd=%s&continue=https://mail.google.com/mail/", +//http://mail.google.com/mail/?view=cv&search=inbox&th=10859fac99369d5f&lvp=-1&cvp=9&qt=&fs=1&tf=1 +//http%3A%2F%2Fmail.google.com%2Fmail%3Fview%3Dcv%26search%3Dinbox%26th%3D1085ab8ed25d733c%26lvp%3D-1%26cvp%3D9%26qt%3D%26fs%3D1%26tf%3D1&source=googletalk + "https://www.google.com/accounts/ServiceLoginAuth?service=mail&Email=%s&Passwd=%s&continue=http%%3A%%2F%%2Fmail.google.com%%2Fmail%%3Fview%%3Dcv%%26search%%3Dinbox%%26th%%3D%x%x%%26lvp%%3D-1%%26cvp%%3D9%%26qt%%3D%%26fs%%3D1%%26tf%%3D1&source=googletalk", + mpd->username, + mpd->password, + (DWORD)(mpd->tid>>32), + (DWORD)(mpd->tid) + ); +// JabberLog("Redir: %s",url); + CallService(MS_UTILS_OPENURL,1,(LPARAM)url); + } + PUDeletePopUp(hWnd); + return TRUE; + } + break; + case WM_CONTEXTMENU: { + PUDeletePopUp(hWnd); + break; + } + case UM_FREEPLUGINDATA: { + mpd = (POPUP_ACCINFO * )PUGetPluginData(hWnd); + if ((mpd) && (int)mpd!=-1) free(mpd); + return TRUE; //TRUE or FALSE is the same, it gets ignored. + } + default: + break; + } + return DefWindowProc(hWnd, message, wParam, lParam); +} + +int saveChatsToServer = -1; //-1: unknown; 0: disabled; 1: enabled +extern long GMailOptsDlg; +void JabberUserConfigResult( XmlNode *iqNode, void *userdata ){ + struct ThreadData *info = ( struct ThreadData * ) userdata; + XmlNode *queryNode; + char* type; + int tempSaveChatsToServer = saveChatsToServer; + saveChatsToServer = -1; + JabberLog( "Received JabberUserConfigResult"); + if (( type=JabberXmlGetAttrValue( iqNode, "type" )) == NULL ) goto LBLEnd; + if (( queryNode=JabberXmlGetChild( iqNode, "error" )) )goto LBLEnd; // error situation + /*if ( !strcmp( type, "result" ))*/ { + char *str; + if (( queryNode=JabberXmlGetChild( iqNode, "usersetting" )) == NULL ) goto LBLOK; + str = JabberXmlGetAttrValue( queryNode, "xmlns" ); + if ( str!=NULL && !strcmp( str, "google:setting" )) { + XmlNode *settingNode = JabberXmlGetChild( queryNode, "archivingenabled" ); + str = JabberXmlGetAttrValue(settingNode,"value"); + if (str){ + if ( !strcmp( str, "true" )) tempSaveChatsToServer = 1; + if ( !strcmp( str, "false" )) tempSaveChatsToServer = 0; + } + } else goto LBLEnd; +LBLOK: + saveChatsToServer = tempSaveChatsToServer; + } +LBLEnd: + if (GMailOptsDlg) SetDlgItemText((HWND)GMailOptsDlg, IDC_SAVECHATS, (saveChatsToServer==-1)?TranslateT("Unknown"):(saveChatsToServer?TranslateT("Enabled"):TranslateT("Disabled"))); +} + +void JabberUserConfigRequest(ThreadData *info){ + int iqId = JabberSerialNext(); + if (saveChatsToServer!=-1) { + //send the option + JabberIqAdd( iqId, IQ_PROC_NONE, JabberDummyResult ); + JabberSend( info->s, "", info->username, info->server, iqId, saveChatsToServer?"false":"true"); +// saveChatsToServer = saveChatsToServer?0:1; + iqId = JabberSerialNext(); //we already used the initial one + } + JabberIqAdd( iqId, IQ_PROC_NONE, JabberUserConfigResult ); + JabberSend( info->s, "", info->username, info->server, iqId); +} + +BOOL CALLBACK JabberGmailOptDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ){ + BOOL bChecked; + BOOL popupavail; + + switch ( msg ) { + case WM_INITDIALOG: + { + TranslateDialogDefault( hwndDlg ); + int gmailuse = JGetByte( NULL, "GMailUse",1); + popupavail = ServiceExists(MS_POPUP_QUERY); + CheckDlgButton( hwndDlg, IDC_USEPOPUP, (0x1 & gmailuse)); + CheckDlgButton( hwndDlg, IDC_USEFAKE, (0x2 & gmailuse)==2); + int i; + int engmail = (i = JGetByte(NULL,"EnableGMail",1))&1; + CheckDlgButton( hwndDlg, IDC_ENGMAIL, (0x1 & i)); + EnableWindow(GetDlgItem(hwndDlg, IDC_USEPOPUP),popupavail ); + popupavail &= gmailuse; + popupavail &= (0x1 & i); + CheckDlgButton( hwndDlg, IDC_ENGMAILSTARTUP, (0x2 & i)); + CheckDlgButton( hwndDlg, IDC_SHOWREQUEST, JGetByte(NULL,"ShowRequest",0)); + i = JGetByte(NULL,"ShowResult",0); + CheckDlgButton( hwndDlg, IDC_SHOWRESULT, 0x1 & i); + CheckDlgButton( hwndDlg, IDC_SUPERR, 0x2 & i); + CheckDlgButton( hwndDlg, IDC_SUPREREQUEST, 0x4 & i); + i = JGetByte(NULL,"SyncTime",0); + CheckDlgButton( hwndDlg, IDC_SYNCHRONIZE, (0x1 & i)); + CheckDlgButton( hwndDlg, IDC_SYNCHRONIZESILENT, (0x2 & i)!=0); + EnableWindow( GetDlgItem( hwndDlg, IDC_SYNCHRONIZESILENT ), engmail && (0x1 & i)); + CheckDlgButton( hwndDlg, IDC_VISITGMAIL, JGetByte("OnClick",1)); + EnableWindow( GetDlgItem( hwndDlg, IDC_VISITGMAIL ), engmail && popupavail ); + CheckDlgButton( hwndDlg, IDC_INVASUNAVAIL, JGetByte(NULL,"InvAsUnavail",TRUE)); + EnableWindow( GetDlgItem( hwndDlg, IDC_ENGMAILSTARTUP ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_USEFAKE ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_FORCECHECK ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SYNCHRONIZE ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SHOWREQUEST ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SHOWRESULT ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_PREVIEW ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SUPERR ), engmail ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SUPREREQUEST ), engmail ); + + SendDlgItemMessage(hwndDlg,IDC_COLOURTEXT,CPM_SETCOLOUR,0,JGetDword(NULL,"ColMsgText",0)); + SendDlgItemMessage(hwndDlg,IDC_COLOURBACK,CPM_SETCOLOUR,0,JGetDword(NULL,"ColMsgBack",0)); + SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURTEXT,CPM_SETCOLOUR,0,JGetDword(NULL,"ColDebugText",0)); + SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURBACK,CPM_SETCOLOUR,0,JGetDword(NULL,"ColDebugBack",RGB(255,255,128))); + SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURTEXT,CPM_SETCOLOUR,0,JGetDword(NULL,"ColErrorText",0)); + SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURBACK,CPM_SETCOLOUR,0,JGetDword(NULL,"ColErrorBack",RGB(255,128,128))); + SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURTEXT,CPM_SETCOLOUR,0,JGetDword(NULL,"ColClockText",0)); + SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURBACK,CPM_SETCOLOUR,0,JGetDword(NULL,"ColClockBack",0)); + i = JGetDword(NULL,"PopUpTimeout",0x0000FFFF); + SetDlgItemInt(hwndDlg, IDC_EDIT_TIMEOUT,((i&0xFFFF)==0xFFFF)?-1:(i&0xFFFF),TRUE); + SetDlgItemInt(hwndDlg, IDC_EDIT_CLOCKTIMEOUT,((i>>16)==0xFFFF)?-1:(i>>16),TRUE); + i = JGetDword(NULL,"PopUpTimeoutDebug",0xFFFF0000); + SetDlgItemInt(hwndDlg, IDC_EDIT_DEBUGTIMEOUT,((i&0xFFFF)==0xFFFF)?-1:(i&0xFFFF),TRUE); + SetDlgItemInt(hwndDlg, IDC_EDIT_ERRORTIMEOUT,((i>>16)==0xFFFF)?-1:(i>>16),TRUE); + SetDlgItemText(hwndDlg, IDC_SAVECHATS, (saveChatsToServer==-1)?TranslateT("Unknown"):(saveChatsToServer?TranslateT("Enabled"):TranslateT("Disabled"))); + + return TRUE; + } + case WM_COMMAND: + switch ( LOWORD( wParam )) { + case IDC_ENGMAIL: + bChecked = IsDlgButtonChecked( hwndDlg, LOWORD( wParam ) ); + popupavail = ServiceExists(MS_POPUP_QUERY); + EnableWindow( GetDlgItem( hwndDlg, IDC_ENGMAILSTARTUP ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_USEPOPUP ), bChecked && popupavail); + EnableWindow( GetDlgItem( hwndDlg, IDC_USEFAKE ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_FORCECHECK ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SYNCHRONIZE ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SHOWREQUEST ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SHOWRESULT ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_PREVIEW ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_VISITGMAIL ), bChecked && popupavail); + EnableWindow( GetDlgItem( hwndDlg, IDC_SUPERR ), bChecked ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SUPREREQUEST ), bChecked ); + case IDC_SYNCHRONIZE: + bChecked = IsDlgButtonChecked( hwndDlg, LOWORD( wParam ) ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SYNCHRONIZESILENT), bChecked ); + goto LBL_Apply; + case IDC_USEPOPUP: + bChecked = IsDlgButtonChecked( hwndDlg, LOWORD( wParam ) ); + EnableWindow( GetDlgItem( hwndDlg, IDC_VISITGMAIL ), bChecked ); + goto LBL_Apply; + case IDC_PREVIEW: { + if (IsDlgButtonChecked( hwndDlg, IDC_ENGMAIL )){ + //Declarations and initializations + POPUPDATAEX ppd = { 0 }; + char sendersList[150]; + + { // show the error popup + ppd.lchIcon = iconList[11]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: Error Code %s; Type %s.",jabberProtoName, + "500", + "wait"); + mir_snprintf(sendersList,150,"Unable to access mailbox for %s",jabberJID); + int l = mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5, "Message: %s\n", + sendersList + ); + l = makeHead(ppd.lpzText+l,MAX_SECONDLINE-5-l,maxtid,maxtime); + ppd.colorText = SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURTEXT,CPM_GETCOLOUR,0,0); + ppd.colorBack = SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURBACK,CPM_GETCOLOUR,0,0);//RGB(255,128,128); + ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_EDIT_ERRORTIMEOUT, NULL, TRUE); + MyNotification(&ppd); + } + if (IsDlgButtonChecked( hwndDlg, IDC_SHOWREQUEST ) ){ + ppd.lchIcon = iconList[12]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: Maibox request",jabberProtoName); + ppd.colorText = SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURTEXT,CPM_GETCOLOUR,0,0); + ppd.colorBack = SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURBACK,CPM_GETCOLOUR,0,0);//RGB(255,255,128); + makeHead(ppd.lpzText, MAX_SECONDLINE - 5,maxtid,maxtime); + ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_EDIT_DEBUGTIMEOUT, NULL, TRUE); + MyNotification(&ppd); + } + if (IsDlgButtonChecked( hwndDlg, IDC_SHOWRESULT ) ){ + ppd.lchIcon = iconList[12]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: Maibox result: Matched %s", + jabberProtoName, + "1" + ); + ppd.colorText = SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURTEXT,CPM_GETCOLOUR,0,0); + ppd.colorBack = SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURBACK,CPM_GETCOLOUR,0,0);//RGB(255,255,128); + ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_EDIT_DEBUGTIMEOUT, NULL, TRUE); + int pos = makeHead(ppd.lpzText, MAX_SECONDLINE - 5, + -1, + ((_int64)time(NULL)*1000+784) + ); + pos += mir_snprintf(ppd.lpzText+pos, MAX_SECONDLINE - 5,"\nLocalDrift: %d seconds", 5); + if (IsDlgButtonChecked( hwndDlg, IDC_SYNCHRONIZE )) strncat(ppd.lpzText,"; Synchronized.", MAX_SECONDLINE - 5); + MyNotification(&ppd); + } else { // the clock syncronisation will be shown only if the result popup is disabled + if (IsDlgButtonChecked( hwndDlg, IDC_SYNCHRONIZE ) && (IsDlgButtonChecked( hwndDlg, IDC_SYNCHRONIZESILENT )==0)){ + ppd.lchIcon = iconList[13]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: System clock %ssynchronized", + jabberProtoName,"" + ); + ppd.colorText = SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURTEXT,CPM_GETCOLOUR,0,0); + ppd.colorBack = SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURBACK,CPM_GETCOLOUR,0,0);//RGB(255,255,128); + ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_EDIT_CLOCKTIMEOUT, NULL, TRUE); + mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5,"LocalDrift: %d seconds", + 5 + ); + MyNotification(&ppd); + } + } + ppd.lchIcon = iconList[10]; + mir_snprintf(ppd.lpzContactName,150,"%s: New mail from ",jabberProtoName); + strncat(ppd.lpzContactName,"Some One, Me Myself",150); + StringFromUnixTime(sendersList,50,time(NULL)); + mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5, "Subject%s: %s\n%Time: %s\n%s", + "(3)", + "A GMail notify test", + sendersList, + "Hi, I am trying the e-mail notification in JGmail.dll" + ); + ppd.colorText = SendDlgItemMessage(hwndDlg,IDC_COLOURTEXT,CPM_GETCOLOUR,0,0); + ppd.colorBack = SendDlgItemMessage(hwndDlg,IDC_COLOURBACK,CPM_GETCOLOUR,0,0); + ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_EDIT_TIMEOUT, NULL, TRUE); + MyNotification(&ppd); + SkinPlaySound(soundname); + } + } + break; + case IDC_FORCECHECK:{ + __int64 tmptid = maxtid; + __int64 tmptime = maxtime; + maxtid = 1; + maxtime= 1; + if (jabberThreadInfo)JabberRequestMailBox(jabberThreadInfo->s); + else { + POPUPDATAEX ppd = { 0 }; + ppd.lchIcon = iconList[11]; + mir_snprintf(ppd.lpzContactName, MAX_SECONDLINE - 5, "%s: No connection.",jabberProtoName); + mir_snprintf(ppd.lpzText, MAX_SECONDLINE - 5, "Impossible to check"); + ppd.colorText = SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURTEXT,CPM_GETCOLOUR,0,0); + ppd.colorBack = SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURBACK,CPM_GETCOLOUR,0,0);//RGB(255,128,128); + ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_EDIT_ERRORTIMEOUT, NULL, TRUE); + MyNotification(&ppd); + } + maxtid = tmptid; + maxtime = tmptime; + }break; + case IDC_SAVECHATS:{ + if (jabberThreadInfo)JabberUserConfigRequest(jabberThreadInfo); + }break; + case IDC_EDIT_TIMEOUT: + case IDC_EDIT_DEBUGTIMEOUT: + case IDC_EDIT_ERRORTIMEOUT: + case IDC_EDIT_CLOCKTIMEOUT: + if (HIWORD(wParam)==EN_KILLFOCUS){ + int i = GetDlgItemInt(hwndDlg, LOWORD( wParam ), NULL, TRUE); + SetDlgItemInt(hwndDlg, LOWORD( wParam ),((i<-1)?-1:((i>0xFFFE)?0xFFFE:i)),TRUE); + } + if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return true; + goto LBL_Apply; + case IDC_RESET: { + SendDlgItemMessage(hwndDlg,IDC_COLOURTEXT,CPM_SETCOLOUR,0,0); + SendDlgItemMessage(hwndDlg,IDC_COLOURBACK,CPM_SETCOLOUR,0,0); + SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURTEXT,CPM_SETCOLOUR,0,0); + SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURBACK,CPM_SETCOLOUR,0,RGB(255,255,128)); + SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURTEXT,CPM_SETCOLOUR,0,0); + SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURBACK,CPM_SETCOLOUR,0,RGB(255,128,128)); + SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURTEXT,CPM_SETCOLOUR,0,0); + SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURBACK,CPM_SETCOLOUR,0,0); + SetDlgItemInt(hwndDlg, IDC_EDIT_TIMEOUT,-1,TRUE); + SetDlgItemInt(hwndDlg, IDC_EDIT_CLOCKTIMEOUT,0,TRUE); + SetDlgItemInt(hwndDlg, IDC_EDIT_DEBUGTIMEOUT,0,TRUE); + SetDlgItemInt(hwndDlg, IDC_EDIT_ERRORTIMEOUT,-1,TRUE); + } + default: + LBL_Apply: + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + break; + } + break; + case WM_NOTIFY: + if (( ( LPNMHDR ) lParam )->code == PSN_APPLY ) { + int i = 0; + bChecked = 0; + if (IsDlgButtonChecked( hwndDlg, IDC_ENGMAIL )) bChecked += 1; + if (IsDlgButtonChecked( hwndDlg, IDC_ENGMAILSTARTUP )) bChecked += 2; + JSetByte( "EnableGMail",bChecked); + if (bChecked & 1){ + JSetByte( "ShowRequest", ( BYTE ) IsDlgButtonChecked( hwndDlg, IDC_SHOWREQUEST )); + i = IsDlgButtonChecked( hwndDlg, IDC_SHOWRESULT ); + if (IsDlgButtonChecked( hwndDlg, IDC_SUPERR )) i |= 2; + if (IsDlgButtonChecked( hwndDlg, IDC_SUPREREQUEST )) i |= 4; + JSetByte( "ShowResult", ( BYTE ) i); + JSetByte( "OnClick", ( BYTE ) IsDlgButtonChecked( hwndDlg, IDC_VISITGMAIL )); + } + bChecked = IsDlgButtonChecked( hwndDlg, IDC_USEPOPUP ); + bChecked |= (IsDlgButtonChecked( hwndDlg, IDC_USEFAKE )<<1); + JSetByte( "GMailUse",bChecked); + i = IsDlgButtonChecked( hwndDlg, IDC_SYNCHRONIZE ); + if (IsDlgButtonChecked( hwndDlg, IDC_SYNCHRONIZESILENT )) i |= 2; + JSetByte( "SyncTime",i); + JSetByte( "InvAsUnavail", ( BYTE ) IsDlgButtonChecked( hwndDlg, IDC_INVASUNAVAIL )); + JSetDword(NULL, "ColMsgText", SendDlgItemMessage(hwndDlg,IDC_COLOURTEXT,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColMsgBack", SendDlgItemMessage(hwndDlg,IDC_COLOURBACK,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColDebugText", SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURTEXT,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColDebugBack", SendDlgItemMessage(hwndDlg,IDC_DEBUGCOLOURBACK,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColErrorText", SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURTEXT,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColErrorBack", SendDlgItemMessage(hwndDlg,IDC_ERRORCOLOURBACK,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColClockText", SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURTEXT,CPM_GETCOLOUR,0,0)); + JSetDword(NULL, "ColClockBack", SendDlgItemMessage(hwndDlg,IDC_CLOCKCOLOURBACK,CPM_GETCOLOUR,0,0)); + i = ((WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_CLOCKTIMEOUT, NULL, TRUE)<<16) | ((WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_TIMEOUT, NULL, TRUE)); + JSetDword(NULL,"PopUpTimeout",i); + i = ((WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_ERRORTIMEOUT, NULL, TRUE)<<16) | ((WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_DEBUGTIMEOUT, NULL, TRUE)); + JSetDword(NULL,"PopUpTimeoutDebug",i); + + } + break; + }//switch (msg) +return false; +} + diff -rduN1 JabberG/google_token.cpp JGmail/google_token.cpp --- JabberG/google_token.cpp Thu Jan 1 01:00:00 1970 +++ JGmail/google_token.cpp Tue Mar 28 20:00:00 2006 @@ -0,0 +1,472 @@ +/* +Plugin of Miranda IM for communicating with users of the MSN Messenger protocol. +Copyright (c) 2003-5 George Hazan. +Copyright (c) 2002-3 Richard Hughes (original version). + +Miranda IM: the free icq client for MS Windows +Copyright (C) 2000-2002 Richard Hughes, Roland Rabien & Tristan Van de Vreede + +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 2 +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, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "jabber.h" +#include "version.h" + +void __stdcall JabberLog( const char* fmt, ... ); +#define respString "Step %d: Responce is %stive: %s" +#define SSL_BUF_SIZE 8192 + +///////////////////////////////////////////////////////////////////////////////////////// +// Basic SSL operation class +struct SSL_Base +{ + + virtual ~SSL_Base() {} + + virtual int init() = 0; + virtual char* getSslToken( char* data ) = 0; + char * result; +}; + + + +///////////////////////////////////////////////////////////////////////////////////////// +// WinInet class +///////////////////////////////////////////////////////////////////////////////////////// + +//all that junk out if static SSL is used +#ifndef STATICSSL + +#define ERROR_FLAGS (FLAGS_ERROR_UI_FILTER_FOR_ERRORS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS ) + +#include "wininet.h" + + +typedef BOOL ( WINAPI *ft_HttpQueryInfo )( HINTERNET, DWORD, LPVOID, LPDWORD, LPDWORD ); +typedef BOOL ( WINAPI *ft_HttpSendRequest )( HINTERNET, LPCSTR, DWORD, LPVOID, DWORD ); +typedef BOOL ( WINAPI *ft_InternetCloseHandle )( HINTERNET ); +typedef DWORD ( WINAPI *ft_InternetErrorDlg )( HWND, HINTERNET, DWORD, DWORD, LPVOID* ); +typedef BOOL ( WINAPI *ft_InternetSetOption )( HINTERNET, DWORD, LPVOID, DWORD ); +typedef BOOL ( WINAPI *ft_InternetReadFile )( HINTERNET, LPVOID, DWORD, LPDWORD ); + +typedef HINTERNET ( WINAPI *ft_HttpOpenRequest )( HINTERNET, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPCSTR*, DWORD, DWORD ); +typedef HINTERNET ( WINAPI *ft_InternetConnect )( HINTERNET, LPCSTR, INTERNET_PORT, LPCSTR, LPCSTR, DWORD, DWORD, DWORD ); +typedef HINTERNET ( WINAPI *ft_InternetOpen )( LPCSTR, DWORD, LPCSTR, LPCSTR, DWORD ); + +#define ERROR_INTERNET_SEC_CERT_ERRORS (INTERNET_ERROR_BASE + 55) +#define ERROR_INTERNET_SEC_CERT_NO_REV (INTERNET_ERROR_BASE + 56) +#define ERROR_INTERNET_SEC_CERT_REV_FAILED (INTERNET_ERROR_BASE + 57) + +struct SSL_WinInet : public SSL_Base +{ + virtual ~SSL_WinInet(); + + virtual char* getSslToken( char* data ); + virtual int init(); + + char* getSslResult(char * parUrl, char* data ); + + void readInput( HINTERNET ); +private: int stage; + + //----------------------------------------------------------------------------------- + HMODULE m_dll; + + ft_InternetCloseHandle f_InternetCloseHandle; + ft_InternetConnect f_InternetConnect; + ft_InternetErrorDlg f_InternetErrorDlg; + ft_InternetOpen f_InternetOpen; + ft_InternetReadFile f_InternetReadFile; + ft_InternetSetOption f_InternetSetOption; + ft_HttpOpenRequest f_HttpOpenRequest; + ft_HttpQueryInfo f_HttpQueryInfo; + ft_HttpSendRequest f_HttpSendRequest; +}; + +///////////////////////////////////////////////////////////////////////////////////////// + +int SSL_WinInet::init() +{ + if (( m_dll = LoadLibraryA( "WinInet.dll" )) == NULL ) + return 10; + + f_InternetCloseHandle = (ft_InternetCloseHandle)GetProcAddress( m_dll, "InternetCloseHandle" ); + f_InternetConnect = (ft_InternetConnect)GetProcAddress( m_dll, "InternetConnectA" ); + f_InternetErrorDlg = (ft_InternetErrorDlg)GetProcAddress( m_dll, "InternetErrorDlg" ); + f_InternetOpen = (ft_InternetOpen)GetProcAddress( m_dll, "InternetOpenA" ); + f_InternetReadFile = (ft_InternetReadFile)GetProcAddress( m_dll, "InternetReadFile" ); + f_InternetSetOption = (ft_InternetSetOption)GetProcAddress( m_dll, "InternetSetOptionA" ); + f_HttpOpenRequest = (ft_HttpOpenRequest)GetProcAddress( m_dll, "HttpOpenRequestA" ); + f_HttpQueryInfo = (ft_HttpQueryInfo)GetProcAddress( m_dll, "HttpQueryInfoA" ); + f_HttpSendRequest = (ft_HttpSendRequest)GetProcAddress( m_dll, "HttpSendRequestA" ); + + stage = 0; + result= 0; + + return 0; +} + +SSL_WinInet::~SSL_WinInet() +{ + #if defined( _UNICODE ) + FreeLibrary( m_dll ); // we free WININET.DLL only if we're under NT + #endif + if (result) mir_free(result); + result = NULL; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +void SSL_WinInet::readInput( HINTERNET hRequest ) +{ + DWORD dwSize; + + do { + char tmpbuf[100]; + f_InternetReadFile( hRequest, tmpbuf, 50, &dwSize); + } + while (dwSize != 0); +} + +char* SSL_WinInet::getSslResult(char * parUrl, char* data ) +{ + stage++; + DWORD tFlags = + INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | + INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | + INTERNET_FLAG_IGNORE_CERT_CN_INVALID | + INTERNET_FLAG_IGNORE_CERT_DATE_INVALID | + INTERNET_FLAG_KEEP_CONNECTION | + INTERNET_FLAG_NO_AUTO_REDIRECT | + INTERNET_FLAG_NO_CACHE_WRITE | + INTERNET_FLAG_NO_COOKIES | + INTERNET_FLAG_RELOAD | + INTERNET_FLAG_SECURE; + + const DWORD tInternetFlags = + INTERNET_FLAG_NO_COOKIES | + INTERNET_FLAG_NO_UI | + INTERNET_FLAG_PRAGMA_NOCACHE | + INTERNET_FLAG_SECURE; + + char* urlStart = strstr( parUrl, "://" ); + if ( urlStart == NULL ) + urlStart = parUrl; + else + urlStart += 3; + + { int tLen = strlen( urlStart )+1; + parUrl = ( char* )alloca( tLen ); + memcpy( parUrl, urlStart, tLen ); + } + + char* tObjectName = ( char* )strchr( parUrl, '/' ); + if ( tObjectName != NULL ) { + int tLen = strlen( tObjectName )+1; + char* newBuf = ( char* )alloca( tLen ); + memcpy( newBuf, tObjectName, tLen ); + + *tObjectName = 0; + tObjectName = newBuf; + } + else tObjectName = "/"; + + + + HINTERNET tNetHandle; + char* tBuffer = ( char* )_alloca( SSL_BUF_SIZE ); + + tNetHandle = f_InternetOpen( "Miranda IM (JGmail "__VERSION_STRING")", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, tInternetFlags ); + + if ( tNetHandle == NULL ) { + JabberLog( "InternetOpen() failed" ); + return NULL; + } + +// JabberLog( "SSL request: '%s'", data ); + + char* tSslAnswer = NULL; + + HINTERNET tUrlHandle = f_InternetConnect( tNetHandle, parUrl, INTERNET_DEFAULT_HTTPS_PORT, "", "", INTERNET_SERVICE_HTTP, INTERNET_FLAG_NO_AUTO_REDIRECT + INTERNET_FLAG_NO_COOKIES, 0 ); + if ( tUrlHandle != NULL ) { + HINTERNET tRequest = f_HttpOpenRequest( tUrlHandle, "POST", tObjectName, NULL, "", NULL, tFlags, NULL ); + if ( tRequest != NULL ) { + DWORD tBufSize; + bool bProxyParamsSubstituted = false; + +LBL_Restart: + JabberLog( "Step %d: Sending request %s%s...", stage, parUrl, tObjectName ); +#define HTTP_ADD_HEADERS "Content-Type: application/x-www-form-urlencoded\r\nX-Opinion: WinInet is evil" + DWORD tErrorCode = f_HttpSendRequest( tRequest, HTTP_ADD_HEADERS, strlen(HTTP_ADD_HEADERS), data, strlen(data) ); +// DWORD tErrorCode = f_HttpSendRequest( tRequest, NULL, 0, NULL, 0 ); + if ( tErrorCode == 0 ) { + int lastError = GetLastError(); + JabberLog( "HttpSendRequest() failed with error %ld", lastError); + tSslAnswer = strdup( "" ); + + if ( lastError == 2 ) + JabberLog( "Internet Explorer is in the 'Offline' mode. Switch IE to the 'Online' mode and then try to relogin" ); + } + else { + DWORD dwCode; + tBufSize = sizeof( dwCode ); + f_HttpQueryInfo( tRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwCode, &tBufSize, 0 ); + + switch( dwCode ) { + case HTTP_STATUS_REDIRECT: + tBufSize = SSL_BUF_SIZE; + f_HttpQueryInfo( tRequest, HTTP_QUERY_LOCATION, tBuffer, &tBufSize, NULL ); + JabberLog( "Redirected to '%s'", tBuffer ); + tSslAnswer = getSslResult( tBuffer, data ); + break; + + case HTTP_STATUS_DENIED: + case HTTP_STATUS_PROXY_AUTH_REQ: + case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: + case ERROR_INTERNET_INCORRECT_PASSWORD: + case ERROR_INTERNET_INVALID_CA: + case ERROR_INTERNET_POST_IS_NON_SECURE: + case ERROR_INTERNET_SEC_CERT_CN_INVALID: + case ERROR_INTERNET_SEC_CERT_DATE_INVALID: + case ERROR_INTERNET_SEC_CERT_ERRORS: + case ERROR_INTERNET_SEC_CERT_NO_REV: + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + JabberLog( "HttpSendRequest returned error code %d", tErrorCode ); + if ( ERROR_INTERNET_FORCE_RETRY == f_InternetErrorDlg( GetDesktopWindow(), tRequest, tErrorCode, ERROR_FLAGS, NULL )) { + readInput( tRequest ); + goto LBL_Restart; + } + + // else fall into the general error handling routine + + case HTTP_STATUS_OK: + JabberLog(respString,stage,"posi","OK"); + { + unsigned long numRead = 0; +// f_HttpQueryInfo( tRequest, HTTP_QUERY_RAW_HEADERS_CRLF, tBuffer, &tBufSize, NULL ); + if (f_InternetReadFile(tRequest, tBuffer, SSL_BUF_SIZE, &numRead)){ + tBuffer[numRead] = '\0'; + //JabberLog("numRead: %d; Data: %s\n",numRead,tBuffer); + tSslAnswer = strdup( tBuffer ); + } else { + tSslAnswer = strdup( "" ); + } + } + break; + default: + tBufSize = SSL_BUF_SIZE; + if ( !f_HttpQueryInfo( tRequest, HTTP_QUERY_STATUS_TEXT, tBuffer, &tBufSize, NULL )) + strcpy( tBuffer, "unknown error" ); + JabberLog(respString,stage,"nega",tBuffer); + tSslAnswer = strdup( "" ); + } } + + f_InternetCloseHandle( tRequest ); + } + + f_InternetCloseHandle( tUrlHandle ); + } + else JabberLog( "InternetOpenUrl() failed" ); + + f_InternetCloseHandle( tNetHandle ); + return tSslAnswer; +} + +char* SSL_WinInet::getSslToken(char * data){ + char *sslResult = getSslResult("https://www.google.com/accounts/ClientAuth",data); +// char *sslResult = getSslResult("https://10.1.93.182:443/accounts/ClientAuth",data); + int len = strlen(sslResult); + char *temp; + char * SID = NULL; + char * LSID = NULL; + temp = sslResult; + while (temp < sslResult+len){ + if (!strncmp(temp,"SID=",4)) SID = temp; + if (!strncmp(temp,"LSID=",5)) LSID = temp; + temp = strchr(temp,'\n'); + temp[0] = '\0'; if (temp[-1] == '\r') temp[-1] = '\0'; // awful code! + temp++; + } + if (SID && LSID){ + temp = (char *)mir_alloc(SSL_BUF_SIZE); + mir_snprintf(temp,SSL_BUF_SIZE,"%s&%s&service=mail&Session=true\r\n",SID,LSID); + free(sslResult); + sslResult = getSslResult("https://www.google.com/accounts/IssueAuthToken",temp); + len = strlen(sslResult); + if (sslResult[len-1]=='\n') {len--; sslResult[len]='\0';} + if (sslResult[len-1]=='\r') {len--; sslResult[len]='\0';} + if (len){ + result = (char *)mir_alloc(len+1); + strcpy(result,sslResult); + } + } else JabberLog("Server did not return SID and LSID"); + free(sslResult); + return result; +} +#endif //#ifdef STATICSSL + +///////////////////////////////////////////////////////////////////////////////////////// +// Performs the login via SSL3 using the OpenSSL library + +#include "jabber_ssl.h" + +struct SSL_OpenSsl : public SSL_Base +{ + virtual ~SSL_OpenSsl(); + virtual char* getSslToken( char* data ); + virtual int init(); +}; + +///////////////////////////////////////////////////////////////////////////////////////// + + +int SSL_OpenSsl::init() +{ + result = NULL; + return 0; +} + +SSL_OpenSsl::~SSL_OpenSsl(){ + if (result) mir_free(result); + result = NULL; +} +///////////////////////////////////////////////////////////////////////////////////////// + + +char* SSL_OpenSsl::getSslToken( char* data ) +{ + NETLIBOPENCONNECTION tConn = { 0 }; + tConn.cbSize = sizeof( tConn ); + tConn.szHost = "www.google.com"; +// tConn.szHost = "10.1.93.182"; + tConn.wPort = 443; +// tConn.wPort = 4433; +// tConn.flags = NLOCF_HTTP; + HANDLE h = ( HANDLE )JCallService( MS_NETLIB_OPENCONNECTION, ( WPARAM )hNetlibUser, ( LPARAM )&tConn ); + if ( h == NULL ) + return NULL; + + PVOID ssl = pfn_SSL_new( jabberSslCtx ); + if ( ssl != NULL ) { + SOCKET s = JCallService( MS_NETLIB_GETSOCKET, ( WPARAM )h, 0 ); + if ( s != INVALID_SOCKET ) { + pfn_SSL_set_fd( ssl, s ); + if ( pfn_SSL_connect( ssl ) > 0 ) { + JabberLog( "SSL connection succeeded" ); + + char *buf = ( char* )mir_alloc( SSL_BUF_SIZE ); + + int nBytes = mir_snprintf( buf, SSL_BUF_SIZE, + "POST /%s HTTP/1.1\r\n" + "Host: %s\r\n" + "User-Agent: Miranda IM (JGmail "__VERSION_STRING")\r\n" + "Content-Length: %d\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Connection: Keep-Alive\r\n\r\n%s", "accounts/ClientAuth", tConn.szHost, strlen(data),data ); + + //JabberLog( "Sending SSL query:\n%s", buf ); + pfn_SSL_write( ssl, buf, nBytes); + + nBytes = pfn_SSL_read( ssl, buf, SSL_BUF_SIZE-1 ); + if ( nBytes > 0 ) { + buf[nBytes] = '\0'; //just in case + char * responce = strchr(buf,' ')+1; + char * temp = strchr(buf,'\n'); + temp[0] = '\0'; if (temp[-1] == '\r') temp[-1] = '\0'; // awful code! + if (!strncmp(responce,"200",3)){ + JabberLog(respString,1,"posi",responce); + temp++; + char * SID = NULL; + char * LSID = NULL; + while (temp < buf+nBytes){ + if (!strncmp(temp,"SID=",4)) SID = temp; + if (!strncmp(temp,"LSID=",5)) LSID = temp; + temp = strchr(temp,'\n'); + temp[0] = '\0'; if (temp[-1] == '\r') temp[-1] = '\0'; // awful code! + temp++; + } + if (SID && LSID) { + char *secondStage = (char* )mir_alloc( SSL_BUF_SIZE ); + nBytes = mir_snprintf(secondStage,SSL_BUF_SIZE,"%s&%s&service=mail&Session=true\r\n",SID,LSID); + nBytes = mir_snprintf( buf, SSL_BUF_SIZE, + "POST /%s HTTP/1.1\r\n" + "Host: %s\r\n" + "User-Agent: Miranda IM (JGmail "__VERSION_STRING")\r\n" + "Content-Length: %d\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Connection: Keep-Alive\r\n\r\n%s", "accounts/IssueAuthToken", tConn.szHost, nBytes, secondStage); + mir_free(secondStage); + //JabberLog( "Sending SSL query:\n%s", buf ); + pfn_SSL_write( ssl, buf, nBytes); + nBytes = pfn_SSL_read( ssl, buf, SSL_BUF_SIZE-1 ); + if ( nBytes > 0 ) { + buf[nBytes] = '\0'; //just in case + if (buf[nBytes-1] == '\n') {buf[nBytes-1] = '\0'; nBytes--;} + if (buf[nBytes-1] == '\r') {buf[nBytes-1] = '\0'; nBytes--;} + responce = strchr(buf,' ')+1; + temp = strchr(buf,'\n'); + temp[0] = '\0'; if (temp[-1] == '\r') temp[-1] = '\0'; // awful code! + if (!strncmp(responce,"200",3)){ + JabberLog(respString,2,"posi",responce); + temp++; + temp = strrchr(temp,'\n'); + temp++; + //JabberLog( "SSL result:\n%s", temp ); + result = ( char* )mir_alloc( strlen(temp)+1 ); + strcpy(result,temp); + } else JabberLog(respString,2,"nega",responce); + } else JabberLog( "SSL read failed: %d",nBytes); + } else JabberLog("Server did not return SID and LSID"); + } else JabberLog(respString,1,"nega",responce); + } else JabberLog( "SSL read failed: %d",nBytes); + mir_free(buf); + } else JabberLog( "SSL connection failed" ); + }else JabberLog( "NetLib did not provide valid socket" ); + pfn_SSL_free( ssl ); + } else JabberLog( "pfn_SSL_new failed" ); + JCallService( MS_NETLIB_CLOSEHANDLE, ( WPARAM )h, 0 ); + return result; +} + +char * getXGoogleToken(char * email, char * passwd){ + char *data = (char *)mir_alloc(SSL_BUF_SIZE); + char *temp = JabberHttpUrlEncode(email); + int p = mir_snprintf(data,SSL_BUF_SIZE,"Email=%s&",temp); + free(temp); + temp = JabberHttpUrlEncode(passwd); + p += mir_snprintf(data+p,SSL_BUF_SIZE-p,"Passwd=%s&PersistentCookie=false&source=JGmail",temp); + free(temp); + SSL_Base *pAgent; +#ifndef STATICSSL + if (!hLibSSL) pAgent = new SSL_WinInet(); + else +#endif + pAgent = new SSL_OpenSsl(); + if (pAgent->init()){ + delete pAgent; + return NULL; + } + if (pAgent->getSslToken(data)){ + int len = strlen(email)+strlen(pAgent->result)+2; + char * toEncode = (char *)mir_alloc(len+1); + mir_snprintf(toEncode,len+1,"%c%s%c%s",'\0',email,'\0',pAgent->result); + char * base64Encoded = JabberBase64Encode( toEncode, len ); + mir_free(toEncode); + strncpy(data,base64Encoded,SSL_BUF_SIZE); + free(base64Encoded); + } else data = NULL; + delete pAgent; + return data; +} \ No newline at end of file diff -rduN1 JabberG/icolib.cpp JGmail/icolib.cpp --- JabberG/icolib.cpp Thu Jan 1 01:00:00 1970 +++ JGmail/icolib.cpp Sun Mar 19 04:25:34 2006 @@ -0,0 +1,161 @@ +#include "jabber.h" +#include +#include +#include "resource.h" +extern HINSTANCE hInst; + +/* +#define IDI_JABBER 102 +#define IDI_ADDCONTACT 122 +#define IDI_DELETE 123 +#define IDI_EDIT 124 +#define IDI_OPEN 131 +#define IDI_REQUEST 141 +#define IDI_GRANT 142 +#define IDI_AGENTS 154 +#define IDI_VCARD 155 +#define IDI_SAVE 166 +#define IDI_MAIL_NEW 186 +#define IDI_MAIL_STOP 187 +#define IDI_MAIL_INFO 188 +#define IDI_MAIL_CLOCK 189 +*/ +#define NUMICONSSMALL 14 +#define NUMICONSBIG 3 +static char *iconNames[NUMICONSSMALL]={NULL,"vcard","Agents", + "Add","Delete","Rename","Request","Grant","Open","Save", + "mail-new","mail-stop","mail-info","mail-clock"}; +static char *iconDescs[NUMICONSSMALL]={NULL,"VCard Menu",iconNames[2], + iconNames[3],iconNames[4],iconNames[5],iconNames[6],iconNames[7],iconNames[8],iconNames[9], + "New E-Mail","E-Mail Error","E-Mail Info","E-Mail Clock"}; +static int iconInd[NUMICONSSMALL]={0,155,154,122,123,124,141,142,131,166,186,187,188,189}; +HICON iconList[NUMICONSSMALL]; + +static int iconBigInd[NUMICONSBIG]={147,144,IDC_LOGO}; +static char *iconBigNames[NUMICONSBIG]={"group","key","write"}; +static char *iconBigDescs[NUMICONSBIG]={"Group Chat","Password","VCard"}; +HICON iconBigList[NUMICONSBIG]; + + extern HANDLE hMenuRequestAuth; + extern HANDLE hMenuGrantAuth; + extern HANDLE hMenuJoinLeave; + + extern HANDLE hMenuAgent; + extern HANDLE hMenuChangePassword; + extern HANDLE hMenuGroupchat; + extern HANDLE hMenuVCard; + +void IcoLibUpdateMenus(){ + CLISTMENUITEM mi = {0}; + + mi.cbSize = sizeof(mi); + mi.flags = CMIM_FLAGS | CMIM_ICON; + mi.hIcon = iconList[6];// IDI_REQUEST; + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuRequestAuth, ( LPARAM )&mi ); + mi.hIcon = iconList[7];// IDI_GRANT; + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuGrantAuth, ( LPARAM )&mi ); + mi.hIcon = iconBigList[0]; + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuJoinLeave, ( LPARAM )&mi ); + + mi.hIcon = iconList[2];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )); + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuAgent, ( LPARAM )&mi ); + mi.hIcon = iconBigList[1];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_KEYS )); + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuChangePassword, ( LPARAM )&mi ); + mi.hIcon = iconBigList[0];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )); + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuGroupchat, ( LPARAM )&mi ); + mi.hIcon = iconList[1];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_VCARD )) + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuVCard, ( LPARAM )&mi ); +} + +int IcoLibIconsChanged(WPARAM wParam, LPARAM lParam) +{ + HICON temp; + char szTemp[MAX_PATH + 128]; + + for (int i=0;i<3;i++){ //BigIcons + mir_snprintf(szTemp, sizeof(szTemp), "%s_%s", jabberProtoName, iconBigNames[i]); + if (temp = (HICON) CallService(MS_SKIN2_GETICON, 0, (LPARAM) szTemp))iconBigList[i]=temp; + } + for (i=1;i<14;i++){ //BigIcons + mir_snprintf(szTemp, sizeof(szTemp), "%s_%s", jabberProtoName, iconNames[i]); + if (temp = (HICON) CallService(MS_SKIN2_GETICON, 0, (LPARAM) szTemp))iconList[i]=temp; + } + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + mi.flags = CMIM_FLAGS | CMIM_ICON; + mi.hIcon = iconList[6];// IDI_REQUEST; + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuRequestAuth, ( LPARAM )&mi ); + mi.hIcon = iconList[7];// IDI_GRANT; + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuGrantAuth, ( LPARAM )&mi ); + mi.hIcon = iconBigList[0]; + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuJoinLeave, ( LPARAM )&mi ); + + mi.hIcon = iconList[2];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )); + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuAgent, ( LPARAM )&mi ); + mi.hIcon = iconBigList[1];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_KEYS )); + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuChangePassword, ( LPARAM )&mi ); + mi.hIcon = iconBigList[0];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )); + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuGroupchat, ( LPARAM )&mi ); + mi.hIcon = iconList[1];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_VCARD )) + JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuVCard, ( LPARAM )&mi ); + return 0; +} + +void JGmailSetupIcons(){ + HIMAGELIST CSImages = ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 3); + {// workarround of 4bit forced images + HBITMAP hScrBM = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_ICONSBIG), IMAGE_BITMAP, 0, 0,LR_SHARED); + ImageList_AddMasked(CSImages, hScrBM, RGB( 255, 0, 255 )); + DeleteObject(hScrBM); + } + for (int i=0; i<3; i++){ + iconBigList[i] = ImageList_ExtractIcon(NULL, CSImages, i); + } + ImageList_Destroy(CSImages); + CSImages = ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 14); + {// workarround of 4bit forced images + HBITMAP hScrBM = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_ICONSSMALL), IMAGE_BITMAP, 0, 0,LR_SHARED); + ImageList_AddMasked(CSImages, hScrBM, RGB( 255, 0, 255 )); + DeleteObject(hScrBM); + } + for (i=0; i<14; i++){ + iconList[i] = ImageList_ExtractIcon(NULL, CSImages, i); + } + ImageList_Destroy(CSImages); +} +void JGmailSetupIcoLib(){ + if (ServiceExists(MS_SKIN2_GETICON)){ + HICON temp; + SKINICONDESC sid = {0}; + char szTemp[MAX_PATH + 128]; + + HookEvent(ME_SKIN2_ICONSCHANGED, IcoLibIconsChanged); + + sid.cbSize = SKINICONDESC_SIZE_V2; + sid.pszSection = jabberProtoName; + sid.pszDefaultFile = NULL; + sid.iDefaultIndex = 0; + for (int i=0;i<14;i++) if (iconInd[i]){ + sid.pszDescription = iconDescs[i]; + mir_snprintf(szTemp, sizeof(szTemp), "%s_%s", jabberProtoName, iconNames[i]); + sid.pszName = szTemp; + sid.iDefaultIndex = -iconInd[i]; + sid.hDefaultIcon = iconList[i];; + CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid); + if (temp = (HICON) CallService(MS_SKIN2_GETICON, 0, (LPARAM) szTemp))iconList[i]=temp; + } + sid.cbSize = SKINICONDESC_SIZE_V3; + sid.cx=sid.cy=32; + for (i=0;i<3;i++){ + sid.pszDescription = Translate(iconBigDescs[i]); + mir_snprintf(szTemp, sizeof(szTemp), "%s_%s", jabberProtoName, iconBigNames[i]); + sid.pszName = szTemp; + sid.iDefaultIndex = -iconBigInd[i]; + sid.hDefaultIcon = iconBigList[i]; + CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid); + if (temp = (HICON) CallService(MS_SKIN2_GETICON, 0, (LPARAM) szTemp))iconBigList[i]=temp; + } + } + IcoLibUpdateMenus(); +} + Binary files JabberG/icos/16x16.bmp and JGmail/icos/16x16.bmp differ Binary files JabberG/icos/32x32.bmp and JGmail/icos/32x32.bmp differ Binary files JabberG/icos/addcontact.ico and JGmail/icos/addcontact.ico differ Binary files JabberG/icos/block.ico and JGmail/icos/block.ico differ Binary files JabberG/icos/delete.ico and JGmail/icos/delete.ico differ Binary files JabberG/icos/gcadmin.ico and JGmail/icos/gcadmin.ico differ Binary files JabberG/icos/gcmodera.ico and JGmail/icos/gcmodera.ico differ Binary files JabberG/icos/gcowner.ico and JGmail/icos/gcowner.ico differ Binary files JabberG/icos/gcvoice.ico and JGmail/icos/gcvoice.ico differ Binary files JabberG/icos/grant.ico and JGmail/icos/grant.ico differ Binary files JabberG/icos/group.ico and JGmail/icos/group.ico differ Binary files JabberG/icos/jabber.ico and JGmail/icos/jabber.ico differ Binary files JabberG/icos/key.ico and JGmail/icos/key.ico differ Binary files JabberG/icos/open.ico and JGmail/icos/open.ico differ Binary files JabberG/icos/pages.ico and JGmail/icos/pages.ico differ Binary files JabberG/icos/rename.ico and JGmail/icos/rename.ico differ Binary files JabberG/icos/request.ico and JGmail/icos/request.ico differ Binary files JabberG/icos/save.ico and JGmail/icos/save.ico differ Binary files JabberG/icos/write.ico and JGmail/icos/write.ico differ diff -rduN1 JabberG/jabber.cpp JGmail/jabber.cpp --- JabberG/jabber.cpp Tue Feb 7 18:24:25 2006 +++ JGmail/jabber.cpp Tue Mar 28 20:27:06 2006 @@ -39,12 +39,12 @@ #if defined( _UNICODE ) - "Jabber Protocol (Unicode)", + "Jabber Protocol (GMail) (Unicode)", #else - "Jabber Protocol", + "Jabber Protocol (GMail)", #endif - __VERSION_DWORD, - "Jabber protocol plugin for Miranda IM ( "__DATE__" )", - "George Hazan", - "ghazan@postman.ru", - "( c ) 2002-05 Santithorn Bunchua, George Hazan", - "http://miranda-im.org/download/details.php?action=viewfile&id=437", + __VERSION_DWORD, + "Jabber protocol plugin (GMail mod) for Miranda IM ( "__DATE__" )", + "George Hazan, YB", + "yb@saaplugin.no-ip.info", + "( c ) 2002-05 Santithorn Bunchua, George Hazan, YB", + "http://forums.miranda-im.org/showthread.php?p=43865", 0, @@ -83,3 +83,5 @@ // SSL-related global variable +#ifndef STATICSSL HMODULE hLibSSL = NULL; +#endif PVOID jabberSslCtx; @@ -187,2 +189,4 @@ +void JGmailSetupIcons(); +void JGmailSetupIcoLib(); static int OnModulesLoaded( WPARAM wParam, LPARAM lParam ) @@ -197,2 +201,11 @@ HookEvent( ME_USERINFO_INITIALISE, JabberUserInfoInit ); + if (JGetByte(NULL,"EnableGMail",1) & 1) { + //Setup the sound + extern char soundname[64]; + char sounddesc[64]; + mir_snprintf(soundname,64, "%s/NewMail",jabberProtoName); + mir_snprintf(sounddesc,64, "%s: %s",jabberProtoName,"New Mail Notify"); + SkinAddNewSound( soundname, sounddesc, "newmail.wav" ); + } + @@ -219,3 +232,3 @@ } - + JGmailSetupIcoLib(); return 0; @@ -226,8 +239,8 @@ -static int iconList[] = { - IDI_GCOWNER, - IDI_GCADMIN, - IDI_GCMODERATOR, - IDI_GCVOICE -}; +//static int iconList[] = { +// IDI_GCOWNER, +// IDI_GCADMIN, +// IDI_GCMODERATOR, +// IDI_GCVOICE +//}; @@ -264,2 +277,4 @@ + //Load the icons. Later will change the menus if IcoLib is available + JGmailSetupIcons(); // Register protocol module @@ -290,4 +305,4 @@ - for ( int i=0; i < JABBER_ICON_TOTAL; i++ ) - jabberIcon[i] = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( iconList[i] ), IMAGE_ICON, 0, 0, 0 ); +// for ( int i=0; i < JABBER_ICON_TOTAL; i++ ) +// jabberIcon[i] = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( iconList[i] ), IMAGE_ICON, 0, 0, 0 ); diff -rduN1 JabberG/jabber.dsp JGmail/jabber.dsp --- JabberG/jabber.dsp Mon Jan 23 15:26:10 2006 +++ JGmail/jabber.dsp Tue Mar 28 20:30:18 2006 @@ -23,2 +23,4 @@ !MESSAGE "jabberg - Win32 Debug Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "jabberg - Win32 Static Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "jabberg - Win32 Static" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE @@ -56,5 +58,9 @@ LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/release/plugins/jabber.dll" /ALIGN:4096 /ignore:4108 +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/release/plugins/JGmail.dll" /ALIGN:4096 /ignore:4108 # SUBTRACT LINK32 /pdb:none /incremental:yes +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=upx --best --force ../../bin/release/plugins/JGmail.dll +# End Special Build Tool @@ -83,4 +89,4 @@ LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/debug/plugins/jabber.dll" /pdbtype:sept +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/debug/plugins/JGmail.dll" /pdbtype:sept # SUBTRACT LINK32 /pdb:none /incremental:no @@ -102,3 +108,3 @@ # ADD BASE CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JABBER_EXPORTS" /FAcs /Yu"jabber.h" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "JABBER_EXPORTS" /FAcs /Yu"jabber.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "JABBER_EXPORTS" /FAcs /FR /Yu"jabber.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 @@ -111,6 +117,10 @@ LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/release/plugins/jabber.dll" /ALIGN:4096 /ignore:4108 +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/release/plugins/JGmail.dll" /ALIGN:4096 /ignore:4108 # SUBTRACT BASE LINK32 /pdb:none /incremental:yes -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/Release Unicode/plugins/jabber.dll" /ALIGN:4096 /ignore:4108 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/Release Unicode/plugins/JGmail.dll" /ALIGN:4096 /ignore:4108 # SUBTRACT LINK32 /pdb:none /incremental:yes +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=upx --best --force "../../bin/Release Unicode/plugins/JGmail.dll" +# End Special Build Tool @@ -140,7 +150,73 @@ LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /incremental:no /map /debug /machine:I386 /out:"../../bin/debug/plugins/jabber.dll" /pdbtype:sept +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /incremental:no /map /debug /machine:I386 /out:"../../bin/Debug Unicode/plugins/JGmail.dll" /pdbtype:sept # SUBTRACT BASE LINK32 /pdb:none -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/debug/plugins/jabber.dll" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/Debug Unicode/plugins/JGmail.dll" /pdbtype:sept # SUBTRACT LINK32 /pdb:none /incremental:no +!ELSEIF "$(CFG)" == "jabberg - Win32 Static Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "jabberg___Win32_Static_Unicode" +# PROP BASE Intermediate_Dir "jabberg___Win32_Static_Unicode" +# PROP BASE Ignore_Export_Lib 1 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Static_Unicode" +# PROP Intermediate_Dir "Release_Static_Unicode" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /I "Z:\temp\openssl\openssl-0.9.8-stable-SNAP-20060314\inc32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JABBER_EXPORTS" /D "STATICSSL" /FAcs /Yu"jabber.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /I "Z:\temp\openssl\openssl-0.9.8-stable-SNAP-20060314\inc32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "JABBER_EXPORTS" /D "STATICSSL" /FAcs /Yu"jabber.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib zlib.lib ssleay32.lib libeay32.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/Release Unicode/plugins/staticssl/JGmail.dll" /libpath:"z:\temp\openssl\zlib-1.2.3\projects\visualc6\Win32_LIB_ASM_Release\\" /libpath:"z:\temp\openssl\openssl-0.9.8-stable-SNAP-20060314\out32\\" /ALIGN:4096 /ignore:4108 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib zlib.lib ssleay32.lib libeay32.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/Release Unicode/plugins/staticssl/JGmail.dll" /libpath:"z:\temp\openssl\zlib-1.2.3\projects\visualc6\Win32_LIB_ASM_Release\\" /libpath:"z:\temp\openssl\openssl-0.9.8-stable-SNAP-20060314\out32\\" /ALIGN:4096 /ignore:4108 +# SUBTRACT LINK32 /pdb:none +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=upx --best --force "../../bin/Release Unicode/plugins/staticssl/JGmail.dll" +# End Special Build Tool + +!ELSEIF "$(CFG)" == "jabberg - Win32 Static" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "jabberg___Win32_Static" +# PROP BASE Intermediate_Dir "jabberg___Win32_Static" +# PROP BASE Ignore_Export_Lib 1 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Static" +# PROP Intermediate_Dir "Release_Static" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JABBER_EXPORTS" /FAcs /Yu"jabber.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /I "Z:\temp\openssl\openssl-0.9.8-stable-SNAP-20060314\inc32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JABBER_EXPORTS" /D "STATICSSL" /FAcs /Yu"jabber.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/release/plugins/JGmail.dll" /ALIGN:4096 /ignore:4108 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib version.lib zlib.lib ssleay32.lib libeay32.lib /nologo /base:"0x32500000" /dll /map /debug /machine:I386 /out:"../../bin/release/plugins/staticssl/JGmail.dll" /libpath:"z:\temp\openssl\zlib-1.2.3\projects\visualc6\Win32_LIB_ASM_Release\\" /libpath:"z:\temp\openssl\openssl-0.9.8-stable-SNAP-20060314\out32\\" /ALIGN:4096 /ignore:4108 +# SUBTRACT LINK32 /pdb:none +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=upx --best --force ../../bin/release/plugins/staticssl/JGmail.dll +# End Special Build Tool + !ENDIF @@ -153,2 +229,4 @@ # Name "jabberg - Win32 Debug Unicode" +# Name "jabberg - Win32 Static Unicode" +# Name "jabberg - Win32 Static" # Begin Group "Source Files" @@ -158,2 +236,14 @@ +SOURCE=.\gmail.cpp +# End Source File +# Begin Source File + +SOURCE=.\google_token.cpp +# End Source File +# Begin Source File + +SOURCE=.\icolib.cpp +# End Source File +# Begin Source File + SOURCE=.\jabber.cpp @@ -348,2 +438,6 @@ +SOURCE=.\icos\16x16.bmp +# End Source File +# Begin Source File + SOURCE=.\icos\addcontact.ico @@ -390,2 +484,18 @@ # End Source File +# Begin Source File + +SOURCE=".\icos\mail-clock.ico" +# End Source File +# Begin Source File + +SOURCE=".\icos\mail-info.ico" +# End Source File +# Begin Source File + +SOURCE=".\icos\mail-new.ico" +# End Source File +# Begin Source File + +SOURCE=".\icos\mail-stop.ico" +# End Source File # Begin Source File diff -rduN1 JabberG/jabber.h JGmail/jabber.h --- JabberG/jabber.h Tue Feb 28 00:25:34 2006 +++ JGmail/jabber.h Sat Mar 18 04:47:16 2006 @@ -293,3 +293,5 @@ extern HANDLE hNetlibUser; +#ifndef STATICSSL extern HMODULE hLibSSL; +#endif extern PVOID jabberSslCtx; @@ -527,2 +529,4 @@ +extern HICON iconBigList[3]; +extern HICON iconList[14]; #endif diff -rduN1 JabberG/jabber.rc JGmail/jabber.rc --- JabberG/jabber.rc Sun Mar 19 01:29:19 2006 +++ JGmail/jabber.rc Sat Apr 1 22:11:00 2006 @@ -78,6 +78,6 @@ EDITTEXT IDC_PORT,70,87,26,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Use SSL",IDC_USE_SSL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,104,88,54,10 - CONTROL "Use TLS",IDC_USE_TLS,"Button",BS_AUTOCHECKBOX | + CONTROL "StartTLS if available",IDC_USE_TLS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,165,88,80,10 + CONTROL "Use SSL",IDC_USE_SSL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,104,88,54,10 PUSHBUTTON "Register new user",IDC_BUTTON_REGISTER,165,19,78,13 @@ -218,5 +218,5 @@ LTEXT "",IDC_WHITERECT,0,0,238,26 - ICON IDI_WRITE,IDC_LOGO,7,4,20,20 + ICON "",IDC_LOGO,7,4,20,20 LTEXT "",IDC_NAME,33,5,200,8,0,WS_EX_TRANSPARENT - CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK | + CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK | TCS_MULTILINE | WS_TABSTOP,5,29,228,158 @@ -410,2 +410,53 @@ +IDD_OPT_EXPERT DIALOGEX 0, 0, 279, 241 +STYLE DS_FIXEDSYS | DS_CENTER | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_OPT_EXPERT_TAB,"SysTabControl32",0x0,2,3,273,236,0 +END + +IDD_OPT_JGMAIL DIALOGEX 0, 0, 271, 181 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Functionality",IDC_STATIC,1,3,269,82 + CONTROL "Enable GMail functionality",IDC_ENGMAIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,17,101,10 + CONTROL "Suppress startup check",IDC_ENGMAILSTARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,17,90,10 + CONTROL "Synchronize Clock",IDC_SYNCHRONIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,30,101,10 + CONTROL "Silently",IDC_SYNCHRONIZESILENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,30,85,10 + CONTROL "Use Fake Contact",IDC_USEFAKE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,43,94,10 + CONTROL "Use PopUps",IDC_USEPOPUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,43,61,10 + CONTROL "Show Request",IDC_SHOWREQUEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,56,94,10 + CONTROL "Show Result",IDC_SHOWRESULT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,56,82,10 + CONTROL "Suppress Errors",IDC_SUPERR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,69,94,10 + CONTROL "Don't re-request mail box Automatically",IDC_SUPREREQUEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,69,145,10 + PUSHBUTTON "Preview",IDC_PREVIEW,209,17,57,11 + PUSHBUTTON "Check Now!",IDC_FORCECHECK,209,30,57,11 + GROUPBOX "Popups",IDC_STATIC,1,85,269,56 + CONTROL "Visit GMail on E-Mail PopUp click",IDC_VISITGMAIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,96,145,10 + RTEXT "Messages: ",IDC_STATIC,10,116,40,10 + CONTROL "",IDC_COLOURTEXT,"ColourPicker",WS_TABSTOP,51,116,10,10 + CONTROL "",IDC_COLOURBACK,"ColourPicker",WS_TABSTOP,61,116,10,10 + EDITTEXT IDC_EDIT_TIMEOUT,75,113,26,12,ES_RIGHT | ES_AUTOHSCROLL + RTEXT "Clock: ",IDC_STATIC,121,116,30,10 + CONTROL "",IDC_CLOCKCOLOURTEXT,"ColourPicker",WS_TABSTOP,152,116,10,10 + CONTROL "",IDC_CLOCKCOLOURBACK,"ColourPicker",WS_TABSTOP,162,116,10,10 + EDITTEXT IDC_EDIT_CLOCKTIMEOUT,176,113,26,12,ES_RIGHT | ES_AUTOHSCROLL + RTEXT "Debug: ",IDC_STATIC,10,127,40,10 + CONTROL "",IDC_DEBUGCOLOURTEXT,"ColourPicker",WS_TABSTOP,51,127,10,10 + CONTROL "",IDC_DEBUGCOLOURBACK,"ColourPicker",WS_TABSTOP,61,127,10,10 + EDITTEXT IDC_EDIT_DEBUGTIMEOUT,75,126,26,12,ES_RIGHT | ES_AUTOHSCROLL + RTEXT "Errors: ",IDC_STATIC,121,127,30,10 + CONTROL "",IDC_ERRORCOLOURTEXT,"ColourPicker",WS_TABSTOP,152,127,10,10 + CONTROL "",IDC_ERRORCOLOURBACK,"ColourPicker",WS_TABSTOP,162,127,10,10 + EDITTEXT IDC_EDIT_ERRORTIMEOUT,176,126,26,12,ES_RIGHT | ES_AUTOHSCROLL + PUSHBUTTON "Reset",IDC_RESET,209,126,57,11 + GROUPBOX "Misc",IDC_STATIC,1,141,269,38 + CONTROL "Treat Invisible as Unvailable",IDC_INVASUNAVAIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,152,202,10 + RTEXT "Saving chats to server is: ",IDC_STATIC,109,166,100,10 + PUSHBUTTON "Unknown",IDC_SAVECHATS,209,164,57,11 +END + IDD_OPT_JABBER2 DIALOGEX 0, 0, 222, 173 @@ -506,3 +557,3 @@ BEGIN - CONTROL "List4",IDC_LIST,"SysListView32",LVS_REPORT | + CONTROL "List4",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | @@ -799,2 +850,3 @@ IDI_JABBER ICON "icos\\jabber.ico" +/* IDI_GROUP ICON "icos\\group.ico" @@ -815,2 +867,9 @@ IDI_GCVOICE ICON "icos\\gcvoice.ico" +IDI_MAIL_NEW ICON "icos\\mail-new.ico" +IDI_MAIL_STOP ICON "icos\\mail-stop.ico" +IDI_MAIL_INFO ICON "icos\\mail-info.ico" +IDI_MAIL_CLOCK ICON "icos\\mail-clock.ico" +*/ +IDB_ICONSBIG BITMAP DISCARDABLE "icos\\32x32.bmp" +IDB_ICONSSMALL BITMAP DISCARDABLE "icos\\16x16.bmp" #endif // English (U.S.) resources diff -rduN1 JabberG/jabber_agent.cpp JGmail/jabber_agent.cpp --- JabberG/jabber_agent.cpp Tue Feb 7 18:24:25 2006 +++ JGmail/jabber_agent.cpp Mon Mar 13 23:35:32 2006 @@ -70,3 +70,3 @@ hwndJabberAgents = hwndDlg; - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconList[2] ); TranslateDialogDefault( hwndDlg ); @@ -492,3 +492,3 @@ dontEnableParent = FALSE; - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconList[2] ); TranslateDialogDefault( hwndDlg ); diff -rduN1 JabberG/jabber_chat.cpp JGmail/jabber_chat.cpp --- JabberG/jabber_chat.cpp Tue Feb 28 00:25:35 2006 +++ JGmail/jabber_chat.cpp Mon Mar 13 01:03:40 2006 @@ -319,3 +319,3 @@ TranslateDialogDefault( hwndDlg ); - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconBigList[0]); SetDlgItemTextA( hwndDlg, IDC_ROOM, ( char* )lParam ); diff -rduN1 JabberG/jabber_groupchat.cpp JGmail/jabber_groupchat.cpp --- JabberG/jabber_groupchat.cpp Tue Feb 28 00:25:35 2006 +++ JGmail/jabber_groupchat.cpp Mon Mar 13 01:02:56 2006 @@ -105,3 +105,3 @@ // lParam is the initial conference server ( if any ) - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconBigList[0] ); TranslateDialogDefault( hwndDlg ); @@ -776,3 +776,3 @@ free( nick ); - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconBigList[0] ); } diff -rduN1 JabberG/jabber_iq.h JGmail/jabber_iq.h --- JabberG/jabber_iq.h Mon Nov 21 00:25:44 2005 +++ JGmail/jabber_iq.h Sat Apr 1 04:35:20 2006 @@ -60,4 +60,4 @@ void JabberIqResultGetAvatar( XmlNode *iqNode, void *userdata ); -void JabberIqResultGetAuth( XmlNode *iqNode, void *userdata ); -void JabberIqResultSetAuth( XmlNode *iqNode, void *userdata ); +//void JabberIqResultGetAuth( XmlNode *iqNode, void *userdata ); +//void JabberIqResultSetAuth( XmlNode *iqNode, void *userdata ); void JabberIqResultGetRoster( XmlNode *iqNode, void *userdata ); @@ -82,2 +82,6 @@ void JabberIqResultMucGetOwnerList( XmlNode *iqNode, void *userdata ); +void JabberIqResultBind( XmlNode *iqNode, void *userdata ); +void JabberIqResultMailNotify( XmlNode *iqNode, void *userdata ); +void JabberRequestMailBox(HANDLE hConn); +void JabberEnableNotifications(ThreadData *info); diff -rduN1 JabberG/jabber_iqid.cpp JGmail/jabber_iqid.cpp --- JabberG/jabber_iqid.cpp Mon Jan 23 15:27:42 2006 +++ JGmail/jabber_iqid.cpp Sat Apr 1 04:37:52 2006 @@ -37,2 +37,3 @@ +/* this is not needed anylonger - new Auth procedure void JabberIqResultGetAuth( XmlNode *iqNode, void *userdata ) @@ -124,2 +125,55 @@ } } +*/ +void JabberIqResultBind( XmlNode *iqNode, void *userdata ) +{ +// JabberXmlDumpNode( iqNode ); + struct ThreadData *info = ( struct ThreadData * ) userdata; + int iqId; + XmlNode* queryNode = JabberXmlGetChild( iqNode, "bind" ); + if (queryNode){ +// JabberLog("Has query node"); + if (queryNode=JabberXmlGetChild( queryNode, "jid" )){ +// JabberLog("Has query jid"); + if (queryNode->text) { +// JabberLog("JID has text"); +// JabberLog("text: %s",queryNode->text); + if (!strncmp(info->fullJID,queryNode->text,sizeof (info->fullJID))){ + JabberLog( "Result Bind: %s %s %s",info->fullJID,"confirmed.",NULL); + } else { + JabberLog( "Result Bind: %s %s %s",info->fullJID,"changed to",queryNode->text); + strncpy(info->fullJID,queryNode->text,sizeof (info->fullJID)); + } } + } else if (queryNode=JabberXmlGetChild( queryNode, "error" )){ + //rfc3920 page 39 + char errorMessage [256]; + int pos=0; + pos = mir_snprintf(errorMessage,256,Translate("Resource ")); + XmlNode *tempNode; + if (tempNode = JabberXmlGetChild( queryNode, "resource" )) pos += mir_snprintf(errorMessage,256-pos,"\"%s\" ",tempNode->text); + pos += mir_snprintf(errorMessage,256-pos,Translate("refused by server\n%s: %s"),Translate("Type"),Translate(JabberXmlGetAttrValue( queryNode, "type" ))); + if (queryNode->numChild) pos += mir_snprintf(errorMessage+pos,256-pos,"\n%s: %s\n",Translate("Reason"),Translate(queryNode->child[0]->name)); + mir_snprintf( errorMessage,256-pos, "%s %s@%s.", JTranslate( "Authentication failed for" ), info->username, info->server ); + MessageBoxA( NULL, errorMessage, JTranslate( "Jabber Protocol" ), MB_OK|MB_ICONSTOP|MB_SETFOREGROUND ); + JSendBroadcast( NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPROTOCOL ); + JabberSend( info->s, "" ); + jabberThreadInfo = NULL; // To disallow auto reconnect + } + } + { + int i = JGetByte(NULL,"EnableGMail",1); + if (i & 1) { + JabberEnableNotifications(info); + if ((i & 2) == 0) JabberRequestMailBox(info->s); + } + } + iqId = JabberSerialNext(); + JabberIqAdd( iqId, IQ_PROC_NONE, JabberIqResultGetRoster ); + JabberSend( info->s, "", iqId ); + if ( hwndJabberAgents ) { + // Retrieve agent information + iqId = JabberSerialNext(); + JabberIqAdd( iqId, IQ_PROC_GETAGENTS, JabberIqResultGetAgents ); + JabberSend( info->s, "", iqId ); + } +} @@ -208,3 +262,3 @@ if ( JGetByte( hContact, "ChatRoom", 0 )) - QueueUserAPC( sttCreateRoom, hMainThread, ( ULONG_PTR )jid ); + QueueUserAPC( sttCreateRoom, hMainThread, ( unsigned long )jid ); diff -rduN1 JabberG/jabber_iqid_muc.cpp JGmail/jabber_iqid_muc.cpp --- JabberG/jabber_iqid_muc.cpp Mon Jan 23 15:27:42 2006 +++ JGmail/jabber_iqid_muc.cpp Mon Mar 13 23:41:22 2006 @@ -295,5 +295,5 @@ if( nm->nmcd.lItemlParam == ( LPARAM )( -1 )) - hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_ADDCONTACT ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); + hIcon = iconList[3]; //IDI_ADDCONTACT else - hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_DELETE ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); + hIcon = iconList[4]; //IDI_DELETE DrawIconEx( nm->nmcd.hdc, ( rc.left+rc.right-GetSystemMetrics( SM_CXSMICON ))/2, ( rc.top+rc.bottom-GetSystemMetrics( SM_CYSMICON ))/2,hIcon, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0, NULL, DI_NORMAL ); diff -rduN1 JabberG/jabber_menu.cpp JGmail/jabber_menu.cpp --- JabberG/jabber_menu.cpp Tue Oct 25 18:05:12 2005 +++ JGmail/jabber_menu.cpp Tue Mar 14 05:36:30 2006 @@ -36,5 +36,5 @@ -static HANDLE hMenuRequestAuth = NULL; -static HANDLE hMenuGrantAuth = NULL; -static HANDLE hMenuJoinLeave = NULL; +HANDLE hMenuRequestAuth = NULL; +HANDLE hMenuGrantAuth = NULL; +HANDLE hMenuJoinLeave = NULL; @@ -167,3 +167,3 @@ mi.position = -2000001001; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_REQUEST )); + mi.hIcon = iconList[6];// IDI_REQUEST; mi.pszService = text; @@ -177,3 +177,3 @@ mi.position = -2000001000; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_GRANT )); + mi.hIcon = iconList[7];// IDI_GRANT; mi.pszService = text; @@ -187,3 +187,3 @@ mi.position = -2000001002; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )); + mi.hIcon = iconBigList[0]; mi.pszService = text; diff -rduN1 JabberG/jabber_opt.cpp JGmail/jabber_opt.cpp --- JabberG/jabber_opt.cpp Mon Jan 23 15:27:45 2006 +++ JGmail/jabber_opt.cpp Sat Apr 1 22:31:14 2006 @@ -188,3 +188,3 @@ } - else SetDlgItemTextA( hwndDlg, IDC_EDIT_LOGIN_SERVER, "jabber.org" ); + else SetDlgItemTextA( hwndDlg, IDC_EDIT_LOGIN_SERVER, "gmail.com" ); @@ -195,3 +195,3 @@ CheckDlgButton( hwndDlg, IDC_USE_SSL, JGetByte( "UseSSL", FALSE )); - CheckDlgButton( hwndDlg, IDC_USE_TLS, JGetByte( "UseTLS", FALSE )); + CheckDlgButton( hwndDlg, IDC_USE_TLS, JGetByte( "UseTLS", TRUE )); EnableWindow(GetDlgItem( hwndDlg, IDC_USE_TLS ), !JGetByte( "UseSSL", FALSE )); @@ -318,2 +318,3 @@ // Fall through + case IDC_USE_TLS: case IDC_SAVEPASSWORD: @@ -544,3 +545,148 @@ } + return FALSE; +} + +BOOL CALLBACK JabberGmailOptDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ); +long StandardOptsDlg, AdvOptsDlg, GMailOptsDlg; + +static void reInitTabs(HWND hwndDlg){ + int iExpert = SendMessage(GetParent(hwndDlg), PSM_ISEXPERT, 0, 0); + short int t = (short)JGetByte("ActiveTab",0); + TCITEMA tci; + RECT theTabSpace; + RECT rcClient; + { + RECT rcTab, rcDlg; + HWND hwndTab = GetDlgItem(hwndDlg, IDC_OPT_EXPERT_TAB); + TabCtrl_GetItemRect(hwndTab,0,&rcTab); + TabCtrl_DeleteAllItems(hwndTab); + theTabSpace.top = rcTab.bottom; // the size of the tab + GetWindowRect(GetDlgItem(hwndDlg, IDC_OPT_EXPERT_TAB), &rcTab); + GetWindowRect(hwndDlg, &rcDlg); + theTabSpace.bottom = rcTab.bottom -rcTab.top -theTabSpace.top; + theTabSpace.top = rcTab.top -rcDlg.top +theTabSpace.top; + theTabSpace.left = rcTab.left - rcDlg.left; + theTabSpace.right = rcTab.right-rcTab.left; + } + tci.mask = TCIF_PARAM|TCIF_TEXT; + if (iExpert) { + if (!AdvOptsDlg) AdvOptsDlg = (long)CreateDialog(hInst,MAKEINTRESOURCE(IDD_OPT_JABBER2), hwndDlg, JabberAdvOptDlgProc); + tci.lParam = AdvOptsDlg; + tci.pszText = Translate("Expert"); + GetClientRect((HWND)tci.lParam,&rcClient); + SendMessage(GetDlgItem(hwndDlg, IDC_OPT_EXPERT_TAB), TCM_INSERTITEMA, (WPARAM)0, (LPARAM)&tci); + MoveWindow((HWND)tci.lParam,theTabSpace.left+(theTabSpace.right-rcClient.right)/2, + theTabSpace.top+(theTabSpace.bottom-rcClient.bottom)/2, + rcClient.right,rcClient.bottom,1); + ShowWindow((HWND)tci.lParam, (t==2)?SW_SHOW:SW_HIDE); + } else { + if (t>1) t = 1; + ShowWindow((HWND) AdvOptsDlg,SW_HIDE); + } + if (!GMailOptsDlg) GMailOptsDlg = (long)CreateDialog(hInst,MAKEINTRESOURCE(IDD_OPT_JGMAIL), hwndDlg, JabberGmailOptDlgProc); + tci.lParam = GMailOptsDlg; + GetClientRect((HWND)tci.lParam,&rcClient); + tci.pszText = Translate("GMail"); + SendMessage(GetDlgItem(hwndDlg, IDC_OPT_EXPERT_TAB), TCM_INSERTITEMA, (WPARAM)0, (LPARAM)&tci); + MoveWindow((HWND)tci.lParam,theTabSpace.left+(theTabSpace.right-rcClient.right)/2, + theTabSpace.top+(theTabSpace.bottom-rcClient.bottom)/2, + rcClient.right,rcClient.bottom,1); + ShowWindow((HWND)tci.lParam, (t==1)?SW_SHOW:SW_HIDE); + + if (!StandardOptsDlg) StandardOptsDlg = (long)CreateDialog(hInst,MAKEINTRESOURCE(IDD_OPT_JABBER), hwndDlg, JabberOptDlgProc); + tci.lParam = StandardOptsDlg; + tci.pszText = Translate("Standard"); + GetClientRect((HWND)tci.lParam,&rcClient); + SendMessage(GetDlgItem(hwndDlg, IDC_OPT_EXPERT_TAB), TCM_INSERTITEMA, (WPARAM)0, (LPARAM)&tci); + MoveWindow((HWND)tci.lParam,theTabSpace.left+(theTabSpace.right-rcClient.right)/2, + theTabSpace.top+(theTabSpace.bottom-rcClient.bottom)/2, + rcClient.right,rcClient.bottom,1); + ShowWindow((HWND)tci.lParam, (t==0)?SW_SHOW:SW_HIDE); + + { HWND hwndEnum= GetDlgItem((HWND)StandardOptsDlg, IDC_USE_TLS); + hwndEnum = GetWindow(hwndEnum, GW_HWNDNEXT); + do { + ShowWindow(hwndEnum, iExpert?SW_SHOW:SW_HIDE); + hwndEnum = GetWindow(hwndEnum, GW_HWNDNEXT); + }while (hwndEnum && (hwndEnum != GetDlgItem((HWND)StandardOptsDlg,CBS_DROPDOWNLIST))); + hwndEnum= GetDlgItem((HWND)GMailOptsDlg, IDC_USEPOPUP); + hwndEnum = GetWindow(hwndEnum, GW_HWNDNEXT); + do { + ShowWindow(hwndEnum, iExpert?SW_SHOW:SW_HIDE); + hwndEnum = GetWindow(hwndEnum, GW_HWNDNEXT); + }while (hwndEnum && (hwndEnum != GetDlgItem((HWND)StandardOptsDlg,IDC_RESET))); + } + + + TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_OPT_EXPERT_TAB),t); + +} + BOOL CALLBACK JabberExpOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ +// char str[MAXMODULELABELLENGTH]; + switch (msg) + { + case WM_INITDIALOG: + { + reInitTabs(hwndDlg); + return TRUE; + } + case PSM_CHANGED: +#ifdef _DEBUG + MessageBoxA(hwndDlg,"Child dialog changed","EventHapened",0); +#endif + SendMessage(GetParent(hwndDlg), PSM_CHANGED, (unsigned int)hwndDlg, 0); + break; + case WM_DESTROY: + StandardOptsDlg = GMailOptsDlg = AdvOptsDlg = 0; + break; + case WM_NOTIFY: + { + switch(((LPNMHDR)lParam)->idFrom) { + case 0: { + BOOL CommandApply = FALSE; + if ( (CommandApply = lParam && ((LPNMHDR)lParam)->code == PSN_APPLY) || (lParam && ((LPNMHDR)lParam)->code == PSN_RESET) ) { +#ifdef _DEBUG + MessageBoxA(hwndDlg,CommandApply?"Apply":"Cancel","EventHapened",0); +#endif + if (CommandApply) { + SendMessage((HWND)AdvOptsDlg, WM_NOTIFY, wParam, lParam); + SendMessage((HWND)GMailOptsDlg, WM_NOTIFY, wParam, lParam); + SendMessage((HWND)StandardOptsDlg, WM_NOTIFY, wParam, lParam); + return TRUE; + } else { + } + } //if PSN_APPLY + else if( ((LPNMHDR)lParam)->code == PSN_EXPERTCHANGED) reInitTabs(hwndDlg); + } + break; + case IDC_OPT_EXPERT_TAB: + switch (((LPNMHDR)lParam)->code) + { + case TCN_SELCHANGING: + { + TCITEM tci; + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(GetDlgItem(hwndDlg,IDC_OPT_EXPERT_TAB),TabCtrl_GetCurSel(GetDlgItem(hwndDlg,IDC_OPT_EXPERT_TAB)),&tci); + ShowWindow((HWND)tci.lParam,SW_HIDE); + } + break; + case TCN_SELCHANGE: + { + TCITEM tci; + short int t; + tci.mask = TCIF_PARAM; + t = TabCtrl_GetCurSel(GetDlgItem(hwndDlg,IDC_OPT_EXPERT_TAB)); + TabCtrl_GetItem(GetDlgItem(hwndDlg,IDC_OPT_EXPERT_TAB),t,&tci); + JSetByte("ActiveTab", t); + ShowWindow((HWND)tci.lParam,SW_SHOW); + } + break; + } + break; + } + }//end case(LPNMHDR)lParam)->idFrom + break; + } return FALSE; @@ -554,3 +700,3 @@ OPTIONSDIALOGPAGE odp = { 0 }; - char str[128]; +// char str[128]; @@ -559,17 +705,20 @@ odp.pszGroup = "Network"; - odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_JABBER ); +// odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_JABBER ); + odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_EXPERT ); odp.pszTitle = jabberModuleName; odp.flags = ODPF_BOLDGROUPS; - odp.pfnDlgProc = JabberOptDlgProc; - odp.nIDBottomSimpleControl = IDC_SIMPLE; - JCallService( MS_OPT_ADDPAGE, wParam, ( LPARAM )&odp ); - - odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_JABBER2 ); - mir_snprintf( str, sizeof( str ), "%s %s", jabberModuleName, JTranslate( "Advanced" )); - str[sizeof( str )-1] = '\0'; - odp.pszTitle = str; - odp.pfnDlgProc = JabberAdvOptDlgProc; - odp.flags = ODPF_BOLDGROUPS|ODPF_EXPERTONLY; +// odp.pfnDlgProc = JabberOptDlgProc; + odp.pfnDlgProc = JabberExpOptDlgProc; +// odp.nIDBottomSimpleControl = IDC_SIMPLE; odp.nIDBottomSimpleControl = 0; JCallService( MS_OPT_ADDPAGE, wParam, ( LPARAM )&odp ); + +// odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_EXPERT ); +// mir_snprintf( str, sizeof( str ), "%s %s", jabberModuleName, JTranslate( "Advanced" )); +// str[sizeof( str )-1] = '\0'; +// odp.pszTitle = str; +// odp.pfnDlgProc = JabberExpOptDlgProc; +// odp.flags = ODPF_BOLDGROUPS|ODPF_EXPERTONLY; +// odp.nIDBottomSimpleControl = 0; +// JCallService( MS_OPT_ADDPAGE, wParam, ( LPARAM )&odp ); return 0; diff -rduN1 JabberG/jabber_password.cpp JGmail/jabber_password.cpp --- JabberG/jabber_password.cpp Mon Jan 23 15:27:45 2006 +++ JGmail/jabber_password.cpp Mon Mar 13 01:04:18 2006 @@ -51,3 +51,3 @@ - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_KEYS )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconBigList[1] ); TranslateDialogDefault( hwndDlg ); diff -rduN1 JabberG/jabber_ssl.cpp JGmail/jabber_ssl.cpp --- JabberG/jabber_ssl.cpp Mon Jan 23 15:27:45 2006 +++ JGmail/jabber_ssl.cpp Wed Feb 22 00:24:32 2006 @@ -47,2 +47,3 @@ +#ifndef STATICSSL BOOL JabberSslInit() @@ -106,7 +107,36 @@ +#else // ndef STATICSSL +BOOL JabberSslInit() +{ + BOOL error = FALSE; + + sslHandleList = NULL; + sslHandleCount = 0; + InitializeCriticalSection( &sslHandleMutex ); + + pfn_SSL_library_init=SSL_library_init; + pfn_SSLv23_client_method=( PFN_SSL_pvoid_void )SSLv23_client_method; + pfn_SSL_CTX_new=( PFN_SSL_pvoid_pvoid )SSL_CTX_new; + pfn_SSL_CTX_free=( PFN_SSL_void_pvoid )SSL_CTX_free; + pfn_SSL_new=( PFN_SSL_pvoid_pvoid )SSL_new; + pfn_SSL_free=( PFN_SSL_void_pvoid )SSL_free; + pfn_SSL_set_fd=( PFN_SSL_int_pvoid_int )SSL_set_fd; + pfn_SSL_connect=( PFN_SSL_int_pvoid )SSL_connect; + pfn_SSL_read=( PFN_SSL_int_pvoid_pvoid_int )SSL_read; + pfn_SSL_write=( PFN_SSL_int_pvoid_pvoid_int )SSL_write; + + pfn_SSL_library_init(); + jabberSslCtx = pfn_SSL_CTX_new( pfn_SSLv23_client_method()); + + return TRUE; +} +#endif // ndef STATICSSL + void JabberSslUninit() { +#ifndef STATICSSL if ( hLibSSL ) { +#endif // ndef STATICSSL pfn_SSL_CTX_free( jabberSslCtx ); - +#ifndef STATICSSL JabberLog( "Free SSL library" ); @@ -115,3 +145,3 @@ } - +#endif // ndef STATICSSL if ( sslHandleList ) free( sslHandleList ); diff -rduN1 JabberG/jabber_ssl.h JGmail/jabber_ssl.h --- JabberG/jabber_ssl.h Mon Nov 21 00:25:44 2005 +++ JGmail/jabber_ssl.h Mon Mar 27 02:46:54 2006 @@ -29,2 +29,7 @@ +#ifdef STATICSSL +#include +#endif + + typedef int ( *PFN_SSL_int_void ) ( void ); @@ -61,2 +66,3 @@ void JabberSslRemoveHandle( HANDLE hConn ); +char * getXGoogleToken(char * email, char * passwd); diff -rduN1 JabberG/jabber_svc.cpp JGmail/jabber_svc.cpp --- JabberG/jabber_svc.cpp Sat Feb 11 23:24:54 2006 +++ JGmail/jabber_svc.cpp Thu Mar 23 19:04:14 2006 @@ -269,3 +269,3 @@ if ( JGetStaticString( "LoginServer", NULL, szServer, sizeof szServer )) - strcpy( szServer, "jabber.org" ); + strcpy( szServer, "gmail.com" ); @@ -629,5 +629,10 @@ if ( msgCount > 1 ) { + int templen = strlen(r[i].resourceName)+1; + char *temp = (char *)mir_alloc(templen); strcat( str, "( " ); - strcat( str, r[i].resourceName ); + strncpy(temp,r[i].resourceName, templen); + JabberUtf8Decode(temp,NULL); + strcat( str, temp); strcat( str, " ): " ); + mir_free(temp); } @@ -1196,5 +1201,6 @@ -static HANDLE hMenuAgent = NULL; -static HANDLE hMenuChangePassword = NULL; -static HANDLE hMenuGroupchat = NULL; +HANDLE hMenuAgent = NULL; +HANDLE hMenuChangePassword = NULL; +HANDLE hMenuGroupchat = NULL; +HANDLE hMenuVCard = NULL; @@ -1275,3 +1281,3 @@ mi.position = 2000050000; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )); + mi.hIcon = iconList[2];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )); mi.pszService = text; @@ -1285,3 +1291,3 @@ mi.position = 2000050001; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_KEYS )); + mi.hIcon = iconBigList[1];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_KEYS )); mi.pszService = text; @@ -1295,3 +1301,3 @@ mi.position = 2000050002; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )); + mi.hIcon = iconBigList[0];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_GROUP )); mi.pszService = text; @@ -1305,5 +1311,5 @@ mi.position = 2000050003; - mi.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_VCARD )); + mi.hIcon = iconList[1];//LoadIcon( hInst, MAKEINTRESOURCE( IDI_VCARD )); mi.pszService = text; - JCallService( MS_CLIST_ADDMAINMENUITEM, 0, ( LPARAM )&mi ); + hMenuVCard = ( HANDLE ) JCallService( MS_CLIST_ADDMAINMENUITEM, 0, ( LPARAM )&mi ); } diff -rduN1 JabberG/jabber_thread.cpp JGmail/jabber_thread.cpp --- JabberG/jabber_thread.cpp Fri Mar 17 14:49:51 2006 +++ JGmail/jabber_thread.cpp Tue Mar 28 20:34:54 2006 @@ -51,2 +51,4 @@ static void JabberProcessRegIq( XmlNode *node, void *userdata ); +void JabberUserConfigResult( XmlNode *iqNode, void *userdata ); + @@ -140,2 +142,22 @@ +static XmlState xmlState; +static char *xmlStreamToBeInitialized = 0; +static void xmlStreamInitialize(char *which){ + JabberLog("Stream will be initialized %s",which); + xmlStreamToBeInitialized = strdup(which); +} +static void xmlStreamInitializeNow(struct ThreadData *info){ + JabberLog("Stream is initializing %s",xmlStreamToBeInitialized?xmlStreamToBeInitialized:"after connect"); + if (xmlStreamToBeInitialized){ + free(xmlStreamToBeInitialized); + xmlStreamToBeInitialized = NULL; + JabberXmlDestroyState(&xmlState); + } + JabberXmlInitState( &xmlState ); + JabberXmlSetCallback( &xmlState, 1, ELEM_OPEN, JabberProcessStreamOpening, info ); + JabberXmlSetCallback( &xmlState, 1, ELEM_CLOSE, JabberProcessStreamClosing, info ); + JabberXmlSetCallback( &xmlState, 2, ELEM_CLOSE, JabberProcessProtocol, info ); + JabberSend( info->s, "", TXT(info->server) ); +} + void __cdecl JabberServerThread( struct ThreadData *info ) @@ -330,5 +352,24 @@ BOOL sslMode = FALSE; - if ( info->useSSL ) { + if ( info->port==443){ //fake ssl session - Client Hello + unsigned int fake[] = {//Long Live Ethereal! + 0x03014680, 0x002D0001, 0x01100000, 0x00038000, + 0xC0000780, 0x02400006, 0x00048000, 0x04000080, + 0x00FFFE00, 0xFE000A00, 0x090000FE, 0x00640000, + 0x00006200, 0x06000003, 0xA60C171F, 0xFC78002F, + 0xB12E5546, 0xEAF13983}; + Netlib_Send( info->s,(char *)fake,sizeof(fake), MSG_NODUMP ); + char *buff = (char *)mir_alloc(0x100); + int i = Netlib_Recv( info->s,buff,0x100, MSG_NODUMP ); + mir_free(buff); + if (!i){ + JabberLog( "Thread ended, fake HTTPS session failed" ); + goto LBL_Exit; + } + } else if ( info->useSSL ) { JabberLog( "Intializing SSL connection" ); - if ( hLibSSL!=NULL && socket!=INVALID_SOCKET ) { + if ( +#ifndef STATICSSL + hLibSSL!=NULL && +#endif + socket!=INVALID_SOCKET ) { JabberLog( "SSL using socket = %d", socket ); @@ -366,3 +407,5 @@ free( buffer ); +#ifndef STATICSSL if ( !hLibSSL ) +#endif MessageBox( NULL, TranslateT( "The connection requires an OpenSSL library, which is not installed." ), TranslateT( "Jabber Connection Error" ), MB_OK|MB_ICONSTOP|MB_SETFOREGROUND ); @@ -386,11 +429,3 @@ - XmlState xmlState; - JabberXmlInitState( &xmlState ); - JabberXmlSetCallback( &xmlState, 1, ELEM_OPEN, JabberProcessStreamOpening, info ); - JabberXmlSetCallback( &xmlState, 1, ELEM_CLOSE, JabberProcessStreamClosing, info ); - JabberXmlSetCallback( &xmlState, 2, ELEM_CLOSE, JabberProcessProtocol, info ); - - JabberSend( info->s, "", TXT(info->server) ); - - JabberLog( "Entering main recv loop" ); + xmlStreamInitializeNow(info); datalen = 0; @@ -403,8 +438,2 @@ sslMode = TRUE; - JabberXmlDestroyState(&xmlState); - JabberXmlInitState( &xmlState ); - JabberXmlSetCallback( &xmlState, 1, ELEM_OPEN, JabberProcessStreamOpening, info ); - JabberXmlSetCallback( &xmlState, 1, ELEM_CLOSE, JabberProcessStreamClosing, info ); - JabberXmlSetCallback( &xmlState, 2, ELEM_CLOSE, JabberProcessProtocol, info ); - JabberSend( info->s, "", TXT(info->server) ); } @@ -447,2 +476,4 @@ else JabberLog( "Unknown state: bytesParsed=%d, datalen=%d, jabberNetworkBufferSize=%d", bytesParsed, datalen, jabberNetworkBufferSize ); + + if (xmlStreamToBeInitialized) xmlStreamInitializeNow(info); } @@ -539,8 +570,2 @@ - if ( !info->useSSL && hLibSSL != NULL && JGetByte( "UseTLS", FALSE )) { - JabberLog( "Requesting TLS" ); - JabberSend( info->s, "" ); - return; - } - if ( info->type == JABBER_SESSION_NORMAL ) { @@ -549,15 +574,3 @@ streamId = _strdup( sid ); - } - - int iqId = JabberSerialNext(); - JabberIqAdd( iqId, IQ_PROC_NONE, JabberIqResultGetAuth ); - JabberSend( info->s, "%s", iqId, TXT(info->username)); - } - else if ( info->type == JABBER_SESSION_REGISTER ) { - iqIdRegGetReg = JabberSerialNext(); - JabberSend( info->s, "", iqIdRegGetReg, TXT(info->server)); - SendMessage( info->reg_hwndDlg, WM_JABBER_REGDLG_UPDATE, 50, ( LPARAM )JTranslate( "Requesting registration instruction..." )); - } - else JabberSend( info->s, "" ); -} +} } } @@ -572,11 +585,163 @@ -static void JabberProcessProtocol( XmlNode *node, void *userdata ) +static void JabberProcessFeatures( XmlNode *node, void *userdata ) { - struct ThreadData *info; + int i,k; + bool isPlainAvailable = false; + bool isXGoogleTokenAvailable = false; + bool isRegisterAvailable = false; + bool areMechanismsDefined = false; + struct ThreadData *info = ( struct ThreadData * ) userdata; + for (i=0;inumChild;i++){ + if (!strcmp(node->child[i]->name,"starttls")){ + if ( !info->useSSL && + #ifndef STATICSSL + hLibSSL != NULL && + #endif + JGetByte( "UseTLS", TRUE )) { + JabberLog( "Requesting TLS" ); + JabberSend( info->s, "" ); + return; + } + } else if (!strcmp(node->child[i]->name,"mechanisms")){ + areMechanismsDefined = true; + //JabberLog("%d mechanisms\n",node->child[i]->numChild); + for (k=0;kchild[i]->numChild;k++){ + if (!strcmp(node->child[i]->child[k]->name,"mechanism")) + //JabberLog("Mechanism: %s",node->child[i]->child[k]->text); + if (!strcmp(node->child[i]->child[k]->text,"PLAIN")) isPlainAvailable = true; + if (!strcmp(node->child[i]->child[k]->text,"X-GOOGLE-TOKEN")) isXGoogleTokenAvailable = true; + } + } else if (!strcmp(node->child[i]->name,"register")) isRegisterAvailable = true; + } + if (areMechanismsDefined) { + char *PLAIN = 0; + char *X_GOOGLE_TOKEN = 0; + if (isPlainAvailable && isXGoogleTokenAvailable) + if (info->useSSL ) isXGoogleTokenAvailable = false;//we Prefere plain if SSL + if (isXGoogleTokenAvailable){ + int size = strlen(info->username)+1+strlen(info->server); + char *localJid = (char *)mir_alloc(size+1); + mir_snprintf(localJid,size+1,"%s@%s",info->username,info->server); + X_GOOGLE_TOKEN = getXGoogleToken(localJid,info->password); + if (!X_GOOGLE_TOKEN) X_GOOGLE_TOKEN = ""; //Later will show auth failed + mir_free(localJid); + } else if (isPlainAvailable){ + int size = strlen(info->username)*2+strlen(info->server)+strlen(info->password)+3; + char *toEncode = (char *)mir_alloc(size+1); + mir_snprintf(toEncode,size+1,"%s@%s%c%s%c%s",info->username,info->server,0,info->username,0,info->password); + PLAIN = JabberBase64Encode( toEncode, size ); + mir_free(toEncode); + JabberLog( "Never publish the hash below" ); + } else { + MessageBoxA( NULL, JTranslate("No known auth methods available. Giving up."), JTranslate( "Jabber Authentication" ), MB_OK|MB_ICONSTOP|MB_SETFOREGROUND ); + JabberSend( info->s, "" ); + JSendBroadcast( NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD ); + return; + } + if ( info->type == JABBER_SESSION_NORMAL ) { + JabberSend( info->s, "%s", + X_GOOGLE_TOKEN?"X-GOOGLE-TOKEN":"PLAIN", + X_GOOGLE_TOKEN?X_GOOGLE_TOKEN:PLAIN); + } + else if ( info->type == JABBER_SESSION_REGISTER ) { + iqIdRegGetReg = JabberSerialNext(); + JabberSend( info->s, "", iqIdRegGetReg, TXT(info->server)); + SendMessage( info->reg_hwndDlg, WM_JABBER_REGDLG_UPDATE, 50, ( LPARAM )JTranslate( "Requesting registration instruction..." )); + } + else JabberSend( info->s, "" ); + if (PLAIN) free(PLAIN); +// if (X_GOOGLE_TOKEN) free(X_GOOGLE_TOKEN); + } else { // mechanisms are not defined. We are already logged-in + char *str=JabberTextEncode( info->resource ); + int iqId = JabberSerialNext(); + JabberIqAdd( iqId, IQ_PROC_NONE, JabberIqResultBind ); + JabberSend( info->s, "%s",iqId,str); + JabberSend( info->s, ""); + free(str); + } +} + +static void JabberProcessFailure( XmlNode *node, void *userdata ){ +// JabberXmlDumpNode( node ); + struct ThreadData *info = ( struct ThreadData * ) userdata; + char* type; +//failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl' + if (( type=JabberXmlGetAttrValue( node, "xmlns" )) == NULL ) return; + if ( !strcmp( type, "urn:ietf:params:xml:ns:xmpp-sasl" )){ + char text[128]; + + JabberSend( info->s, "" ); + mir_snprintf( text, sizeof( text ), "%s %s@%s.", JTranslate( "Authentication failed for" ), info->username, info->server ); + MessageBoxA( NULL, text, JTranslate( "Jabber Authentication" ), MB_OK|MB_ICONSTOP|MB_SETFOREGROUND ); + JSendBroadcast( NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD ); + jabberThreadInfo = NULL; // To disallow auto reconnect + } +} + +static void JabberProcessError( XmlNode *node, void *userdata ){ +// JabberXmlDumpNode( node ); + struct ThreadData *info = ( struct ThreadData * ) userdata; + char* buff; + int i; + int pos; +//failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl' + if ( !node->numChild ) return; + buff = (char *)mir_alloc(1024); + pos=0; + for (i=0;inumChild;i++){ + pos += mir_snprintf(buff+pos,1024-pos,"%s: %s\n",node->child[i]->name,node->child[i]->text); + if (!strcmp(node->child[i]->name,"conflict")) JSendBroadcast( NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION); + } + MessageBoxA( NULL, buff, JTranslate( "Jabber Error" ), MB_OK|MB_ICONSTOP|MB_SETFOREGROUND ); + mir_free(buff); + JabberSend( info->s, "" ); +} +static void JabberProcessSuccess( XmlNode *node, void *userdata ) +{ //JabberXmlDumpNode( node ); + struct ThreadData *info = ( struct ThreadData * ) userdata; + char* type; +// int iqId; + // RECVED: type == JABBER_SESSION_NORMAL ) { + JabberLog( "Succcess: Logged-in." ); + if ( DBGetContactSetting( NULL, jabberProtoName, "Nick", &dbv )) + JSetString( NULL, "Nick", info->username ); + else + JFreeVariant( &dbv ); + xmlStreamInitialize( "after successful sasl" ); + } + else { + JabberLog( "Succcess: unknown action %s.",type); +} } + + +static void JabberProcessProtocol( XmlNode *node, void *userdata ) +{ + struct ThreadData *info; + + info = ( struct ThreadData * ) userdata; + if ( !strcmp( node->name, "proceed" )){ + JabberProcessProceed( node, userdata ); + return; + } + else if ( !strcmp( node->name, "stream:features" )){ + JabberProcessFeatures( node, userdata ); + } + else if ( !strcmp( node->name, "success")){ + JabberProcessSuccess( node, userdata ); + } + else if ( !strcmp( node->name, "failure")){ + JabberProcessFailure( node, userdata ); + } + else if ( !strcmp( node->name, "stream:error")){ + JabberProcessError( node, userdata ); + } + else if ( info->type == JABBER_SESSION_NORMAL ) { if ( !strcmp( node->name, "message" )) @@ -587,4 +752,2 @@ JabberProcessIq( node, userdata ); - else if ( !strcmp( node->name, "proceed" )) - JabberProcessProceed( node, userdata ); else @@ -595,4 +758,2 @@ JabberProcessRegIq( node, userdata ); - else if ( !strcmp( node->name, "proceed")) - JabberProcessProceed( node, userdata ); else @@ -622,2 +783,3 @@ JabberLog( "SSL enabled for handle = %d", info->s ); + xmlStreamInitialize( "after successful StartTLS" ); } @@ -1095,3 +1257,3 @@ HANDLE hContact; - XmlNode *queryNode, *siNode, *n; + XmlNode *queryNode, *siNode, *n, *newMailNode; char* from, *type, *jid, *nick; @@ -1375,2 +1537,21 @@ } + // RECVED: s, "",idStr ); + JabberRequestMailBox( info->s ); + } } + // RECVED: s, "",idStr ); + } + JabberUserConfigResult(node,jabberThreadInfo); + } // RECVED: ... diff -rduN1 JabberG/jabber_userinfo.cpp JGmail/jabber_userinfo.cpp --- JabberG/jabber_userinfo.cpp Tue Feb 7 18:24:26 2006 +++ JGmail/jabber_userinfo.cpp Mon Mar 13 23:47:48 2006 @@ -191,3 +191,3 @@ SetWindowLong( hwndDlg, GWL_USERDATA, ( LONG ) photoInfo ); - SendMessage( GetDlgItem( hwndDlg, IDC_SAVE ), BM_SETIMAGE, IMAGE_ICON, ( LPARAM )LoadImage( hInst, MAKEINTRESOURCE( IDI_SAVE ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 )); + SendMessage( GetDlgItem( hwndDlg, IDC_SAVE ), BM_SETIMAGE, IMAGE_ICON, ( LPARAM )iconList[9]); ShowWindow( GetDlgItem( hwndDlg, IDC_LOAD ), SW_HIDE ); diff -rduN1 JabberG/jabber_util.cpp JGmail/jabber_util.cpp --- JabberG/jabber_util.cpp Tue Feb 7 18:24:27 2006 +++ JGmail/jabber_util.cpp Wed Feb 8 19:41:52 2006 @@ -920,3 +920,3 @@ case ID_STATUS_INVISIBLE: - JabberSend( jabberThreadInfo->s, "%s%s", toStr, priorityStr, extra ); + JabberSend( jabberThreadInfo->s, "%s%s", JGetByte(NULL,"InvAsUnavail",TRUE)?"unavailable":"invisible",toStr, priorityStr, extra ); break; diff -rduN1 JabberG/jabber_vcard.cpp JGmail/jabber_vcard.cpp --- JabberG/jabber_vcard.cpp Fri Mar 17 14:51:06 2006 +++ JGmail/jabber_vcard.cpp Sun Mar 19 04:13:46 2006 @@ -188,4 +188,4 @@ hBitmap = NULL; - SendMessage( GetDlgItem( hwndDlg, IDC_LOAD ), BM_SETIMAGE, IMAGE_ICON, ( LPARAM )LoadImage( hInst, MAKEINTRESOURCE( IDI_OPEN ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 )); - SendMessage( GetDlgItem( hwndDlg, IDC_DELETE ), BM_SETIMAGE, IMAGE_ICON, ( LPARAM )LoadImage( hInst, MAKEINTRESOURCE( IDI_DELETE ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 )); + SendMessage( GetDlgItem( hwndDlg, IDC_LOAD ), BM_SETIMAGE, IMAGE_ICON, ( LPARAM )iconList[8]); + SendMessage( GetDlgItem( hwndDlg, IDC_DELETE ), BM_SETIMAGE, IMAGE_ICON, ( LPARAM )iconList[4]); ShowWindow( GetDlgItem( hwndDlg, IDC_SAVE ), SW_HIDE ); @@ -627,7 +627,7 @@ if( nm->nmcd.lItemlParam==( LPARAM )( -1 ) && nm->iSubItem==3 ) - hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_ADDCONTACT ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); + hIcon = iconList[3]; else if ( nm->iSubItem==2 && nm->nmcd.lItemlParam!=( LPARAM )( -1 )) - hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_EDIT ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); + hIcon = iconList[5]; else if ( nm->iSubItem==3 && nm->nmcd.lItemlParam!=( LPARAM )( -1 )) - hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_DELETE ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); + hIcon = iconList[4]; else break; @@ -1046,2 +1046,3 @@ +extern HICON iconBigList[]; static BOOL CALLBACK JabberVcardDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) @@ -1053,3 +1054,9 @@ { - SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_VCARD )) ); + SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconBigList[2] ); + SendDlgItemMessage(hwndDlg, // dialog box window handle + IDC_LOGO, // icon identifier + STM_SETIMAGE, // message to send + (WPARAM) IMAGE_ICON, // image type + (LPARAM) iconBigList[2]); // new icon handle + TranslateDialogDefault( hwndDlg ); diff -rduN1 JabberG/resource.h JGmail/resource.h --- JabberG/resource.h Fri Mar 17 14:51:55 2006 +++ JGmail/resource.h Sat Apr 1 17:35:26 2006 @@ -1,4 +1,4 @@ //{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by jabber.rc +// Microsoft Developer Studio generated include file. +// Used by msvc6.rc // @@ -12,6 +12,8 @@ #define IDD_PASSWORD 111 -#define IDI_TLEN 121 -#define IDI_ADDCONTACT 122 -#define IDI_DELETE 123 -#define IDI_EDIT 124 +//#define IDI_TLEN 121 +#define IDB_ICONSSMALL 122 +#define IDB_ICONSBIG 123 +//#define IDI_ADDCONTACT 122 +//#define IDI_DELETE 123 +//#define IDI_EDIT 124 #define IDD_VCARD 125 @@ -23,3 +25,3 @@ #define IDD_VCARD_ADDPHONE 131 -#define IDI_OPEN 131 +//#define IDI_OPEN 131 #define IDD_VCARD_PHOTO 132 @@ -28,12 +30,12 @@ #define IDD_OPT_JABBER2 140 -#define IDI_REQUEST 141 +//#define IDI_REQUEST 141 #define IDD_GROUPCHAT 141 -#define IDI_GRANT 142 -#define IDI_KEYS 144 -#define IDI_GROUP 147 +//#define IDI_GRANT 142 +//#define IDI_KEYS 144 +//#define IDI_GROUP 147 #define IDD_GROUPCHAT_JOIN 148 -#define IDI_AGENTS 154 -#define IDI_VCARD 155 -#define IDI_WRITE 162 -#define IDI_SAVE 166 +//#define IDI_AGENTS 154 +//#define IDI_VCARD 155 +//#define IDI_WRITE 162 +//#define IDI_SAVE 166 #define IDD_GROUPCHAT_INPUT 167 @@ -41,6 +43,6 @@ #define IDD_JIDLIST 171 -#define IDI_GCOWNER 173 -#define IDI_GCADMIN 175 -#define IDI_GCMODERATOR 176 -#define IDI_GCVOICE 179 +//#define IDI_GCOWNER 173 +//#define IDI_GCADMIN 175 +//#define IDI_GCMODERATOR 176 +//#define IDI_GCVOICE 179 #define IDD_AGENT_MANUAL_REGISTER 182 @@ -50,2 +52,37 @@ #define IDD_OPT_SETAVATAR 185 +//#define IDI_MAIL_NEW 186 +//#define IDI_MAIL_STOP 187 +//#define IDI_MAIL_INFO 188 +//#define IDI_MAIL_CLOCK 189 +#define IDD_OPT_EXPERT 190 +#define IDC_OPT_EXPERT_TAB 191 +#define IDD_OPT_JGMAIL 192 +#define IDC_ENGMAIL 193 +#define IDC_SHOWREQUEST 195 +#define IDC_SHOWRESULT 196 +#define IDC_SYNCHRONIZE 197 +#define IDC_SYNCHRONIZESILENT 198 +#define IDC_VISITGMAIL 199 +#define IDC_INVASUNAVAIL 200 +#define IDC_ENGMAILSTARTUP 201 +#define IDC_PREVIEW 202 +#define IDC_COLOURTEXT 203 +#define IDC_COLOURBACK 204 +#define IDC_USEPOPUP 205 +#define IDC_EDIT_TIMEOUT 206 +#define IDC_DEBUGCOLOURTEXT 207 +#define IDC_DEBUGCOLOURBACK 208 +#define IDC_EDIT_DEBUGTIMEOUT 209 +#define IDC_ERRORCOLOURTEXT 210 +#define IDC_ERRORCOLOURBACK 211 +#define IDC_USEFAKE 212 +#define IDC_EDIT_ERRORTIMEOUT 213 +#define IDC_CLOCKCOLOURTEXT 214 +#define IDC_CLOCKCOLOURBACK 215 +#define IDC_EDIT_CLOCKTIMEOUT 216 +#define IDC_RESET 217 +#define IDC_FORCECHECK 218 +#define IDC_SAVECHATS 219 +#define IDC_SUPERR 220 +#define IDC_SUPREREQUEST 221 #define IDC_EDIT_USERNAME 1000 @@ -222,6 +259,6 @@ // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 185 +#define _APS_NEXT_RESOURCE_VALUE 222 #define _APS_NEXT_COMMAND_VALUE 40017 diff -rduN1 JabberG/version.h JGmail/version.h --- JabberG/version.h Mon Jan 23 15:28:35 2006 +++ JGmail/version.h Sat Apr 1 01:46:20 2006 @@ -1,3 +1,3 @@ #define __FILEVERSION_STRING 0,4,3,0 -#define __VERSION_STRING "0.4.3.0" +#define __VERSION_STRING "0.4.3.0e" #define __VERSION_DWORD 0x00040300 diff -rduN1 JabberG/version.rc JGmail/version.rc --- JabberG/version.rc Sat Mar 5 21:42:04 2005 +++ JGmail/version.rc Wed Feb 22 00:42:12 2006 @@ -33,8 +33,8 @@ VALUE "CompanyName", "Miranda\0" - VALUE "FileDescription", "Jabber Protocol Plugin for Miranda IM\0" + VALUE "FileDescription", "Jabber Protocol Plugin (GMail mod) for Miranda IM\0" VALUE "FileVersion", __VERSION_STRING VALUE "InternalName", "jabber\0" - VALUE "LegalCopyright", "Copyright ( c) 2002-04 Santithorn Bunchua, 2005 George Hazan \0" + VALUE "LegalCopyright", "Copyright ( c) 2002-04 Santithorn Bunchua, 2005 George Hazan, 2006 YB(GMail mod)\0" VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "jabber.dll\0" + VALUE "OriginalFilename", "JGmail.dll\0" VALUE "PrivateBuild", "\0"