summaryrefslogtreecommitdiff
path: root/plugins/UserInfoEx/svc_gender.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/UserInfoEx/svc_gender.cpp')
-rw-r--r--plugins/UserInfoEx/svc_gender.cpp284
1 files changed, 284 insertions, 0 deletions
diff --git a/plugins/UserInfoEx/svc_gender.cpp b/plugins/UserInfoEx/svc_gender.cpp
new file mode 100644
index 0000000000..128b9fe97e
--- /dev/null
+++ b/plugins/UserInfoEx/svc_gender.cpp
@@ -0,0 +1,284 @@
+/*
+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_gender.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_contacts.h"
+
+static HANDLE ghExtraIconF = INVALID_HANDLE_VALUE;
+static HANDLE ghExtraIconM = INVALID_HANDLE_VALUE;
+static HANDLE ghExtraIconSvc = INVALID_HANDLE_VALUE;
+
+static HANDLE hChangedHook = NULL;
+static HANDLE hApplyIconHook = NULL;
+static HANDLE hRebuildIconsHook = NULL;
+
+BYTE GenderOf(HANDLE hContact, LPCSTR pszProto)
+{
+ DBVARIANT dbv;
+
+ if (DB::Setting::GetAsIsEx(hContact, USERINFO, pszProto, SET_CONTACT_GENDER, &dbv) == 0)
+ {
+ // gender must be byte and either M or F
+ if (dbv.type == DBVT_BYTE && (dbv.bVal == 'M' || dbv.bVal == 'F'))
+ {
+ return dbv.bVal;
+ }
+ DB::Variant::Free(&dbv);
+ }
+ return 0;
+}
+
+/**
+ * This function gets the gender of the contact from the database.
+ *
+ * @param hContact - handle to contact to read email from
+ *
+ * @retval F - contact is female
+ * @retval M - contact is male
+ * @retval 0 - contact does not provide its gender
+ **/
+BYTE GenderOf(HANDLE hContact)
+{
+ return GenderOf(hContact, DB::Contact::Proto(hContact));
+}
+
+/***********************************************************************************************************
+ * Event Handler functions
+ ***********************************************************************************************************/
+
+static INT OnCListRebuildIcons(WPARAM wParam, LPARAM lParam)
+{
+ HICON hIcon = IcoLib_GetIcon(ICO_COMMON_FEMALE);
+ ghExtraIconF = (HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)hIcon, 0);
+ CallService(MS_SKIN2_RELEASEICON,(WPARAM)hIcon,0);
+ hIcon = IcoLib_GetIcon(ICO_COMMON_MALE);
+ ghExtraIconM = (HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)hIcon, 0);
+ CallService(MS_SKIN2_RELEASEICON,(WPARAM)hIcon,0);
+ 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(HANDLE hContact, LPARAM)
+{
+ if (myGlobals.ExtraIconsServiceExist && (ghExtraIconSvc != INVALID_HANDLE_VALUE))
+ {
+ EXTRAICON ico;
+
+ ZeroMemory(&ico, sizeof(ico));
+ ico.cbSize = sizeof(ico);
+ ico.hContact = hContact;
+ ico.hExtraIcon = ghExtraIconSvc;
+ switch (GenderOf(hContact))
+ {
+ case 'M':
+ ico.icoName = ICO_COMMON_MALE;
+ break;
+ case 'F':
+ ico.icoName = ICO_COMMON_FEMALE;
+ break;
+ default:
+ ico.icoName = NULL;
+ }
+ CallService(MS_EXTRAICON_SET_ICON, (WPARAM)&ico, 0);
+ }
+ else
+ {
+ IconExtraColumn iec;
+
+ iec.ColumnType = DB::Setting::GetByte(SET_CLIST_EXTRAICON_GENDER, DEFVAL_CLIST_EXTRAICON_GENDER);
+ if ((BYTE)iec.ColumnType != -1)
+ {
+ iec.cbSize = sizeof(IconExtraColumn);
+ switch (GenderOf(hContact))
+ {
+ case 'M':
+ iec.hImage = ghExtraIconM;
+ break;
+ case 'F':
+ iec.hImage = ghExtraIconF;
+ break;
+ default:
+ iec.hImage = INVALID_HANDLE_VALUE;
+ }
+ CallService(MS_CLIST_EXTRA_SET_ICON, (WPARAM)hContact, (LPARAM)&iec);
+ }
+ }
+ 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->value.type <= DBVT_BYTE) && !mir_stricmp(pdbcws->szSetting, SET_CONTACT_GENDER))
+ {
+ OnCListApplyIcons(hContact, 0);
+ }
+ return 0;
+}
+
+/***********************************************************************************************************
+ * public Module Interface functions
+ ***********************************************************************************************************/
+
+/**
+ * Force all icons to be reloaded.
+ *
+ * @param wParam - handle to the contact whose extra icon is to apply
+ * @param lParam - not used
+ **/
+VOID SvcGenderApplyCListIcons()
+{
+ HANDLE hContact;
+
+ //walk through all the contacts stored in the DB
+ for (hContact = DB::Contact::FindFirst(); hContact != NULL; hContact = DB::Contact::FindNext(hContact))
+ {
+ OnCListApplyIcons(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 SvcGenderEnableExtraIcons(BYTE bColumn, BOOLEAN bUpdateDB)
+{
+ bool bEnable = (bColumn!=((BYTE)-1));
+ if (myGlobals.HaveCListExtraIcons)
+ {
+ if (bUpdateDB)
+ {
+ if (myGlobals.ExtraIconsServiceExist)
+ {
+ DB::Setting::WriteByte(SET_CLIST_EXTRAICON_GENDER2, bColumn);
+ }
+ else
+ {
+ DB::Setting::WriteByte(SET_CLIST_EXTRAICON_GENDER, bColumn);
+ }
+ }
+
+ if (bEnable) // Gender checkt or dropdown select
+ {
+ 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 = "gender"; //must be the same as the group name in extraicon
+ ico.description="Gender (uinfoex)";
+ ico.descIcon = ICO_COMMON_MALE;
+ ghExtraIconSvc = (HANDLE)CallService(MS_EXTRAICON_REGISTER, (WPARAM)&ico, 0);
+ }
+ }
+ else
+ {
+ if (hRebuildIconsHook == NULL)
+ {
+ hRebuildIconsHook = HookEvent(ME_CLIST_EXTRA_LIST_REBUILD, OnCListRebuildIcons);
+ OnCListRebuildIcons(0, 0);
+ }
+ }
+ // hook events
+ if (hChangedHook == NULL)
+ {
+ hChangedHook = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, (MIRANDAHOOK)OnContactSettingChanged);
+ }
+ if (hApplyIconHook == NULL)
+ {
+ hApplyIconHook = HookEvent(ME_CLIST_EXTRA_IMAGE_APPLY, (MIRANDAHOOK)OnCListApplyIcons);
+ }
+ }
+ else
+ {
+ if (hChangedHook)
+ {
+ UnhookEvent(hChangedHook);
+ hChangedHook = NULL;
+ }
+ if (hApplyIconHook)
+ {
+ UnhookEvent(hApplyIconHook);
+ hApplyIconHook = NULL;
+ }
+ if (hRebuildIconsHook)
+ {
+ UnhookEvent(hRebuildIconsHook);
+ hRebuildIconsHook = NULL;
+ }
+ }
+ SvcGenderApplyCListIcons();
+ }
+}
+
+/**
+ * This function initially loads the module uppon startup.
+ **/
+VOID SvcGenderLoadModule()
+{
+ if ( myGlobals.ExtraIconsServiceExist)
+ {
+ SvcGenderEnableExtraIcons(DB::Setting::GetByte(SET_CLIST_EXTRAICON_GENDER2, 0), FALSE);
+ }
+ else
+ {
+ SvcGenderEnableExtraIcons(DB::Setting::GetByte(SET_CLIST_EXTRAICON_GENDER, DEFVAL_CLIST_EXTRAICON_GENDER), FALSE);
+ }
+}
+
+/**
+ * This function unloads the module.
+ *
+ * @param none
+ *
+ * @return nothing
+ **/
+VOID SvcGenderUnloadModule()
+{
+ // unhook event handlers
+ UnhookEvent(hChangedHook); hChangedHook = NULL;
+ UnhookEvent(hApplyIconHook); hApplyIconHook = NULL;
+ UnhookEvent(hRebuildIconsHook); hRebuildIconsHook = NULL;
+}