summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2012-07-05 22:41:06 +0000
committerGeorge Hazan <george.hazan@gmail.com>2012-07-05 22:41:06 +0000
commite3cefc7b6ca803e3f87dbadae54a110332778490 (patch)
tree0ee41f14f962f946c9e64fae4a11fbcb197af853 /src/core
parentf0fb070eab8f276e66c0154363656045bc0dadb3 (diff)
- first of the /Core standard plugins;
- code cleaning git-svn-id: http://svn.miranda-ng.org/main/trunk@778 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src/core')
-rw-r--r--src/core/commonheaders.h1
-rw-r--r--src/core/miranda.cpp55
-rw-r--r--src/core/miranda.h21
-rw-r--r--src/core/modules.cpp10
-rw-r--r--src/core/stdplug.h23
-rw-r--r--src/core/stduserinfo/commonheaders.cpp2
-rw-r--r--src/core/stduserinfo/commonheaders.h96
-rw-r--r--src/core/stduserinfo/contactinfo.cpp528
-rw-r--r--src/core/stduserinfo/main.cpp90
-rw-r--r--src/core/stduserinfo/res/cursor_hyperlink.curbin0 -> 326 bytes
-rw-r--r--src/core/stduserinfo/resource.rc303
-rw-r--r--src/core/stduserinfo/stdinfo.cpp612
-rw-r--r--src/core/stduserinfo/stduserinfo_10.vcxproj218
-rw-r--r--src/core/stduserinfo/stduserinfo_10.vcxproj.filters50
-rw-r--r--src/core/stduserinfo/userinfo.cpp629
-rw-r--r--src/core/stduserinfo/version.h14
-rw-r--r--src/core/stduserinfo/version.rc38
17 files changed, 2640 insertions, 50 deletions
diff --git a/src/core/commonheaders.h b/src/core/commonheaders.h
index 5e6c25da62..ca35d2ae4b 100644
--- a/src/core/commonheaders.h
+++ b/src/core/commonheaders.h
@@ -93,6 +93,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <m_timezones.h>
#include "miranda.h"
+#include "stdplug.h"
#include <m_ssl.h>
#include <m_netlib.h>
diff --git a/src/core/miranda.cpp b/src/core/miranda.cpp
index a04846b217..4ee236537f 100644
--- a/src/core/miranda.cpp
+++ b/src/core/miranda.cpp
@@ -118,27 +118,27 @@ static void __cdecl compactHeapsThread(void*)
HANDLE hHeaps[256];
DWORD hc;
SleepEx((1000*60)*5, TRUE); // every 5 minutes
- hc=GetProcessHeaps(255, (PHANDLE)&hHeaps);
+ hc = GetProcessHeaps(255, (PHANDLE)&hHeaps);
if (hc != 0 && hc < 256) {
DWORD j;
- for (j=0; j < hc; j++)
+ for (j = 0; j < hc; j++)
HeapCompact(hHeaps[j], 0);
}
} //while
}
-void (*SetIdleCallback) (void)=NULL;
+void (*SetIdleCallback) (void) = NULL;
static INT_PTR SystemSetIdleCallback(WPARAM, LPARAM lParam)
{
if (lParam && SetIdleCallback == NULL) {
- SetIdleCallback=(void (*)(void))lParam;
+ SetIdleCallback = (void (*)(void))lParam;
return 1;
}
return 0;
}
-static DWORD dwEventTime=0;
+static DWORD dwEventTime = 0;
void checkIdle(MSG * msg)
{
switch(msg->message) {
@@ -209,9 +209,8 @@ void ParseCommandLine()
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
- DWORD myPid=0;
- int messageloop=1;
- HMODULE hUser32, hThemeAPI, hDwmApi, hShFolder = NULL;
+ DWORD myPid = 0;
+ int messageloop = 1;
int result = 0;
hInst = hInstance;
@@ -222,23 +221,23 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif
- hUser32 = GetModuleHandleA("user32");
+ HINSTANCE hUser32 = GetModuleHandleA("user32");
openInputDesktop = (pfnOpenInputDesktop)GetProcAddress (hUser32, "OpenInputDesktop");
closeDesktop = (pfnCloseDesktop)GetProcAddress (hUser32, "CloseDesktop");
msgWaitForMultipleObjectsEx = (pfnMsgWaitForMultipleObjectsEx)GetProcAddress(hUser32, "MsgWaitForMultipleObjectsEx");
- animateWindow =(pfnAnimateWindow)GetProcAddress(hUser32, "AnimateWindow");
- setLayeredWindowAttributes =(pfnSetLayeredWindowAttributes)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
+ animateWindow = (pfnAnimateWindow)GetProcAddress(hUser32, "AnimateWindow");
+ setLayeredWindowAttributes = (pfnSetLayeredWindowAttributes)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
MyMonitorFromPoint = (pfnMyMonitorFromPoint)GetProcAddress(hUser32, "MonitorFromPoint");
MyMonitorFromRect = (pfnMyMonitorFromRect)GetProcAddress(hUser32, "MonitorFromRect");
MyMonitorFromWindow = (pfnMyMonitorFromWindow)GetProcAddress(hUser32, "MonitorFromWindow");
MyGetMonitorInfo = (pfnMyGetMonitorInfo)GetProcAddress(hUser32, "GetMonitorInfoW");
- hShFolder = GetModuleHandleA("shell32");
+ HINSTANCE hShFolder = GetModuleHandleA("shell32");
shGetSpecialFolderPathA = (pfnSHGetSpecialFolderPathA)GetProcAddress(hShFolder, "SHGetSpecialFolderPathA");
shGetSpecialFolderPathW = (pfnSHGetSpecialFolderPathW)GetProcAddress(hShFolder, "SHGetSpecialFolderPathW");
if (shGetSpecialFolderPathA == NULL) {
- hShFolder = LoadLibraryA("ShFolder.dll");
+ HINSTANCE hShFolder = LoadLibraryA("ShFolder.dll");
shGetSpecialFolderPathA = (pfnSHGetSpecialFolderPathA)GetProcAddress(hShFolder, "SHGetSpecialFolderPathA");
shGetSpecialFolderPathW = (pfnSHGetSpecialFolderPathW)GetProcAddress(hShFolder, "SHGetSpecialFolderPathW");
}
@@ -246,17 +245,17 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
shAutoComplete = (pfnSHAutoComplete)GetProcAddress(GetModuleHandleA("shlwapi"), "SHAutoComplete");
if ( IsWinVerXPPlus()) {
- hThemeAPI = LoadLibraryA("uxtheme.dll");
+ HINSTANCE hThemeAPI = LoadLibraryA("uxtheme.dll");
if (hThemeAPI) {
openThemeData = (pfnOpenThemeData)GetProcAddress(hThemeAPI, "OpenThemeData");
isThemeBackgroundPartiallyTransparent = (pfnIsThemeBackgroundPartiallyTransparent)GetProcAddress(hThemeAPI, "IsThemeBackgroundPartiallyTransparent");
- drawThemeParentBackground = (pfnDrawThemeParentBackground)GetProcAddress(hThemeAPI, "DrawThemeParentBackground");
+ drawThemeParentBackground = (pfnDrawThemeParentBackground)GetProcAddress(hThemeAPI, "DrawThemeParentBackground");
drawThemeBackground = (pfnDrawThemeBackground)GetProcAddress(hThemeAPI, "DrawThemeBackground");
drawThemeText = (pfnDrawThemeText)GetProcAddress(hThemeAPI, "DrawThemeText");
drawThemeTextEx = (pfnDrawThemeTextEx)GetProcAddress(hThemeAPI, "DrawThemeTextEx");
getThemeBackgroundContentRect = (pfnGetThemeBackgroundContentRect)GetProcAddress(hThemeAPI , "GetThemeBackgroundContentRect");
getThemeFont = (pfnGetThemeFont)GetProcAddress(hThemeAPI, "GetThemeFont");
- closeThemeData = (pfnCloseThemeData)GetProcAddress(hThemeAPI, "CloseThemeData");
+ closeThemeData = (pfnCloseThemeData)GetProcAddress(hThemeAPI, "CloseThemeData");
enableThemeDialogTexture = (pfnEnableThemeDialogTexture)GetProcAddress(hThemeAPI, "EnableThemeDialogTexture");
setWindowTheme = (pfnSetWindowTheme)GetProcAddress(hThemeAPI, "SetWindowTheme");
setWindowThemeAttribute = (pfnSetWindowThemeAttribute)GetProcAddress(hThemeAPI, "SetWindowThemeAttribute");
@@ -270,7 +269,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
}
if ( IsWinVerVistaPlus()) {
- hDwmApi = LoadLibraryA("dwmapi.dll");
+ HINSTANCE hDwmApi = LoadLibraryA("dwmapi.dll");
if (hDwmApi) {
dwmExtendFrameIntoClientArea = (pfnDwmExtendFrameIntoClientArea)GetProcAddress(hDwmApi, "DwmExtendFrameIntoClientArea");
dwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled)GetProcAddress(hDwmApi, "DwmIsCompositionEnabled");
@@ -306,12 +305,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
forkthread(compactHeapsThread, 0, NULL);
CreateServiceFunction(MS_SYSTEM_SETIDLECALLBACK, SystemSetIdleCallback);
CreateServiceFunction(MS_SYSTEM_GETIDLE, SystemGetIdle);
- dwEventTime=GetTickCount();
- myPid=GetCurrentProcessId();
+ dwEventTime = GetTickCount();
+ myPid = GetCurrentProcessId();
while (messageloop) {
MSG msg;
DWORD rc;
- BOOL dying=FALSE;
+ BOOL dying = FALSE;
rc = MsgWaitForMultipleObjectsEx(waitObjectCount, hWaitObjects, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
if (rc >= WAIT_OBJECT_0 && rc < WAIT_OBJECT_0 + waitObjectCount) {
rc -= WAIT_OBJECT_0;
@@ -320,7 +319,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
//
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message != WM_QUIT) {
- HWND h=GetForegroundWindow();
+ HWND h = GetForegroundWindow();
DWORD pid = 0;
checkIdle(&msg);
if (h != NULL && GetWindowThreadProcessId(h, &pid) && pid == myPid && GetClassLongPtr(h, GCW_ATOM) == 32770)
@@ -344,7 +343,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
PostQuitMessage(0);
}
else if (dying)
- messageloop=0;
+ messageloop = 0;
}
}
@@ -358,12 +357,8 @@ exit:
OleUninitialize();
- if (bufferedPaintUninit) bufferedPaintUninit();
-
- if (hDwmApi) FreeLibrary(hDwmApi);
- if (hThemeAPI) FreeLibrary(hThemeAPI);
- if (hShFolder) FreeLibrary(hShFolder);
-
+ if (bufferedPaintUninit)
+ bufferedPaintUninit();
return result;
}
@@ -401,8 +396,8 @@ static INT_PTR GetMirandaVersionText(WPARAM wParam, LPARAM lParam)
PVOID pVerInfo;
GetModuleFileName(NULL, filename, SIZEOF(filename));
- verInfoSize=GetFileVersionInfoSize(filename, &unused);
- pVerInfo=mir_alloc(verInfoSize);
+ verInfoSize = GetFileVersionInfoSize(filename, &unused);
+ pVerInfo = mir_alloc(verInfoSize);
GetFileVersionInfo(filename, 0, verInfoSize, pVerInfo);
VerQueryValue(pVerInfo, _T("\\StringFileInfo\\000004b0\\ProductVersion"), (LPVOID*)&productVersion, &blockSize);
#if defined(_WIN64)
diff --git a/src/core/miranda.h b/src/core/miranda.h
index 3446fc0a72..3b08c636ba 100644
--- a/src/core/miranda.h
+++ b/src/core/miranda.h
@@ -126,7 +126,7 @@ void KillModuleSounds(int hLangpack);
/**** miranda.cpp **********************************************************************/
extern HINSTANCE hInst;
-extern HANDLE hOkToExitEvent, hModulesLoadedEvent;
+extern HANDLE hOkToExitEvent, hModulesLoadedEvent, hevLoadModule, hevUnloadModule;
/**** utf.cpp **************************************************************************/
@@ -145,20 +145,10 @@ HTREEITEM FindNamedTreeItemAtRoot(HWND hwndTree, const TCHAR* name);
/**** skin2icons.cpp *******************************************************************/
-HANDLE IcoLib_AddNewIcon(int hLangpack, SKINICONDESC* sid);
-HICON IcoLib_GetIcon(const char* pszIconName, bool big);
-HICON IcoLib_GetIconByHandle(HANDLE hItem, bool big);
-HANDLE IcoLib_IsManaged(HICON hIcon);
-int IcoLib_ReleaseIcon(HICON hIcon, char* szIconName, bool big);
-
void KillModuleIcons(int hLangpack);
/**** skinicons.cpp ********************************************************************/
-HICON LoadSkinProtoIcon(const char* szProto, int status, bool big = false);
-HICON LoadSkinIcon(int idx, bool big = false);
-HANDLE GetSkinIconHandle(int idx);
-
HICON LoadIconEx(HINSTANCE hInstance, LPCTSTR lpIconName, BOOL bShared);
int ImageList_AddIcon_NotShared(HIMAGELIST hIml, LPCTSTR szResource);
int ImageList_ReplaceIcon_NotShared(HIMAGELIST hIml, int iIndex, HINSTANCE hInstance, LPCTSTR szResource);
@@ -167,20 +157,13 @@ int ImageList_AddIcon_IconLibLoaded(HIMAGELIST hIml, int iconId);
int ImageList_AddIcon_ProtoIconLibLoaded(HIMAGELIST hIml, const char* szProto, int iconId);
int ImageList_ReplaceIcon_IconLibLoaded(HIMAGELIST hIml, int nIndex, HICON hIcon);
-void Button_SetIcon_IcoLib(HWND hDlg, int itemId, int iconId, const char* tooltip);
-void Button_FreeIcon_IcoLib(HWND hDlg, int itemId);
-
-void Window_SetIcon_IcoLib(HWND hWnd, int iconId);
-void Window_SetProtoIcon_IcoLib(HWND hWnd, const char* szProto, int iconId);
-void Window_FreeIcon_IcoLib(HWND hWnd);
-
-#define IconLib_ReleaseIcon(hIcon, szName) IcoLib_ReleaseIcon(hIcon, szName, false);
#define Safe_DestroyIcon(hIcon) if (hIcon) DestroyIcon(hIcon)
/**** clistmenus.cpp ********************************************************************/
extern HANDLE hMainMenuObject, hContactMenuObject, hStatusMenuObject;
extern HANDLE hPreBuildMainMenuEvent, hPreBuildContactMenuEvent;
+extern HANDLE hShutdownEvent, hPreShutdownEvent;
extern const int statusModeList[ MAX_STATUS_COUNT ];
extern const int skinIconStatusList[ MAX_STATUS_COUNT ];
diff --git a/src/core/modules.cpp b/src/core/modules.cpp
index d1636a09a0..d33fc47a84 100644
--- a/src/core/modules.cpp
+++ b/src/core/modules.cpp
@@ -146,7 +146,14 @@ int LoadDefaultModules(void)
if ( LoadIgnoreModule()) return 1;
if ( LoadVisibilityModule()) return 1;
- if ( !pluginDefault[ 0].pImpl) if ( LoadUserInfoModule()) return 1;
+ for (int i=0; i < 1; i++) {
+ if ( pluginDefault[i].pImpl )
+ continue;
+
+ if ( !LoadCorePlugin(pluginDefault[i]))
+ return 1;
+ }
+
if ( !pluginDefault[ 1].pImpl) if ( LoadSendRecvUrlModule()) return 1;
if ( !pluginDefault[ 2].pImpl) if ( LoadSendRecvEMailModule()) return 1;
if ( !pluginDefault[ 3].pImpl) if ( LoadSendRecvAuthModule()) return 1;
@@ -157,6 +164,7 @@ int LoadDefaultModules(void)
if ( !pluginDefault[ 8].pImpl) if ( LoadAutoAwayModule()) return 1;
if ( !pluginDefault[ 9].pImpl) if ( LoadUserOnlineModule()) return 1;
if ( !pluginDefault[10].pImpl) if ( LoadUpdateNotifyModule()) return 1;
+
return 0;
}
diff --git a/src/core/stdplug.h b/src/core/stdplug.h
new file mode 100644
index 0000000000..269eeeba3d
--- /dev/null
+++ b/src/core/stdplug.h
@@ -0,0 +1,23 @@
+
+#ifdef _STATIC
+ #define MIRANDA_EXE_FUNC(T) extern "C" T __declspec(dllexport)
+#else
+ #define MIRANDA_EXE_FUNC(T) extern "C" T __declspec(dllimport)
+#endif
+
+MIRANDA_EXE_FUNC(HICON) LoadSkinProtoIcon(const char* szProto, int status, bool big = false);
+MIRANDA_EXE_FUNC(HICON) LoadSkinIcon(int idx, bool big = false);
+MIRANDA_EXE_FUNC(HANDLE) GetSkinIconHandle(int idx);
+
+MIRANDA_EXE_FUNC(HANDLE) IcoLib_AddNewIcon(int hLangpack, SKINICONDESC* sid);
+MIRANDA_EXE_FUNC(HICON) IcoLib_GetIcon(const char* pszIconName, bool big);
+MIRANDA_EXE_FUNC(HICON) IcoLib_GetIconByHandle(HANDLE hItem, bool big);
+MIRANDA_EXE_FUNC(HANDLE) IcoLib_IsManaged(HICON hIcon);
+MIRANDA_EXE_FUNC(int) IcoLib_ReleaseIcon(HICON hIcon, char* szIconName, bool big=false);
+
+MIRANDA_EXE_FUNC(void) Button_SetIcon_IcoLib(HWND hDlg, int itemId, int iconId, const char* tooltip);
+MIRANDA_EXE_FUNC(void) Button_FreeIcon_IcoLib(HWND hDlg, int itemId);
+
+MIRANDA_EXE_FUNC(void) Window_SetIcon_IcoLib(HWND hWnd, int iconId);
+MIRANDA_EXE_FUNC(void) Window_SetProtoIcon_IcoLib(HWND hWnd, const char* szProto, int iconId);
+MIRANDA_EXE_FUNC(void) Window_FreeIcon_IcoLib(HWND hWnd);
diff --git a/src/core/stduserinfo/commonheaders.cpp b/src/core/stduserinfo/commonheaders.cpp
new file mode 100644
index 0000000000..95b2201163
--- /dev/null
+++ b/src/core/stduserinfo/commonheaders.cpp
@@ -0,0 +1,2 @@
+#include "commonheaders.h"
+
diff --git a/src/core/stduserinfo/commonheaders.h b/src/core/stduserinfo/commonheaders.h
new file mode 100644
index 0000000000..b3fdcb29f3
--- /dev/null
+++ b/src/core/stduserinfo/commonheaders.h
@@ -0,0 +1,96 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2009 Miranda ICQ/IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+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.
+*/
+
+// to enable all 0.9.0 core functions
+#define MIRANDA_VER 0x0A00
+
+#define WINVER 0x0700
+#define _WIN32_WINNT 0x0700
+#define _WIN32_IE 0x0601
+
+#include <tchar.h>
+#include <winsock2.h>
+#include <shlobj.h>
+#include <uxtheme.h>
+#include <commctrl.h>
+#include <vssym32.h>
+
+#include <stdio.h>
+#include <time.h>
+#include <stddef.h>
+#include <process.h>
+#include <io.h>
+#include <limits.h>
+#include <string.h>
+#include <locale.h>
+#include <direct.h>
+#include <malloc.h>
+
+#include <win2k.h>
+
+#include <m_system.h>
+#include <m_system_cpp.h>
+#include <m_core.h>
+#include <newpluginapi.h>
+#include <m_database.h>
+#include <m_netlib.h>
+#include <m_clc.h>
+#include <m_clui.h>
+#include <m_crypto.h>
+#include <m_langpack.h>
+#include <m_clist.h>
+#include <m_clistint.h>
+#include <m_avatars.h>
+#include <m_button.h>
+#include <m_protosvc.h>
+#include <m_protomod.h>
+#include <m_protocols.h>
+#include <m_protoint.h>
+#include <m_plugins.h>
+#include <m_options.h>
+#include <m_skin.h>
+#include <m_contacts.h>
+#include <m_message.h>
+#include <m_userinfo.h>
+#include <m_history.h>
+#include <m_addcontact.h>
+#include <m_findadd.h>
+#include <m_file.h>
+#include <m_email.h>
+#include <m_awaymsg.h>
+#include <m_idle.h>
+#include <m_ignore.h>
+#include <m_icolib.h>
+#include <m_modernopt.h>
+#include <m_help.h>
+#include <m_timezones.h>
+
+#include "version.h"
+
+#include "../../resource.h"
+#include "../stdplug.h"
+
+extern HINSTANCE hInst;
+
+typedef HRESULT (STDAPICALLTYPE *pfnEnableThemeDialogTexture)(HWND hwnd, DWORD dwFlags);
+extern pfnEnableThemeDialogTexture enableThemeDialogTexture;
diff --git a/src/core/stduserinfo/contactinfo.cpp b/src/core/stduserinfo/contactinfo.cpp
new file mode 100644
index 0000000000..031a9e40ab
--- /dev/null
+++ b/src/core/stduserinfo/contactinfo.cpp
@@ -0,0 +1,528 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2009 Miranda ICQ/IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+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.
+*/
+
+#include "commonheaders.h"
+
+static HFONT hEmailFont = NULL;
+static HCURSOR hHandCursor = NULL;
+
+static INT_PTR CALLBACK EditUserEmailDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam);
+ if (*(char*)lParam) SetWindowText(hwndDlg, TranslateT("Edit E-Mail Address"));
+ TranslateDialogDefault(hwndDlg);
+ SetDlgItemTextA(hwndDlg, IDC_EMAIL, (char*)lParam);
+ EnableWindow(GetDlgItem(hwndDlg, IDOK), *(char*)lParam);
+ return TRUE;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDOK:
+ GetDlgItemTextA(hwndDlg, IDC_EMAIL, (char*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA), 256);
+ //fall through
+ case IDCANCEL:
+ EndDialog(hwndDlg, wParam);
+ case IDC_EMAIL:
+ if (HIWORD(wParam) == EN_CHANGE)
+ EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EMAIL)));
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK EditUserPhoneDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static int noRecursion = 0;
+
+ switch(msg) {
+ case WM_INITDIALOG:
+ {
+ char *szText = (char*)lParam;
+ int i, item, countryCount;
+ struct CountryListEntry *countries;
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam);
+ if (szText[0]) SetWindowText(hwndDlg, TranslateT("Edit Phone Number"));
+ TranslateDialogDefault(hwndDlg);
+ if (lstrlenA(szText)>4 && !lstrcmpA(szText+lstrlenA(szText)-4, " SMS")) {
+ CheckDlgButton(hwndDlg, IDC_SMS, BST_CHECKED);
+ szText[lstrlenA(szText)-4] = '\0';
+ }
+ EnableWindow(GetDlgItem(hwndDlg, IDOK), szText[0]);
+ SendDlgItemMessage(hwndDlg, IDC_AREA, EM_LIMITTEXT, 31, 0);
+ SendDlgItemMessage(hwndDlg, IDC_NUMBER, EM_LIMITTEXT, 63, 0);
+ CallService(MS_UTILS_GETCOUNTRYLIST, (WPARAM)&countryCount, (LPARAM)&countries);
+ for (i=0;i<countryCount;i++) {
+ if (countries[i].id == 0 || countries[i].id == 0xFFFF) continue;
+ item = SendDlgItemMessageA(hwndDlg, IDC_COUNTRY, CB_ADDSTRING, 0, (LPARAM)Translate(countries[i].szName));
+ SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_SETITEMDATA, item, countries[i].id);
+ }
+ SetDlgItemTextA(hwndDlg, IDC_PHONE, szText);
+ }
+ return TRUE;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDOK:
+ { char *szText = (char*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ int isValid = 1;
+ GetDlgItemTextA(hwndDlg, IDC_PHONE, szText, 252);
+ if (lstrlenA(szText)<7 || szText[0] != '+') isValid = 0;
+ if (isValid) isValid = (lstrlenA(szText+1) == (int)strspn(szText+1, "0123456789 ()-"));
+ if ( !isValid) {
+ MessageBox(hwndDlg, TranslateT("The phone number should start with a + and consist of numbers, spaces, brackets and hyphens only."), TranslateT("Invalid Phone Number"), MB_OK);
+ break;
+ }
+ if (IsDlgButtonChecked(hwndDlg, IDC_SMS)) lstrcatA(szText, " SMS");
+ }
+ //fall through
+ case IDCANCEL:
+ EndDialog(hwndDlg, wParam);
+ case IDC_COUNTRY:
+ if (HIWORD(wParam) != CBN_SELCHANGE) break;
+ case IDC_AREA:
+ case IDC_NUMBER:
+ if (LOWORD(wParam) != IDC_COUNTRY && HIWORD(wParam) != EN_CHANGE) break;
+ if (noRecursion) break;
+ EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
+ { char szPhone[96], szArea[32], szNumber[64];
+ GetDlgItemTextA(hwndDlg, IDC_AREA, szArea, SIZEOF(szArea));
+ GetDlgItemTextA(hwndDlg, IDC_NUMBER, szNumber, SIZEOF(szNumber));
+ mir_snprintf(szPhone, SIZEOF(szPhone), "+%u (%s) %s", SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_GETCURSEL, 0, 0), 0), szArea, szNumber);
+ noRecursion = 1;
+ SetDlgItemTextA(hwndDlg, IDC_PHONE, szPhone);
+ noRecursion = 0;
+ }
+ break;
+ case IDC_PHONE:
+ if (HIWORD(wParam) != EN_UPDATE) break;
+ if (noRecursion) break;
+ noRecursion = 1;
+ {
+ char szText[256], *pText = NULL, *pArea, *pNumber;
+ int isValid = 1;
+ GetDlgItemTextA(hwndDlg, IDC_PHONE, szText, SIZEOF(szText));
+ if (szText[0] != '+')
+ isValid = 0;
+
+ if (isValid) {
+ int i, country = strtol(szText+1, &pText, 10);
+ if (pText - szText > 4)
+ isValid = 0;
+ else {
+ for (i = SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_GETCOUNT, 0, 0)-1; i >= 0; i--)
+ if (country == SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_GETITEMDATA, i, 0)) {
+ SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_SETCURSEL, i, 0);
+ break;
+ }
+ if (i < 0)
+ isValid = 0;
+ }
+ }
+ if (isValid) {
+ pArea = pText+strcspn(pText, "0123456789");
+ pText = pArea+strspn(pArea, "0123456789");
+ if (*pText) {
+ *pText = '\0';
+ pNumber = pText+1+strcspn(pText+1, "0123456789");
+ SetDlgItemTextA(hwndDlg, IDC_NUMBER, pNumber);
+ }
+ SetDlgItemTextA(hwndDlg, IDC_AREA, pArea);
+ }
+ if ( !isValid) {
+ SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_SETCURSEL, -1, 0);
+ SetDlgItemTextA(hwndDlg, IDC_AREA, "");
+ SetDlgItemTextA(hwndDlg, IDC_NUMBER, "");
+ }
+ }
+ noRecursion = 0;
+ EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(GetDlgItem(hwndDlg, IDC_PHONE)));
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static int IsOverEmail(HWND hwndDlg, TCHAR* szEmail, int cchEmail)
+{
+ RECT rc;
+ HWND hwndEmails;
+ TCHAR szText[256];
+ HDC hdc;
+ SIZE textSize;
+ LVHITTESTINFO hti;
+
+ hwndEmails = GetDlgItem(hwndDlg, IDC_EMAILS);
+ GetCursorPos(&hti.pt);
+ ScreenToClient(hwndEmails, &hti.pt);
+ GetClientRect(hwndEmails, &rc);
+ if ( !PtInRect(&rc, hti.pt)) return 0;
+ if (ListView_SubItemHitTest(hwndEmails, &hti) == -1) return 0;
+ if (hti.iSubItem != 1) return 0;
+ if ( !(hti.flags&LVHT_ONITEMLABEL)) return 0;
+ ListView_GetSubItemRect(hwndEmails, hti.iItem, 1, LVIR_LABEL, &rc);
+ szText[0] = 0;
+ ListView_GetItemText(hwndEmails, hti.iItem, 1, szText, SIZEOF(szText));
+ hdc = GetDC(hwndEmails);
+ SelectObject(hdc, hEmailFont);
+ GetTextExtentPoint32(hdc, szText, lstrlen(szText), &textSize);
+ ReleaseDC(hwndEmails, hdc);
+ if (hti.pt.x<rc.left+textSize.cx) {
+ if (szEmail && cchEmail) lstrcpyn(szEmail, szText, cchEmail);
+ return 1;
+ }
+ return 0;
+}
+
+#define M_REMAKELISTS (WM_USER+1)
+INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam);
+ if (hEmailFont) DeleteObject(hEmailFont);
+ {
+ LOGFONT lf;
+ hEmailFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_EMAILS, WM_GETFONT, 0, 0);
+ GetObject(hEmailFont, sizeof(lf), &lf);
+ lf.lfUnderline = 1;
+ hEmailFont = CreateFontIndirect(&lf);
+ }
+ if (hHandCursor == NULL) {
+ if ( IsWinVer2000Plus()) hHandCursor = LoadCursor(NULL, IDC_HAND);
+ else hHandCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_HYPERLINKHAND));
+ }
+ TranslateDialogDefault(hwndDlg);
+ {
+ LVCOLUMN lvc;
+ RECT rc;
+ GetClientRect(GetDlgItem(hwndDlg, IDC_EMAILS), &rc);
+ rc.right-=GetSystemMetrics(SM_CXVSCROLL);
+ lvc.mask = LVCF_WIDTH;
+ ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg, IDC_EMAILS), LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
+ ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg, IDC_PHONES), LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
+ lvc.cx = rc.right/4;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 0, &lvc);
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 0, &lvc);
+ lvc.cx = rc.right-rc.right/4-40;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 1, &lvc);
+ lvc.cx = rc.right-rc.right/4-90;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 1, &lvc);
+ lvc.cx = 50;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 2, &lvc);
+ lvc.cx = 20;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 2, &lvc);
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 3, &lvc);
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 3, &lvc);
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 4, &lvc);
+ }
+ break;
+
+ case M_REMAKELISTS:
+ {
+ int i;
+ HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ if (hContact != NULL) {
+ char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto == NULL)
+ break;
+
+ //e-mails
+ ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_EMAILS));
+
+ char idstr[33];
+ TCHAR idstr2[33];
+ DBVARIANT dbv;
+
+ LVITEM lvi;
+ lvi.mask = LVIF_TEXT|LVIF_PARAM;
+ lvi.lParam = (LPARAM)(-1);
+ lvi.iSubItem = 0;
+ lvi.iItem = 0;
+ for (i = -1;;i++) {
+ if (i == -1) {
+ if (DBGetContactSettingTString(hContact, szProto, "e-mail", &dbv))
+ continue;
+ lvi.pszText = TranslateT("Primary");
+ }
+ else {
+ mir_snprintf(idstr, SIZEOF(idstr), "e-mail%d", i);
+ if (DBGetContactSettingTString(hContact, szProto, idstr, &dbv))
+ break;
+
+ lvi.pszText = idstr2;
+ mir_sntprintf(idstr2, SIZEOF(idstr2), _T("%d"), i+2);
+ }
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_EMAILS), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_EMAILS), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ lvi.iSubItem = 0;
+ for (i=0;;i++) {
+ lvi.lParam = i;
+ mir_snprintf(idstr, SIZEOF(idstr), "Mye-mail%d", i);
+ if (DBGetContactSettingTString(hContact, "UserInfo", idstr, &dbv))
+ break;
+ lvi.pszText = idstr2;
+ mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"), i+1);
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_EMAILS), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_EMAILS), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ lvi.mask = LVIF_PARAM;
+ lvi.lParam = (LPARAM)(-2);
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_EMAILS), &lvi);
+ //phones
+ ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_PHONES));
+ lvi.mask = LVIF_TEXT|LVIF_PARAM;
+ lvi.lParam = (LPARAM)(-1);
+ lvi.iSubItem = 0;
+ lvi.iItem = 0;
+ if ( !DBGetContactSettingTString(hContact, szProto, "Phone", &dbv)) {
+ lvi.pszText = TranslateT("Primary");
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ if ( !DBGetContactSettingTString(hContact, szProto, "Fax", &dbv)) {
+ lvi.pszText = TranslateT("Fax");
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ if ( !DBGetContactSettingTString(hContact, szProto, "Cellular", &dbv)) {
+ lvi.pszText = TranslateT("Mobile");
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ if (lstrlenA(dbv.pszVal)>4 && !lstrcmpA(dbv.pszVal+lstrlenA(dbv.pszVal)-4, " SMS")) {
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 2, _T("y"));
+ dbv.ptszVal[lstrlen(dbv.ptszVal)-4] = '\0';
+ }
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ if ( !DBGetContactSettingTString(hContact, szProto, "CompanyPhone", &dbv)) {
+ lvi.pszText = TranslateT("Work Phone");
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ if ( !DBGetContactSettingTString(hContact, szProto, "CompanyFax", &dbv)) {
+ lvi.pszText = TranslateT("Work Fax");
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ lvi.iSubItem = 0;
+ for (i=0;; i++) {
+ lvi.lParam = i;
+ mir_snprintf(idstr, SIZEOF(idstr), "MyPhone%d", i);
+ if (DBGetContactSettingTString(hContact, "UserInfo", idstr, &dbv))
+ break;
+ lvi.pszText = idstr2;
+ mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"), i+1);
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ if (lstrlen(dbv.ptszVal)>4 && !lstrcmp(dbv.ptszVal+lstrlen(dbv.ptszVal)-4, _T(" SMS"))) {
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 2, _T("y"));
+ dbv.ptszVal[lstrlen(dbv.ptszVal)-4] = '\0';
+ }
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal);
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ lvi.mask = LVIF_PARAM;
+ lvi.lParam = (LPARAM)(-2);
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi);
+ }
+ }
+ break;
+
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED)
+ SendMessage(hwndDlg, M_REMAKELISTS, 0, 0);
+ break;
+
+ case IDC_EMAILS:
+ case IDC_PHONES:
+ switch (((LPNMHDR)lParam)->code) {
+ case NM_CUSTOMDRAW:
+ {
+ NMLVCUSTOMDRAW *nm = (NMLVCUSTOMDRAW*)lParam;
+ switch(nm->nmcd.dwDrawStage) {
+ case CDDS_PREPAINT:
+ case CDDS_ITEMPREPAINT:
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW);
+ return TRUE;
+ case CDDS_SUBITEM|CDDS_ITEMPREPAINT:
+ {
+ RECT rc;
+ ListView_GetSubItemRect(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, LVIR_LABEL, &rc);
+ if (nm->iSubItem == 1 && nm->nmcd.hdr.idFrom == IDC_EMAILS) {
+ HFONT hoFont;
+ TCHAR szText[256] = {0};
+ ListView_GetItemText(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, szText, SIZEOF(szText));
+ hoFont = (HFONT)SelectObject(nm->nmcd.hdc, hEmailFont);
+ SetTextColor(nm->nmcd.hdc, RGB(0, 0, 255));
+ DrawText(nm->nmcd.hdc, szText, -1, &rc, DT_END_ELLIPSIS|DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_TOP);
+ SelectObject(nm->nmcd.hdc, hoFont);
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT);
+ return TRUE;
+ }
+
+ HICON hIcon = NULL;
+ if (nm->nmcd.lItemlParam == (LPARAM)(-2) && nm->iSubItem-3 == (nm->nmcd.hdr.idFrom == IDC_PHONES))
+ hIcon = LoadSkinIcon(SKINICON_OTHER_ADDCONTACT);
+ else if (nm->iSubItem>1 && nm->nmcd.lItemlParam != (LPARAM)(-1) && nm->nmcd.lItemlParam != (LPARAM)(-2)) {
+ static int iconResources[3] = {SKINICON_OTHER_RENAME, SKINICON_OTHER_DELETE};
+ if (nm->iSubItem == 2 && nm->nmcd.hdr.idFrom == IDC_PHONES) {
+ TCHAR szText[2];
+ ListView_GetItemText(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, szText, SIZEOF(szText));
+ if (szText[0]) hIcon = LoadSkinIcon(SKINICON_OTHER_SMS);
+ }
+ else hIcon = LoadSkinIcon(iconResources[nm->iSubItem-3+(nm->nmcd.hdr.idFrom == IDC_EMAILS)]);
+ }
+ else break;
+ DrawIconEx(nm->nmcd.hdc, (rc.left+rc.right-GetSystemMetrics(SM_CXSMICON))/2, (rc.top+rc.bottom-GetSystemMetrics(SM_CYSMICON))/2, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL);
+ IcoLib_ReleaseIcon(hIcon, 0);
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT);
+ return TRUE;
+ }
+ }
+ }
+ break;
+
+ case NM_CLICK:
+ {
+ NMLISTVIEW *nm = (NMLISTVIEW*)lParam;
+ LVITEM lvi;
+ TCHAR szEmail[256];
+ HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ char *szIdTemplate = nm->hdr.idFrom == IDC_PHONES?"MyPhone%d":"Mye-mail%d";
+ LVHITTESTINFO hti;
+
+ if (IsOverEmail(hwndDlg, szEmail, SIZEOF(szEmail))) {
+ TCHAR szExec[264];
+ mir_sntprintf(szExec, SIZEOF(szExec), _T("mailto:%s"), szEmail);
+ ShellExecute(hwndDlg, _T("open"), szExec, NULL, NULL, SW_SHOW);
+ break;
+ }
+ if (nm->iSubItem<2) break;
+ hti.pt.x = (short)LOWORD(GetMessagePos());
+ hti.pt.y = (short)HIWORD(GetMessagePos());
+ ScreenToClient(nm->hdr.hwndFrom, &hti.pt);
+ if (ListView_SubItemHitTest(nm->hdr.hwndFrom, &hti) == -1) break;
+ lvi.mask = LVIF_PARAM;
+ lvi.iItem = hti.iItem;
+ lvi.iSubItem = 0;
+ ListView_GetItem(nm->hdr.hwndFrom, &lvi);
+ if (lvi.lParam == (LPARAM)(-1)) break;
+ if (lvi.lParam == (LPARAM)(-2)) {
+ if (hti.iSubItem-3 == (nm->hdr.idFrom == IDC_PHONES)) {
+ //add
+ char szNewData[256] = "", idstr[33];
+ DBVARIANT dbv;
+ if (IDOK != DialogBoxParam(hInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szNewData))
+ break;
+ for (int i=0;; i++) {
+ mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i);
+ if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break;
+ DBFreeVariant(&dbv);
+ }
+ DBWriteContactSettingString(hContact, "UserInfo", idstr, szNewData);
+ SendMessage(hwndDlg, M_REMAKELISTS, 0, 0);
+ }
+ }
+ else {
+ if (hti.iSubItem-3 == (nm->hdr.idFrom == IDC_PHONES)) {
+ //delete
+ int i;
+ char idstr[33];
+ DBVARIANT dbv;
+ for (i = lvi.lParam;;i++) {
+ mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i+1);
+ if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break;
+ mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i);
+ DBWriteContactSettingString(hContact, "UserInfo", idstr, dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i);
+ DBDeleteContactSetting(hContact, "UserInfo", idstr);
+ SendMessage(hwndDlg, M_REMAKELISTS, 0, 0);
+ }
+ else if (hti.iSubItem-2 == (nm->hdr.idFrom == IDC_PHONES)) {
+ //edit
+ char szText[256], idstr[33];
+ DBVARIANT dbv;
+ mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, lvi.lParam);
+ if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break;
+ lstrcpynA(szText, dbv.pszVal, SIZEOF(szText));
+ DBFreeVariant(&dbv);
+ if (IDOK != DialogBoxParam(hInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szText))
+ break;
+ DBWriteContactSettingString(hContact, "UserInfo", idstr, szText);
+ SendMessage(hwndDlg, M_REMAKELISTS, 0, 0);
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+ break;
+
+ case WM_SETCURSOR:
+ if (LOWORD(lParam) != HTCLIENT) break;
+ if (GetForegroundWindow() == GetParent(hwndDlg)) {
+ POINT pt;
+ GetCursorPos(&pt);
+ ScreenToClient(hwndDlg, &pt);
+ }
+ if (IsOverEmail(hwndDlg, NULL, 0)) {
+ SetCursor(hHandCursor);
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
+ return TRUE;
+ }
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
diff --git a/src/core/stduserinfo/main.cpp b/src/core/stduserinfo/main.cpp
new file mode 100644
index 0000000000..22420f0fa3
--- /dev/null
+++ b/src/core/stduserinfo/main.cpp
@@ -0,0 +1,90 @@
+/*
+
+Standard User Info plugin for Myranda IM
+
+Copyright (C) 2012 George Hazan
+
+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.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "commonheaders.h"
+
+int LoadUserInfoModule(void);
+
+CLIST_INTERFACE* pcli;
+TIME_API tmi;
+HINSTANCE hInst;
+int hLangpack;
+
+pfnEnableThemeDialogTexture enableThemeDialogTexture;
+
+PLUGININFOEX pluginInfo = {
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ MIRANDA_VERSION_DWORD,
+ __DESCRIPTION,
+ __AUTHOR,
+ __AUTHOREMAIL,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ // {8198DC94-0BC4-448A-8495-8FE832C1D333}
+ {0x8198dc94, 0xbc4, 0x448a, {0x84, 0x95, 0x8f, 0xe8, 0x32, 0xc1, 0xd3, 0x33 }}
+};
+
+static const MUUID interfaces[] = {MIID_UIUSERINFO, MIID_LAST};
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ hInst = hinstDLL;
+ return TRUE;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfo;
+}
+
+extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
+
+static int OnModulesLoaded(WPARAM, LPARAM)
+{
+ return 0;
+}
+
+extern "C" int __declspec(dllexport) Load(void)
+{
+ mir_getLP(&pluginInfo);
+ mir_getTMI(&tmi);
+
+ pcli = ( CLIST_INTERFACE* )CallService(MS_CLIST_RETRIEVE_INTERFACE, 0, (LPARAM)hInst);
+
+ if ( IsWinVerXPPlus()) {
+ HINSTANCE hThemeAPI = LoadLibraryA("uxtheme.dll");
+ if (hThemeAPI)
+ enableThemeDialogTexture = (pfnEnableThemeDialogTexture)GetProcAddress(hThemeAPI, "EnableThemeDialogTexture");
+ }
+
+ LoadUserInfoModule();
+ return 0;
+}
+
+extern "C" int __declspec(dllexport) Unload(void)
+{
+ return 0;
+}
diff --git a/src/core/stduserinfo/res/cursor_hyperlink.cur b/src/core/stduserinfo/res/cursor_hyperlink.cur
new file mode 100644
index 0000000000..f0f548c828
--- /dev/null
+++ b/src/core/stduserinfo/res/cursor_hyperlink.cur
Binary files differ
diff --git a/src/core/stduserinfo/resource.rc b/src/core/stduserinfo/resource.rc
new file mode 100644
index 0000000000..4b2a37b640
--- /dev/null
+++ b/src/core/stduserinfo/resource.rc
@@ -0,0 +1,303 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "..\..\resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include <winres.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+
+IDC_HYPERLINKHAND CURSOR "res/cursor_hyperlink.cur"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ADDPHONE DIALOGEX 0, 0, 210, 91
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Add Phone Number"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Enter country, area code and phone number:",IDC_STATIC,5,5,200,8
+ COMBOBOX IDC_COUNTRY,21,15,66,120,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_AREA,91,15,36,12,ES_AUTOHSCROLL | ES_NUMBER
+ EDITTEXT IDC_NUMBER,131,15,74,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "Or enter a full international number:",IDC_STATIC,5,30,200,8
+ EDITTEXT IDC_PHONE,21,40,184,12,ES_AUTOHSCROLL
+ CONTROL "Phone can receive SMS text messages",IDC_SMS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,56,200,10
+ DEFPUSHBUTTON "OK",IDOK,47,72,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,113,72,50,14
+END
+
+IDD_ADDEMAIL DIALOGEX 0, 0, 187, 42
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Add E-Mail Address"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ EDITTEXT IDC_EMAIL,5,5,177,12,ES_AUTOHSCROLL
+ DEFPUSHBUTTON "OK",IDOK,36,23,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,102,23,50,14
+END
+
+IDD_DETAILS DIALOGEX 0, 0, 318, 210
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "%s: User Details"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "%s\nView personal user details and more",IDC_HEADERBAR,
+ "MHeaderbarCtrl",0x0,0,0,318,25
+ CONTROL "",IDC_PAGETREE,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS | TVS_TRACKSELECT | TVS_FULLROWSELECT | TVS_NONEVENHEIGHT | WS_HSCROLL | WS_TABSTOP,3,30,76,176,WS_EX_STATICEDGE
+ CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK | TCS_MULTILINE | WS_TABSTOP,85,29,228,158
+ PUSHBUTTON "Update Now",IDC_UPDATE,85,191,55,14,WS_DISABLED
+ CTEXT "Updating",IDC_UPDATING,145,194,113,8,SS_NOPREFIX | SS_CENTERIMAGE
+ DEFPUSHBUTTON "OK",IDOK,263,191,50,14
+END
+
+IDD_INFO_SUMMARY DIALOGEX 0, 0, 222, 132
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Nickname:",IDC_STATIC,5,5,46,8
+ EDITTEXT IDC_NICK,51,5,166,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "First name:",IDC_STATIC,5,18,46,8
+ EDITTEXT IDC_FIRSTNAME,51,18,74,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Gender:",IDC_STATIC,126,18,44,8
+ EDITTEXT IDC_GENDER,170,18,47,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Last name:",IDC_STATIC,5,31,46,8
+ EDITTEXT IDC_LASTNAME,51,31,74,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Age:",IDC_STATIC,126,31,44,8
+ EDITTEXT IDC_AGE,170,31,47,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "E-mail:",IDC_STATIC,5,44,46,8
+ CONTROL "",IDC_EMAIL,"Hyperlink",WS_TABSTOP,51,44,166,8
+ LTEXT "Date of birth:",IDC_STATIC,5,58,59,8
+ EDITTEXT IDC_DOBDAY,66,58,8,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_DOBMONTH,76,58,16,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_DOBYEAR,94,58,20,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Marital status:",IDC_STATIC,5,71,76,8
+ EDITTEXT IDC_MARITAL,83,71,87,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+END
+
+IDD_INFO_CONTACT DIALOGEX 0, 0, 222, 132
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "E-mail:",IDC_STATIC,5,5,212,8
+ CONTROL "List1",IDC_EMAILS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,14,212,50
+ LTEXT "Phone:",IDC_STATIC,5,68,212,8
+ CONTROL "List1",IDC_PHONES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,77,212,50
+END
+
+IDD_INFO_BACKGROUND DIALOGEX 0, 0, 222, 132
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Web page:",IDC_STATIC,5,5,44,8
+ CONTROL "",IDC_WEBPAGE,"Hyperlink",WS_TABSTOP,49,5,168,8
+ LTEXT "Past background:",IDC_STATIC,5,18,212,8
+ CONTROL "List1",IDC_PAST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,27,212,44
+ LTEXT "Interests:",IDC_STATIC,5,74,212,8
+ CONTROL "List1",IDC_INTERESTS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,83,212,44
+END
+
+IDD_INFO_NOTES DIALOGEX 0, 0, 222, 132
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "About:",IDC_STATIC,5,5,212,8
+ EDITTEXT IDC_ABOUT,5,13,212,45,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
+ LTEXT "My notes:",IDC_STATIC,5,61,212,8
+ EDITTEXT IDC_MYNOTES,5,69,212,58,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL
+END
+
+IDD_INFO_LOCATION DIALOGEX 0, 0, 222, 147
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Street:",IDC_STATIC,5,5,51,8
+ EDITTEXT IDC_STREET,56,5,161,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "City:",IDC_STATIC,5,22,51,8
+ EDITTEXT IDC_CITY,56,22,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "State:",IDC_STATIC,5,33,51,8
+ EDITTEXT IDC_STATE,56,33,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Postal code:",IDC_STATIC,5,44,51,8
+ EDITTEXT IDC_ZIP,56,44,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Country:",IDC_STATIC,5,55,51,8
+ EDITTEXT IDC_COUNTRY,56,55,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Spoken languages:",IDC_STATIC,5,70,51,16
+ EDITTEXT IDC_LANGUAGE1,56,70,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_LANGUAGE2,56,78,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_LANGUAGE3,56,86,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Timezone:",IDC_STATIC,5,97,51,8
+ EDITTEXT IDC_TIMEZONE,56,97,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Local time:",IDC_STATIC,5,108,51,8
+ EDITTEXT IDC_LOCALTIME,56,108,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ COMBOBOX IDC_TIMEZONESELECT,4,132,214,46,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Set custom time zone",IDC_STATIC,5,121,212,8
+END
+
+IDD_INFO_WORK DIALOGEX 0, 0, 222, 132
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Company:",IDC_STATIC,5,5,51,8
+ EDITTEXT IDC_COMPANY,56,5,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Department:",IDC_STATIC,5,17,51,8
+ EDITTEXT IDC_DEPARTMENT,56,17,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Position:",IDC_STATIC,5,28,51,8
+ EDITTEXT IDC_POSITION,56,28,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Street:",IDC_STATIC,5,48,51,8
+ EDITTEXT IDC_STREET,56,48,161,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "City:",IDC_STATIC,5,65,51,8
+ EDITTEXT IDC_CITY,56,65,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "State:",IDC_STATIC,5,76,51,8
+ EDITTEXT IDC_STATE,56,76,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Postal code:",IDC_STATIC,5,87,51,8
+ EDITTEXT IDC_ZIP,56,87,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Country:",IDC_STATIC,5,98,51,8
+ EDITTEXT IDC_COUNTRY,56,98,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Website:",IDC_STATIC,5,109,51,8
+ CONTROL "",IDC_WEBPAGE,"Hyperlink",WS_TABSTOP,57,109,160,8
+END
+
+#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_INFO_CONTACT, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 217
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 127
+ END
+
+ IDD_INFO_BACKGROUND, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 217
+ VERTGUIDE, 49
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 127
+ END
+
+ IDD_INFO_NOTES, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 217
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 127
+ END
+
+ IDD_INFO_LOCATION, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 217
+ VERTGUIDE, 56
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 142
+ HORZGUIDE, 22
+ HORZGUIDE, 33
+ HORZGUIDE, 45
+ HORZGUIDE, 56
+ HORZGUIDE, 70
+ HORZGUIDE, 95
+ HORZGUIDE, 106
+ END
+
+ IDD_INFO_WORK, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 217
+ VERTGUIDE, 56
+ VERTGUIDE, 126
+ VERTGUIDE, 170
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 127
+ HORZGUIDE, 16
+ HORZGUIDE, 27
+ HORZGUIDE, 44
+ HORZGUIDE, 61
+ HORZGUIDE, 72
+ HORZGUIDE, 83
+ HORZGUIDE, 94
+ HORZGUIDE, 105
+ END
+
+ IDD_ADDEMAIL, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 182
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 37
+ END
+
+ IDD_ADDPHONE, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 205
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 86
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "..\..\resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include <windows.h>\r\n"
+ "#include <winres.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
diff --git a/src/core/stduserinfo/stdinfo.cpp b/src/core/stduserinfo/stdinfo.cpp
new file mode 100644
index 0000000000..008f2d0b74
--- /dev/null
+++ b/src/core/stduserinfo/stdinfo.cpp
@@ -0,0 +1,612 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2009 Miranda ICQ/IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+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.
+*/
+
+#include "commonheaders.h"
+
+INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+
+#define SVS_NORMAL 0
+#define SVS_GENDER 1
+#define SVS_ZEROISUNSPEC 2
+#define SVS_IP 3
+#define SVS_COUNTRY 4
+#define SVS_MONTH 5
+#define SVS_SIGNED 6
+#define SVS_TIMEZONE 7
+
+static int Proto_GetContactInfoSetting(HANDLE hContact, const char *szProto, const char *szModule, const char *szSetting, DBVARIANT *dbv, const int nType)
+{
+ DBCONTACTGETSETTING cgs = {szModule, szSetting, dbv};
+ dbv->type = (BYTE)nType;
+
+ return CallProtoService(szProto, PS_GETINFOSETTING, (WPARAM)hContact, (LPARAM)&cgs);
+}
+
+static void Proto_FreeInfoVariant(DBVARIANT *dbv)
+{
+ switch (dbv->type) {
+ case DBVT_ASCIIZ:
+ case DBVT_UTF8:
+ case DBVT_WCHAR:
+ {
+ mir_free(dbv->pszVal);
+ dbv->pszVal = 0;
+ break;
+ }
+ case DBVT_BLOB:
+ {
+ mir_free(dbv->pbVal);
+ dbv->pbVal = 0;
+ break;
+ }
+ }
+ dbv->type = 0;
+}
+
+static void SetValue(HWND hwndDlg, int idCtrl, HANDLE hContact, char *szModule, char *szSetting, int special)
+{
+ DBVARIANT dbv = { 0 };
+ char str[80], *pstr = NULL;
+ TCHAR* ptstr = NULL;
+ int unspecified = 0;
+ char* szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ bool proto_service = szProto && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC);
+
+ dbv.type = DBVT_DELETED;
+ if (szModule == NULL) unspecified = 1;
+ else if (proto_service) unspecified = Proto_GetContactInfoSetting(hContact, szProto, szModule, szSetting, &dbv, 0);
+ else unspecified = DBGetContactSettingW(hContact, szModule, szSetting, &dbv);
+ if ( !unspecified) {
+ switch(dbv.type) {
+ case DBVT_BYTE:
+ if (special == SVS_GENDER) {
+ if (dbv.cVal == 'M') ptstr = TranslateT("Male");
+ else if (dbv.cVal == 'F') ptstr = TranslateT("Female");
+ else unspecified = 1;
+ }
+ else if (special == SVS_MONTH) {
+ if (dbv.bVal>0 && dbv.bVal <= 12) {
+ pstr = str;
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SABBREVMONTHNAME1-1+dbv.bVal, str, SIZEOF(str));
+ }
+ else unspecified = 1;
+ }
+ else if (special == SVS_TIMEZONE) {
+ if (dbv.cVal == -100) unspecified = 1;
+ else {
+ pstr = str;
+ mir_snprintf(str, SIZEOF(str), dbv.cVal?"UTC%+d:%02d":"UTC", -dbv.cVal/2, (dbv.cVal&1)*30);
+ }
+ }
+ else {
+ unspecified = (special == SVS_ZEROISUNSPEC && dbv.bVal == 0);
+ pstr = _itoa(special == SVS_SIGNED?dbv.cVal:dbv.bVal, str, 10);
+ }
+ break;
+ case DBVT_WORD:
+ if (special == SVS_COUNTRY) {
+ WORD wSave = dbv.wVal;
+ if (wSave == (WORD)-1) {
+ char szSettingName[100];
+ mir_snprintf(szSettingName, SIZEOF(szSettingName), "%sName", szSetting);
+ if ( !DBGetContactSettingTString(hContact, szModule, szSettingName, &dbv)) {
+ ptstr = dbv.ptszVal;
+ unspecified = false;
+ break;
+ }
+ }
+
+ pstr = Translate((char*)CallService(MS_UTILS_GETCOUNTRYBYNUMBER, wSave, 0));
+ unspecified = pstr == NULL;
+ }
+ else {
+ unspecified = (special == SVS_ZEROISUNSPEC && dbv.wVal == 0);
+ pstr = _itoa(special == SVS_SIGNED?dbv.sVal:dbv.wVal, str, 10);
+ }
+ break;
+ case DBVT_DWORD:
+ unspecified = (special == SVS_ZEROISUNSPEC && dbv.dVal == 0);
+ if (special == SVS_IP) {
+ struct in_addr ia;
+ ia.S_un.S_addr = htonl(dbv.dVal);
+ pstr = inet_ntoa(ia);
+ if (dbv.dVal == 0) unspecified = 1;
+ }
+ else pstr = _itoa(special == SVS_SIGNED?dbv.lVal:dbv.dVal, str, 10);
+ break;
+ case DBVT_ASCIIZ:
+ unspecified = (special == SVS_ZEROISUNSPEC && dbv.pszVal[0] == '\0');
+ pstr = dbv.pszVal;
+ break;
+ case DBVT_UTF8:
+ unspecified = (special == SVS_ZEROISUNSPEC && dbv.pszVal[0] == '\0');
+ if ( !unspecified)
+ { WCHAR* wszStr;
+ Utf8Decode(dbv.pszVal, &wszStr);
+ SetDlgItemTextW(hwndDlg, idCtrl, TranslateTS(wszStr));
+ mir_free(wszStr);
+ goto LBL_Exit;
+ }
+
+ pstr = dbv.pszVal;
+ Utf8Decode(dbv.pszVal, NULL);
+ break;
+ default: pstr = str; lstrcpyA(str, "???"); break;
+ } }
+
+ if (unspecified)
+ SetDlgItemText(hwndDlg, idCtrl, TranslateT("<not specified>"));
+ else if (ptstr != NULL)
+ SetDlgItemText(hwndDlg, idCtrl, ptstr);
+ else
+ SetDlgItemTextA(hwndDlg, idCtrl, pstr);
+
+
+LBL_Exit:
+
+ EnableWindow(GetDlgItem(hwndDlg, idCtrl), !unspecified);
+ if (proto_service)
+ Proto_FreeInfoVariant(&dbv);
+ else
+ DBFreeVariant(&dbv);
+}
+
+static INT_PTR CALLBACK SummaryDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ break;
+
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED)
+ { char *szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+ if (hContact != NULL) {
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto == NULL) break;
+ SetValue(hwndDlg, IDC_NICK, hContact, szProto, "Nick", 0);
+ SetValue(hwndDlg, IDC_FIRSTNAME, hContact, szProto, "FirstName", 0);
+ SetValue(hwndDlg, IDC_LASTNAME, hContact, szProto, "LastName", 0);
+ SetValue(hwndDlg, IDC_EMAIL, hContact, szProto, "e-mail", 0);
+ SetValue(hwndDlg, IDC_AGE, hContact, szProto, "Age", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_GENDER, hContact, szProto, "Gender", SVS_GENDER);
+ SetValue(hwndDlg, IDC_DOBDAY, hContact, szProto, "BirthDay", 0);
+ SetValue(hwndDlg, IDC_DOBMONTH, hContact, szProto, "BirthMonth", SVS_MONTH);
+ SetValue(hwndDlg, IDC_DOBYEAR, hContact, szProto, "BirthYear", 0);
+ SetValue(hwndDlg, IDC_MARITAL, hContact, szProto, "MaritalStatus", 0);
+ } }
+ break;
+ }
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
+ break;
+ case IDC_EMAIL:
+ if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EMAIL))) {
+ TCHAR szExec[264], szEmail[256];
+ GetDlgItemText(hwndDlg, IDC_EMAIL, szEmail, SIZEOF(szEmail));
+ mir_sntprintf(szExec, SIZEOF(szExec), _T("mailto:%s"), szEmail);
+ ShellExecute(hwndDlg, _T("open"), szExec, NULL, NULL, SW_SHOW);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK LocationDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+ TranslateDialogDefault(hwndDlg);
+ SetTimer(hwndDlg, 1, 1000, NULL);
+
+ tmi.prepareList((HANDLE)lParam, GetDlgItem(hwndDlg, IDC_TIMEZONESELECT), TZF_PLF_CB);
+ SendMessage(hwndDlg, WM_TIMER, 0, 0);
+ break;
+
+ case WM_TIMER:
+ {
+ HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ if (hContact != NULL)
+ {
+ TCHAR szTime[80];
+
+ if (tmi.printDateTimeByContact(hContact, _T("s"), szTime, SIZEOF(szTime), TZF_KNOWNONLY))
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_LOCALTIME), FALSE);
+ SetDlgItemText(hwndDlg, IDC_LOCALTIME, TranslateT("<not specified>"));
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_LOCALTIME), TRUE);
+ SetDlgItemText(hwndDlg, IDC_LOCALTIME, szTime);
+ }
+ }
+ break;
+ }
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED)
+ { char *szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+ if (hContact != NULL) {
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto == NULL) break;
+ SetValue(hwndDlg, IDC_STREET, hContact, szProto, "Street", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_CITY, hContact, szProto, "City", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_STATE, hContact, szProto, "State", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_ZIP, hContact, szProto, "ZIP", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_COUNTRY, hContact, szProto, "Country", SVS_COUNTRY);
+ SetValue(hwndDlg, IDC_LANGUAGE1, hContact, szProto, "Language1", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_LANGUAGE2, hContact, szProto, "Language2", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_LANGUAGE3, hContact, szProto, "Language3", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_TIMEZONE, hContact, szProto, "Timezone", SVS_TIMEZONE);
+ }
+ }
+ break;
+ }
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
+ break;
+ case IDC_TIMEZONESELECT:
+ if (HIWORD(wParam) == CBN_SELCHANGE) {
+ HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ tmi.storeListResults(hContact, GetDlgItem(hwndDlg, IDC_TIMEZONESELECT), TZF_PLF_CB);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK WorkDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED)
+ { char *szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+ if (hContact != NULL) {
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto == NULL) break;
+ SetValue(hwndDlg, IDC_COMPANY, hContact, szProto, "Company", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_DEPARTMENT, hContact, szProto, "CompanyDepartment", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_POSITION, hContact, szProto, "CompanyPosition", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_STREET, hContact, szProto, "CompanyStreet", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_CITY, hContact, szProto, "CompanyCity", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_STATE, hContact, szProto, "CompanyState", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_ZIP, hContact, szProto, "CompanyZIP", SVS_ZEROISUNSPEC);
+ SetValue(hwndDlg, IDC_COUNTRY, hContact, szProto, "CompanyCountry", SVS_COUNTRY);
+ SetValue(hwndDlg, IDC_WEBPAGE, hContact, szProto, "CompanyHomepage", SVS_ZEROISUNSPEC);
+ } }
+ break;
+ }
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
+ break;
+ case IDC_WEBPAGE:
+ if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_WEBPAGE))) {
+ char szPage[256];
+ GetDlgItemTextA(hwndDlg, IDC_WEBPAGE, szPage, SIZEOF(szPage));
+ CallService(MS_UTILS_OPENURL, 1, (LPARAM)szPage);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+// Resizes all columns in a listview (report style)
+// to make all text visible
+void ResizeColumns(HWND hwndLV)
+{
+ int nCol = 0; LVCOLUMN lvCol;
+ lvCol.mask = LVCF_WIDTH;
+ while (ListView_GetColumn(hwndLV, nCol++, &lvCol))
+ ListView_SetColumnWidth(hwndLV, nCol-1, LVSCW_AUTOSIZE);
+}
+
+static INT_PTR CALLBACK BackgroundDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ { LVCOLUMN lvc;
+ RECT rc;
+ GetClientRect(GetDlgItem(hwndDlg, IDC_PAST), &rc);
+ rc.right-=GetSystemMetrics(SM_CXVSCROLL);
+ lvc.mask = LVCF_WIDTH;
+ lvc.cx = rc.right/3;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PAST), 0, &lvc);
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_INTERESTS), 0, &lvc);
+ lvc.cx = rc.right-rc.right/3;
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PAST), 1, &lvc);
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_INTERESTS), 1, &lvc);
+ }
+ ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg, IDC_PAST), LVS_EX_LABELTIP, LVS_EX_LABELTIP);
+ ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg, IDC_INTERESTS), LVS_EX_LABELTIP, LVS_EX_LABELTIP);
+ break;
+
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED)
+ { LVITEM lvi;
+ int i;
+ char idstr[33];
+ DBVARIANT dbv, dbvText;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+
+ if (hContact != NULL) {
+ char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto == NULL) break;
+ bool proto_service = (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC) == PF4_INFOSETTINGSVC;
+ SetValue(hwndDlg, IDC_WEBPAGE, hContact, szProto, "Homepage", SVS_ZEROISUNSPEC);
+
+ //past
+ ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_PAST));
+ lvi.mask = LVIF_TEXT;
+ lvi.iSubItem = 0;
+ lvi.iItem = 0;
+ for (i=0;;i++) {
+ mir_snprintf(idstr, SIZEOF(idstr), "Past%d", i);
+ if ((proto_service && Proto_GetContactInfoSetting(hContact, szProto, szProto, idstr, &dbv, DBVT_TCHAR)) ||
+ ( !proto_service && DBGetContactSettingTString(hContact, szProto, idstr, &dbv)))
+ break;
+ mir_snprintf(idstr, SIZEOF(idstr), "Past%dText", i);
+ if (DBGetContactSettingTString(hContact, szProto, idstr, &dbvText))
+ {if (proto_service) Proto_FreeInfoVariant(&dbv); else DBFreeVariant(&dbv); break;}
+ lvi.pszText = dbv.ptszVal;
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PAST), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PAST), lvi.iItem, 1, dbvText.ptszVal);
+ DBFreeVariant(&dbvText);
+ if (proto_service)
+ Proto_FreeInfoVariant(&dbv);
+ else
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+
+ for (i=0;;i++) {
+ mir_snprintf(idstr, SIZEOF(idstr), "Affiliation%d", i);
+ if ((proto_service && Proto_GetContactInfoSetting(hContact, szProto, szProto, idstr, &dbv, DBVT_TCHAR)) ||
+ ( !proto_service && DBGetContactSettingTString(hContact, szProto, idstr, &dbv)))
+ break;
+ mir_snprintf(idstr, SIZEOF(idstr), "Affiliation%dText", i);
+ if (DBGetContactSettingTString(hContact, szProto, idstr, &dbvText))
+ {if (proto_service) Proto_FreeInfoVariant(&dbv); else DBFreeVariant(&dbv); break;}
+ lvi.pszText = dbv.ptszVal;
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PAST), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PAST), lvi.iItem, 1, dbvText.ptszVal);
+ DBFreeVariant(&dbvText);
+ if (proto_service)
+ Proto_FreeInfoVariant(&dbv);
+ else
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+
+ ResizeColumns(GetDlgItem(hwndDlg, IDC_PAST));
+
+ //interests
+ ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_INTERESTS));
+ lvi.mask = LVIF_TEXT;
+ lvi.iSubItem = 0;
+ lvi.iItem = 0;
+ for (i=0;;i++) {
+ mir_snprintf(idstr, SIZEOF(idstr), "Interest%dCat", i);
+ if ((proto_service && Proto_GetContactInfoSetting(hContact, szProto, szProto, idstr, &dbv, DBVT_TCHAR)) ||
+ ( !proto_service && DBGetContactSettingTString(hContact, szProto, idstr, &dbv)))
+ break;
+ mir_snprintf(idstr, SIZEOF(idstr), "Interest%dText", i);
+ if (DBGetContactSettingTString(hContact, szProto, idstr, &dbvText))
+ {if (proto_service) Proto_FreeInfoVariant(&dbv); else DBFreeVariant(&dbv); break;}
+ lvi.pszText = dbv.ptszVal;
+ ListView_InsertItem(GetDlgItem(hwndDlg, IDC_INTERESTS), &lvi);
+ ListView_SetItemText(GetDlgItem(hwndDlg, IDC_INTERESTS), lvi.iItem, 1, dbvText.ptszVal);
+ DBFreeVariant(&dbvText);
+ if (proto_service)
+ Proto_FreeInfoVariant(&dbv);
+ else
+ DBFreeVariant(&dbv);
+ lvi.iItem++;
+ }
+ ResizeColumns(GetDlgItem(hwndDlg, IDC_INTERESTS));
+ } }
+ break;
+ }
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
+ break;
+ case IDC_WEBPAGE:
+ if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_WEBPAGE))) {
+ char szPage[256];
+ GetDlgItemTextA(hwndDlg, IDC_WEBPAGE, szPage, SIZEOF(szPage));
+ CallService(MS_UTILS_OPENURL, 1, (LPARAM)szPage);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK NotesDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ { DBVARIANT dbv;
+ HFONT hFont;
+ LOGFONT lf;
+ HDC hDC = GetDC(hwndDlg);
+ lf.lfHeight = -MulDiv(10, GetDeviceCaps(hDC, LOGPIXELSY), 72);
+ ReleaseDC(hwndDlg, hDC);
+ lf.lfWidth = 0;
+ lf.lfEscapement = 0;
+ lf.lfOrientation = 0;
+ lf.lfWeight = FW_NORMAL;
+ lf.lfItalic = 0;
+ lf.lfUnderline = 0;
+ lf.lfStrikeOut = 0;
+ lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
+ lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lf.lfQuality = DEFAULT_QUALITY;
+ lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
+ lstrcpy(lf.lfFaceName, _T("Courier New"));
+ lf.lfCharSet = DEFAULT_CHARSET;
+// hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
+ hFont = CreateFontIndirect(&lf);
+ SendDlgItemMessage(hwndDlg, IDC_ABOUT, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0));
+
+ if ( !DBGetContactSettingString((HANDLE)lParam, "UserInfo", "MyNotes", &dbv)) {
+ SetDlgItemTextA(hwndDlg, IDC_MYNOTES, dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+ SendDlgItemMessage(hwndDlg, IDC_MYNOTES, EM_LIMITTEXT, 2048, 0);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_INFOCHANGED:
+ { char *szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+ if (hContact != NULL) {
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto == NULL) break;
+ SetValue(hwndDlg, IDC_ABOUT, hContact, szProto, "About", 0);
+ }
+ break;
+ }
+ case PSN_APPLY:
+ { HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+ if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_MYNOTES))) {
+ char text[2048];
+ GetDlgItemTextA(hwndDlg, IDC_MYNOTES, text, SIZEOF(text));
+ DBWriteContactSettingString(hContact, "UserInfo", "MyNotes", text);
+ }
+ else DBDeleteContactSetting(hContact, "UserInfo", "MyNotes");
+ break;
+ }
+ }
+ break;
+ }
+ break;
+ case WM_COMMAND:
+ if (wParam == MAKEWPARAM(IDC_MYNOTES, EN_CHANGE))
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ else if (LOWORD(wParam) == IDCANCEL)
+ SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
+ break;
+ case WM_DESTROY:
+ {
+ HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_ABOUT, WM_GETFONT, 0, 0);
+ DeleteObject(hFont);
+ }
+ break;
+ }
+ return FALSE;
+}
+
+int DetailsInit(WPARAM wParam, LPARAM lParam)
+{
+ if (lParam == NULL)
+ return 0;
+
+ if (CallService(MS_PROTO_GETCONTACTBASEPROTO, lParam, 0) == 0)
+ return 0;
+
+ OPTIONSDIALOGPAGE odp;
+ odp.cbSize = sizeof(odp);
+ odp.hIcon = NULL;
+ odp.hInstance = hInst;
+ odp.flags = 0;
+
+ odp.pfnDlgProc = SummaryDlgProc;
+ odp.position = -2100000000;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_SUMMARY);
+ odp.pszTitle = LPGEN("Summary");
+ UserInfo_AddPage(wParam, &odp);
+
+ odp.pfnDlgProc = ContactDlgProc;
+ odp.position = -1800000000;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_CONTACT);
+ odp.pszTitle = LPGEN("Contact");
+ UserInfo_AddPage(wParam, &odp);
+
+ odp.pfnDlgProc = LocationDlgProc;
+ odp.position = -1500000000;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_LOCATION);
+ odp.pszTitle = LPGEN("Location");
+ UserInfo_AddPage(wParam, &odp);
+
+ odp.pfnDlgProc = WorkDlgProc;
+ odp.position = -1200000000;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_WORK);
+ odp.pszTitle = LPGEN("Work");
+ UserInfo_AddPage(wParam, &odp);
+
+ odp.pfnDlgProc = BackgroundDlgProc;
+ odp.position = -900000000;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_BACKGROUND);
+ odp.pszTitle = LPGEN("Background info");
+ UserInfo_AddPage(wParam, &odp);
+
+ odp.pfnDlgProc = NotesDlgProc;
+ odp.position = 0;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_NOTES);
+ odp.pszTitle = LPGEN("Notes");
+ UserInfo_AddPage(wParam, &odp);
+ return 0;
+}
diff --git a/src/core/stduserinfo/stduserinfo_10.vcxproj b/src/core/stduserinfo/stduserinfo_10.vcxproj
new file mode 100644
index 0000000000..af6d086e6d
--- /dev/null
+++ b/src/core/stduserinfo/stduserinfo_10.vcxproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>stduserinfo</ProjectName>
+ <ProjectGuid>{1C856B14-54CD-4D07-B18B-5F7DB073AB51}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\Core\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\Obj\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\Core\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\Obj\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64\Core\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64\Core\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary>true</IgnoreImportLibrary>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <WarningLevel>Level3</WarningLevel>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\include\msapi;..\..\..\include</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>miranda32.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <BaseAddress>0x3ae00000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <SubSystem>Windows</SubSystem>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>false</StringPooling>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\include\msapi;..\..\..\include</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>miranda32.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <BaseAddress>0x3ae00000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <SubSystem>Windows</SubSystem>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <WarningLevel>Level3</WarningLevel>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\include\msapi;..\..\..\include</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>miranda64.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <BaseAddress>0x3ae00000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <SubSystem>Windows</SubSystem>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>false</StringPooling>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\include\msapi;..\..\..\include</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>miranda64.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <BaseAddress>0x3ae00000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <SubSystem>Windows</SubSystem>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="commonheaders.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="contactinfo.cpp" />
+ <ClCompile Include="main.cpp" />
+ <ClCompile Include="stdinfo.cpp" />
+ <ClCompile Include="userinfo.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\stdplug.h" />
+ <ClInclude Include="commonheaders.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="resource.rc" />
+ <ResourceCompile Include="version.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/core/stduserinfo/stduserinfo_10.vcxproj.filters b/src/core/stduserinfo/stduserinfo_10.vcxproj.filters
new file mode 100644
index 0000000000..ac101b1384
--- /dev/null
+++ b/src/core/stduserinfo/stduserinfo_10.vcxproj.filters
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{5c074c9e-6c66-4233-bbd3-a50170fccf47}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{e30af2c4-42d4-4342-8eb9-2dbca157c6bb}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{9208a050-ffae-47fa-bc98-4ca4f79d37d7}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="commonheaders.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="contactinfo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="main.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="stdinfo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="userinfo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\stdplug.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="commonheaders.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="version.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ <ResourceCompile Include="resource.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/core/stduserinfo/userinfo.cpp b/src/core/stduserinfo/userinfo.cpp
new file mode 100644
index 0000000000..a36c134106
--- /dev/null
+++ b/src/core/stduserinfo/userinfo.cpp
@@ -0,0 +1,629 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2009 Miranda ICQ/IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+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.
+*/
+
+#include "commonheaders.h"
+
+#define UPDATEANIMFRAMES 20
+
+int DetailsInit(WPARAM wParam, LPARAM lParam);
+static INT_PTR CALLBACK DlgProcDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+static HANDLE hWindowList = NULL;
+static HANDLE hDetailsInitEvent;
+
+struct DetailsPageInit {
+ int pageCount;
+ OPTIONSDIALOGPAGE *odp;
+};
+
+struct DetailsPageData {
+ DLGTEMPLATE *pTemplate;
+ HINSTANCE hInst;
+ DLGPROC dlgProc;
+ LPARAM dlgParam;
+ HWND hwnd;
+ HTREEITEM hItem;
+ int changed;
+ TCHAR *ptszTitle, *ptszTab;
+};
+
+struct DetailsData {
+ HANDLE hContact;
+ HANDLE hProtoAckEvent;
+ HINSTANCE hInstIcmp;
+ HFONT hBoldFont;
+ int pageCount;
+ int currentPage;
+ struct DetailsPageData *opd;
+ RECT rcDisplay, rcDisplayTab;
+ int updateAnimFrame;
+ TCHAR szUpdating[64];
+ int *infosUpdated;
+};
+
+static int PageSortProc(OPTIONSDIALOGPAGE *item1, OPTIONSDIALOGPAGE *item2)
+{
+ int res;
+ if ( !lstrcmp(item1->ptszTitle, TranslateT("Summary"))) return -1;
+ if ( !lstrcmp(item2->ptszTitle, TranslateT("Summary"))) return 1;
+ if (res = lstrcmp(item1->ptszTitle, item2->ptszTitle)) return res;
+ if (item1->ptszTab && !item2->ptszTab) return -1;
+ if ( !item1->ptszTab && item2->ptszTab) return 1;
+ if ( !item1->ptszTab && !item2->ptszTab) return 0;
+ if (item1->ptszTab && !lstrcmp(item1->ptszTab, TranslateT("General"))) return -1;
+ if (item2->ptszTab && !lstrcmp(item2->ptszTab, TranslateT("General"))) return 1;
+ return lstrcmp(item1->ptszTab, item2->ptszTab);
+}
+
+static INT_PTR ShowDetailsDialogCommand(WPARAM wParam, LPARAM)
+{
+ HWND hwnd;
+ PROPSHEETHEADER psh;
+ struct DetailsPageInit opi;
+ int i;
+
+ if (hwnd = WindowList_Find(hWindowList, (HANDLE)wParam)) {
+ SetForegroundWindow(hwnd);
+ SetFocus(hwnd);
+ return 0;
+ }
+
+ opi.pageCount = 0;
+ opi.odp = NULL;
+ NotifyEventHooks(hDetailsInitEvent, (WPARAM)&opi, wParam);
+ if (opi.pageCount == 0) return 0;
+ qsort(opi.odp, opi.pageCount, sizeof(OPTIONSDIALOGPAGE), (int (*)(const void*, const void*))PageSortProc);
+
+ ZeroMemory(&psh, sizeof(psh));
+ psh.dwSize = sizeof(psh);
+ psh.dwFlags = PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW;
+ psh.hwndParent = NULL;
+ psh.nPages = opi.pageCount;
+ psh.pStartPage = 0;
+ psh.pszCaption = (TCHAR*)wParam; //more abuses of structure: this is hContact
+ psh.ppsp = (PROPSHEETPAGE*)opi.odp; //blatent misuse of the structure, but what the hell
+
+ CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_DETAILS), NULL, DlgProcDetails, (LPARAM)&psh);
+ for (i=0;i<opi.pageCount;i++) {
+ //cleanup moved to WM_DESTROY
+ //mir_free((char*)opi.odp[i].pszTitle);
+ //mir_free((char*)opi.odp[i].pszTab);
+ if (opi.odp[i].pszGroup != NULL) mir_free(opi.odp[i].pszGroup);
+ if ((DWORD_PTR)opi.odp[i].pszTemplate&0xFFFF0000) mir_free((char*)opi.odp[i].pszTemplate);
+ }
+ mir_free(opi.odp);
+ return 0;
+}
+
+static INT_PTR AddDetailsPage(WPARAM wParam, LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE *odp = (OPTIONSDIALOGPAGE*)lParam, *dst;
+ struct DetailsPageInit *opi = (struct DetailsPageInit*)wParam;
+
+ if (odp == NULL || opi == NULL) return 1;
+ if (odp->cbSize != sizeof(OPTIONSDIALOGPAGE))
+ return 1;
+
+ opi->odp = (OPTIONSDIALOGPAGE*)mir_realloc(opi->odp, sizeof(OPTIONSDIALOGPAGE)*(opi->pageCount+1));
+ dst = opi->odp + opi->pageCount;
+ dst->cbSize = sizeof(OPTIONSDIALOGPAGE);
+ dst->hInstance = odp->hInstance;
+ dst->pfnDlgProc = odp->pfnDlgProc;
+ dst->position = odp->position;
+ if ((DWORD_PTR)odp->pszTemplate&0xFFFF0000) dst->pszTemplate = mir_strdup(odp->pszTemplate);
+ else dst->pszTemplate = odp->pszTemplate;
+
+
+ if (odp->flags & ODPF_UNICODE)
+ {
+ dst->ptszTitle = (odp->ptszTitle == 0) ? NULL : mir_wstrdup(odp->ptszTitle);
+ dst->ptszTab = ( !(odp->flags & ODPF_USERINFOTAB) || !odp->ptszTab) ? NULL : mir_wstrdup(odp->ptszTab);
+ }
+ else
+
+ {
+ if (odp->flags & ODPF_DONTTRANSLATE)
+ dst->ptszTitle = (odp->pszTitle == 0) ? NULL : mir_a2t(odp->pszTitle);
+ else
+ dst->ptszTitle = (odp->pszTitle == 0) ? NULL : Langpack_PcharToTchar(odp->pszTitle);
+ dst->ptszTab = ( !(odp->flags & ODPF_USERINFOTAB) || !odp->pszTab) ? NULL : Langpack_PcharToTchar(odp->pszTab);
+ }
+
+ dst->pszGroup = NULL;
+ dst->groupPosition = odp->groupPosition;
+ dst->hGroupIcon = odp->hGroupIcon;
+ dst->hIcon = odp->hIcon;
+ if (odp->cbSize == sizeof(OPTIONSDIALOGPAGE))
+ dst->dwInitParam = odp->dwInitParam;
+ opi->pageCount++;
+ return 0;
+}
+
+static void ThemeDialogBackground(HWND hwnd)
+{
+ if (enableThemeDialogTexture)
+ enableThemeDialogTexture(hwnd, ETDT_ENABLETAB);
+}
+
+static void CreateDetailsTabs(HWND hwndDlg, struct DetailsData* dat, struct DetailsPageData* ppg)
+{
+ HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABS);
+ int i, sel = 0, pages = 0;
+ TCITEM tie;
+ tie.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
+ tie.iImage = -1;
+ TabCtrl_DeleteAllItems(hwndTab);
+ for (i=0; i < dat->pageCount; i++) {
+ if ( !dat->opd[i].ptszTab || lstrcmp(dat->opd[i].ptszTitle, ppg->ptszTitle)) continue;
+
+ tie.pszText = TranslateTS(dat->opd[i].ptszTab);
+ tie.lParam = i;
+ TabCtrl_InsertItem(hwndTab, pages, &tie);
+ if ( !lstrcmp(dat->opd[i].ptszTab, ppg->ptszTab))
+ sel = pages;
+ pages++;
+ }
+ TabCtrl_SetCurSel(hwndTab, sel);
+
+ LONG style = GetWindowLongPtr(hwndTab, GWL_STYLE);
+ SetWindowLongPtr(hwndTab, GWL_STYLE, pages > 1 ? style | WS_TABSTOP : style & ~WS_TABSTOP);
+}
+
+static void CreateDetailsPageWindow(HWND hwndDlg, struct DetailsData* dat, struct DetailsPageData* ppg)
+{
+ RECT *rc = ppg->ptszTab ? &dat->rcDisplayTab : &dat->rcDisplay;
+ ppg->hwnd = CreateDialogIndirectParam(ppg->hInst, ppg->pTemplate, hwndDlg, ppg->dlgProc, (LPARAM)dat->hContact);
+ ThemeDialogBackground(ppg->hwnd);
+ SetWindowPos(ppg->hwnd, HWND_TOP, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, 0);
+ SetWindowPos(ppg->hwnd, HWND_TOP, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, 0);
+ {
+ PSHNOTIFY pshn;
+ pshn.hdr.code = PSN_PARAMCHANGED;
+ pshn.hdr.hwndFrom = ppg->hwnd;
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = (LPARAM)ppg->dlgParam;
+ SendMessage(ppg->hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
+
+ pshn.hdr.code = PSN_INFOCHANGED;
+ pshn.hdr.hwndFrom = ppg->hwnd;
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = (LPARAM)dat->hContact;
+ SendMessage(ppg->hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
+ }
+}
+
+static int UserInfoContactDelete(WPARAM wParam, LPARAM)
+{
+ HWND hwnd;
+ hwnd = WindowList_Find(hWindowList, (HANDLE)wParam);
+ if (hwnd != NULL) DestroyWindow(hwnd);
+ return 0;
+}
+
+#define HM_PROTOACK (WM_USER+10)
+#define M_CHECKONLINE (WM_USER+11)
+static INT_PTR CALLBACK DlgProcDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ struct DetailsData *dat = (struct DetailsData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ Window_SetIcon_IcoLib(hwndDlg, SKINICON_OTHER_USERDETAILS);
+ {
+ PROPSHEETHEADER *psh = (PROPSHEETHEADER*)lParam;
+ dat = (DetailsData*)mir_calloc(sizeof(DetailsData));
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);
+ dat->hContact = (HANDLE)psh->pszCaption;
+ dat->hProtoAckEvent = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_PROTOACK);
+ WindowList_Add(hWindowList, hwndDlg, dat->hContact);
+ {
+ TCHAR *name, oldTitle[256], newTitle[256];
+ if (dat->hContact == NULL)
+ name = TranslateT("Owner");
+ else
+ name = pcli->pfnGetContactDisplayName(dat->hContact, 0);
+
+ GetWindowText(hwndDlg, oldTitle, SIZEOF(oldTitle));
+ mir_sntprintf(newTitle, SIZEOF(newTitle), oldTitle, name);
+ SetWindowText(hwndDlg, newTitle);
+
+ GetDlgItemText(hwndDlg, IDC_HEADERBAR, oldTitle, SIZEOF(oldTitle));
+ mir_sntprintf(newTitle, SIZEOF(newTitle), oldTitle, name);
+ SetDlgItemText(hwndDlg, IDC_HEADERBAR, newTitle);
+ }
+ { LOGFONT lf;
+ HFONT hNormalFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_NAME, WM_GETFONT, 0, 0);
+ GetObject(hNormalFont, sizeof(lf), &lf);
+ lf.lfWeight = FW_BOLD;
+ dat->hBoldFont = CreateFontIndirect(&lf);
+ SendDlgItemMessage(hwndDlg, IDC_NAME, WM_SETFONT, (WPARAM)dat->hBoldFont, 0);
+ }
+ { OPTIONSDIALOGPAGE *odp;
+ int i;
+ TVINSERTSTRUCT tvis;
+ DBVARIANT dbv;
+
+ HWND hwndTree = GetDlgItem(hwndDlg, IDC_PAGETREE);
+
+ dat->currentPage = 0;
+ if (DBGetContactSettingTString(NULL, "UserInfo", "LastTab", &dbv))
+ dbv.type = DBVT_DELETED;
+ dat->pageCount = psh->nPages;
+ dat->opd = (DetailsPageData*)mir_calloc(sizeof(DetailsPageData) * dat->pageCount);
+ odp = (OPTIONSDIALOGPAGE*)psh->ppsp;
+
+ for (i=0; i < dat->pageCount; i++) {
+ dat->opd[i].pTemplate = (LPDLGTEMPLATE)LockResource(LoadResource(odp[i].hInstance,
+ FindResourceA(odp[i].hInstance, odp[i].pszTemplate, MAKEINTRESOURCEA(5))));
+ dat->opd[i].dlgProc = odp[i].pfnDlgProc;
+ dat->opd[i].dlgParam = odp[i].dwInitParam;
+ dat->opd[i].hInst = odp[i].hInstance;
+
+ dat->opd[i].ptszTitle = odp[i].ptszTitle;
+ dat->opd[i].ptszTab = odp[i].ptszTab;
+
+ if (i && dat->opd[i].ptszTab && !lstrcmp(dat->opd[i-1].ptszTitle, dat->opd[i].ptszTitle)) {
+ dat->opd[i].hItem = dat->opd[i-1].hItem;
+ continue;
+ }
+
+ tvis.hParent = NULL;
+ tvis.hInsertAfter = TVI_LAST;
+ tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
+ tvis.item.lParam = (LPARAM) i;
+ if (odp[i].flags & ODPF_DONTTRANSLATE)
+ tvis.item.pszText = mir_tstrdup(odp[i].ptszTitle);
+ else
+ tvis.item.pszText = TranslateTS(odp[i].ptszTitle);
+ if (dbv.type != DBVT_DELETED && !lstrcmp(tvis.item.pszText, dbv.ptszVal))
+ dat->currentPage = i;
+ dat->opd[i].hItem = TreeView_InsertItem(hwndTree, &tvis);
+ }
+ DBFreeVariant(&dbv);
+ }
+
+ {
+ HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABS);
+
+ TCITEM tci;
+ tci.mask = TCIF_TEXT | TCIF_IMAGE;
+ tci.iImage = -1;
+ tci.pszText = _T("X");
+ TabCtrl_InsertItem(hwndTab, 0, &tci);
+
+ GetWindowRect(hwndTab, &dat->rcDisplayTab);
+ TabCtrl_AdjustRect(hwndTab, FALSE, &dat->rcDisplayTab);
+ { POINT pt = {0, 0};
+ ClientToScreen(hwndDlg, &pt);
+ OffsetRect(&dat->rcDisplayTab, -pt.x, -pt.y);
+ }
+
+ TabCtrl_DeleteAllItems(hwndTab);
+
+ GetWindowRect(hwndTab, &dat->rcDisplay);
+ TabCtrl_AdjustRect(hwndTab, FALSE, &dat->rcDisplay);
+ { POINT pt = {0, 0};
+ ClientToScreen(hwndDlg, &pt);
+ OffsetRect(&dat->rcDisplay, -pt.x, -pt.y);
+ } }
+
+ TreeView_SelectItem(GetDlgItem(hwndDlg, IDC_PAGETREE), dat->opd[dat->currentPage].hItem);
+
+ dat->updateAnimFrame = 0;
+ GetDlgItemText(hwndDlg, IDC_UPDATING, dat->szUpdating, SIZEOF(dat->szUpdating));
+ SendMessage(hwndDlg, M_CHECKONLINE, 0, 0);
+ if ( !CallContactService(dat->hContact, PSS_GETINFO, SGIF_ONOPEN, 0)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
+ SetTimer(hwndDlg, 1, 100, NULL);
+ } else
+ ShowWindow(GetDlgItem(hwndDlg, IDC_UPDATING), SW_HIDE);
+
+ SetFocus(GetDlgItem(hwndDlg, IDC_PAGETREE));
+
+ return TRUE;
+ }
+ case WM_TIMER:
+ {
+ TCHAR str[128];
+ mir_sntprintf(str, SIZEOF(str), _T("%.*s%s%.*s"), dat->updateAnimFrame%10, _T("........."), dat->szUpdating, dat->updateAnimFrame%10, _T("........."));
+ SetDlgItemText(hwndDlg, IDC_UPDATING, str);
+ if (++dat->updateAnimFrame == UPDATEANIMFRAMES) dat->updateAnimFrame = 0;
+ break;
+ }
+ case WM_CTLCOLORSTATIC:
+ switch (GetDlgCtrlID((HWND)lParam)) {
+ case IDC_WHITERECT:
+ SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
+ return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
+ case IDC_UPDATING:
+ {
+ COLORREF textCol, bgCol, newCol;
+ int ratio;
+ textCol = GetSysColor(COLOR_BTNTEXT);
+ bgCol = GetSysColor(COLOR_3DFACE);
+ ratio = abs(UPDATEANIMFRAMES/2-dat->updateAnimFrame)*510/UPDATEANIMFRAMES;
+ newCol = RGB(GetRValue(bgCol)+(GetRValue(textCol)-GetRValue(bgCol))*ratio/256,
+ GetGValue(bgCol)+(GetGValue(textCol)-GetGValue(bgCol))*ratio/256,
+ GetBValue(bgCol)+(GetBValue(textCol)-GetBValue(bgCol))*ratio/256);
+ SetTextColor((HDC)wParam, newCol);
+ SetBkColor((HDC)wParam, GetSysColor(COLOR_3DFACE));
+ return (INT_PTR)GetSysColorBrush(COLOR_3DFACE);
+ }
+ default:
+ SetBkMode((HDC)wParam, TRANSPARENT);
+ return (INT_PTR)GetStockObject(NULL_BRUSH);
+ }
+ break;
+
+ case PSM_CHANGED:
+ dat->opd[dat->currentPage].changed = 1;
+ return TRUE;
+
+ case PSM_FORCECHANGED:
+ {
+ int i;
+ PSHNOTIFY pshn;
+ pshn.hdr.code = PSN_INFOCHANGED;
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = (LPARAM)dat->hContact;
+ for (i=0;i<dat->pageCount;i++) {
+ pshn.hdr.hwndFrom = dat->opd[i].hwnd;
+ if (dat->opd[i].hwnd != NULL)
+ SendMessage(dat->opd[i].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
+ }
+ break;
+ }
+ case M_CHECKONLINE:
+ {
+ char *szProto;
+ if (dat->hContact != NULL) {
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0);
+ if (szProto == NULL) {EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE); break;}
+ if (CallProtoService(szProto, PS_GETSTATUS, 0, 0)<ID_STATUS_ONLINE) EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
+ else EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), !IsWindowVisible(GetDlgItem(hwndDlg, IDC_UPDATING)));
+ }
+ break;
+ }
+ case HM_PROTOACK:
+ {
+ ACKDATA *ack = (ACKDATA*)lParam;
+ int i;
+
+ if (ack->hContact == NULL && ack->type == ACKTYPE_STATUS) {
+ SendMessage(hwndDlg, M_CHECKONLINE, 0, 0);
+ break;
+ }
+ if (ack->hContact != dat->hContact) break;
+ if (ack->type != ACKTYPE_GETINFO) break;
+ SendMessage(hwndDlg, PSM_FORCECHANGED, 0, 0);
+ /* if they're not gonna send any more ACK's don't let that mean we should crash */
+ if ( !ack->hProcess && !ack->lParam) {
+ ShowWindow(GetDlgItem(hwndDlg, IDC_UPDATING), SW_HIDE);
+ KillTimer(hwndDlg, 1);
+ SendMessage(hwndDlg, M_CHECKONLINE, 0, 0);
+ break;
+ } //if
+ if (dat->infosUpdated == NULL) dat->infosUpdated = (int*)mir_calloc(sizeof(int)*(INT_PTR)ack->hProcess);
+ if (ack->result == ACKRESULT_SUCCESS || ack->result == ACKRESULT_FAILED) dat->infosUpdated[ack->lParam] = 1;
+ for (i=0;i<(int)ack->hProcess;i++)
+ if (dat->infosUpdated[i] == 0) break;
+ if (i == (int)ack->hProcess) {
+ ShowWindow(GetDlgItem(hwndDlg, IDC_UPDATING), SW_HIDE);
+ KillTimer(hwndDlg, 1);
+ SendMessage(hwndDlg, M_CHECKONLINE, 0, 0);
+ } }
+ break;
+
+ case WM_NOTIFY:
+ switch(wParam) {
+ case IDC_TABS:
+ case IDC_PAGETREE:
+ switch(((LPNMHDR)lParam)->code) {
+ case TCN_SELCHANGING:
+ case TVN_SELCHANGING:
+ if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL) {
+ PSHNOTIFY pshn;
+ pshn.hdr.code = PSN_KILLACTIVE;
+ pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd;
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = (LPARAM)dat->hContact;
+ if (SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn)) {
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
+ return TRUE;
+ }
+ }
+ break;
+
+ case TCN_SELCHANGE:
+ if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL) {
+ HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABS);
+ ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE);
+
+ TCITEM tie;
+ TVITEM tvi;
+
+ tie.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tie);
+ dat->currentPage = tie.lParam;
+
+ tvi.hItem = TreeView_GetNextItem(GetDlgItem(hwndDlg, IDC_PAGETREE), NULL, TVGN_CARET);
+ tvi.mask = TVIF_PARAM;
+ tvi.lParam = dat->currentPage;
+ TreeView_SetItem(GetDlgItem(hwndDlg, IDC_PAGETREE), &tvi);
+
+ if (dat->currentPage != -1) {
+ if (dat->opd[dat->currentPage].hwnd == NULL)
+ CreateDetailsPageWindow(hwndDlg, dat, &dat->opd[dat->currentPage]);
+ ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOWNA);
+ }
+ }
+ break;
+
+ case TVN_SELCHANGED:
+ if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL)
+ ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE);
+ {
+ LPNMTREEVIEW pnmtv = (LPNMTREEVIEW) lParam;
+ TVITEM tvi = pnmtv->itemNew;
+ dat->currentPage = tvi.lParam;
+
+ if (dat->currentPage != -1) {
+ CreateDetailsTabs(hwndDlg, dat, &dat->opd[dat->currentPage]);
+ if (dat->opd[dat->currentPage].hwnd == NULL)
+ CreateDetailsPageWindow(hwndDlg, dat, &dat->opd[dat->currentPage]);
+ ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOWNA);
+
+ }
+ }
+ break;
+ }
+ break;
+ }
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDCANCEL:
+ {
+ PSHNOTIFY pshn;
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = (LPARAM)dat->hContact;
+ pshn.hdr.code = PSN_RESET;
+ for (int i=0; i < dat->pageCount; i++) {
+ if (dat->opd[i].hwnd == NULL || !dat->opd[i].changed) continue;
+ pshn.hdr.hwndFrom = dat->opd[i].hwnd;
+ SendMessage(dat->opd[i].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
+ }
+ DestroyWindow(hwndDlg);
+ }
+ break;
+
+ case IDOK:
+ {
+ PSHNOTIFY pshn;
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = (LPARAM)dat->hContact;
+ if (dat->currentPage != -1) {
+ pshn.hdr.code = PSN_KILLACTIVE;
+ pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd;
+ if (SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn))
+ break;
+ }
+
+ pshn.hdr.code = PSN_APPLY;
+ for (int i=0; i < dat->pageCount;i++) {
+ if (dat->opd[i].hwnd == NULL || !dat->opd[i].changed) continue;
+ pshn.hdr.hwndFrom = dat->opd[i].hwnd;
+ if (SendMessage(dat->opd[i].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn) == PSNRET_INVALID_NOCHANGEPAGE) {
+ TreeView_Select(GetDlgItem(hwndDlg, IDC_PAGETREE), dat->opd[i].hItem, TVGN_CARET);
+ if (dat->currentPage != -1) ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE);
+ dat->currentPage = i;
+ ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOW);
+ return 0;
+ }
+ }
+ DestroyWindow(hwndDlg);
+ }
+ break;
+
+ case IDC_UPDATE:
+ if (dat->infosUpdated != NULL) {mir_free(dat->infosUpdated); dat->infosUpdated = NULL;}
+ if (dat->hContact != NULL) {
+ if ( !CallContactService(dat->hContact, PSS_GETINFO, 0, 0)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_UPDATING), SW_SHOW);
+ SetTimer(hwndDlg, 1, 100, NULL);
+ }
+ }
+ break;
+ }
+ break;
+
+ case WM_CLOSE:
+ SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDOK));
+ break;
+
+ case WM_DESTROY:
+ {
+ TCHAR name[128];
+ TVITEM tvi;
+ tvi.mask = TVIF_TEXT;
+ tvi.hItem = dat->opd[dat->currentPage].hItem;
+ tvi.pszText = name;
+ tvi.cchTextMax = SIZEOF(name);
+ TreeView_GetItem(GetDlgItem(hwndDlg, IDC_PAGETREE), &tvi);
+ DBWriteContactSettingTString(NULL, "UserInfo", "LastTab", name);
+ }
+ Window_FreeIcon_IcoLib(hwndDlg);
+ SendDlgItemMessage(hwndDlg, IDC_NAME, WM_SETFONT, SendDlgItemMessage(hwndDlg, IDC_WHITERECT, WM_GETFONT, 0, 0), 0);
+ DeleteObject(dat->hBoldFont);
+ WindowList_Remove(hWindowList, hwndDlg);
+ UnhookEvent(dat->hProtoAckEvent);
+ {
+ for (int i=0; i < dat->pageCount; i++) {
+ if (dat->opd[i].hwnd != NULL) DestroyWindow(dat->opd[i].hwnd);
+ mir_free(dat->opd[i].ptszTitle);
+ mir_free(dat->opd[i].ptszTab);
+ }
+ }
+ mir_free(dat->infosUpdated);
+ mir_free(dat->opd);
+ mir_free(dat);
+ break;
+ }
+ return FALSE;
+}
+
+static int ShutdownUserInfo(WPARAM, LPARAM)
+{
+ WindowList_BroadcastAsync(hWindowList, WM_DESTROY, 0, 0);
+ return 0;
+}
+
+int LoadUserInfoModule(void)
+{
+ CreateServiceFunction("UserInfo/AddPage", AddDetailsPage);
+ CreateServiceFunction(MS_USERINFO_SHOWDIALOG, ShowDetailsDialogCommand);
+
+ hDetailsInitEvent = CreateHookableEvent(ME_USERINFO_INITIALISE);
+
+ HookEvent(ME_USERINFO_INITIALISE, DetailsInit);
+ HookEvent(ME_DB_CONTACT_DELETED, UserInfoContactDelete);
+ HookEvent(ME_SYSTEM_PRESHUTDOWN, ShutdownUserInfo);
+
+ CLISTMENUITEM mi = { 0 };
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIF_ICONFROMICOLIB;
+ mi.position = 1000050000;
+ mi.icolibItem = GetSkinIconHandle(SKINICON_OTHER_USERDETAILS);
+ mi.pszName = LPGEN("User &Details");
+ mi.pszService = MS_USERINFO_SHOWDIALOG;
+ Menu_AddContactMenuItem(&mi);
+
+ mi.position = 500050000;
+ mi.pszName = LPGEN("View/Change My &Details...");
+ Menu_AddMainMenuItem(&mi);
+
+ hWindowList = (HANDLE)CallService(MS_UTILS_ALLOCWINDOWLIST, 0, 0);
+ return 0;
+}
diff --git a/src/core/stduserinfo/version.h b/src/core/stduserinfo/version.h
new file mode 100644
index 0000000000..b9df9bad73
--- /dev/null
+++ b/src/core/stduserinfo/version.h
@@ -0,0 +1,14 @@
+
+#include <m_version.h>
+
+#define __FILEVERSION_STRING MIRANDA_VERSION_FILEVERSION
+#define __VERSION_STRING MIRANDA_VERSION_STRING
+
+#define __PLUGIN_NAME "stduserinfo"
+#define __INTERNAL_NAME "stduserinfo"
+#define __FILENAME "stduserinfo.dll"
+#define __DESCRIPTION "Core module for providing user information."
+#define __AUTHOR "Myranda team"
+#define __AUTHOREMAIL ""
+#define __AUTHORWEB "http://nightly.miranda.im"
+#define __COPYRIGHT "© 2012 Myranda team"
diff --git a/src/core/stduserinfo/version.rc b/src/core/stduserinfo/version.rc
new file mode 100644
index 0000000000..e637f0cb33
--- /dev/null
+++ b/src/core/stduserinfo/version.rc
@@ -0,0 +1,38 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "afxres.h"
+#include "version.h"
+
+#ifdef _WIN32
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+#endif //_WIN32
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION __FILEVERSION_STRING
+ PRODUCTVERSION __FILEVERSION_STRING
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "FileDescription", __DESCRIPTION
+ VALUE "InternalName", __PLUGIN_NAME
+ VALUE "LegalCopyright", __COPYRIGHT
+ VALUE "OriginalFilename", __FILENAME
+ VALUE "ProductName", __PLUGIN_NAME
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END