summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2022-08-03 18:22:14 +0300
committerGeorge Hazan <ghazan@miranda.im>2022-08-03 18:22:14 +0300
commit7dc21cf346e2c36dbcf281f28fcb0d19ae008dab (patch)
treed1d13e858b94501bc9e034b2040a124de0615573 /src/core
parent22ad532bfa626867529355baa5ea96f2fafdc233 (diff)
stduserinfo: empty pages to be dropped
Diffstat (limited to 'src/core')
-rw-r--r--src/core/stduserinfo/src/contactinfo.cpp17
-rw-r--r--src/core/stduserinfo/src/stdafx.h1
-rw-r--r--src/core/stduserinfo/src/stdinfo.cpp300
-rw-r--r--src/core/stduserinfo/src/userinfo.cpp9
-rw-r--r--src/core/stduserinfo/src/utils.h214
-rw-r--r--src/core/stduserinfo/stduserinfo.vcxproj1
-rw-r--r--src/core/stduserinfo/stduserinfo.vcxproj.filters3
7 files changed, 342 insertions, 203 deletions
diff --git a/src/core/stduserinfo/src/contactinfo.cpp b/src/core/stduserinfo/src/contactinfo.cpp
index 250c8dd5b2..165c6ba214 100644
--- a/src/core/stduserinfo/src/contactinfo.cpp
+++ b/src/core/stduserinfo/src/contactinfo.cpp
@@ -214,6 +214,18 @@ static int IsOverEmail(HWND hwndDlg, wchar_t *szEmail, int cchEmail)
return 0;
}
+static DataItem itemsContact[] = {
+ { "e-mail", 0, 0 },
+ { "e-mail0", 0, 0 },
+ { "Mye-mail0", 0, 0 },
+ { "Phone", 0, 0 },
+ { "Fax", 0, 0 },
+ { "Cellular", 0, 0 },
+ { "CompanyPhone", 0, 0 },
+ { "CompanyFax", 0, 0 },
+ { "MyPhone0", 0, 0 },
+};
+
class CContactPage : public CUserInfoPageDlg
{
typedef CUserInfoPageDlg CSuper;
@@ -287,6 +299,11 @@ public:
return RD_ANCHORX_LEFT | RD_ANCHORY_TOP;
}
+ bool IsEmpty() const override
+ {
+ return IsEmptyValue(m_hContact, itemsContact);
+ }
+
bool OnRefresh() override
{
if (m_hContact == 0)
diff --git a/src/core/stduserinfo/src/stdafx.h b/src/core/stduserinfo/src/stdafx.h
index a4f3d878bc..76b456e716 100644
--- a/src/core/stduserinfo/src/stdafx.h
+++ b/src/core/stduserinfo/src/stdafx.h
@@ -68,6 +68,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "version.h"
#include "resource.h"
+#include "utils.h"
#define MODULENAME "UserInfo"
diff --git a/src/core/stduserinfo/src/stdinfo.cpp b/src/core/stduserinfo/src/stdinfo.cpp
index f7e823f5c5..cea7d02464 100644
--- a/src/core/stduserinfo/src/stdinfo.cpp
+++ b/src/core/stduserinfo/src/stdinfo.cpp
@@ -24,172 +24,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
-#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
-#define SVS_MARITAL 8
-
-static void SetValue(HWND m_hwnd, int idCtrl, MCONTACT hContact, const char *szModule, char *szSetting, int special)
-{
- char *pstr = nullptr;
- wchar_t *pwstr = nullptr, wstr[80];
-
- DBVARIANT dbv = { DBVT_DELETED };
-
- int unspecified;
- if (szModule == nullptr)
- unspecified = 1;
- else
- unspecified = db_get_s(hContact, szModule, szSetting, &dbv, 0);
-
- if (!unspecified) {
- switch (dbv.type) {
- case DBVT_BYTE:
- if (special == SVS_GENDER) {
- if (dbv.cVal == 'M') pwstr = TranslateT("Male");
- else if (dbv.cVal == 'F') pwstr = TranslateT("Female");
- else unspecified = 1;
- }
- else if (special == SVS_MONTH) {
- if (dbv.bVal > 0 && dbv.bVal <= 12) {
- pwstr = wstr;
- GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVMONTHNAME1 - 1 + dbv.bVal, wstr, _countof(wstr));
- }
- else unspecified = 1;
- }
- else if (special == SVS_TIMEZONE) {
- if (dbv.cVal == -100) unspecified = 1;
- else {
- pwstr = wstr;
- mir_snwprintf(wstr, dbv.cVal ? L"UTC%+d:%02d" : L"UTC", -dbv.cVal / 2, (dbv.cVal & 1) * 30);
- }
- }
- else if (special == SVS_MARITAL) {
- switch (dbv.cVal) {
- case 0:
- pwstr = TranslateT("<not specified>");
- break;
- case 10:
- pwstr = TranslateT("Single");
- break;
- case 11:
- pwstr = TranslateT("Close relationships");
- break;
- case 12:
- pwstr = TranslateT("Engaged");
- break;
- case 20:
- pwstr = TranslateT("Married");
- break;
- case 30:
- pwstr = TranslateT("Divorced");
- break;
- case 31:
- pwstr = TranslateT("Separated");
- break;
- case 40:
- pwstr = TranslateT("Widowed");
- break;
- case 50:
- pwstr = TranslateT("Actively searching");
- break;
- case 60:
- pwstr = TranslateT("In love");
- break;
- case 70:
- pwstr = TranslateT("It's complicated");
- break;
- case 80:
- pwstr = TranslateT("In a civil union");
- break;
- default:
- unspecified = 1;
- }
- }
- else {
- unspecified = (special == SVS_ZEROISUNSPEC && dbv.bVal == 0);
- pwstr = _itow(special == SVS_SIGNED ? dbv.cVal : dbv.bVal, wstr, 10);
- }
- break;
-
- case DBVT_WORD:
- if (special == SVS_COUNTRY) {
- uint16_t wSave = dbv.wVal;
- if (wSave == (uint16_t)-1) {
- char szSettingName[100];
- mir_snprintf(szSettingName, "%sName", szSetting);
- if (!db_get_ws(hContact, szModule, szSettingName, &dbv)) {
- pwstr = dbv.pwszVal;
- unspecified = false;
- break;
- }
- }
-
- pwstr = TranslateW(_A2T((char*)CallService(MS_UTILS_GETCOUNTRYBYNUMBER, wSave, 0)));
- unspecified = pwstr == nullptr;
- }
- else {
- unspecified = (special == SVS_ZEROISUNSPEC && dbv.wVal == 0);
- pwstr = _itow(special == SVS_SIGNED ? dbv.sVal : dbv.wVal, wstr, 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);
- mir_wstrncpy(wstr, _A2T(inet_ntoa(ia)), _countof(wstr));
- pwstr = wstr;
- if (dbv.dVal == 0)
- unspecified = 1;
- }
- else pwstr = _itow(special == SVS_SIGNED ? dbv.lVal : dbv.dVal, wstr, 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) {
- SetDlgItemTextW(m_hwnd, idCtrl, TranslateW(ptrW(mir_utf8decodeW(dbv.pszVal))));
- goto LBL_Exit;
- }
-
- pstr = dbv.pszVal;
- mir_utf8decode(dbv.pszVal, nullptr);
- break;
-
- default:
- pwstr = wstr;
- mir_wstrcpy(wstr, L"???");
- break;
- }
- }
-
- if (unspecified)
- SetDlgItemText(m_hwnd, idCtrl, TranslateT("<not specified>"));
- else if (pwstr != nullptr)
- SetDlgItemText(m_hwnd, idCtrl, pwstr);
- else
- SetDlgItemTextA(m_hwnd, idCtrl, pstr);
-
-LBL_Exit:
- EnableWindow(GetDlgItem(m_hwnd, idCtrl), !unspecified);
- db_free(&dbv);
-}
-
/////////////////////////////////////////////////////////////////////////////////////////
// Summary dlg page
+static DataItem itemsSummary1[] = {
+ { "Nick", IDC_NICK, 0 },
+ { "FirstName", IDC_FIRSTNAME, 0 },
+ { "LastName", IDC_LASTNAME, 0 },
+ { "e-mail", IDC_EMAIL, 0 },
+ { "Age", IDC_AGE, SVS_ZEROISUNSPEC },
+ { "Gender", IDC_GENDER, SVS_GENDER },
+ { "MaritalStatus", IDC_MARITAL, SVS_MARITAL },
+ { "Nick", IDC_NICK, 0 },
+};
+
+static DataItem itemsSummary2[] = {
+ { "BirthDay", IDC_DOBDAY, 0 },
+ { "BirthMonth", IDC_DOBMONTH, SVS_MONTH },
+ { "BirthYear", IDC_DOBYEAR, 0 },
+};
+
class CSummaryDlg : public CUserInfoPageDlg
{
CCtrlHyperlink m_email;
@@ -202,24 +56,26 @@ public:
m_email.OnClick = Callback(this, &CSummaryDlg::onClick_Email);
}
+ bool IsEmpty() const override
+ {
+ if (!IsEmptyValue(m_hContact, itemsSummary1))
+ return false;
+
+ const char *szProto = Proto_GetBaseAccountName(m_hContact);
+ const char *szModule = (-1 == db_get_dw(m_hContact, "UserInfo", "BirthDay", -1)) ? szProto : "UserInfo";
+ return IsEmptyValue(m_hContact, itemsSummary2, szModule);
+ }
+
bool OnRefresh() override
{
const char *szProto = Proto_GetBaseAccountName(m_hContact);
if (szProto == nullptr)
return false;
- SetValue(m_hwnd, IDC_NICK, m_hContact, szProto, "Nick", 0);
- SetValue(m_hwnd, IDC_FIRSTNAME, m_hContact, szProto, "FirstName", 0);
- SetValue(m_hwnd, IDC_LASTNAME, m_hContact, szProto, "LastName", 0);
- SetValue(m_hwnd, IDC_EMAIL, m_hContact, szProto, "e-mail", 0);
- SetValue(m_hwnd, IDC_AGE, m_hContact, szProto, "Age", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_GENDER, m_hContact, szProto, "Gender", SVS_GENDER);
- SetValue(m_hwnd, IDC_MARITAL, m_hContact, szProto, "MaritalStatus", SVS_MARITAL);
+ SetValue(m_hwnd, m_hContact, itemsSummary1);
const char *szModule = (-1 == db_get_dw(m_hContact, "UserInfo", "BirthDay", -1)) ? szProto : "UserInfo";
- SetValue(m_hwnd, IDC_DOBDAY, m_hContact, szModule, "BirthDay", 0);
- SetValue(m_hwnd, IDC_DOBMONTH, m_hContact, szModule, "BirthMonth", SVS_MONTH);
- SetValue(m_hwnd, IDC_DOBYEAR, m_hContact, szModule, "BirthYear", 0);
+ SetValue(m_hwnd, m_hContact, itemsSummary2, szModule);
return false;
}
@@ -236,6 +92,18 @@ public:
/////////////////////////////////////////////////////////////////////////////////////////
// Location dlg page
+static DataItem itemsLocation[] = {
+ { "Street", IDC_STREET, SVS_ZEROISUNSPEC },
+ { "City", IDC_CITY, SVS_ZEROISUNSPEC },
+ { "State", IDC_STATE, SVS_ZEROISUNSPEC },
+ { "ZIP", IDC_ZIP, SVS_ZEROISUNSPEC },
+ { "Country", IDC_COUNTRY, SVS_COUNTRY },
+ { "Language1", IDC_LANGUAGE1, SVS_ZEROISUNSPEC },
+ { "Language2", IDC_LANGUAGE2, SVS_ZEROISUNSPEC },
+ { "Language3", IDC_LANGUAGE3, SVS_ZEROISUNSPEC },
+ { "Timezone", IDC_TIMEZONE, SVS_TIMEZONE },
+};
+
class CLocationDlg : public CUserInfoPageDlg
{
CTimer m_timer;
@@ -277,21 +145,14 @@ public:
}
}
+ bool IsEmpty() const override
+ {
+ return IsEmptyValue(m_hContact, itemsLocation);
+ }
+
bool OnRefresh() override
{
- char *szProto = Proto_GetBaseAccountName(m_hContact);
- if (szProto == nullptr)
- return false;
-
- SetValue(m_hwnd, IDC_STREET, m_hContact, szProto, "Street", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_CITY, m_hContact, szProto, "City", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_STATE, m_hContact, szProto, "State", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_ZIP, m_hContact, szProto, "ZIP", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_COUNTRY, m_hContact, szProto, "Country", SVS_COUNTRY);
- SetValue(m_hwnd, IDC_LANGUAGE1, m_hContact, szProto, "Language1", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_LANGUAGE2, m_hContact, szProto, "Language2", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_LANGUAGE3, m_hContact, szProto, "Language3", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_TIMEZONE, m_hContact, szProto, "Timezone", SVS_TIMEZONE);
+ SetValue(m_hwnd, m_hContact, itemsLocation);
return false;
}
@@ -304,6 +165,18 @@ public:
/////////////////////////////////////////////////////////////////////////////////////////
// Work dlg page
+static DataItem itemsWork[] = {
+ { "Company", IDC_COMPANY, SVS_ZEROISUNSPEC },
+ { "CompanyDepartment", IDC_DEPARTMENT, SVS_ZEROISUNSPEC },
+ { "CompanyPosition", IDC_POSITION, SVS_ZEROISUNSPEC },
+ { "CompanyStreet", IDC_STREET, SVS_ZEROISUNSPEC },
+ { "CompanyCity", IDC_CITY, SVS_ZEROISUNSPEC },
+ { "CompanyState", IDC_STATE, SVS_ZEROISUNSPEC },
+ { "CompanyZIP", IDC_ZIP, SVS_ZEROISUNSPEC },
+ { "CompanyCountry", IDC_COUNTRY, SVS_COUNTRY },
+ { "CompanyHomepage", IDC_WEBPAGE, SVS_ZEROISUNSPEC },
+};
+
class CWorkDlg : public CUserInfoPageDlg
{
CCtrlHyperlink m_url;
@@ -316,21 +189,14 @@ public:
m_url.OnClick = Callback(this, &CWorkDlg::onClick_Page);
}
- bool OnRefresh() override
+ bool IsEmpty() const override
{
- char *szProto = Proto_GetBaseAccountName(m_hContact);
- if (szProto == nullptr)
- return false;
+ return IsEmptyValue(m_hContact, itemsWork);
+ }
- SetValue(m_hwnd, IDC_COMPANY, m_hContact, szProto, "Company", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_DEPARTMENT, m_hContact, szProto, "CompanyDepartment", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_POSITION, m_hContact, szProto, "CompanyPosition", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_STREET, m_hContact, szProto, "CompanyStreet", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_CITY, m_hContact, szProto, "CompanyCity", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_STATE, m_hContact, szProto, "CompanyState", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_ZIP, m_hContact, szProto, "CompanyZIP", SVS_ZEROISUNSPEC);
- SetValue(m_hwnd, IDC_COUNTRY, m_hContact, szProto, "CompanyCountry", SVS_COUNTRY);
- SetValue(m_hwnd, IDC_WEBPAGE, m_hContact, szProto, "CompanyHomepage", SVS_ZEROISUNSPEC);
+ bool OnRefresh() override
+ {
+ SetValue(m_hwnd, m_hContact, itemsWork);
return false;
}
@@ -344,6 +210,19 @@ public:
/////////////////////////////////////////////////////////////////////////////////////////
// Work dlg page
+static DataItem itemsBackground1[] = {
+ { "Homepage", IDC_WEBPAGE, SVS_ZEROISUNSPEC },
+};
+
+static DataItem itemsBackground2[] = {
+ { "Past0", 0, 0 },
+ { "Past0Text", 0, 0 },
+ { "Affiliation0", 0, 0 },
+ { "Affiliation0Text", 0, 0 },
+ { "Interest0Cat", 0, 0 },
+ { "Interest%dText", 0, 0 },
+};
+
// Resizes all columns in a listview (report style)
// to make all text visible
void ResizeColumns(CCtrlListView &ctrl)
@@ -399,13 +278,21 @@ public:
return RD_ANCHORX_LEFT | RD_ANCHORY_TOP;
}
+ bool IsEmpty() const override
+ {
+ if (!IsEmptyValue(m_hContact, itemsBackground1))
+ return false;
+
+ return IsEmptyValue(m_hContact, itemsBackground2);
+ }
+
bool OnRefresh() override
{
char *szProto = Proto_GetBaseAccountName(m_hContact);
if (szProto == nullptr)
return false;
- SetValue(m_hwnd, IDC_WEBPAGE, m_hContact, szProto, "Homepage", SVS_ZEROISUNSPEC);
+ SetValue(m_hwnd, m_hContact, itemsBackground1, szProto);
// past
m_past.DeleteAllItems();
@@ -485,6 +372,10 @@ public:
/////////////////////////////////////////////////////////////////////////////////////////
// Notes dlg page
+static DataItem itemsNotes[] = {
+ { "About", IDC_ABOUT, 0 },
+};
+
class CNotesDlg : public CUserInfoPageDlg
{
CCtrlEdit mynotes;
@@ -545,11 +436,14 @@ public:
return RD_ANCHORX_LEFT | RD_ANCHORY_TOP;
}
+ bool IsEmpty() const override
+ {
+ return IsEmptyValue(m_hContact, itemsNotes);
+ }
+
bool OnRefresh() override
{
- char *szProto = Proto_GetBaseAccountName(m_hContact);
- if (szProto != NULL)
- SetValue(m_hwnd, IDC_ABOUT, m_hContact, szProto, "About", 0);
+ SetValue(m_hwnd, m_hContact, itemsNotes);
return false;
}
};
diff --git a/src/core/stduserinfo/src/userinfo.cpp b/src/core/stduserinfo/src/userinfo.cpp
index 85e328ef4c..f9b77cee5d 100644
--- a/src/core/stduserinfo/src/userinfo.cpp
+++ b/src/core/stduserinfo/src/userinfo.cpp
@@ -118,6 +118,15 @@ class CUserInfoDlg : public CDlgBase
LIST<DetailsPageData> items(1, PageSortProc);
NotifyEventHooks(hDetailsInitEvent, (WPARAM)&items, hContact);
+
+ for (auto &it : items.rev_iter()) {
+ if (!it->pDialog->IsEmpty())
+ continue;
+
+ delete it;
+ items.remove(items.indexOf(&it));
+ }
+
if (items.getCount() == 0)
return;
diff --git a/src/core/stduserinfo/src/utils.h b/src/core/stduserinfo/src/utils.h
new file mode 100644
index 0000000000..cb766c47ae
--- /dev/null
+++ b/src/core/stduserinfo/src/utils.h
@@ -0,0 +1,214 @@
+/*
+
+Standard User Info plugin for Miranda NG
+
+Copyright (C) 2012-22 Miranda NG team (https://miranda-ng.org)
+
+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.
+*/
+
+#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
+#define SVS_MARITAL 8
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+struct DataItem
+{
+ const char *szSetting;
+ int idCtrl, special;
+};
+
+template <size_t _Size>
+bool IsEmptyValue(MCONTACT hContact, DataItem(&buffer)[_Size], const char *szModule = nullptr)
+{
+ if (szModule == nullptr)
+ szModule = Proto_GetBaseAccountName(hContact);
+
+ DBVARIANT dbv;
+ for (auto &it : buffer) {
+ if (db_get_s(hContact, szModule, it.szSetting, &dbv, 0) != 0)
+ continue;
+
+ db_free(&dbv);
+ return false;
+ }
+
+ return true;
+}
+
+template <size_t _Size>
+void SetValue(HWND hwndDlg, MCONTACT hContact, DataItem(&buffer)[_Size], const char *szModule = nullptr)
+{
+ if (szModule == nullptr)
+ szModule = Proto_GetBaseAccountName(hContact);
+
+ for (auto &it : buffer) {
+ char *pstr = nullptr;
+ wchar_t *pwstr = nullptr, wstr[80];
+
+ DBVARIANT dbv = { DBVT_DELETED };
+
+ bool unspecified;
+ if (szModule == nullptr)
+ unspecified = true;
+ else
+ unspecified = db_get_s(hContact, szModule, it.szSetting, &dbv, 0) != 0;
+
+ if (!unspecified) {
+ switch (dbv.type) {
+ case DBVT_BYTE:
+ if (it.special == SVS_GENDER) {
+ if (dbv.cVal == 'M') pwstr = TranslateT("Male");
+ else if (dbv.cVal == 'F') pwstr = TranslateT("Female");
+ else unspecified = 1;
+ }
+ else if (it.special == SVS_MONTH) {
+ if (dbv.bVal > 0 && dbv.bVal <= 12) {
+ pwstr = wstr;
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVMONTHNAME1 - 1 + dbv.bVal, wstr, _countof(wstr));
+ }
+ else unspecified = 1;
+ }
+ else if (it.special == SVS_TIMEZONE) {
+ if (dbv.cVal == -100) unspecified = 1;
+ else {
+ pwstr = wstr;
+ mir_snwprintf(wstr, dbv.cVal ? L"UTC%+d:%02d" : L"UTC", -dbv.cVal / 2, (dbv.cVal & 1) * 30);
+ }
+ }
+ else if (it.special == SVS_MARITAL) {
+ switch (dbv.cVal) {
+ case 0:
+ pwstr = TranslateT("<not specified>");
+ break;
+ case 10:
+ pwstr = TranslateT("Single");
+ break;
+ case 11:
+ pwstr = TranslateT("Close relationships");
+ break;
+ case 12:
+ pwstr = TranslateT("Engaged");
+ break;
+ case 20:
+ pwstr = TranslateT("Married");
+ break;
+ case 30:
+ pwstr = TranslateT("Divorced");
+ break;
+ case 31:
+ pwstr = TranslateT("Separated");
+ break;
+ case 40:
+ pwstr = TranslateT("Widowed");
+ break;
+ case 50:
+ pwstr = TranslateT("Actively searching");
+ break;
+ case 60:
+ pwstr = TranslateT("In love");
+ break;
+ case 70:
+ pwstr = TranslateT("It's complicated");
+ break;
+ case 80:
+ pwstr = TranslateT("In a civil union");
+ break;
+ default:
+ unspecified = 1;
+ }
+ }
+ else {
+ unspecified = (it.special == SVS_ZEROISUNSPEC && dbv.bVal == 0);
+ pwstr = _itow(it.special == SVS_SIGNED ? dbv.cVal : dbv.bVal, wstr, 10);
+ }
+ break;
+
+ case DBVT_WORD:
+ if (it.special == SVS_COUNTRY) {
+ uint16_t wSave = dbv.wVal;
+ if (wSave == (uint16_t)-1) {
+ char szSettingName[100];
+ mir_snprintf(szSettingName, "%sName", it.szSetting);
+ if (!db_get_ws(hContact, szModule, szSettingName, &dbv)) {
+ pwstr = dbv.pwszVal;
+ unspecified = false;
+ break;
+ }
+ }
+
+ pwstr = TranslateW(_A2T((char *)CallService(MS_UTILS_GETCOUNTRYBYNUMBER, wSave, 0)));
+ unspecified = pwstr == nullptr;
+ }
+ else {
+ unspecified = (it.special == SVS_ZEROISUNSPEC && dbv.wVal == 0);
+ pwstr = _itow(it.special == SVS_SIGNED ? dbv.sVal : dbv.wVal, wstr, 10);
+ }
+ break;
+
+ case DBVT_DWORD:
+ unspecified = (it.special == SVS_ZEROISUNSPEC && dbv.dVal == 0);
+ if (it.special == SVS_IP) {
+ struct in_addr ia;
+ ia.S_un.S_addr = htonl(dbv.dVal);
+ mir_wstrncpy(wstr, _A2T(inet_ntoa(ia)), _countof(wstr));
+ pwstr = wstr;
+ if (dbv.dVal == 0)
+ unspecified = 1;
+ }
+ else pwstr = _itow(it.special == SVS_SIGNED ? dbv.lVal : dbv.dVal, wstr, 10);
+ break;
+
+ case DBVT_ASCIIZ:
+ unspecified = (it.special == SVS_ZEROISUNSPEC && dbv.pszVal[0] == '\0');
+ pstr = dbv.pszVal;
+ break;
+
+ case DBVT_UTF8:
+ unspecified = (it.special == SVS_ZEROISUNSPEC && dbv.pszVal[0] == '\0');
+ if (!unspecified) {
+ SetDlgItemTextW(hwndDlg, it.idCtrl, TranslateW(ptrW(mir_utf8decodeW(dbv.pszVal))));
+ goto LBL_Exit;
+ }
+
+ mir_utf8decode(dbv.pszVal, &pwstr);
+ break;
+
+ default:
+ pwstr = wstr;
+ mir_wstrcpy(wstr, L"???");
+ break;
+ }
+ }
+
+ if (unspecified)
+ SetDlgItemText(hwndDlg, it.idCtrl, TranslateT("<not specified>"));
+ else if (pwstr != nullptr)
+ SetDlgItemText(hwndDlg, it.idCtrl, pwstr);
+ else
+ SetDlgItemTextA(hwndDlg, it.idCtrl, pstr);
+
+LBL_Exit:
+ EnableWindow(GetDlgItem(hwndDlg, it.idCtrl), !unspecified);
+ db_free(&dbv);
+ }
+}
diff --git a/src/core/stduserinfo/stduserinfo.vcxproj b/src/core/stduserinfo/stduserinfo.vcxproj
index 95a73fb2c7..c95dd3b082 100644
--- a/src/core/stduserinfo/stduserinfo.vcxproj
+++ b/src/core/stduserinfo/stduserinfo.vcxproj
@@ -34,6 +34,7 @@
<ClCompile Include="src\stdinfo.cpp" />
<ClCompile Include="src\userinfo.cpp" />
<ClInclude Include="src\stdafx.h" />
+ <ClInclude Include="src\utils.h" />
<ClInclude Include="src\version.h" />
<ClInclude Include="src\resource.h" />
</ItemGroup>
diff --git a/src/core/stduserinfo/stduserinfo.vcxproj.filters b/src/core/stduserinfo/stduserinfo.vcxproj.filters
index 67b20cd02b..d856651dba 100644
--- a/src/core/stduserinfo/stduserinfo.vcxproj.filters
+++ b/src/core/stduserinfo/stduserinfo.vcxproj.filters
@@ -22,6 +22,9 @@
<ClInclude Include="src\stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="src\utils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="src\version.h">
<Filter>Header Files</Filter>
</ClInclude>