From f04d64869f3b1de54fb343f28f955584780001b8 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Sat, 26 Nov 2011 15:41:10 +0000 Subject: Project folders rename part 3 git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@215 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- UserInfoEx/svc_gender.cpp | 284 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 UserInfoEx/svc_gender.cpp (limited to 'UserInfoEx/svc_gender.cpp') diff --git a/UserInfoEx/svc_gender.cpp b/UserInfoEx/svc_gender.cpp new file mode 100644 index 0000000..128b9fe --- /dev/null +++ b/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; +} -- cgit v1.2.3