本文整理汇总了C++中TCString类的典型用法代码示例。如果您正苦于以下问题:C++ TCString类的具体用法?C++ TCString怎么用?C++ TCString使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了TCString类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: __declspec
extern "C" int __declspec(dllexport) Load(void)
{
mir_getLP(&pluginInfo);
mir_getCLI();
HookEvent(ME_SYSTEM_MODULESLOADED, MirandaLoaded);
Icon_Register(g_hInstance, MOD_NAME, iconList, _countof(iconList), "nas");
InitCommonControls();
InitOptions(); // must be called before we hook CallService
if (db_get_b(NULL, MOD_NAME, DB_SETTINGSVER, 0) < 1) { // change all %nas_message% variables to %extratext% if it wasn't done before
TCString Str = db_get_s(NULL, MOD_NAME, "PopupsFormat", _T(""));
if (Str.GetLen())
db_set_ts(NULL, MOD_NAME, "PopupsFormat", Str.Replace(_T("nas_message"), _T("extratext")));
Str = db_get_s(NULL, MOD_NAME, "ReplyPrefix", _T(""));
if (Str.GetLen())
db_set_ts(NULL, MOD_NAME, "ReplyPrefix", Str.Replace(_T("nas_message"), _T("extratext")));
}
if (db_get_b(NULL, MOD_NAME, DB_SETTINGSVER, 0) < 2) { // disable autoreply for not-on-list contacts, as such contact may be a spam bot
db_set_b(NULL, MOD_NAME, ContactStatusToDBSetting(0, DB_ENABLEREPLY, 0, INVALID_CONTACT_ID), 0);
db_set_b(NULL, MOD_NAME, DB_SETTINGSVER, 2);
}
return 0;
}
示例2: ShowPopup
void ShowPopup(SHOWPOPUP_DATA *sd)
{
TCString PopupText;
if (sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_SHOWPREVCLIENT)) {
mir_sntprintf(PopupText.GetBuffer(MAX_MSG_LEN), MAX_MSG_LEN, TranslateT("changed client to %s (was %s)"), (const TCHAR*)sd->MirVer, (const TCHAR*)sd->OldMirVer);
PopupText.ReleaseBuffer();
}
else {
mir_sntprintf(PopupText.GetBuffer(MAX_MSG_LEN), MAX_MSG_LEN, TranslateT("changed client to %s"), (const TCHAR*)sd->MirVer);
PopupText.ReleaseBuffer();
}
PLUGIN_DATA *pdata = (PLUGIN_DATA*)calloc(1, sizeof(PLUGIN_DATA));
POPUPDATAT ppd = {0};
ppd.lchContact = sd->hContact;
char *szProto = GetContactProto(sd->hContact);
pdata->hIcon = ppd.lchIcon = Finger_GetClientIcon(sd->MirVer, false);
_ASSERT(ppd.lchIcon);
if (!ppd.lchIcon || (DWORD)ppd.lchIcon == CALLSERVICE_NOTFOUND) {
// if we didn't succeed retrieving client icon, show the usual status icon instead
ppd.lchIcon = LoadSkinnedProtoIcon(szProto, db_get_w(sd->hContact, szProto, "Status", ID_STATUS_OFFLINE));
pdata->hIcon = NULL;
}
_tcsncpy(ppd.lptzContactName, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)sd->hContact, GCDNF_TCHAR), lengthof(ppd.lptzContactName) - 1);
_tcsncpy(ppd.lptzText, PopupText, lengthof(ppd.lptzText) - 1);
ppd.colorBack = (sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_DEFBGCOLOUR) ? 0 : sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_BGCOLOUR));
ppd.colorText = (sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_DEFTEXTCOLOUR) ? 0 : sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_TEXTCOLOUR));
ppd.PluginWindowProc = PopupWndProc;
pdata->PopupLClickAction = sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_LCLICK_ACTION);
pdata->PopupRClickAction = sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_RCLICK_ACTION);
ppd.iSeconds = sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_POPUPDELAY);
ppd.PluginData = pdata;
PUAddPopupT(&ppd);
}
示例3: CHECK
TCDynStr::TCDynStr(const TCString& str,uint pos,uint count)
/****************************************************************************
*
* Function: TCDynStr::TCDynStr
* Parameters: str - TCString to copy from
* pos - Starting position in the string
* count - Number of characters to copy
*
* Description: Constructs a string from another string, starting at the
* position 'pos' and including 'count' characters.
*
****************************************************************************/
{
CHECK(str.valid());
if (pos > str.length())
pos = str.length();
if (count > str.length() - pos)
count = str.length() - pos;
len = count+1;
size = computeSize(len);
if ((text = new char[size]) != NULL) {
memcpy(text,(const char *)str+pos,len);
text[count] = '\0'; // Null terminate the string
}
}
示例4: GetTreeCtrl
void CMsgTree::UpdateItem(int ID) // updates item title, and expanded/collapsed state for groups
{
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
int Order = TreeCtrl->IDToOrder(ID);
if (Order != -1) {
CBaseTreeItem* TreeItem = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
TCString NewTitle;
TVITEM tvi;
tvi.mask = TVIF_HANDLE | TVIF_TEXT;
tvi.hItem = TreeItem->hItem;
tvi.pszText = NewTitle.GetBuffer(TREEITEMTITLE_MAXLEN);
tvi.cchTextMax = TREEITEMTITLE_MAXLEN;
TreeView_GetItem(hTreeView, &tvi);
if (TreeItem->Title != (const TCHAR*)tvi.pszText) {
TreeCtrl->SetModified(true);
NMMSGTREE nm = { 0 };
nm.ItemNew = TreeItem;
nm.hdr.code = MTN_ITEMRENAMED;
nm.hdr.hwndFrom = hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(hTreeView);
SendMessage(GetParent(hTreeView), WM_NOTIFY, 0, (LPARAM)&nm);
}
tvi.mask = TVIF_HANDLE | TVIF_TEXT;
tvi.pszText = TreeItem->Title;
TreeView_SetItem(hTreeView, &tvi);
TreeView_Expand(hTreeView, tvi.hItem, (TreeItem->Flags & TIF_EXPANDED) ? TVE_EXPAND : TVE_COLLAPSE);
}
}
示例5: ShowPopup
void ShowPopup(SHOWPOPUP_DATA *sd)
{
TCString PopupText;
if (sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_SHOWPREVCLIENT)) {
mir_snwprintf(PopupText.GetBuffer(MAX_MSG_LEN), MAX_MSG_LEN, TranslateT("changed client to %s (was %s)"), (const wchar_t*)sd->MirVer, (const wchar_t*)sd->OldMirVer);
PopupText.ReleaseBuffer();
}
else {
mir_snwprintf(PopupText.GetBuffer(MAX_MSG_LEN), MAX_MSG_LEN, TranslateT("changed client to %s"), (const wchar_t*)sd->MirVer);
PopupText.ReleaseBuffer();
}
PLUGIN_DATA *pdata = (PLUGIN_DATA*)calloc(1, sizeof(PLUGIN_DATA));
POPUPDATAT ppd = { 0 };
ppd.lchContact = sd->hContact;
char *szProto = GetContactProto(sd->hContact);
pdata->hIcon = ppd.lchIcon = Finger_GetClientIcon(sd->MirVer, false);
_ASSERT(ppd.lchIcon);
if (!ppd.lchIcon || (INT_PTR)ppd.lchIcon == CALLSERVICE_NOTFOUND) {
// if we didn't succeed retrieving client icon, show the usual status icon instead
ppd.lchIcon = Skin_LoadProtoIcon(szProto, db_get_w(sd->hContact, szProto, "Status", ID_STATUS_OFFLINE));
pdata->hIcon = nullptr;
}
wcsncpy(ppd.lptzContactName, Clist_GetContactDisplayName(sd->hContact), _countof(ppd.lptzContactName) - 1);
wcsncpy(ppd.lptzText, PopupText, _countof(ppd.lptzText) - 1);
ppd.colorBack = (sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_DEFBGCOLOUR) ? 0 : sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_BGCOLOUR));
ppd.colorText = (sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_DEFTEXTCOLOUR) ? 0 : sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_TEXTCOLOUR));
ppd.PluginWindowProc = PopupWndProc;
pdata->PopupLClickAction = sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_LCLICK_ACTION);
pdata->PopupRClickAction = sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_RCLICK_ACTION);
ppd.iSeconds = sd->PopupOptPage->GetValue(IDC_POPUPOPTDLG_POPUPDELAY);
ppd.PluginData = pdata;
PUAddPopupT(&ppd);
}
示例6: GetMsgFormat
TCString CContactSettings::GetMsgFormat(int Flags, int *pOrder, char *szProtoOverride)
// returns the requested message; sets Order to the order of the message in the message tree, if available; or to -1 otherwise.
// szProtoOverride is needed only to get status message of the right protocol when the ICQ contact is on list, but not with the same
// protocol on which it requests the message - this way we can still get contact details.
{
TCString Message = NULL;
if (pOrder)
*pOrder = -1;
if (Flags & GMF_PERSONAL) // try getting personal message (it overrides global)
Message = db_get_s(hContact, MOD_NAME, StatusToDBSetting(Status, DB_STATUSMSG, IDC_MOREOPTDLG_PERSTATUSPERSONAL), (TCHAR*)NULL);
if (Flags & (GMF_LASTORDEFAULT | GMF_PROTOORGLOBAL | GMF_TEMPORARY) && Message.IsEmpty()) {
char *szProto = szProtoOverride ? szProtoOverride : (hContact ? GetContactProto(hContact) : NULL);
// we mustn't pass here by GMF_TEMPORARY flag, as otherwise we'll handle GMF_TEMPORARY | GMF_PERSONAL combination incorrectly,
// which is supposed to get only per-contact messages, and at the same time also may be used with NULL contact to get the global status message
if (Flags & (GMF_LASTORDEFAULT | GMF_PROTOORGLOBAL))
Message = CProtoSettings(szProto).GetMsgFormat(Flags, pOrder);
else if (!hContact) { // handle global temporary message too
if (g_ProtoStates[szProto].TempMsg.IsSet())
Message = g_ProtoStates[szProto].TempMsg;
}
}
return Message;
}
示例7: HookEvent
int CMPlugin::Load()
{
HookEvent(ME_SYSTEM_MODULESLOADED, MirandaLoaded);
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &g_hMainThread, THREAD_SET_CONTEXT, false, 0);
InitOptions();
if (db_get_b(NULL, MODULENAME, DB_SETTINGSVER, 0) < 1) {
TCString Str;
Str = db_get_s(NULL, MODULENAME, DB_IGNORESUBSTRINGS, L"");
if (Str.GetLen()) // fix incorrect regexp from v0.1.1.0
db_set_ws(NULL, MODULENAME, DB_IGNORESUBSTRINGS, Str.Replace(L"/Miranda[0-9A-F]{8}/", L"/[0-9A-F]{8}(\\W|$)/"));
db_set_b(NULL, MODULENAME, DB_SETTINGSVER, 1);
}
return 0;
}
示例8: __declspec
extern "C" int __declspec(dllexport) Load(void)
{
mir_getLP( &pluginInfo );
HookEvent(ME_SYSTEM_MODULESLOADED, MirandaLoaded);
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &g_hMainThread, THREAD_SET_CONTEXT, false, 0);
InitOptions();
if (db_get_b(NULL, MOD_NAME, DB_SETTINGSVER, 0) < 1) {
TCString Str;
Str = db_get_s(NULL, MOD_NAME, DB_IGNORESUBSTRINGS, _T(""));
if (Str.GetLen()) // fix incorrect regexp from v0.1.1.0
db_set_ts(NULL, MOD_NAME, DB_IGNORESUBSTRINGS, Str.Replace(_T("/Miranda[0-9A-F]{8}/"), _T("/[0-9A-F]{8}(\\W|$)/")));
db_set_b(NULL, MOD_NAME, DB_SETTINGSVER, 1);
}
return 0;
}
示例9:
TCSubStr::TCSubStr(const TCString& str,uint pos,uint count)
/****************************************************************************
*
* Function: TCSubStr::TCSubStr
* Parameters: str - TCString to copy from
* pos - Starting position in the string
* count - Number of characters to copy
*
* Description: Constructs a TCSubStr from another string, starting at the
* position 'pos' and including 'count' characters.
*
****************************************************************************/
{
CHECK(str.valid());
if (pos > str.length())
pos = str.length();
if (count > str.length() - pos)
count = str.length() - pos;
len = count+1;
text = (char *)((const char *)str + pos);
}
示例10: PcreCheck
int PcreCheck(TCString Str, int StartingID)
{ // StartingID specifies the pattern from which to start checking, i.e. the check starts from the next pattern after the one that has ID == StartingID
int I;
if (StartingID == -1)
{
I = 0;
} else
{
for (I = 0; I < PcreCompileData.GetSize(); I++)
{
if (PcreCompileData[I].ID == StartingID)
{
I++;
break;
}
}
}
for (; I < PcreCompileData.GetSize(); I++)
{
if (PcreCompileData[I].pPcre)
{
int Res = pcre16_exec(PcreCompileData[I].pPcre, PcreCompileData[I].pExtra, Str, Str.GetLen() - 1, 0, PCRE_NOTEMPTY | PCRE_NO_UTF8_CHECK, NULL, 0);
if (Res >= 0)
{
return PcreCompileData[I].ID;
}
} else
{
if (_tcsstr(Str.ToLower(), PcreCompileData[I].Pattern.ToLower()))
{
return PcreCompileData[I].ID;
}
}
}
return -1;
}
示例11: DBGetContactSettingAsString
TCString DBGetContactSettingAsString(MCONTACT hContact, const char *szModule, const char *szSetting, const TCHAR *szDefaultValue)
{ // also converts numeric values to a string
DBVARIANT dbv = {0};
int iRes = db_get_ws(hContact, szModule, szSetting, &dbv);
TCString Result;
if (!iRes && (dbv.type == DBVT_ASCIIZ || dbv.type == DBVT_WCHAR))
{
Result = dbv.ptszVal;
}
else if (dbv.type == DBVT_BYTE || dbv.type == DBVT_WORD || dbv.type == DBVT_DWORD)
{
long value = (dbv.type == DBVT_DWORD) ? dbv.dVal : (dbv.type == DBVT_WORD ? dbv.wVal : dbv.bVal);
_ultot(value, Result.GetBuffer(64), 10);
Result.ReleaseBuffer();
}
else Result = szDefaultValue;
if (!iRes)
db_free(&dbv);
return Result;
}
示例12: VariablesEscape
TCString VariablesEscape(TCString Str)
{
if (!Str.GetLen())
{
return _T("");
}
enum eState
{
ST_TEXT, ST_QUOTE
};
eState State = ST_QUOTE;
TCString Result(_T("`"));
const TCHAR *p = Str;
while (*p)
{
if (*p == '`')
{
if (State == ST_TEXT)
{
Result += _T("````");
State = ST_QUOTE;
} else
{
Result += _T("``");
}
} else
{
Result += *p;
State = ST_TEXT;
}
p++;
}
if (State == ST_QUOTE)
{
Result.GetBuffer()[Result.GetLen() - 1] = '\0';
Result.ReleaseBuffer();
} else
{
Result += '`';
}
return Result;
}
示例13: MsgTreeSubclassProc
static LRESULT CALLBACK MsgTreeSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
CMsgTree *dat = CWndUserData(GetParent(hWnd)).GetMsgTree();
switch (Msg) {
case UM_MSGTREE_UPDATE: // returns TRUE if updated
{
bool Modified = dat->MsgTreePage.GetModified();
TCString WndTitle;
if (Modified) {
WndTitle.GetBuffer(256);
HWND hCurWnd = hWnd;
do {
hCurWnd = GetParent(hCurWnd);
} while (hCurWnd && !GetWindowText(hCurWnd, WndTitle, 256));
WndTitle.ReleaseBuffer();
}
if (!Modified || MessageBox(GetParent(hWnd), TCString(TranslateT("You've made changes to multiple message trees at a time.\r\nDo you want to leave changes in \"")) + WndTitle + TranslateT("\" dialog?\r\nPress Yes to leave changes in this dialog, or No to discard its changes and save changes of the other message tree instead."), WndTitle + _T(" - ") + TranslateT("New Away System"), MB_ICONQUESTION | MB_YESNO) == IDNO) {
COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl();
TCString OldTitle, OldMsg, NewTitle, NewMsg;
int OldOrder = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hWnd)));
if (OldOrder != -1) {
CBaseTreeItem* ItemOld = (OldOrder <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(OldOrder)] : (CBaseTreeItem*)&TreeCtrl->Value[OldOrder];
OldTitle = ItemOld->Title;
if (!(ItemOld->Flags & TIF_ROOTITEM))
OldMsg = ((CTreeItem*)ItemOld)->User_Str1;
}
dat->UpdateLock++;
dat->MsgTreePage.DBToMemToPage();
dat->UpdateLock--;
NMMSGTREE nm = { 0 };
int Order = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hWnd)));
if (Order != -1) {
nm.ItemNew = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
NewTitle = nm.ItemNew->Title;
if (!(nm.ItemNew->Flags & TIF_ROOTITEM))
NewMsg = ((CTreeItem*)nm.ItemNew)->User_Str1;
}
if (OldTitle.IsEmpty())
OldTitle = _T(""); // to be sure that NULL will be equal to "" in the latter comparisons
if (OldMsg.IsEmpty())
OldMsg = _T("");
if (NewTitle.IsEmpty())
NewTitle = _T("");
if (NewMsg.IsEmpty())
NewMsg = _T("");
if (OldTitle != (const TCHAR*)NewTitle || OldMsg != (const TCHAR*)NewMsg) {
// probably it's better to leave nm.ItemOld = NULL, to prevent accidental rewriting of it with old data from an edit control etc.
nm.hdr.code = MTN_SELCHANGED;
nm.hdr.hwndFrom = hWnd;
nm.hdr.idFrom = GetDlgCtrlID(hWnd);
SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm);
}
return true;
}
}
return false;
case WM_KEYDOWN:
switch (wParam) {
case VK_DELETE:
dat->DeleteSelectedItem();
break;
case VK_INSERT:
dat->AddMessage();
break;
}
break;
case WM_RBUTTONDOWN:
SetFocus(hWnd);
{
TVHITTESTINFO hitTest;
hitTest.pt.x = (short)LOWORD(lParam);
hitTest.pt.y = (short)HIWORD(lParam);
TreeView_HitTest(hWnd, &hitTest);
if (hitTest.hItem && hitTest.flags & TVHT_ONITEM)
TreeView_SelectItem(hWnd, hitTest.hItem);
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
break;
case WM_CONTEXTMENU:
{
TVHITTESTINFO ht;
ht.pt.x = GET_X_LPARAM(lParam);
ht.pt.y = GET_Y_LPARAM(lParam);
TVITEM tvi = { 0 };
if (ht.pt.x == -1 && ht.pt.y == -1) { // use selected item
if (tvi.hItem = TreeView_GetSelection(hWnd)) {
TreeView_EnsureVisible(hWnd, tvi.hItem);
RECT rc;
TreeView_GetItemRect(hWnd, tvi.hItem, &rc, true);
ht.pt.x = rc.left;
ht.pt.y = rc.bottom;
}
}
else {
ScreenToClient(hWnd, &ht.pt);
//.........这里部分代码省略.........
示例14: CompileRegexp
TCString CompileRegexp(TCString Regexp, int bAddAsUsualSubstring, int ID)
{
TCString Result(_T(""));
sPcreCompileData s = {0};
int NewID = PcreCompileData.AddElem(s);
PcreCompileData[NewID].ID = ID;
if (hPcreDLL && !bAddAsUsualSubstring)
{
const char *Err;
int ErrOffs;
int Flags = PCRE_CASELESS;
if (Regexp[0] == '/')
{
TCString OrigRegexp = Regexp;
Regexp = Regexp.Right(Regexp.GetLen() - 1);
TCHAR *pRegexpEnd = (TCHAR*)Regexp + Regexp.GetLen();
TCHAR *p = _tcsrchr(Regexp.GetBuffer(), '/');
if (!p)
{
Regexp = OrigRegexp;
} else
{
*p = 0;
Flags = 0;
while (++p < pRegexpEnd)
{
switch (*p) {
case 'i':
Flags |= PCRE_CASELESS;
break;
case 'm':
Flags |= PCRE_MULTILINE;
break;
case 's':
Flags |= PCRE_DOTALL;
break;
case 'x':
Flags |= PCRE_EXTENDED;
break;
case 'A':
Flags |= PCRE_ANCHORED;
break;
case 'f':
Flags |= PCRE_FIRSTLINE;
break;
case 'D':
Flags |= PCRE_DOLLAR_ENDONLY;
break;
case 'U':
Flags |= PCRE_UNGREEDY;
break;
case 'X':
Flags |= PCRE_EXTRA;
break;
default:
// Result += LogMessage(Translate("Warning, unknown pattern modifier '%c':\n"), *p );
break;
}
}
}
Regexp.ReleaseBuffer();
}
PcreCompileData[NewID].pPcre = pcre_compile(WCHAR2UTF8(Regexp).GetData(), PCRE_UTF8 | PCRE_NO_UTF8_CHECK | Flags, &Err, &ErrOffs, NULL);
if (PcreCompileData[NewID].pPcre) {
PcreCompileData[NewID].pExtra = NULL;
if (pcre_study)
PcreCompileData[NewID].pExtra = pcre_study(PcreCompileData[NewID].pPcre, 0, &Err);
}
else {
// Result += LogMessage(TranslateT("Syntax error in regexp\n%s\nat offset %d: %s."), (TCHAR*)Regexp, ErrOffs, (TCHAR*)ANSI2TCHAR(Err)) + _T("\n\n");
PcreCompileData[NewID].Pattern = Regexp;
}
}
else PcreCompileData[NewID].Pattern = Regexp;
return Result;
}
示例15: ContactSettingChanged
int ContactSettingChanged(WPARAM hContact, LPARAM lParam)
{
DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam;
if (lstrcmpA(cws->szSetting, DB_MIRVER))
return 0;
SHOWPOPUP_DATA sd = {0};
char *szProto = GetContactProto(hContact);
if (g_PreviewOptPage)
sd.MirVer = _T("Miranda NG ICQ 0.93.5.3007");
else {
if (!hContact) // exit if hContact == NULL and it's not a popup preview
return 0;
_ASSERT(szProto);
if (!strcmp(szProto, META_PROTO)) // workaround for metacontacts
return 0;
sd.MirVer = db_get_s(hContact, szProto, DB_MIRVER, _T(""));
if (sd.MirVer.IsEmpty())
return 0;
}
sd.OldMirVer = db_get_s(hContact, MOD_NAME, DB_OLDMIRVER, _T(""));
db_set_ts(hContact, MOD_NAME, DB_OLDMIRVER, sd.MirVer); // we have to write it here, because we modify sd.OldMirVer and sd.MirVer to conform our settings later
if (sd.OldMirVer.IsEmpty()) // looks like it's the right way to do
return 0;
COptPage PopupOptPage;
if (g_PreviewOptPage)
PopupOptPage = *g_PreviewOptPage;
else {
PopupOptPage = g_PopupOptPage;
PopupOptPage.DBToMem();
}
MCONTACT hContactOrMeta = (hContact) ? db_mc_getMeta(hContact) : 0;
if (!hContactOrMeta)
hContactOrMeta = hContact;
if (hContact && db_get_b(hContactOrMeta, "CList", "Hidden", 0))
return 0;
int PerContactSetting = hContact ? db_get_b(hContact, MOD_NAME, DB_CCN_NOTIFY, NOTIFY_USEGLOBAL) : NOTIFY_ALWAYS; // NOTIFY_ALWAYS for preview
if (PerContactSetting == NOTIFY_USEGLOBAL && hContactOrMeta != hContact) // subcontact setting has a priority over a metacontact setting
PerContactSetting = db_get_b(hContactOrMeta, MOD_NAME, DB_CCN_NOTIFY, NOTIFY_USEGLOBAL);
if (PerContactSetting && (PerContactSetting == NOTIFY_ALMOST_ALWAYS || PerContactSetting == NOTIFY_ALWAYS || !PopupOptPage.GetValue(IDC_POPUPOPTDLG_USESTATUSNOTIFYFLAG) || !(db_get_dw(hContactOrMeta, "Ignore", "Mask1", 0) & 0x8))) { // check if we need to notify at all
sd.hContact = hContact;
sd.PopupOptPage = &PopupOptPage;
if (!PopupOptPage.GetValue(IDC_POPUPOPTDLG_VERCHGNOTIFY) || !PopupOptPage.GetValue(IDC_POPUPOPTDLG_SHOWVER)) {
if (bFingerprintExists) {
LPCTSTR ptszOldClient = Finger_GetClientDescr(sd.OldMirVer);
LPCTSTR ptszClient = Finger_GetClientDescr(sd.MirVer);
if (ptszOldClient && ptszClient) {
if (PerContactSetting != NOTIFY_ALMOST_ALWAYS && PerContactSetting != NOTIFY_ALWAYS && !PopupOptPage.GetValue(IDC_POPUPOPTDLG_VERCHGNOTIFY) && !_tcscmp(ptszClient, ptszOldClient))
return 0;
if (!PopupOptPage.GetValue(IDC_POPUPOPTDLG_SHOWVER)) {
sd.MirVer = ptszClient;
sd.OldMirVer = ptszOldClient;
}
}
}
}
if (sd.MirVer == (const TCHAR*)sd.OldMirVer) {
_ASSERT(hContact);
return 0;
}
if (PerContactSetting == NOTIFY_ALWAYS || (PopupOptPage.GetValue(IDC_POPUPOPTDLG_POPUPNOTIFY) && (g_PreviewOptPage || PerContactSetting == NOTIFY_ALMOST_ALWAYS || -1 == PcreCheck(sd.MirVer)))) {
ShowPopup(&sd);
SkinPlaySound(CLIENTCHANGED_SOUND);
}
}
if (hContact) {
TCString ClientName;
if (PopupOptPage.GetValue(IDC_POPUPOPTDLG_SHOWPREVCLIENT) && sd.OldMirVer.GetLen()) {
mir_sntprintf(ClientName.GetBuffer(MAX_MSG_LEN), MAX_MSG_LEN, TranslateT("%s (was %s)"), (const TCHAR*)sd.MirVer, (const TCHAR*)sd.OldMirVer);
ClientName.ReleaseBuffer();
}
else ClientName = sd.MirVer;
}
_ASSERT(sd.MirVer.GetLen()); // save the last known MirVer value even if the new one is empty
return 0;
}