From 9c6d8a640911d336cc1e758310bbfccaf547d2d2 Mon Sep 17 00:00:00 2001 From: sje Date: Wed, 1 Nov 2006 14:40:04 +0000 Subject: git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@10 4f64403b-2f21-0410-a795-97e2b3489a10 --- otr/options.cpp | 418 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 418 insertions(+) create mode 100644 otr/options.cpp (limited to 'otr/options.cpp') diff --git a/otr/options.cpp b/otr/options.cpp new file mode 100644 index 0000000..4e81895 --- /dev/null +++ b/otr/options.cpp @@ -0,0 +1,418 @@ +#include "common.h" +#include "options.h" + +Options options; + +#define WMU_REFRESHLIST (WM_USER + 241) +#define CONTACT_DEFAULT_POLICY 0xFFFF + +#include +typedef std::map ContactPolicyMap; + +void LoadOptions() { + options.default_policy = DBGetContactSettingWord(0, MODULE, "DefaultPolicy", OTRL_POLICY_OPPORTUNISTIC); + // deal with changed flags in proto.h and new interpretation of 'manual' mode (see common.h) + switch(options.default_policy) { + case OTRL_POLICY_MANUAL: + options.default_policy = OTRL_POLICY_MANUAL_MOD; + break; + case OTRL_POLICY_OPPORTUNISTIC: + case OTRL_POLICY_MANUAL_MOD: + case OTRL_POLICY_ALWAYS: + case OTRL_POLICY_NEVER: + break; + default: + options.default_policy = OTRL_POLICY_OPPORTUNISTIC; + break; + } + if(options.default_policy == OTRL_POLICY_MANUAL) + options.default_policy = OTRL_POLICY_MANUAL_MOD; + options.err_method = (ErrorDisplay)DBGetContactSettingWord(0, MODULE, "ErrorDisplay", ED_POP); + options.prefix_messages = (DBGetContactSettingByte(0, MODULE, "PrefixMessages", 0) == 1); + options.msg_inline = (DBGetContactSettingByte(0, MODULE, "MsgInline", 0) == 1); + + DBVARIANT dbv; + if(!DBGetContactSetting(0, MODULE, "Prefix", &dbv)) { + strncpy(options.prefix, dbv.pszVal, 64); + options.prefix[63] = 0; + DBFreeVariant(&dbv); + } else + strcpy(options.prefix, "OTR: "); + + options.delete_history = (DBGetContactSettingByte(0, MODULE, "DeleteHistory", 1) == 1); +} + +void SaveOptions(ContactPolicyMap *contact_policies) { + DBWriteContactSettingWord(0, MODULE, "DefaultPolicy", options.default_policy); + DBWriteContactSettingWord(0, MODULE, "ErrorDisplay", (int)options.err_method); + DBWriteContactSettingByte(0, MODULE, "PrefixMessages", options.prefix_messages ? 1 : 0); + DBWriteContactSettingByte(0, MODULE, "MsgInline", options.msg_inline ? 1 : 0); + + for(ContactPolicyMap::iterator i = contact_policies->begin(); i != contact_policies->end(); i++) { + DBWriteContactSettingWord(i->first, MODULE, "Policy", i->second); + } + + DBWriteContactSettingStringUtf(0, MODULE, "Prefix", options.prefix); + + DBWriteContactSettingByte(0, MODULE, "DeleteHistory", options.delete_history ? 1 : 0); +} + +INT_PTR CALLBACK DlgProcOpts1(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { + + switch ( msg ) { + case WM_INITDIALOG: + TranslateDialogDefault( hwndDlg ); + { + // set contact to policy map + ContactPolicyMap *contact_policies = new ContactPolicyMap(); + SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)contact_policies); + HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); + char *proto; + while ( hContact != NULL ) { + proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); + if(proto && DBGetContactSettingByte(hContact, proto, "ChatRoom", 0) == 0 && CallService(MS_PROTO_ISPROTOONCONTACT, (WPARAM)hContact, (LPARAM)MODULE)) { + WORD pol = DBGetContactSettingWord(hContact, MODULE, "Policy", CONTACT_DEFAULT_POLICY); + // deal with changed flags in proto.h and new interpretation of 'manual' mode (see common.h) + switch(pol) { + case OTRL_POLICY_MANUAL: + pol = OTRL_POLICY_MANUAL_MOD; + break; + case OTRL_POLICY_OPPORTUNISTIC: + case OTRL_POLICY_MANUAL_MOD: + case OTRL_POLICY_ALWAYS: + case OTRL_POLICY_NEVER: + break; + default: + pol = CONTACT_DEFAULT_POLICY; + break; + } + + contact_policies->operator[](hContact) = pol; + } + hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); + } + } + switch(options.default_policy) { + case OTRL_POLICY_OPPORTUNISTIC: + CheckDlgButton(hwndDlg, IDC_RAD_OPP, TRUE); + break; + case OTRL_POLICY_MANUAL_MOD: + CheckDlgButton(hwndDlg, IDC_RAD_MANUAL, TRUE); + break; + case OTRL_POLICY_ALWAYS: + CheckDlgButton(hwndDlg, IDC_RAD_ALWAYS, TRUE); + break; + case OTRL_POLICY_NEVER: + CheckDlgButton(hwndDlg, IDC_RAD_NEVER, TRUE); + break; + } + + SendMessage(GetDlgItem(hwndDlg, IDC_CLIST),LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_FULLROWSELECT);// | LVS_EX_CHECKBOXES); + + { + // add list columns + LVCOLUMN lvc; + // Initialize the LVCOLUMN structure. + // The mask specifies that the format, width, text, and + // subitem members of the structure are valid. + lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + lvc.fmt = LVCFMT_LEFT; + + lvc.iSubItem = 0; + lvc.pszText = Translate("Contact"); + lvc.cx = 150; // width of column in pixels + ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_CLIST), 0, &lvc); + + lvc.iSubItem = 1; + lvc.pszText = Translate("Protocol"); + lvc.cx = 100; // width of column in pixels + ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_CLIST), 1, &lvc); + + lvc.iSubItem = 2; + lvc.pszText = Translate("Policy"); + lvc.cx = 100; // width of column in pixels + ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_CLIST), 2, &lvc); + } + SendMessage(hwndDlg, WMU_REFRESHLIST, 0, 0); + + // fill proto list box + { + int num_protocols; + PROTOCOLDESCRIPTOR **pppDesc; + + CallService(MS_PROTO_ENUMPROTOCOLS, (LPARAM)&num_protocols, (WPARAM)&pppDesc); + HWND hw = GetDlgItem(hwndDlg, IDC_LIST_PROTOS); + for(int i = 0; i < num_protocols; i++) { + if(pppDesc[i]->type == PROTOTYPE_PROTOCOL && strcmp(pppDesc[i]->szName, "MetaContacts") != 0 + && CallProtoService(pppDesc[i]->szName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_IM == PF1_IM) + { + SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)pppDesc[i]->szName); + } + } + } + + CheckDlgButton(hwndDlg, IDC_CHK_PREFIX, options.prefix_messages ? TRUE : FALSE); + CheckDlgButton(hwndDlg, IDC_CHK_MSGINLINE, options.msg_inline ? TRUE : FALSE); + + SetDlgItemText(hwndDlg, IDC_ED_PREFIX, options.prefix); + return TRUE; + + case WMU_REFRESHLIST: + //enumerate contacts, fill in list + { + ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_CLIST)); + + LVITEM lvI = {0}; + + // Some code to create the list-view control. + // Initialize LVITEM members that are common to all + // items. + lvI.mask = LVIF_TEXT | LVIF_PARAM;// | LVIF_NORECOMPUTE;// | LVIF_IMAGE; + + char *proto; + HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); + while ( hContact != NULL ) + { + proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); + if(proto && DBGetContactSettingByte(hContact, proto, "ChatRoom", 0) == 0 && CallService(MS_PROTO_ISPROTOONCONTACT, (WPARAM)hContact, (LPARAM)MODULE) // ignore chatrooms + && (proto && strcmp(proto, "MetaContacts") != 0)) // and MetaContacts + { + lvI.iSubItem = 0; + lvI.lParam = (LPARAM)hContact; + lvI.pszText = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0); + lvI.iItem = ListView_InsertItem(GetDlgItem(hwndDlg, IDC_CLIST), &lvI); + + lvI.iSubItem = 1; + lvI.pszText = LPSTR_TEXTCALLBACK; + ListView_SetItem(GetDlgItem(hwndDlg, IDC_CLIST), &lvI); + + lvI.iSubItem = 2; + lvI.pszText = LPSTR_TEXTCALLBACK; + ListView_SetItem(GetDlgItem(hwndDlg, IDC_CLIST), &lvI); + } + + hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); + } + } + + return TRUE; + case WM_COMMAND: + if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus()) { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } else + if (HIWORD( wParam ) == LBN_SELCHANGE && LOWORD(wParam) == IDC_LIST_PROTOS) { + HWND hw = GetDlgItem(hwndDlg, IDC_LIST_PROTOS); + int sel = -1; + if((sel = SendMessage(hw, LB_GETCURSEL, 0, 0)) != -1) { + char proto[512]; + SendMessage(hw, LB_GETTEXT, (WPARAM)sel, (LPARAM)proto); + + char fingerprint[45]; + if(otrl_privkey_fingerprint(otr_user_state, fingerprint, MODULE, proto)) + SetDlgItemText(hwndDlg, IDC_ED_FINGERPRINT, fingerprint); + else + SetDlgItemText(hwndDlg, IDC_ED_FINGERPRINT, ""); + + hw = GetDlgItem(hwndDlg, IDC_BUT_NEWKEY); + EnableWindow(hw, TRUE); + + return TRUE; + } else { + hw = GetDlgItem(hwndDlg, IDC_BUT_NEWKEY); + EnableWindow(hw, FALSE); + } + return FALSE; + } else + if ( HIWORD( wParam ) == BN_CLICKED ) { + switch( LOWORD( wParam )) { + case IDC_BUT_NEWKEY: + { + HWND hw = GetDlgItem(hwndDlg, IDC_LIST_PROTOS); + int sel = -1; + if((sel = SendMessage(hw, LB_GETCURSEL, 0, 0)) != -1) { + char proto[512]; + SendMessage(hw, LB_GETTEXT, (WPARAM)sel, (LPARAM)proto); + + SetDlgItemText(hwndDlg, IDC_ED_FINGERPRINT, Translate("Generating new key...please wait")); + otrl_privkey_generate(otr_user_state, private_key_filename, MODULE, proto); + + char fingerprint[45]; + if(otrl_privkey_fingerprint(otr_user_state, fingerprint, MODULE, proto)) + SetDlgItemText(hwndDlg, IDC_ED_FINGERPRINT, fingerprint); + else + SetDlgItemText(hwndDlg, IDC_ED_FINGERPRINT, ""); + + return TRUE; + } + } + + break; + + case IDC_RAD_OPP: + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + return TRUE; + case IDC_RAD_MANUAL: + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + return TRUE; + case IDC_RAD_ALWAYS: + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + return TRUE; + case IDC_RAD_NEVER: + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + return TRUE; + case IDC_CHK_PREFIX: + case IDC_CHK_MSGINLINE: + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + return TRUE; + } + } + break; + case WM_NOTIFY: + if(((LPNMHDR) lParam)->hwndFrom == GetDlgItem(hwndDlg, IDC_CLIST)) { + switch (((LPNMHDR) lParam)->code) { + case NM_CLICK: + if (((LPNMLISTVIEW)lParam)->iSubItem == 2) { + LVITEM lvi; + lvi.mask = LVIF_PARAM; + lvi.iItem = ((LPNMLISTVIEW)lParam)->iItem; + lvi.iSubItem = 0; + SendMessage(GetDlgItem(hwndDlg, IDC_CLIST), LVM_GETITEM, 0, (LPARAM)&lvi); + + HANDLE hContact = (HANDLE)lvi.lParam; + ContactPolicyMap *contact_policies = (ContactPolicyMap *)GetWindowLong(hwndDlg, GWL_USERDATA); + ContactPolicyMap::iterator i = contact_policies->find(hContact); + WORD pol = CONTACT_DEFAULT_POLICY; + if(i != contact_policies->end()) + pol = i->second; + + switch(pol) { + case CONTACT_DEFAULT_POLICY: + pol = OTRL_POLICY_MANUAL_MOD; + break; + case OTRL_POLICY_OPPORTUNISTIC: + pol = OTRL_POLICY_ALWAYS; + break; + case OTRL_POLICY_MANUAL_MOD: + pol = OTRL_POLICY_OPPORTUNISTIC; + break; + case OTRL_POLICY_ALWAYS: + pol = OTRL_POLICY_NEVER; + break; + case OTRL_POLICY_NEVER: + pol = CONTACT_DEFAULT_POLICY; + break; + } + + contact_policies->operator[](hContact) = pol; + ListView_RedrawItems(GetDlgItem(hwndDlg, IDC_CLIST), lvi.iItem, lvi.iItem); + + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + } + break; + case LVN_GETDISPINFO: + { + LVITEM lvi; + lvi.mask = LVIF_PARAM; + lvi.iItem = ((NMLVDISPINFO *)lParam)->item.iItem; + lvi.iSubItem = 0; + SendMessage(GetDlgItem(hwndDlg, IDC_CLIST), LVM_GETITEM, 0, (LPARAM)&lvi); + switch (((NMLVDISPINFO *)lParam)->item.iSubItem) { + case 0: + MessageBox(0, "LVN_GETDISPINFO (0)", "msg", MB_OK); + break; + case 1: + { + HANDLE hContact = (HANDLE)lvi.lParam; + ((NMLVDISPINFO *)lParam)->item.pszText = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + } + break; + case 2: + { + + char *text = 0; + HANDLE hContact = (HANDLE)lvi.lParam; + ContactPolicyMap *contact_policies = (ContactPolicyMap *)GetWindowLong(hwndDlg, GWL_USERDATA); + ContactPolicyMap::iterator i = contact_policies->find(hContact); + WORD pol = CONTACT_DEFAULT_POLICY; + if(i != contact_policies->end()) + pol = i->second; + switch(pol) { + case CONTACT_DEFAULT_POLICY: + text = Translate("Default"); + break; + case OTRL_POLICY_OPPORTUNISTIC: + text = Translate("Opportunistic"); + break; + case OTRL_POLICY_MANUAL_MOD: + text = Translate("Manual"); + break; + case OTRL_POLICY_ALWAYS: + text = Translate("Always"); + break; + case OTRL_POLICY_NEVER: + text = Translate("Never"); + break; + } + ((NMLVDISPINFO *)lParam)->item.pszText = text; + + } + break; + } + } + break; + } + + return FALSE; + } else + if (((LPNMHDR)lParam)->code == (unsigned)PSN_APPLY ) { + if(IsDlgButtonChecked(hwndDlg, IDC_RAD_OPP)) + options.default_policy = OTRL_POLICY_OPPORTUNISTIC; + else if(IsDlgButtonChecked(hwndDlg, IDC_RAD_MANUAL)) + options.default_policy = OTRL_POLICY_MANUAL_MOD; + else if(IsDlgButtonChecked(hwndDlg, IDC_RAD_ALWAYS)) + options.default_policy = OTRL_POLICY_ALWAYS; + else if(IsDlgButtonChecked(hwndDlg, IDC_RAD_NEVER)) + options.default_policy = OTRL_POLICY_NEVER; + + options.prefix_messages = IsDlgButtonChecked(hwndDlg, IDC_CHK_PREFIX) ? true : false; + options.msg_inline = IsDlgButtonChecked(hwndDlg, IDC_CHK_MSGINLINE) ? true : false; + GetDlgItemText(hwndDlg, IDC_ED_PREFIX, options.prefix, 64); + + ContactPolicyMap *contact_policies = (ContactPolicyMap *)GetWindowLong(hwndDlg, GWL_USERDATA); + + SaveOptions(contact_policies); + return TRUE; + } + break; + + case WM_DESTROY: + { + ContactPolicyMap *contact_policies = (ContactPolicyMap *)GetWindowLong(hwndDlg, GWL_USERDATA); + SetWindowLong(hwndDlg, GWL_USERDATA, 0); + delete contact_policies; + } + } + + return FALSE; +} + +int OptInit(WPARAM wParam, LPARAM lParam) { + OPTIONSDIALOGPAGE odp = { 0 }; +#define OPTIONPAGE_OLD_SIZE2 60 + //odp.cbSize = sizeof(odp); + odp.cbSize = OPTIONPAGE_OLD_SIZE2; + odp.position = 100; + odp.hInstance = hInst; + odp.pszTemplate = MAKEINTRESOURCE(IDD_OPT1); + odp.pszTitle = Translate(MODULE); + odp.pszGroup = Translate("Plugins"); + odp.flags = ODPF_BOLDGROUPS; + odp.nIDBottomSimpleControl = 0; + odp.pfnDlgProc = DlgProcOpts1; + CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp ); + + return 0; +} + +void OptDeinit() { +} -- cgit v1.2.3