summaryrefslogtreecommitdiff
path: root/plugins/UserInfoEx/src/svc_email.cpp
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-07-24 11:48:31 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-07-24 11:48:31 +0000
commit171e81205e357e0d54283a63997ed58ff97d54a9 (patch)
tree2fe6f4cb440569e07d151564446433fb84b83839 /plugins/UserInfoEx/src/svc_email.cpp
parent1e92bf5cf72665b5fec103a0a70d734340725539 (diff)
UserInfoEx, Variables: changed folder structure
git-svn-id: http://svn.miranda-ng.org/main/trunk@1160 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/UserInfoEx/src/svc_email.cpp')
-rw-r--r--plugins/UserInfoEx/src/svc_email.cpp409
1 files changed, 409 insertions, 0 deletions
diff --git a/plugins/UserInfoEx/src/svc_email.cpp b/plugins/UserInfoEx/src/svc_email.cpp
new file mode 100644
index 0000000000..a9a0b47686
--- /dev/null
+++ b/plugins/UserInfoEx/src/svc_email.cpp
@@ -0,0 +1,409 @@
+/*
+UserinfoEx plugin for Miranda IM
+
+Copyright:
+ฉ 2006-2010 DeathAxe, Yasnovidyashii, Merlin, K. Romanov, Kreol
+
+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.
+
+===============================================================================
+
+File name : $HeadURL: https://userinfoex.googlecode.com/svn/trunk/svc_email.cpp $
+Revision : $Revision: 187 $
+Last change on : $Date: 2010-09-08 16:05:54 +0400 (ะกั€, 08 ัะตะฝ 2010) $
+Last change by : $Author: ing.u.horn $
+
+===============================================================================
+*/
+#include "commonheaders.h"
+#include "m_email.h"
+
+static HANDLE ghMenuItem = NULL;
+static HANDLE ghExtraIconDef = INVALID_HANDLE_VALUE;
+static HANDLE ghExtraIconSvc = INVALID_HANDLE_VALUE;
+
+static HANDLE hChangedHook = NULL;
+static HANDLE hApplyIconHook = NULL;
+static HANDLE hRebuildIconsHook = NULL;
+
+/**
+ * This function reads the email address of the contact.
+ *
+ * @param hContact - handle to contact to read email from
+ *
+ * @retval email address
+ * @retval NULL, if contact does not provide any email address
+ **/
+static LPSTR Get(HANDLE hContact)
+{
+ // ignore owner
+ if (hContact != NULL)
+ {
+ LPCSTR pszProto = DB::Contact::Proto(hContact);
+
+ if (pszProto != NULL)
+ {
+ LPCSTR e[2][4] = {
+ { SET_CONTACT_EMAIL, SET_CONTACT_EMAIL0, SET_CONTACT_EMAIL1, "Mye-mail0"},
+ { SET_CONTACT_COMPANY_EMAIL, SET_CONTACT_COMPANY_EMAIL0, SET_CONTACT_COMPANY_EMAIL1, "MyCompanye-mail0"}
+ };
+
+ INT i, j;
+ LPSTR pszEMail;
+
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ pszEMail = DB::Setting::GetAStringEx(hContact, USERINFO, pszProto, e[i][j]);
+ if (pszEMail)
+ {
+ if (strchr(pszEMail, '@'))
+ {
+ return pszEMail;
+ }
+ mir_free(pszEMail);
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Service function that sends emails
+ *
+ * @param wParam - handle to contact to send an email to
+ * @param lParam - not used
+ *
+ * @retval 0 if email was sent
+ * @retval 1 if no email can be sent
+ **/
+static INT_PTR MenuCommand(WPARAM wParam,LPARAM lParam)
+{
+ INT result;
+ LPSTR val = NULL;
+
+ __try
+ {
+ val = Get((HANDLE) wParam);
+ if (val)
+ {
+ LPSTR szUrl;
+ INT_PTR len;
+
+ len = mir_strlen(val) + strlen("mailto:");
+
+ szUrl = (LPSTR)_alloca(len + 1);
+
+ mir_snprintf(szUrl, len + 1, "mailto:%s", val);
+ mir_free(val);
+
+ result = CallService(MS_UTILS_OPENURL, 1, (LPARAM)szUrl);
+ }
+ else
+ {
+ result = 1;
+ MsgBox((HWND)lParam, MB_OK, LPGENT("Send e-mail"), NULL, LPGENT("Memory allocation error!"));
+ }
+ }
+ __except(GetExceptionCode()==EXCEPTION_ACCESS_VIOLATION ?
+ EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
+ {
+ if (val)
+ {
+ mir_free(val);
+ }
+
+ result = 1;
+ MsgErr((HWND)lParam, LPGENT("Memory allocation error!"));
+ }
+ return result;
+}
+
+/***********************************************************************************************************
+ * Event Handler functions
+ ***********************************************************************************************************/
+
+static INT OnCListRebuildIcons(WPARAM wParam, LPARAM lParam)
+{
+ HICON hIcon = IcoLib_GetIcon(ICO_BTN_EMAIL);
+ ghExtraIconDef = (HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)hIcon, 0);
+ Skin_ReleaseIcon(hIcon);
+ return 0;
+}
+
+/**
+ * Notification handler for clist extra icons to be applied for a contact.
+ *
+ * @param wParam - handle to the contact whose extra icon is to apply
+ * @param lParam - not used
+ **/
+static INT OnCListApplyIcons(WPARAM wParam, LPARAM lParam)
+{
+ LPSTR val = Get((HANDLE)wParam);
+
+ if (!myGlobals.ExtraIconsServiceExist)
+ {
+ IconExtraColumn iec;
+
+ iec.cbSize = sizeof(IconExtraColumn);
+ iec.ColumnType = EXTRA_ICON_EMAIL;
+ if (val)
+ {
+ iec.hImage = ghExtraIconDef;
+ mir_free(val);
+ }
+ else
+ {
+ iec.hImage = INVALID_HANDLE_VALUE;
+ mir_free(val);
+ }
+ CallService(MS_CLIST_EXTRA_SET_ICON, wParam, (LPARAM)&iec);
+ }
+ else
+ {
+ EXTRAICON ico;
+ ico.cbSize=sizeof(ico);
+ ico.hContact=(HANDLE)wParam;
+ ico.hExtraIcon=ghExtraIconSvc;
+ ico.icoName=val?ICO_BTN_EMAIL:(char *)0;
+ mir_free(val);
+ CallService(MS_EXTRAICON_SET_ICON, (WPARAM)&ico, 0);
+ }
+ return 0;
+}
+
+/**
+ * Notification handler for changed contact settings
+ *
+ * @param wParam - (HANDLE)hContact
+ * @param lParam - (DBCONTACTWRITESETTING*)pdbcws
+ **/
+static INT OnContactSettingChanged(HANDLE hContact, DBCONTACTWRITESETTING* pdbcws)
+{
+ if (hContact && pdbcws && pdbcws->szSetting &&
+ ((pdbcws->value.type & DBVTF_VARIABLELENGTH) || (pdbcws->value.type == DBVT_DELETED)) &&
+ (!mir_strncmp(pdbcws->szSetting, SET_CONTACT_EMAIL, 6) ||
+ !mir_strncmp(pdbcws->szSetting, SET_CONTACT_COMPANY_EMAIL, 13) ||
+ !mir_strncmp(pdbcws->szSetting, "mye-mail0", 9)))
+ {
+ OnCListApplyIcons((WPARAM)hContact, 0);
+ }
+ return 0;
+}
+
+/**
+ * This function decides whether to show menuitem for sending emails or not.
+ *
+ * @param wParam - handle to contact to send an email to
+ * @param lParam - not used
+ *
+ * @return always 0
+ **/
+static INT OnPreBuildMenu(WPARAM wParam, LPARAM lParam)
+{
+ CLISTMENUITEM mi;
+ LPSTR val;
+
+ ZeroMemory(&mi, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS;
+
+ val = Get((HANDLE)wParam);
+ if (val)
+ {
+ mir_free(val);
+ }
+ else
+ {
+ mi.flags = CMIM_FLAGS | CMIF_HIDDEN;
+ }
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)ghMenuItem, (LPARAM)&mi);
+ return 0;
+}
+
+/***********************************************************************************************************
+ * public Module Interface functions
+ ***********************************************************************************************************/
+
+/**
+ * This function enables or disables menuitems.
+ **/
+VOID SvcEMailRebuildMenu()
+{
+ static HANDLE hPrebuildMenuHook = NULL;
+
+ if (DB::Setting::GetByte(SET_EXTENDED_EMAILSERVICE, TRUE))
+ {
+ if (!hPrebuildMenuHook)
+ {
+ hPrebuildMenuHook = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, OnPreBuildMenu);
+ }
+
+ if (!ghMenuItem)
+ {
+ CLISTMENUITEM mi;
+
+ // insert contact menuitem
+ ZeroMemory(&mi, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.position = -2000010000;
+ mi.hIcon = IcoLib_GetIcon(ICO_BTN_EMAIL);
+ mi.pszName = "&E-mail";
+ mi.pszService = MS_EMAIL_SENDEMAIL;
+ ghMenuItem = Menu_AddContactMenuItem(&mi);
+ }
+ }
+ else
+ {
+ if (hPrebuildMenuHook)
+ {
+ UnhookEvent(ME_CLIST_PREBUILDCONTACTMENU);
+ hPrebuildMenuHook = NULL;
+ }
+ if (ghMenuItem)
+ {
+ CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)ghMenuItem, NULL);
+ ghMenuItem = NULL;
+ }
+ }
+}
+
+/**
+ * Force all icons to be reloaded.
+ *
+ * @param wParam - handle to the contact whose extra icon is to apply
+ * @param lParam - not used
+ **/
+VOID SvcEMailApplyCListIcons()
+{
+ HANDLE hContact;
+
+ //walk through all the contacts stored in the DB
+ for (hContact = DB::Contact::FindFirst(); hContact != NULL; hContact = DB::Contact::FindNext(hContact))
+ {
+ OnCListApplyIcons((WPARAM)hContact, 0);
+ }
+}
+
+/**
+ * Enable or disable the replacement of clist extra icons.
+ *
+ * @param bEnable - determines whether icons are enabled or not
+ * @param bUpdateDB - if true the database setting is updated, too.
+ **/
+VOID SvcEMailEnableExtraIcons(BOOLEAN bEnable, BOOLEAN bUpdateDB)
+{
+ if (myGlobals.HaveCListExtraIcons)
+ {
+ if (bUpdateDB)
+ {
+ DB::Setting::WriteByte(SET_CLIST_EXTRAICON_EMAIL, bEnable);
+ }
+
+ if (bEnable) // E-mail checkt
+ {
+ // hook events
+ if (hChangedHook == NULL)
+ {
+ hChangedHook = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, (MIRANDAHOOK)OnContactSettingChanged);
+ }
+ if (hApplyIconHook == NULL)
+ {
+ hApplyIconHook = HookEvent(ME_CLIST_EXTRA_IMAGE_APPLY, OnCListApplyIcons);
+ }
+ if (myGlobals.ExtraIconsServiceExist)
+ {
+ if (ghExtraIconSvc == INVALID_HANDLE_VALUE)
+ {
+ EXTRAICON_INFO ico;
+
+ ZeroMemory(&ico, sizeof(ico));
+ ico.cbSize = sizeof(ico);
+ ico.type = EXTRAICON_TYPE_ICOLIB;
+ ico.name = "email"; //must be the same as the group name in extraicon
+ ico.description= "E-mail (uinfoex)";
+ ico.descIcon = ICO_BTN_EMAIL;
+ ghExtraIconSvc = (HANDLE)CallService(MS_EXTRAICON_REGISTER, (WPARAM)&ico, 0);
+ ZeroMemory(&ico,sizeof(ico));
+ }
+ }
+ else if (hRebuildIconsHook == NULL)
+ {
+ hRebuildIconsHook = HookEvent(ME_CLIST_EXTRA_LIST_REBUILD, OnCListRebuildIcons);
+ OnCListRebuildIcons(0, 0);
+ }
+ }
+ else // E-mail uncheckt
+ {
+ if (hChangedHook)
+ {
+ UnhookEvent(hChangedHook);
+ hChangedHook = NULL;
+ }
+ if (hApplyIconHook)
+ {
+ UnhookEvent(hApplyIconHook);
+ hApplyIconHook = NULL;
+ }
+ if (hRebuildIconsHook)
+ {
+ UnhookEvent(hRebuildIconsHook);
+ hRebuildIconsHook = NULL;
+ }
+ }
+ SvcEMailApplyCListIcons();
+ }
+}
+
+/**
+ * This function initially loads the module uppon startup.
+ **/
+VOID SvcEMailOnModulesLoaded()
+{
+ SvcEMailEnableExtraIcons(
+ myGlobals.ExtraIconsServiceExist ||
+ DB::Setting::GetByte(SET_CLIST_EXTRAICON_EMAIL,
+ DEFVAL_CLIST_EXTRAICON_EMAIL), FALSE);
+}
+
+/**
+ * This function initially loads the module uppon startup.
+ **/
+VOID SvcEMailLoadModule()
+{
+ if (DB::Setting::GetByte(SET_EXTENDED_EMAILSERVICE, TRUE)) {
+ // create own email send command
+ if (!myDestroyServiceFunction(MS_EMAIL_SENDEMAIL))
+ CreateServiceFunction(MS_EMAIL_SENDEMAIL, MenuCommand);
+ }
+}
+
+/**
+ * This function unloads the Email module.
+ *
+ * @param none
+ *
+ * @return nothing
+ **/
+VOID SvcEMailUnloadModule()
+{
+ // unhook event handlers
+ UnhookEvent(hChangedHook); hChangedHook = NULL;
+ UnhookEvent(hApplyIconHook); hApplyIconHook = NULL;
+ UnhookEvent(hRebuildIconsHook); hRebuildIconsHook = NULL;
+}