summaryrefslogtreecommitdiff
path: root/plugins/UserInfoEx/src/ctrl_edit.cpp
diff options
context:
space:
mode:
authorRozhuk Ivan <rozhuk.im@gmail.com>2014-11-26 23:06:03 +0000
committerRozhuk Ivan <rozhuk.im@gmail.com>2014-11-26 23:06:03 +0000
commit15cb1c735a559b88c7ede033510d8f106eb9e314 (patch)
tree990f59a238a88f5f8494b5094a2bd1dedb018d0a /plugins/UserInfoEx/src/ctrl_edit.cpp
parente94cb836621c0c4432ad7670ea18619812088a10 (diff)
UInfoEx: code cleanup, req for review
git-svn-id: http://svn.miranda-ng.org/main/trunk@11108 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/UserInfoEx/src/ctrl_edit.cpp')
-rw-r--r--plugins/UserInfoEx/src/ctrl_edit.cpp741
1 files changed, 371 insertions, 370 deletions
diff --git a/plugins/UserInfoEx/src/ctrl_edit.cpp b/plugins/UserInfoEx/src/ctrl_edit.cpp
index 1b4ecac93e..71e5f5e0de 100644
--- a/plugins/UserInfoEx/src/ctrl_edit.cpp
+++ b/plugins/UserInfoEx/src/ctrl_edit.cpp
@@ -1,371 +1,372 @@
-/*
-UserinfoEx plugin for Miranda IM
-
-Copyright:
-© 2006-2010 DeathAxe, Yasnovidyashii, Merlin, K. Romanov, Kreol
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "commonheaders.h"
-
-/**
- * This function creates a CEditCtrl object.
- *
- * @param hDlg - HWND of the owning propertysheet page
- * @param idCtrl - the ID of the dialog control to associate with this class's instance
- * @param pszSetting - the database setting to be handled by this class
- * @param dbType - the expected data type of the setting
- *
- * @return This static method returns the pointer of the created object.
- **/
-CBaseCtrl* CEditCtrl::CreateObj(HWND hDlg, WORD idCtrl, LPCSTR pszSetting, BYTE dbType)
-{
- CEditCtrl *ctrl = NULL;
-
- ctrl = new CEditCtrl(hDlg, idCtrl, USERINFO, pszSetting);
- if (ctrl) {
- ctrl->_dbType = dbType;
- }
- return (ctrl);
-}
-
-/**
- * This function creates a CEditCtrl object.
- *
- * @param hDlg - HWND of the owning propertysheet page
- * @param idCtrl - the ID of the dialog control to associate with this class's instance
- * @param pszModule - the database module to be handled by this class
- * @param pszSetting - the database setting to be handled by this class
- * @param dbType - the expected data type of the setting
- *
- * @return This static method returns the pointer of the created object.
- **/
-CBaseCtrl* CEditCtrl::CreateObj(HWND hDlg, WORD idCtrl, LPCSTR pszModule, LPCSTR pszSetting, BYTE dbType)
-{
- CEditCtrl *ctrl = NULL;
-
- ctrl = new CEditCtrl(hDlg, idCtrl, pszModule, pszSetting);
- if (ctrl) {
- ctrl->_dbType = dbType;
- }
- return (ctrl);
-}
-
-/**
- *
- *
- **/
-CEditCtrl::CEditCtrl(HWND hDlg, WORD idCtrl, LPCSTR pszModule, LPCSTR pszSetting)
- : CBaseCtrl(hDlg, idCtrl, pszModule, pszSetting)
-{
- SendDlgItemMessage(hDlg, idCtrl, EM_LIMITTEXT, 0x7fFFffFF, 0L);
-}
-
-/**
- * This method deletes the class object
- * and all allocated memory of its members.
- *
- * @param none
- *
- * @return nothing
- **/
-void CEditCtrl::Release()
-{
- delete this;
-}
-
-/*
- *
- *
- */
-void CEditCtrl::OnReset()
-{
-}
-
-
-/**
- * This method controls the changed bit for the control.
- *
- * @param hCtrl - HWND of the combobox
- * @param hContact - HANDLE of the contact whose timezone to select
- * @param pszProto - the contact's protocol
- *
- * @return nothing
- **/
-BOOL CEditCtrl::OnInfoChanged(MCONTACT hContact, LPCSTR pszProto)
-{
- if (!_Flags.B.hasChanged)
- {
- DBVARIANT dbv;
- TCHAR szText[64];
-
- _Flags.B.hasCustom = _Flags.B.hasProto = _Flags.B.hasMeta = 0;
- _Flags.W |= DB::Setting::GetTStringCtrl(hContact, _pszModule, _pszModule, pszProto, _pszSetting, &dbv);
-
- EnableWindow(_hwnd,
- !hContact || _Flags.B.hasCustom || !db_get_b(NULL, MODNAME, SET_PROPSHEET_PCBIREADONLY, 0));
-
- MIR_FREE(_pszValue);
- switch (dbv.type)
- {
- case DBVT_BYTE:
- _itot_s(dbv.bVal, szText, SIZEOF(szText), 10);
- SetWindowText(_hwnd, szText);
- _pszValue = mir_tcsdup(szText);
- break;
-
- case DBVT_WORD:
- _itot_s(dbv.wVal, szText, SIZEOF(szText), 10);
- SetWindowText(_hwnd, szText);
- _pszValue = mir_tcsdup(szText);
- break;
-
- case DBVT_DWORD:
- _itot_s(dbv.dVal, szText, SIZEOF(szText), 10);
- SetWindowText(_hwnd, szText);
- _pszValue = mir_tcsdup(szText);
- break;
-
- case DBVT_TCHAR:
- if (dbv.ptszVal)
- {
- SetWindowText(_hwnd, dbv.ptszVal);
- _pszValue = dbv.ptszVal;
- break;
- }
-
- default:
- SetWindowText(_hwnd, _T(""));
- db_free(&dbv);
- break;
- }
- _Flags.B.hasChanged = 0;
- }
- return _Flags.B.hasChanged;
-}
-
-/**
- * This method writes the control's information to database
- *
- * @param hContact - HANDLE of the contact whose timezone to select
- * @param pszProto - the contact's protocol
- *
- * @return nothing
- **/
-void CEditCtrl::OnApply(MCONTACT hContact, LPCSTR pszProto)
-{
- if (_Flags.B.hasChanged)
- {
- const char* pszModule = hContact ? _pszModule : pszProto;
-
- if (_Flags.B.hasCustom || !hContact)
- {
- DWORD cch = GetWindowTextLength(_hwnd);
-
- if (cch > 0)
- {
- LPTSTR val = (LPTSTR)mir_alloc((cch + 1) * sizeof(TCHAR));
-
- if (GetWindowText(_hwnd, val, cch + 1) > 0)
- {
- DBVARIANT dbv;
-
- dbv.type = _dbType;
- switch (_dbType)
- {
- case DBVT_BYTE:
- dbv.bVal = (BYTE)_tcstol(val, NULL, 10);
- break;
-
- case DBVT_WORD:
- dbv.wVal = (WORD)_tcstol(val, NULL, 10);
- break;
-
- case DBVT_DWORD:
- dbv.dVal = (DWORD)_tcstol(val, NULL, 10);
- break;
-
- case DBVT_TCHAR:
- dbv.ptszVal = val;
- break;
-
- default:
- dbv.type = DBVT_DELETED;
-
- }
- if (dbv.type != DBVT_DELETED)
- {
- if (!db_set(hContact, pszModule, _pszSetting, &dbv))
- {
- if (!hContact)
- {
- _Flags.B.hasCustom = 0;
- _Flags.B.hasProto = 1;
- }
- _Flags.B.hasChanged = 0;
-
- // save new value
- MIR_FREE(_pszValue);
- _pszValue = val;
- val = NULL;
- }
- }
- }
- MIR_FREE(val);
- }
- }
- if (_Flags.B.hasChanged)
- {
- db_unset(hContact, pszModule, _pszSetting);
-
- _Flags.B.hasChanged = 0;
-
- OnInfoChanged(hContact, pszProto);
- }
- InvalidateRect(_hwnd, NULL, TRUE);
- }
-}
-
-/**
- * The user changed information stored in the control.
- *
- * @return nothing
- **/
-void CEditCtrl::OnChangedByUser(WORD wChangedMsg)
-{
- if ((wChangedMsg == EN_UPDATE) || (wChangedMsg == EN_CHANGE))
- {
- const int cch = GetWindowTextLength(_hwnd);
-
- _Flags.B.hasChanged = mir_tcslen(_pszValue) != cch;
- _Flags.B.hasCustom = (cch > 0);
-
- if (!_Flags.B.hasChanged && _Flags.B.hasCustom) {
- BYTE need_free = 0;
- LPTSTR szText;
-
- __try
- {
- szText = (LPTSTR)alloca((cch + 1) * sizeof(TCHAR));
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- szText = (LPTSTR)mir_alloc((cch + 1) * sizeof(TCHAR));
- need_free = 1;
- }
-
- GetWindowText(_hwnd, szText, cch + 1);
- _Flags.B.hasChanged = mir_tcscmp(_pszValue, szText);
-
- if (need_free) {
- MIR_FREE(szText);
- }
- }
- InvalidateRect(_hwnd, NULL, TRUE);
-
- if (_Flags.B.hasChanged) {
- SendMessage(GetParent(GetParent(_hwnd)), PSM_CHANGED, 0, 0);
- }
- }
-}
-
-/**
- * Opens the url given in a editbox in the users default browser
- **/
-void CEditCtrl::OpenUrl()
-{
- int lenUrl = 1 + Edit_GetTextLength(_hwnd);
- LPSTR szUrl;
- BYTE need_free = 0;
-
- __try
- {
- szUrl = (LPSTR)alloca((8 + lenUrl) * sizeof(CHAR));
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- szUrl = (LPSTR)mir_alloc((8 + lenUrl) * sizeof(CHAR));
- need_free = 1;
- }
- if (szUrl && (GetWindowTextA(_hwnd, szUrl, lenUrl) > 0))
- {
- CallService(MS_UTILS_OPENURL, 1, (LPARAM)szUrl);
- }
- if (need_free)
- {
- MIR_FREE(szUrl);
- }
-}
-
-LRESULT CEditCtrl::LinkNotificationHandler(ENLINK* lnk)
-{
- switch (lnk->msg)
- {
- case WM_SETCURSOR:
- {
- SetCursor(LoadCursor(NULL, IDC_HAND));
- SetWindowLongPtr(GetParent(_hwnd), DWLP_MSGRESULT, TRUE);
- }
- return TRUE;
-
- case WM_LBUTTONUP:
- {
- if (lnk)
- {
- TEXTRANGE tr;
- BYTE need_free = 0;
-
- // do not call function if user selected some chars of the url string
- SendMessage(_hwnd, EM_EXGETSEL, NULL, (LPARAM) &tr.chrg);
- if (tr.chrg.cpMax == tr.chrg.cpMin)
- {
- // retrieve the url string
- tr.chrg = lnk->chrg;
-
- __try
- {
- tr.lpstrText = (LPTSTR)alloca((tr.chrg.cpMax - tr.chrg.cpMin + 8) * sizeof(TCHAR));
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- tr.lpstrText = (LPTSTR)mir_alloc((tr.chrg.cpMax - tr.chrg.cpMin + 8) * sizeof(TCHAR));
- need_free = 1;
- }
- if (tr.lpstrText && (SendMessage(_hwnd, EM_GETTEXTRANGE, NULL, (LPARAM)&tr) > 0))
- {
- if (_tcschr(tr.lpstrText, '@') != NULL && _tcschr(tr.lpstrText, ':') == NULL && _tcschr(tr.lpstrText, '/') == NULL)
- {
- MoveMemory(tr.lpstrText + (7*sizeof(TCHAR)), tr.lpstrText, (tr.chrg.cpMax - tr.chrg.cpMin + 1)*sizeof(TCHAR));
- CopyMemory(tr.lpstrText, _T("mailto:"), (7*sizeof(TCHAR)));
- }
-
- LPSTR pszUrl = mir_t2a(tr.lpstrText);
- if (pszUrl)
- {
- CallService(MS_UTILS_OPENURL, 1, (LPARAM)pszUrl);
- mir_free(pszUrl);
- }
- }
- if (need_free)
- {
- MIR_FREE(tr.lpstrText);
- }
- }
- }
- }
- }
- return FALSE;
+/*
+UserinfoEx plugin for Miranda IM
+
+Copyright:
+© 2006-2010 DeathAxe, Yasnovidyashii, Merlin, K. Romanov, Kreol
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "commonheaders.h"
+
+/**
+ * This function creates a CEditCtrl object.
+ *
+ * @param hDlg - HWND of the owning propertysheet page
+ * @param idCtrl - the ID of the dialog control to associate with this class's instance
+ * @param pszSetting - the database setting to be handled by this class
+ * @param dbType - the expected data type of the setting
+ *
+ * @return This static method returns the pointer of the created object.
+ **/
+CBaseCtrl* CEditCtrl::CreateObj(HWND hDlg, WORD idCtrl, LPCSTR pszSetting, BYTE dbType)
+{
+ CEditCtrl *ctrl = NULL;
+
+ ctrl = new CEditCtrl(hDlg, idCtrl, USERINFO, pszSetting);
+ if (ctrl) {
+ ctrl->_dbType = dbType;
+ }
+ return (ctrl);
+}
+
+/**
+ * This function creates a CEditCtrl object.
+ *
+ * @param hDlg - HWND of the owning propertysheet page
+ * @param idCtrl - the ID of the dialog control to associate with this class's instance
+ * @param pszModule - the database module to be handled by this class
+ * @param pszSetting - the database setting to be handled by this class
+ * @param dbType - the expected data type of the setting
+ *
+ * @return This static method returns the pointer of the created object.
+ **/
+CBaseCtrl* CEditCtrl::CreateObj(HWND hDlg, WORD idCtrl, LPCSTR pszModule, LPCSTR pszSetting, BYTE dbType)
+{
+ CEditCtrl *ctrl = NULL;
+
+ ctrl = new CEditCtrl(hDlg, idCtrl, pszModule, pszSetting);
+ if (ctrl) {
+ ctrl->_dbType = dbType;
+ }
+ return (ctrl);
+}
+
+/**
+ *
+ *
+ **/
+CEditCtrl::CEditCtrl(HWND hDlg, WORD idCtrl, LPCSTR pszModule, LPCSTR pszSetting)
+ : CBaseCtrl(hDlg, idCtrl, pszModule, pszSetting)
+{
+ SendDlgItemMessage(hDlg, idCtrl, EM_LIMITTEXT, 0x7fFFffFF, 0L);
+}
+
+/**
+ * This method deletes the class object
+ * and all allocated memory of its members.
+ *
+ * @param none
+ *
+ * @return nothing
+ **/
+void CEditCtrl::Release()
+{
+ delete this;
+}
+
+/*
+ *
+ *
+ */
+void CEditCtrl::OnReset()
+{
+}
+
+
+/**
+ * This method controls the changed bit for the control.
+ *
+ * @param hCtrl - HWND of the combobox
+ * @param hContact - HANDLE of the contact whose timezone to select
+ * @param pszProto - the contact's protocol
+ *
+ * @return nothing
+ **/
+BOOL CEditCtrl::OnInfoChanged(MCONTACT hContact, LPCSTR pszProto)
+{
+ if (!_Flags.B.hasChanged)
+ {
+ DBVARIANT dbv;
+ TCHAR szText[64];
+
+ _Flags.B.hasCustom = _Flags.B.hasProto = _Flags.B.hasMeta = 0;
+ _Flags.W |= DB::Setting::GetTStringCtrl(hContact, _pszModule, _pszModule, pszProto, _pszSetting, &dbv);
+
+ EnableWindow(_hwnd,
+ !hContact || _Flags.B.hasCustom || !db_get_b(NULL, MODNAME, SET_PROPSHEET_PCBIREADONLY, 0));
+
+ MIR_FREE(_pszValue);
+ switch (dbv.type)
+ {
+ case DBVT_BYTE:
+ _itot_s(dbv.bVal, szText, SIZEOF(szText), 10);
+ SetWindowText(_hwnd, szText);
+ _pszValue = mir_tcsdup(szText);
+ break;
+
+ case DBVT_WORD:
+ _itot_s(dbv.wVal, szText, SIZEOF(szText), 10);
+ SetWindowText(_hwnd, szText);
+ _pszValue = mir_tcsdup(szText);
+ break;
+
+ case DBVT_DWORD:
+ _itot_s(dbv.dVal, szText, SIZEOF(szText), 10);
+ SetWindowText(_hwnd, szText);
+ _pszValue = mir_tcsdup(szText);
+ break;
+
+ case DBVT_TCHAR:
+ if (dbv.ptszVal)
+ {
+ SetWindowText(_hwnd, dbv.ptszVal);
+ _pszValue = dbv.ptszVal;
+ break;
+ }
+
+ default:
+ SetWindowText(_hwnd, _T(""));
+ db_free(&dbv);
+ break;
+ }
+ _Flags.B.hasChanged = 0;
+ }
+ return _Flags.B.hasChanged;
+}
+
+/**
+ * This method writes the control's information to database
+ *
+ * @param hContact - HANDLE of the contact whose timezone to select
+ * @param pszProto - the contact's protocol
+ *
+ * @return nothing
+ **/
+void CEditCtrl::OnApply(MCONTACT hContact, LPCSTR pszProto)
+{
+ if (_Flags.B.hasChanged)
+ {
+ const char* pszModule = hContact ? _pszModule : pszProto;
+
+ if (_Flags.B.hasCustom || !hContact)
+ {
+ DWORD cch = GetWindowTextLength(_hwnd);
+
+ if (cch > 0)
+ {
+ LPTSTR val = (LPTSTR)mir_alloc((cch + 1) * sizeof(TCHAR));
+
+ if (GetWindowText(_hwnd, val, cch + 1) > 0)
+ {
+ DBVARIANT dbv;
+
+ dbv.type = _dbType;
+ switch (_dbType)
+ {
+ case DBVT_BYTE:
+ dbv.bVal = (BYTE)_tcstol(val, NULL, 10);
+ break;
+
+ case DBVT_WORD:
+ dbv.wVal = (WORD)_tcstol(val, NULL, 10);
+ break;
+
+ case DBVT_DWORD:
+ dbv.dVal = (DWORD)_tcstol(val, NULL, 10);
+ break;
+
+ case DBVT_TCHAR:
+ dbv.ptszVal = val;
+ break;
+
+ default:
+ dbv.type = DBVT_DELETED;
+
+ }
+ if (dbv.type != DBVT_DELETED)
+ {
+ if (!db_set(hContact, pszModule, _pszSetting, &dbv))
+ {
+ if (!hContact)
+ {
+ _Flags.B.hasCustom = 0;
+ _Flags.B.hasProto = 1;
+ }
+ _Flags.B.hasChanged = 0;
+
+ // save new value
+ MIR_FREE(_pszValue);
+ _pszValue = val;
+ val = NULL;
+ }
+ }
+ }
+ MIR_FREE(val);
+ }
+ }
+ if (_Flags.B.hasChanged)
+ {
+ db_unset(hContact, pszModule, _pszSetting);
+
+ _Flags.B.hasChanged = 0;
+
+ OnInfoChanged(hContact, pszProto);
+ }
+ InvalidateRect(_hwnd, NULL, TRUE);
+ }
+}
+
+/**
+ * The user changed information stored in the control.
+ *
+ * @return nothing
+ **/
+void CEditCtrl::OnChangedByUser(WORD wChangedMsg)
+{
+ if ((wChangedMsg == EN_UPDATE) || (wChangedMsg == EN_CHANGE))
+ {
+ const int cch = GetWindowTextLength(_hwnd);
+
+ _Flags.B.hasChanged = mir_tcslen(_pszValue) != cch;
+ _Flags.B.hasCustom = (cch > 0);
+
+ if (!_Flags.B.hasChanged && _Flags.B.hasCustom) {
+ BYTE need_free = 0;
+ LPTSTR szText;
+
+ __try
+ {
+ szText = (LPTSTR)alloca((cch + 1) * sizeof(TCHAR));
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ szText = (LPTSTR)mir_alloc((cch + 1) * sizeof(TCHAR));
+ need_free = 1;
+ }
+
+ if (szText != NULL) {
+ GetWindowText(_hwnd, szText, cch + 1);
+ _Flags.B.hasChanged = mir_tcscmp(_pszValue, szText);
+ if (need_free)
+ MIR_FREE(szText);
+ } else {
+ _Flags.B.hasChanged = 0;
+ }
+ }
+ InvalidateRect(_hwnd, NULL, TRUE);
+
+ if (_Flags.B.hasChanged)
+ SendMessage(GetParent(GetParent(_hwnd)), PSM_CHANGED, 0, 0);
+ }
+}
+
+/**
+ * Opens the url given in a editbox in the users default browser
+ **/
+void CEditCtrl::OpenUrl()
+{
+ int lenUrl = 1 + Edit_GetTextLength(_hwnd);
+ LPSTR szUrl;
+ BYTE need_free = 0;
+
+ __try
+ {
+ szUrl = (LPSTR)alloca((8 + lenUrl) * sizeof(CHAR));
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ szUrl = (LPSTR)mir_alloc((8 + lenUrl) * sizeof(CHAR));
+ need_free = 1;
+ }
+ if (szUrl && (GetWindowTextA(_hwnd, szUrl, lenUrl) > 0))
+ {
+ CallService(MS_UTILS_OPENURL, 1, (LPARAM)szUrl);
+ }
+ if (need_free)
+ {
+ MIR_FREE(szUrl);
+ }
+}
+
+LRESULT CEditCtrl::LinkNotificationHandler(ENLINK* lnk)
+{
+ switch (lnk->msg)
+ {
+ case WM_SETCURSOR:
+ {
+ SetCursor(LoadCursor(NULL, IDC_HAND));
+ SetWindowLongPtr(GetParent(_hwnd), DWLP_MSGRESULT, TRUE);
+ }
+ return TRUE;
+
+ case WM_LBUTTONUP:
+ {
+ if (lnk)
+ {
+ TEXTRANGE tr;
+ BYTE need_free = 0;
+
+ // do not call function if user selected some chars of the url string
+ SendMessage(_hwnd, EM_EXGETSEL, NULL, (LPARAM) &tr.chrg);
+ if (tr.chrg.cpMax == tr.chrg.cpMin)
+ {
+ // retrieve the url string
+ tr.chrg = lnk->chrg;
+
+ __try
+ {
+ tr.lpstrText = (LPTSTR)alloca((tr.chrg.cpMax - tr.chrg.cpMin + 8) * sizeof(TCHAR));
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ tr.lpstrText = (LPTSTR)mir_alloc((tr.chrg.cpMax - tr.chrg.cpMin + 8) * sizeof(TCHAR));
+ need_free = 1;
+ }
+ if (tr.lpstrText && (SendMessage(_hwnd, EM_GETTEXTRANGE, NULL, (LPARAM)&tr) > 0))
+ {
+ if (_tcschr(tr.lpstrText, '@') != NULL && _tcschr(tr.lpstrText, ':') == NULL && _tcschr(tr.lpstrText, '/') == NULL)
+ {
+ MoveMemory(tr.lpstrText + (7*sizeof(TCHAR)), tr.lpstrText, (tr.chrg.cpMax - tr.chrg.cpMin + 1)*sizeof(TCHAR));
+ CopyMemory(tr.lpstrText, _T("mailto:"), (7*sizeof(TCHAR)));
+ }
+
+ LPSTR pszUrl = mir_t2a(tr.lpstrText);
+ if (pszUrl)
+ {
+ CallService(MS_UTILS_OPENURL, 1, (LPARAM)pszUrl);
+ mir_free(pszUrl);
+ }
+ }
+ if (need_free)
+ {
+ MIR_FREE(tr.lpstrText);
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
} \ No newline at end of file