本文整理汇总了C++中CallService函数的典型用法代码示例。如果您正苦于以下问题:C++ CallService函数的具体用法?C++ CallService怎么用?C++ CallService使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了CallService函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: buildUinList
char* CIcqProto::buildUinList(int subtype, size_t wMaxLen, MCONTACT *hContactResume)
{
MCONTACT hContact;
WORD wCurrentLen = 0;
DWORD dwUIN;
uid_str szUID;
int add;
char *szList = (char*)SAFE_MALLOC(CallService(MS_DB_CONTACT_GETCOUNT, 0, 0) * UINMAXLEN);
char szLen[2];
szLen[1] = '\0';
if (*hContactResume)
hContact = *hContactResume;
else
hContact = db_find_first(m_szModuleName);
while (hContact != NULL) {
if (!getContactUid(hContact, &dwUIN, &szUID)) {
szLen[0] = (char)mir_strlen(strUID(dwUIN, szUID));
switch (subtype) {
case BUL_VISIBLE:
add = ID_STATUS_ONLINE == getWord(hContact, "ApparentMode", 0);
break;
case BUL_INVISIBLE:
add = ID_STATUS_OFFLINE == getWord(hContact, "ApparentMode", 0);
break;
case BUL_TEMPVISIBLE:
add = getByte(hContact, "TemporaryVisible", 0);
// clear temporary flag
// Here we assume that all temporary contacts will be in one packet
setByte(hContact, "TemporaryVisible", 0);
break;
default:
add = 1;
// If we are in SS mode, we only add those contacts that are
// not in our SS list, or are awaiting authorization, to our
// client side list
if (m_bSsiEnabled && getWord(hContact, DBSETTING_SERVLIST_ID, 0) &&
!getByte(hContact, "Auth", 0))
add = 0;
// Never add hidden contacts to CS list
if (db_get_b(hContact, "CList", "Hidden", 0))
add = 0;
break;
}
if (add) {
wCurrentLen += szLen[0] + 1;
if (wCurrentLen > wMaxLen) {
*hContactResume = hContact;
return szList;
}
strcat(szList, szLen);
strcat(szList, szUID);
}
}
hContact = db_find_next(hContact, m_szModuleName);
}
*hContactResume = NULL;
return szList;
}
示例2: FrameIsFloating
bool FrameIsFloating() {
if(Frameid == -1)
return true; // no frames, always floating
return (CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLOATING, Frameid), 0) != 0);
}
示例3: Parser
int Parser()
{
static NETLIBPACKETRECVER nlpr = {0};
char *ptr;
char tmp[256];
int i;
char *buf;
static char ver[16];
nlpr.cbSize = sizeof(nlpr);
nlpr.dwTimeout = 5;
if(!ghConnection)
{
mir_forkthread(&Start, 0);
}
if(ghConnection)
{
int recvResult;
/* do
{
recvResult = CallService(MS_NETLIB_GETMOREPACKETS,(WPARAM)ghPacketReciever, (LPARAM)&nlpr);
if(recvResult == SOCKET_ERROR)
{
ReStart();
return 1;
}
}
while(recvResult > 0);*/
if(!Connected)
{
char tmp[128];
char *tmp2 = mir_t2a(gbPassword);
recvResult = CallService(MS_NETLIB_GETMOREPACKETS,(WPARAM)ghPacketReciever, (LPARAM)&nlpr);
if(recvResult == SOCKET_ERROR)
{
mir_forkthread(&ReStart, 0);
// ReStart();
return 1;
}
if(mir_strlen(tmp2) > 2)
{
mir_strcpy(tmp, "password ");
mir_strcat(tmp, tmp2);
mir_strcat(tmp, "\n");
Netlib_Send(ghConnection, tmp, (int)mir_strlen(tmp), 0);
recvResult = CallService(MS_NETLIB_GETMOREPACKETS,(WPARAM)ghPacketReciever, (LPARAM)&nlpr);
if(recvResult == SOCKET_ERROR)
{
mir_forkthread(&ReStart, 0);
return 1;
}
}
mir_free(tmp2);
}
Netlib_Send(ghConnection, "status\n", (int)mir_strlen("status\n"), 0);
recvResult = CallService(MS_NETLIB_GETMOREPACKETS,(WPARAM)ghPacketReciever, (LPARAM)&nlpr);
if(recvResult == SOCKET_ERROR)
{
mir_forkthread(&ReStart, 0);
return 1;
}
Netlib_Send(ghConnection, "currentsong\n", (int)mir_strlen("currentsong\n"), 0);
recvResult = CallService(MS_NETLIB_GETMOREPACKETS,(WPARAM)ghPacketReciever, (LPARAM)&nlpr);
if(recvResult == SOCKET_ERROR)
{
mir_forkthread(&ReStart, 0);
return 1;
}
nlpr.bytesUsed = nlpr.bytesAvailable;
}
buf = (char*)nlpr.buffer;
if(ptr = strstr(buf, "MPD"))
{
Connected = TRUE;
ptr = &ptr[4];
for(i = 0; ((ptr[i] != '\n') && (ptr[i] != '\0')); i++)
tmp[i] = ptr[i];
tmp[i] = '\0';
strncpy_s(ver, tmp, _TRUNCATE);
SongInfo.txtver = mir_utf8decodeT(tmp);
}
else
SongInfo.txtver = mir_utf8decodeT(ver);
if(ptr = strstr(buf, "file:"))
{
ptr = &ptr[6];
for(i = 0; ((ptr[i] != '\n') && (ptr[i] != '\0')); i++)
tmp[i] = ptr[i];
tmp[i] = '\0';
SongInfo.mfile = mir_utf8decodeT(tmp);
}
else
SongInfo.mfile = mir_tstrdup(_T(""));
if(ptr = strstr(buf, "Time:"))
{
ptr = &ptr[6];
for(i = 0; ((ptr[i] != '\n') && (ptr[i] != '\0')); i++)
tmp[i] = ptr[i];
tmp[i] = '\0';
SongInfo.total = atoi(tmp);
}
//.........这里部分代码省略.........
示例4: debugLog
void CSametimeProto::DeinitConferenceMenu()
{
debugLog(_T("CSametimeProto::DeinitConferenceMenu()"));
CallService(MO_REMOVEMENUITEM, (WPARAM)hLeaveChatMenuItem, 0);
CallService(MO_REMOVEMENUITEM, (WPARAM)hCreateChatMenuItem, 0);
}
示例5: YmsgrLinksUninit
void YmsgrLinksUninit(void)
{
DestroyServiceFunction(hServiceParseLink);
CallService(MS_ASSOCMGR_REMOVEURLTYPE, 0, (LPARAM)"ymsgr:");
}
示例6: DlgProcRecvFile
INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
FileDlgData *dat = (FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (msg) {
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
{
TCHAR szPath[450];
CLISTEVENT* cle = (CLISTEVENT*)lParam;
dat = (FileDlgData*)mir_calloc(sizeof(FileDlgData));
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);
dat->hContact = cle->hContact;
dat->hDbEvent = cle->hDbEvent;
dat->hPreshutdownEvent = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN);
dat->dwTicks = GetTickCount();
EnumChildWindows(hwndDlg, ClipSiblingsChildEnumProc, 0);
Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE);
Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list"));
Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details"));
Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View user's history"));
Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User menu"));
TCHAR *contactName = pcli->pfnGetContactDisplayName(dat->hContact, 0);
SetDlgItemText(hwndDlg, IDC_FROM, contactName);
GetContactReceivedFilesDir(dat->hContact, szPath, SIZEOF(szPath), TRUE);
SetDlgItemText(hwndDlg, IDC_FILEDIR, szPath);
SHAutoComplete(GetWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), GW_CHILD), 1);
for (int i = 0; i < MAX_MRU_DIRS; i++) {
char idstr[32];
mir_snprintf(idstr, SIZEOF(idstr), "MruDir%d", i);
DBVARIANT dbv;
if (db_get_ts(NULL, "SRFile", idstr, &dbv))
break;
SendDlgItemMessage(hwndDlg, IDC_FILEDIR, CB_ADDSTRING, 0, (LPARAM)dbv.ptszVal);
db_free(&dbv);
}
db_event_markRead(dat->hContact, dat->hDbEvent);
DBEVENTINFO dbei = { sizeof(dbei) };
dbei.cbBlob = db_event_getBlobSize(dat->hDbEvent);
if (dbei.cbBlob > 4 && dbei.cbBlob <= 8196) {
dbei.pBlob = (PBYTE)alloca(dbei.cbBlob + 1);
db_event_get(dat->hDbEvent, &dbei);
dbei.pBlob[dbei.cbBlob] = 0;
dat->fs = cle->lParam ? (HANDLE)cle->lParam : (HANDLE)*(PDWORD)dbei.pBlob;
char *str = (char*)dbei.pBlob + 4;
ptrT ptszFileName(DbGetEventStringT(&dbei, str));
SetDlgItemText(hwndDlg, IDC_FILENAMES, ptszFileName);
unsigned len = (unsigned)strlen(str) + 1;
if (len + 4 < dbei.cbBlob) {
str += len;
ptrT ptszDescription(DbGetEventStringT(&dbei, str));
SetDlgItemText(hwndDlg, IDC_MSG, ptszDescription);
}
}
else DestroyWindow(hwndDlg);
TCHAR datetimestr[64];
tmi.printTimeStamp(NULL, dbei.timestamp, _T("t d"), datetimestr, SIZEOF(datetimestr), 0);
SetDlgItemText(hwndDlg, IDC_DATE, datetimestr);
char* szProto = GetContactProto(dat->hContact);
if (szProto) {
int hasName = 0;
char buf[128];
CONTACTINFO ci = { 0 };
ci.cbSize = sizeof(ci);
ci.hContact = dat->hContact;
ci.szProto = szProto;
ci.dwFlag = CNF_UNIQUEID;
if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) {
switch (ci.type) {
case CNFT_ASCIIZ:
hasName = 1;
mir_snprintf(buf, SIZEOF(buf), "%s", ci.pszVal);
mir_free(ci.pszVal);
break;
case CNFT_DWORD:
hasName = 1;
mir_snprintf(buf, SIZEOF(buf), "%u", ci.dVal);
break;
}
}
if (hasName)
SetDlgItemTextA(hwndDlg, IDC_NAME, buf);
else
SetDlgItemText(hwndDlg, IDC_NAME, contactName);
}
if (db_get_b(dat->hContact, "CList", "NotOnList", 0)) {
//.........这里部分代码省略.........
示例7: AddEvent
struct CListEvent* AddEvent(CLISTEVENT *cle)
{
struct CListEvent* p = saveAddEvent(cle);
if ( p == NULL )
return NULL;
if (1) {
if (p->cle.hContact != 0 && p->cle.hDbEvent != (HANDLE) 1 && !(p->cle.flags & CLEF_ONLYAFEW)) {
int j;
struct NotifyMenuItemExData *nmi = 0;
char *szProto;
TCHAR *szName;
MENUITEMINFO mii = {0};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_DATA | MIIM_BITMAP | MIIM_ID;
if (p->cle.pszService && !strncmp("SRMsg/ReadMessage", p->cle.pszService, 17)) {
// dup check only for msg events
for (j = 0; j < GetMenuItemCount(cfg::dat.hMenuNotify); j++) {
if (GetMenuItemInfo(cfg::dat.hMenuNotify, j, TRUE, &mii) != 0) {
nmi = (struct NotifyMenuItemExData *) mii.dwItemData;
if (nmi != 0 && (HANDLE) nmi->hContact == (HANDLE) p->cle.hContact && nmi->iIcon == p->imlIconIndex)
return p;
} } }
szProto = (char*) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) p->cle.hContact, 0);
szName = pcli->pfnGetContactDisplayName(p->cle.hContact, 0);
if (szProto && szName) {
nmi = (struct NotifyMenuItemExData *) malloc(sizeof(struct NotifyMenuItemExData));
if (nmi) {
TCHAR szBuffer[128];
TCHAR* szStatus = pcli->pfnGetStatusModeDescription(cfg::getWord(p->cle.hContact, szProto, "Status", ID_STATUS_OFFLINE), 0);
#if defined(_UNICODE)
TCHAR szwProto[64];
MultiByteToWideChar(CP_ACP, 0, szProto, -1, szwProto, 64);
szwProto[63] = 0;
_snwprintf(szBuffer, SIZEOF(szBuffer), L"%s: %s (%s)", szwProto, szName, szStatus);
#else
_snprintf(szBuffer, SIZEOF(szBuffer), "%s: %s (%s)", szProto, szName, szStatus);
#endif
szBuffer[127] = 0;
AppendMenu(cfg::dat.hMenuNotify, MF_BYCOMMAND | MF_STRING, cfg::dat.wNextMenuID, szBuffer);
mii.hbmpItem = HBMMENU_CALLBACK;
nmi->hContact = p->cle.hContact;
nmi->iIcon = p->imlIconIndex;
nmi->hIcon = p->cle.hIcon;
nmi->hDbEvent = p->cle.hDbEvent;
mii.dwItemData = (ULONG_PTR) nmi;
mii.wID = cfg::dat.wNextMenuID;
SetMenuItemInfo(cfg::dat.hMenuNotify, cfg::dat.wNextMenuID, FALSE, &mii);
p-> menuId = cfg::dat.wNextMenuID;
cfg::dat.wNextMenuID++;
if (cfg::dat.wNextMenuID > 0x7fff)
cfg::dat.wNextMenuID = 1;
cfg::dat.hIconNotify = p->imlIconIndex;
}
}
} else if (p->cle.hContact != 0 && (p->cle.flags & CLEF_ONLYAFEW)) {
cfg::dat.hIconNotify = p->imlIconIndex;
cfg::dat.hUpdateContact = p->cle.hContact;
}
if (cfg::dat.dwFlags & CLUI_STICKYEVENTS) {
HANDLE hItem = (HANDLE) SendMessage(pcli->hwndContactTree, CLM_FINDCONTACT, (WPARAM) p->cle.hContact, 0);
if (hItem) {
SendMessage(pcli->hwndContactTree, CLM_SETSTICKY, (WPARAM) hItem, 1);
pcli->pfnClcBroadcast(INTM_PROTOCHANGED, (WPARAM) p->cle.hContact, 0);
}
}
if (pcli->events.count > 0) {
cfg::dat.bEventAreaEnabled = TRUE;
if (cfg::dat.notifyActive == 0) {
cfg::dat.notifyActive = 1;
HideShowNotifyFrame();
}
}
InvalidateRect(hwndEventFrame, NULL, FALSE);
if(cfg::dat.bUseFloater & CLUI_USE_FLOATER && cfg::dat.bUseFloater & CLUI_FLOATER_EVENTS)
SFL_Update(0, 0, 0, NULL, FALSE);
}
return p;
}
示例8: EventAreaWndProc
LRESULT CALLBACK EventAreaWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
case WM_CREATE:
hwndEventFrame = hwnd;
return FALSE;
case WM_MEASUREITEM:
{
MEASUREITEMSTRUCT *lpi = (LPMEASUREITEMSTRUCT) lParam;
MENUITEMINFOA mii = {0};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_DATA | MIIM_ID;
if (GetMenuItemInfoA(cfg::dat.hMenuNotify, lpi->itemID, FALSE, &mii) != 0) {
if (mii.dwItemData == lpi->itemData) {
lpi->itemWidth = 8 + 16;
lpi->itemHeight = 0;
return TRUE;
}
}
break;
}
case WM_NCCALCSIZE:
return FrameNCCalcSize(hwnd, DefWindowProc, wParam, lParam,
wndFrameEventArea ? wndFrameEventArea->TitleBar.ShowTitleBar : 0);
case WM_NCPAINT:
return FrameNCPaint(hwnd, DefWindowProc, wParam, lParam,
wndFrameEventArea ? wndFrameEventArea->TitleBar.ShowTitleBar : 0);
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT) lParam;
if (dis->hwndItem == (HWND) cfg::dat.hMenuNotify) {
MENUITEMINFOA mii = {0};
struct NotifyMenuItemExData *nmi = 0;
int iIcon;
HICON hIcon;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_DATA;
if (GetMenuItemInfoA(cfg::dat.hMenuNotify, (UINT) dis->itemID, FALSE, &mii) != 0) {
nmi = (struct NotifyMenuItemExData *) mii.dwItemData;
if (nmi) {
iIcon = CallService(MS_CLIST_GETCONTACTICON, (WPARAM) nmi->hContact, 0);
hIcon = ImageList_GetIcon(hCListImages, iIcon, ILD_NORMAL);
pcli->pfnDrawMenuItem(dis, hIcon, nmi->hIcon);
return TRUE;
}
}
}
break;
}
case WM_LBUTTONUP:
if(cfg::dat.bEventAreaEnabled)
SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_NOTIFYBUTTON, 0), 0);
break;
case WM_COMMAND:
if(LOWORD(wParam) == IDC_NOTIFYBUTTON) {
int iSelection;
MENUITEMINFO mii = {0};
POINT pt;
struct NotifyMenuItemExData *nmi = 0;
int iCount = GetMenuItemCount(cfg::dat.hMenuNotify);
BOOL result;
GetCursorPos(&pt);
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_DATA;
if (iCount > 1)
iSelection = TrackPopupMenu(cfg::dat.hMenuNotify, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL);
else
iSelection = GetMenuItemID(cfg::dat.hMenuNotify, 0);
result = GetMenuItemInfo(cfg::dat.hMenuNotify, (UINT) iSelection, FALSE, &mii);
if (result != 0) {
nmi = (struct NotifyMenuItemExData *) mii.dwItemData;
if (nmi) {
CLISTEVENT *cle = MyGetEvent(iSelection);
if (cle) {
CLISTEVENT *cle1 = NULL;
CallService(cle->pszService, (WPARAM) NULL, (LPARAM) cle);
// re-obtain the pointer, it may already be invalid/point to another event if the
// event we're interested in was removed by the service (nasty one...)
cle1 = MyGetEvent(iSelection);
if (cle1 != NULL)
CallService(MS_CLIST_REMOVEEVENT, (WPARAM) cle->hContact, (LPARAM) cle->hDbEvent);
}
}
}
break;
}
break;
case WM_ERASEBKGND:
return TRUE;
case WM_PAINT:
{
PAINTSTRUCT ps;
RECT rc, rcClient;
//.........这里部分代码省略.........
示例9: ContactListSubclassProc
//.........这里部分代码省略.........
else {
TreeView_SetItemState(hWnd, hItem, 0, TVIS_SELECTED);
dat->SelectedItems.RemoveElem(nIndex);
}
dat->SelectGroups(hItem, nIndex == -1);
NMCLIST nm;
nm.hdr.code = MCLN_SELCHANGED;
nm.hdr.hwndFrom = hWnd;
nm.hdr.idFrom = GetDlgCtrlID(hWnd);
nm.OldSelection = &OldSelection;
nm.NewSelection = &dat->SelectedItems;
SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm);
return 0;
}
// if it was a click on the selected item and there's need to do something in this case, then send SELCHANGED notification by ourselves, as the tree control doesn't do anything
if (hItem == TreeView_GetSelection(hWnd) && (dat->SelectedItems.GetSize() != 1 || (dat->SelectedItems.GetSize() == 1 && dat->SelectedItems[0] != hItem))) {
TreeView_SetItemState(hWnd, hItem, TVIS_SELECTED, TVIS_SELECTED);
NMTREEVIEW nm = { 0 };
nm.hdr.code = TVN_SELCHANGED;
nm.hdr.hwndFrom = hWnd;
nm.hdr.idFrom = GetDlgCtrlID(hWnd);
nm.itemOld.hItem = TreeView_GetSelection(hWnd);
nm.itemOld.mask = TVIF_HANDLE | TVIF_STATE | TVIF_PARAM;
TreeView_GetItem(hWnd, &nm.itemOld);
nm.itemNew = nm.itemOld;
SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm);
}
}
}
break;
case WM_SETFOCUS:
case WM_KILLFOCUS:
for (int i = 0; i < dat->SelectedItems.GetSize(); i++) {
RECT rc;
if (TreeView_GetItemRect(hWnd, dat->SelectedItems[i], &rc, false))
InvalidateRect(hWnd, &rc, false);
}
break;
case WM_SIZE:
case WM_HSCROLL:
InvalidateRect(hWnd, NULL, false);
break;
case WM_MEASUREITEM:
if (!wParam) // if the message was sent by a menu
return Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam);
break;
case WM_DRAWITEM:
if (!wParam) // if the message was sent by a menu
return Menu_DrawItem((LPDRAWITEMSTRUCT)lParam);
break;
case WM_CONTEXTMENU:
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
HTREEITEM hItem = NULL;
if (pt.x == -1 && pt.y == -1) {
if (dat->SelectedItems.GetSize() == 1) {
hItem = dat->SelectedItems[0];
TreeView_EnsureVisible(hWnd, hItem);
RECT rc;
TreeView_GetItemRect(hWnd, hItem, &rc, true);
pt.x = rc.left;
pt.y = rc.bottom;
}
}
else {
DWORD hitFlags;
ScreenToClient(hWnd, &pt);
hItem = dat->HitTest(&pt, &hitFlags);
if (!(hitFlags & MCLCHT_ONITEM))
hItem = NULL;
}
if (hItem) {
MCONTACT hContact = dat->GetItemData(hItem).hContact;
if (IsHContactContact(hContact)) {
HMENU hMenu = Menu_BuildContactMenu(hContact);
if (hMenu) {
ClientToScreen(hWnd, &pt);
CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL), MPCF_CONTACTMENU), hContact);
DestroyMenu(hMenu);
return 0;
}
}
}
}
break;
case WM_DESTROY:
if (dat->ExtraImageList)
ImageList_Destroy(dat->ExtraImageList);
dat->SelectedItems.RemoveAll();
dat->Items.RemoveAll();
break;
}
return CallWindowProc(dat->OrigTreeViewProc, hWnd, Msg, wParam, lParam);
}
示例10: DlgProcAdded
INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
MEVENT hDbEvent = (MEVENT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (msg) {
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details"));
Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list"));
hDbEvent = lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
{
//blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ)
DBEVENTINFO dbei = { sizeof(dbei) };
dbei.cbBlob = db_event_getBlobSize(hDbEvent);
dbei.pBlob = (PBYTE)alloca(dbei.cbBlob);
db_event_get(hDbEvent, &dbei);
DWORD uin = *(PDWORD)dbei.pBlob;
MCONTACT hContact = DbGetAuthEventContact(&dbei);
char* nick = (char*)dbei.pBlob + sizeof(DWORD) * 2;
char* first = nick + mir_strlen(nick) + 1;
char* last = first + mir_strlen(first) + 1;
char* email = last + mir_strlen(last) + 1;
SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0));
SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0));
PROTOACCOUNT* acc = Proto_GetAccount(dbei.szModule);
TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last);
TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first);
TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick);
TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email);
TCHAR name[128] = _T("");
int off = 0;
if (firstT[0] && lastT[0])
off = mir_sntprintf(name, _T("%s %s"), firstT, lastT);
else if (firstT[0])
off = mir_sntprintf(name, _T("%s"), firstT);
else if (lastT[0])
off = mir_sntprintf(name, _T("%s"), lastT);
if (nickT[0]) {
if (off)
mir_sntprintf(name + off, _countof(name) - off, _T(" (%s)"), nickT);
else
_tcsncpy_s(name, nickT, _TRUNCATE);
}
if (!name[0])
_tcsncpy_s(name, TranslateT("<Unknown>"), _TRUNCATE);
TCHAR hdr[256];
if (uin && emailT[0])
mir_sntprintf(hdr, TranslateT("%s added you to the contact list\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName);
else if (uin)
mir_sntprintf(hdr, TranslateT("%s added you to the contact list\n%u on %s"), name, uin, acc->tszAccountName);
else
mir_sntprintf(hdr, TranslateT("%s added you to the contact list\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName);
SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr);
mir_free(lastT);
mir_free(firstT);
mir_free(nickT);
mir_free(emailT);
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact);
if (hContact == INVALID_CONTACT_ID || !db_get_b(hContact, "CList", "NotOnList", 0))
ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_ADD:
{
ADDCONTACTSTRUCT acs = { 0 };
acs.hDbEvent = hDbEvent;
acs.handleType = HANDLE_EVENT;
acs.szProto = "";
CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs);
MCONTACT hContact = (MCONTACT)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA);
if ((hContact == INVALID_CONTACT_ID) || !db_get_b(hContact, "CList", "NotOnList", 0))
ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
}
break;
case IDC_DETAILS:
{
MCONTACT hContact = (MCONTACT)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA);
CallService(MS_USERINFO_SHOWDIALOG, hContact, 0);
}
break;
case IDOK:
{
//.........这里部分代码省略.........
示例11: DlgProcAuthReq
INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
MEVENT hDbEvent = (MEVENT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (msg) {
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details"));
Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list"));
{
hDbEvent = lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
//blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ), reason(ASCIIZ)
DBEVENTINFO dbei = { sizeof(dbei) };
dbei.cbBlob = db_event_getBlobSize(hDbEvent);
dbei.pBlob = (PBYTE)alloca(dbei.cbBlob);
db_event_get(hDbEvent, &dbei);
DWORD uin = *(PDWORD)dbei.pBlob;
MCONTACT hContact = DbGetAuthEventContact(&dbei);
char *nick = (char*)dbei.pBlob + sizeof(DWORD) * 2;
char *first = nick + mir_strlen(nick) + 1;
char *last = first + mir_strlen(first) + 1;
char *email = last + mir_strlen(last) + 1;
char *reason = email + mir_strlen(email) + 1;
SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0));
SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0));
PROTOACCOUNT* acc = Proto_GetAccount(dbei.szModule);
ptrT lastT(dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last));
ptrT firstT(dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first));
ptrT nickT(dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick));
ptrT emailT(dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email));
ptrT reasonT(dbei.flags & DBEF_UTF ? Utf8DecodeT(reason) : mir_a2t(reason));
TCHAR name[128] = _T("");
int off = 0;
if (firstT[0] && lastT[0])
off = mir_sntprintf(name, _T("%s %s"), (TCHAR*)firstT, (TCHAR*)lastT);
else if (firstT[0])
off = mir_sntprintf(name, _T("%s"), (TCHAR*)firstT);
else if (lastT[0])
off = mir_sntprintf(name, _T("%s"), (TCHAR*)lastT);
if (mir_tstrlen(nickT)) {
if (off)
mir_sntprintf(name + off, _countof(name) - off, _T(" (%s)"), (TCHAR*)nickT);
else
_tcsncpy_s(name, nickT, _TRUNCATE);
}
if (!name[0])
_tcsncpy_s(name, TranslateT("<Unknown>"), _TRUNCATE);
TCHAR hdr[256];
if (uin && emailT[0])
mir_sntprintf(hdr, TranslateT("%s requested authorization\n%u (%s) on %s"), name, uin, (TCHAR*)emailT, acc->tszAccountName);
else if (uin)
mir_sntprintf(hdr, TranslateT("%s requested authorization\n%u on %s"), name, uin, acc->tszAccountName);
else
mir_sntprintf(hdr, TranslateT("%s requested authorization\n%s on %s"), name, emailT[0] ? (TCHAR*)emailT : TranslateT("(Unknown)"), acc->tszAccountName);
SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr);
SetDlgItemText(hwndDlg, IDC_REASON, reasonT);
if (hContact == INVALID_CONTACT_ID || !db_get_b(hContact, "CList", "NotOnList", 0))
ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
SendDlgItemMessage(hwndDlg, IDC_DENYREASON, EM_LIMITTEXT, 255, 0);
if (CallProtoService(dbei.szModule, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_NOAUTHDENYREASON) {
EnableWindow(GetDlgItem(hwndDlg, IDC_DENYREASON), FALSE);
SetDlgItemText(hwndDlg, IDC_DENYREASON, TranslateT("Feature is not supported by protocol"));
}
if (!db_get_b(hContact, "CList", "NotOnList", 0)) {
EnableWindow(GetDlgItem(hwndDlg, IDC_ADDCHECK), FALSE);
CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_UNCHECKED);
}
else CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_CHECKED);
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact);
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_DETAILS:
CallService(MS_USERINFO_SHOWDIALOG, GetWindowLongPtr((HWND)lParam, GWLP_USERDATA), 0);
break;
case IDC_DECIDELATER:
DestroyWindow(hwndDlg);
break;
case IDOK:
{
DBEVENTINFO dbei = { sizeof(dbei) };
db_event_get(hDbEvent, &dbei);
CallProtoService(dbei.szModule, PS_AUTHALLOW, (WPARAM)hDbEvent, 0);
//.........这里部分代码省略.........
示例12: getContactXStatus
//.........这里部分代码省略.........
wAdditionalData += 16;
if (m_bXStatusEnabled && bXStatus != 0)
wAdditionalData += 16;
#ifdef DBG_CAPHTML
wAdditionalData += 16;
#endif
#ifdef DBG_AIMCONTACTSEND
wAdditionalData += 16;
#endif
wAdditionalData += CustomCapList.getCount() * 16;
//MIM/PackName
bool bHasPackName = false;
DBVARIANT dbv;
if (!db_get_s(NULL, "ICQCaps", "PackName", &dbv)) {
//MIM/PackName
bHasPackName = true;
wAdditionalData += 16;
}
serverPacketInit(&packet, 62 + wAdditionalData);
packFNACHeader(&packet, ICQ_LOCATION_FAMILY, ICQ_LOCATION_SET_USER_INFO);
/* TLV(5): capability data */
packWord(&packet, 0x0005);
packWord(&packet, WORD(48 + wAdditionalData));
#ifdef DBG_CAPMTN
packDWord(&packet, 0x563FC809); // CAP_TYPING
packDWord(&packet, 0x0B6F41BD);
packDWord(&packet, 0x9F794226);
packDWord(&packet, 0x09DFA2F3);
#endif
packShortCapability(&packet, 0x1349); // AIM_CAPS_ICQSERVERRELAY
// Broadcasts the capability to receive UTF8 encoded messages
if (m_bUtfEnabled)
packShortCapability(&packet, 0x134E); // CAP_UTF8MSGS
#ifdef DBG_NEWCAPS
// Tells server we understand to new format of caps
packShortCapability(&packet, 0x0000); // CAP_SHORTCAPS
#endif
#ifdef DBG_CAPXTRAZ
packDWord(&packet, 0x1a093c6c); // CAP_XTRAZ
packDWord(&packet, 0xd7fd4ec5); // Broadcasts the capability to handle
packDWord(&packet, 0x9d51a647); // Xtraz
packDWord(&packet, 0x4e34f5a0);
#endif
if (m_bAvatarsEnabled)
packShortCapability(&packet, 0x134C); // CAP_DEVILS
#ifdef DBG_OSCARFT
// Broadcasts the capability to receive Oscar File Transfers
packShortCapability(&packet, 0x1343); // CAP_AIM_FILE
#endif
// Tells the server we can speak to AIM
if (m_bAimEnabled)
packShortCapability(&packet, 0x134D); // CAP_AIM_COMPATIBLE
#ifdef DBG_AIMCONTACTSEND
packShortCapability(&packet, 0x134B); // CAP_SENDBUDDYLIST
#endif
if (m_bXStatusEnabled && bXStatus != 0)
packBuffer(&packet, capXStatus[bXStatus - 1], BINARY_CAP_SIZE);
packShortCapability(&packet, 0x1344); // CAP_ICQDIRECT
#ifdef DBG_CAPHTML
packShortCapability(&packet, 0x0002); // CAP_HTMLMSGS
#endif
packDWord(&packet, 0x4D697261); // Miranda Signature
packDWord(&packet, 0x6E64614E);
WORD v[4];
CallService(MS_SYSTEM_GETFILEVERSION, 0, (LPARAM)v);
packWord(&packet, v[0]);
packWord(&packet, v[1]);
packWord(&packet, v[2]);
packWord(&packet, v[3]);
//MIM/PackName
if (bHasPackName) {
packBuffer(&packet, (BYTE*)dbv.pszVal, 0x10);
db_free(&dbv);
}
if (CustomCapList.getCount())
for (int i = 0; i < CustomCapList.getCount(); i++)
packBuffer(&packet, (PBYTE)CustomCapList[i].caps, 0x10);
sendServPacket(&packet);
}
示例13: lstrcmpiA
int GGPROTO::gc_event(WPARAM wParam, LPARAM lParam)
{
GCHOOK *gch = (GCHOOK *)lParam;
GGGC *chat = NULL;
uin_t uin;
// Check if we got our protocol, and fields are set
if (!gch
|| !gch->pDest
|| !gch->pDest->ptszID
|| !gch->pDest->pszModule
|| lstrcmpiA(gch->pDest->pszModule, m_szModuleName)
|| !(uin = getDword(GG_KEY_UIN, 0))
|| !(chat = gc_lookup(gch->pDest->ptszID)))
return 0;
// Window terminated (Miranda exit)
if (gch->pDest->iType == SESSION_TERMINATE)
{
debugLog(_T("gc_event(): Terminating chat %x, id %s from chat window..."), chat, gch->pDest->ptszID);
// Destroy chat entry
free(chat->recipients);
list_remove(&chats, chat, 1);
// Remove contact from contact list (duh!) should be done by chat.dll !!
for (HANDLE hContact = db_find_first(); hContact; ) {
HANDLE hNext = db_find_next(hContact);
DBVARIANT dbv;
if (!getTString(hContact, "ChatRoomID", &dbv)) {
if (dbv.ptszVal && !_tcscmp(gch->pDest->ptszID, dbv.ptszVal))
CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0);
db_free(&dbv);
}
hContact = hNext;
}
return 1;
}
// Message typed / send only if online
if (isonline() && (gch->pDest->iType == GC_USER_MESSAGE) && gch->ptszText) {
TCHAR id[32];
UIN2IDT(uin, id);
DBVARIANT dbv;
GCDEST gcd = { m_szModuleName, gch->pDest->ptszID, GC_EVENT_MESSAGE };
GCEVENT gce = { sizeof(gce), &gcd };
gce.ptszUID = id;
gce.ptszText = gch->ptszText;
TCHAR* nickT;
if (!getTString(GG_KEY_NICK, &dbv)){
nickT = mir_tstrdup(dbv.ptszVal);
db_free(&dbv);
}
else nickT = mir_tstrdup(TranslateT("Me"));
gce.ptszNick = nickT;
// Get rid of CRLF at back
int lc = (int)_tcslen(gch->ptszText) - 1;
while(lc >= 0 && (gch->ptszText[lc] == '\n' || gch->ptszText[lc] == '\r'))
gch->ptszText[lc --] = 0;
gce.time = time(NULL);
gce.bIsMe = 1;
gce.dwFlags = GCEF_ADDTOLOG;
debugLog(_T("gc_event(): Sending conference message to room %s, \"%s\"."), gch->pDest->ptszID, gch->ptszText);
CallServiceSync(MS_GC_EVENT, 0, (LPARAM)&gce);
mir_free(nickT);
char* pszText_utf8 = mir_utf8encodeT(gch->ptszText);
gg_EnterCriticalSection(&sess_mutex, "gc_event", 57, "sess_mutex", 1);
gg_send_message_confer(sess, GG_CLASS_CHAT, chat->recipients_count, chat->recipients, (BYTE*)pszText_utf8);
gg_LeaveCriticalSection(&sess_mutex, "gc_event", 57, 1, "sess_mutex", 1);
mir_free(pszText_utf8);
return 1;
}
// Privmessage selected
if (gch->pDest->iType == GC_USER_PRIVMESS)
{
HANDLE hContact = NULL;
if ((uin = _ttoi(gch->ptszUID)) && (hContact = getcontact(uin, 1, 0, NULL)))
CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0);
}
debugLog(_T("gc_event(): Unhandled event %d, chat %x, uin %d, text \"%s\"."), gch->pDest->iType, chat, uin, gch->ptszText);
return 0;
}
示例14: GetSubMenu
// IDocHostUIHandler
STDMETHODIMP IEView::ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdTarget, IDispatch *pdispReserved) {
IOleCommandTarget * pOleCommandTarget;
IOleWindow * pOleWindow;
HWND hSPWnd;
if (builder == NULL) {
// return S_OK;
}
#ifdef GECKO
{
return E_NOTIMPL;
/*
HMENU hMenu;
hMenu = GetSubMenu(LoadMenu(hInstance, MAKEINTRESOURCE(IDR_CONTEXTMENU)),0);
CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)hMenu,0);
if (dwID == 6) { // anchor
EnableMenuItem(hMenu, ID_MENU_COPYLINK, MF_BYCOMMAND | MF_ENABLED);
} else if (dwID == 5) { // text select
EnableMenuItem(hMenu, ID_MENU_COPY, MF_BYCOMMAND | MF_ENABLED);
} else if (dwID == 1) { // control (image)
EnableMenuItem(hMenu, ID_MENU_SAVEIMAGE, MF_BYCOMMAND | MF_ENABLED);
}
if (builder!=NULL) {
}
int iSelection = TrackPopupMenu(hMenu,
TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
ppt->x,
ppt->y,
0,
hwnd,
(RECT*)NULL);
DestroyMenu(hMenu);
if (iSelection == ID_MENU_CLEARLOG) {
clear(NULL);
} else {
SendMessage(hSPWnd, WM_COMMAND, iSelection, (LPARAM) NULL);
}
*/
}
#else
if (SUCCEEDED(pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&pOleCommandTarget))) {
if (SUCCEEDED(pOleCommandTarget->QueryInterface(IID_IOleWindow, (void**)&pOleWindow))) {
pOleWindow->GetWindow(&hSPWnd);
HMENU hMenu;
hMenu = GetSubMenu(LoadMenu(hInstance, MAKEINTRESOURCE(IDR_CONTEXTMENU)),0);
CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)hMenu,0);
if (dwID == 5) { // anchor
EnableMenuItem(hMenu, ID_MENU_COPYLINK, MF_BYCOMMAND | MF_ENABLED);
} else if (dwID == 4) { // text select
EnableMenuItem(hMenu, ID_MENU_COPY, MF_BYCOMMAND | MF_ENABLED);
} else if (dwID == 1) { // control (image)
EnableMenuItem(hMenu, ID_MENU_SAVEIMAGE, MF_BYCOMMAND | MF_ENABLED);
}
if (builder!=NULL) {
}
int iSelection = TrackPopupMenu(hMenu,
TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
ppt->x,
ppt->y,
0,
hwnd,
(RECT*)NULL);
DestroyMenu(hMenu);
if (iSelection == ID_MENU_CLEARLOG) {
clear(NULL);
} else {
SendMessage(hSPWnd, WM_COMMAND, iSelection, (LPARAM) NULL);
}
pOleWindow->Release();
}
pOleCommandTarget->Release();
}
#endif
return S_OK;
}
示例15: mir_strncpy
int FacebookProto::OnBuildStatusMenu(WPARAM, LPARAM)
{
char text[200];
mir_strncpy(text, m_szModuleName, 100);
char *tDest = text + strlen(text);
CLISTMENUITEM mi = { sizeof(mi) };
mi.pszService = text;
HGENMENU hRoot = MO_GetProtoRootMenu(m_szModuleName);
if (hRoot == NULL) {
CLISTMENUITEM miRoot = { sizeof(miRoot) };
miRoot.popupPosition = 500085000;
miRoot.hParentMenu = HGENMENU_ROOT;
miRoot.flags = CMIF_ROOTPOPUP | CMIF_TCHAR | CMIF_KEEPUNTRANSLATED | (this->isOnline() ? 0 : CMIF_GRAYED);
miRoot.icolibItem = GetIconHandle("facebook");
miRoot.ptszName = m_tszUserName;
hRoot = m_hMenuRoot = Menu_AddProtoMenuItem(&miRoot);
}
else {
if (m_hMenuRoot)
CallService(MO_REMOVEMENUITEM, (WPARAM)m_hMenuRoot, 0);
m_hMenuRoot = NULL;
}
mi.flags = CMIF_CHILDPOPUP | (this->isOnline() ? 0 : CMIF_GRAYED);
mi.position = 201001;
mi.hParentMenu = hRoot;
//CreateProtoService(m_szModuleName,"/Mind",&FacebookProto::OnMind,this);
strcpy(tDest, "/Mind");
mi.pszName = LPGEN("Share status...");
mi.icolibItem = GetIconHandle("mind");
m_hStatusMind = Menu_AddProtoMenuItem(&mi);
//CreateProtoService("/VisitProfile",&FacebookProto::VisitProfile);
strcpy(tDest, "/VisitProfile");
mi.flags = CMIF_CHILDPOPUP;
mi.pszName = LPGEN("Visit profile");
mi.icolibItem = LoadSkinnedIconHandle(SKINICON_EVENT_URL);
// TODO RM: remember and properly free in destructor?
/*m_hStatusMind = */Menu_AddProtoMenuItem(&mi);
//CreateProtoService("/VisitNotifications", &FacebookProto::VisitNotifications);
strcpy(tDest, "/VisitNotifications");
mi.pszName = LPGEN("Visit notifications");
mi.icolibItem = LoadSkinnedIconHandle(SKINICON_EVENT_URL);
Menu_AddProtoMenuItem(&mi);
// Services...
mi.pszName = LPGEN("Services...");
strcpy(tDest, "/Services");
mi.flags = CMIF_CHILDPOPUP | (this->isOnline() ? 0 : CMIF_GRAYED);
mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_HELP);
m_hMenuServicesRoot = Menu_AddProtoMenuItem(&mi);
CreateProtoService("/RefreshBuddyList", &FacebookProto::RefreshBuddyList);
strcpy(tDest, "/RefreshBuddyList");
mi.flags = CMIF_ROOTHANDLE;
mi.pszName = LPGEN("Refresh Buddy List");
mi.pszPopupName = LPGEN("Services");
mi.icolibItem = GetIconHandle("friendship");
mi.hParentMenu = m_hMenuServicesRoot;
Menu_AddProtoMenuItem(&mi);
CreateProtoService("/CheckFriendRequests", &FacebookProto::CheckFriendRequests);
strcpy(tDest, "/CheckFriendRequests");
mi.flags = CMIF_ROOTHANDLE;
mi.pszName = LPGEN("Check Friends Requests");
mi.icolibItem = LoadSkinnedIconHandle(SKINICON_AUTH_REQUEST);
mi.hParentMenu = m_hMenuServicesRoot;
Menu_AddProtoMenuItem(&mi);
CreateProtoService("/CheckNewsfeeds", &FacebookProto::CheckNewsfeeds);
strcpy(tDest, "/CheckNewsfeeds");
mi.flags = CMIF_ROOTHANDLE;
mi.pszName = LPGEN("Check Newsfeeds");
mi.pszPopupName = LPGEN("Services");
mi.icolibItem = GetIconHandle("newsfeed");
mi.hParentMenu = m_hMenuServicesRoot;
Menu_AddProtoMenuItem(&mi);
return 0;
}