diff options
Diffstat (limited to 'plugins/MirOTR/src/svcs_menu.cpp')
-rw-r--r-- | plugins/MirOTR/src/svcs_menu.cpp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/plugins/MirOTR/src/svcs_menu.cpp b/plugins/MirOTR/src/svcs_menu.cpp new file mode 100644 index 0000000000..6699c00adc --- /dev/null +++ b/plugins/MirOTR/src/svcs_menu.cpp @@ -0,0 +1,189 @@ +#include "stdafx.h"
+
+static HGENMENU hStopItem, hStartItem;
+
+////////////////////////////////
+///////// Menu Services ////////
+///////////////////////////////
+int StartOTR(MCONTACT hContact) {
+ const char *proto = GetContactProto(hContact);
+ if (!proto) return 1; // error
+ char *uname = contact_get_id(hContact);
+ if (!uname) return 1; // error
+ DWORD pol = db_get_dw(hContact, MODULENAME, "Policy", CONTACT_DEFAULT_POLICY);
+ if(pol == CONTACT_DEFAULT_POLICY) pol = options.default_policy;
+
+ lib_cs_lock();
+ char *msg = otrl_proto_default_query_msg(MODULENAME, pol);
+ otr_gui_inject_message((void*)hContact, proto, proto, uname, msg ? msg : "?OTRv2?");
+ lib_cs_unlock();
+ otrl_message_free(msg);
+ mir_free(uname);
+ return 0;
+}
+
+INT_PTR SVC_StartOTR(WPARAM hContact, LPARAM lParam)
+{
+ TCHAR buff[512];
+
+ MCONTACT hSub = db_mc_getMostOnline(hContact);
+ if(hSub != 0)
+ hContact = hSub;
+
+ if ( options.bHaveSecureIM && CallService("SecureIM/IsContactSecured", hContact, 0) != 0 ) {
+ mir_sntprintf(buff, SIZEOF(buff), TranslateT(LANG_OTR_SECUREIM_STARTED), contact_get_nameT(hContact));
+ ShowError(buff);
+ return 0;
+ }
+
+ mir_sntprintf(buff, SIZEOF(buff), TranslateT(LANG_SESSION_REQUEST_OTR), contact_get_nameT(hContact));
+ ShowMessage(hContact, buff);
+
+ return StartOTR(hContact);
+}
+
+INT_PTR SVC_RefreshOTR(WPARAM hContact, LPARAM lParam)
+{
+ TCHAR buff[512];
+
+ MCONTACT hSub = db_mc_getMostOnline(hContact);
+ if(hSub != 0)
+ hContact = hSub;
+
+ if ( options.bHaveSecureIM && CallService("SecureIM/IsContactSecured", hContact, 0) != 0 ) {
+ mir_sntprintf(buff, 512, TranslateT(LANG_OTR_SECUREIM_STARTED), contact_get_nameT(hContact));
+ ShowError(buff);
+ return 0;
+ }
+
+ mir_sntprintf(buff, SIZEOF(buff), TranslateT(LANG_SESSION_TRY_CONTINUE_OTR), contact_get_nameT(hContact));
+ ShowMessage(hContact, buff);
+
+ int res = StartOTR(hContact);
+ if (res) return res;
+
+ return 0;
+}
+
+int otr_disconnect_contact(MCONTACT hContact)
+{
+ MCONTACT hSub = db_mc_getMostOnline(hContact);
+ if (hSub != 0)
+ hContact = hSub;
+
+ const char *proto = GetContactProto(hContact);
+ if (!proto) return 1; // error
+ char *uname = contact_get_id(hContact);
+ if (!uname) return 1; // error
+
+ lib_cs_lock();
+ otrl_message_disconnect(otr_user_state, &ops, (void*)hContact, proto, proto, uname);
+ lib_cs_unlock();
+ mir_free(uname);
+ return 0;
+}
+
+INT_PTR SVC_StopOTR(WPARAM hContact, LPARAM lParam)
+{
+ // prevent this filter from acting on injeceted messages for metas, when they are passed though the subcontact's proto send chain
+ if (otr_disconnect_contact(hContact)) return 0;
+
+ SetEncryptionStatus(hContact, TRUST_NOT_PRIVATE);
+
+ TCHAR buff[512];
+ mir_sntprintf(buff, SIZEOF(buff), TranslateT(LANG_SESSION_TERMINATED_OTR), contact_get_nameT(hContact));
+ ShowMessage(hContact, buff);
+ return 0;
+}
+
+INT_PTR SVC_VerifyOTR(WPARAM hContact, LPARAM lParam)
+{
+ MCONTACT hSub = db_mc_getMostOnline(hContact);
+ if(hSub != 0)
+ hContact = hSub;
+
+ ConnContext *context = otrl_context_find_miranda(otr_user_state, hContact);
+ if (!context)
+ return 1;
+
+ //VerifyContextDialog(context);
+ SMPInitDialog(context);
+ return 0;
+}
+
+INT_PTR SVC_ToggleHTMLOTR(WPARAM hContact, LPARAM lParam)
+{
+ MCONTACT hSub = db_mc_getMostOnline(hContact);
+ if (hSub != 0)
+ hContact = hSub;
+
+ if (db_get_b(hContact, MODULENAME, "HTMLConv", 0))
+ db_set_b(hContact, MODULENAME, "HTMLConv", 0);
+ else
+ db_set_b(hContact, MODULENAME, "HTMLConv", 1);
+
+ return 0;
+}
+
+void InitMenu()
+{
+ CreateServiceFunction(MS_OTR_MENUSTART, SVC_StartOTR);
+ CreateServiceFunction(MS_OTR_MENUSTOP, SVC_StopOTR);
+ CreateServiceFunction(MS_OTR_MENUREFRESH, SVC_RefreshOTR);
+ CreateServiceFunction(MS_OTR_MENUVERIFY, SVC_VerifyOTR);
+ CreateServiceFunction(MS_OTR_MENUTOGGLEHTML, SVC_ToggleHTMLOTR);
+
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIF_NOTOFFLINE | CMIF_TCHAR;
+ mi.position = -400000;
+
+ mi.ptszName = _T(LANG_STOP_OTR);
+ mi.pszService = MS_OTR_MENUSTOP;
+ mi.icolibItem = GetIconHandle(ICON_PRIVATE);
+
+ hStopItem = Menu_AddContactMenuItem(&mi);
+
+ mi.ptszName = _T(LANG_START_OTR);
+ mi.pszService = MS_OTR_MENUSTART;
+ mi.icolibItem = GetIconHandle(ICON_NOT_PRIVATE);
+
+ hStartItem = Menu_AddContactMenuItem(&mi);
+
+ HookEvent(ME_CLIST_PREBUILDCONTACTMENU, SVC_PrebuildContactMenu);
+}
+
+int SVC_PrebuildContactMenu(WPARAM hContact, LPARAM lParam)
+{
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIM_FLAGS | CMIF_NOTOFFLINE | CMIF_TCHAR;
+
+ const char *proto = GetContactProto(hContact);
+ DWORD pol = CONTACT_DEFAULT_POLICY;
+
+ if (!proto || db_get_b(hContact, proto, "ChatRoom", 0) == 1) {
+hide_all:
+ Menu_ShowItem(hStartItem, false);
+ Menu_ShowItem(hStopItem, false);
+ return 0;
+ }
+
+ if(proto && strcmp(proto, META_PROTO) == 0) {
+ // make menu act as per most online subcontact
+ hContact = db_mc_getMostOnline(hContact);
+ if (!hContact)
+ goto hide_all;
+ proto = GetContactProto(hContact);
+ }
+
+ pol = db_get_dw(hContact, MODULENAME, "Policy", CONTACT_DEFAULT_POLICY);
+ if(pol == CONTACT_DEFAULT_POLICY) pol = options.default_policy;
+
+ if(pol == OTRL_POLICY_NEVER || pol == OTRL_POLICY_ALWAYS)
+ goto hide_all;
+
+ ConnContext *context = otrl_context_find_miranda(otr_user_state, hContact);
+ TrustLevel encrypted = otr_context_get_trust(context);
+ Menu_ShowItem(hStartItem, encrypted == TRUST_NOT_PRIVATE);
+ Menu_ShowItem(hStopItem, encrypted != TRUST_NOT_PRIVATE);
+ return 0;
+}
\ No newline at end of file |