Exemple #1
0
void CJabberProto::ListRemoveResource(JABBER_LIST list, const TCHAR *jid)
{
	mir_cslockfull lck(m_csLists);
	JABBER_LIST_ITEM *LI = ListGetItemPtr(list, jid);
	if (LI == NULL)
		return;

	const TCHAR *p = _tcschr(jid, '@');
	const TCHAR *q = _tcschr((p == NULL) ? jid : p, '/');
	if (q == NULL)
		return;

	pResourceStatus r( LI->findResource(q+1));
	if (r == NULL)
		return;

	// Found last seen resource ID to be removed
	if (LI->m_pLastSeenResource == r)
		LI->m_pLastSeenResource = NULL;

	// update manually selected resource ID
	if (LI->resourceMode == RSMODE_MANUAL && LI->m_pManualResource == r) {
		LI->resourceMode = RSMODE_LASTSEEN;
		LI->m_pManualResource = NULL;
	}

	// Update MirVer due to possible resource changes
	UpdateMirVer(LI);

	LI->arResources.remove(r);
	r->Release();
	lck.unlock();

	MenuUpdateSrmmIcon(LI);
}
Exemple #2
0
INT_PTR __cdecl CJabberProto::OnMenuHandleResource(WPARAM hContact, LPARAM, LPARAM res)
{
    if (!m_bJabberOnline || !hContact)
        return 0;

    ptrT tszJid(getTStringA(hContact, "jid"));
    if (tszJid == NULL)
        return 0;

    JABBER_LIST_ITEM *LI = ListGetItemPtr(LIST_ROSTER, tszJid);
    if (LI == NULL)
        return 0;

    if (res == MENUITEM_LASTSEEN) {
        LI->m_pManualResource = NULL;
        LI->resourceMode = RSMODE_LASTSEEN;
    }
    else if (res == MENUITEM_SERVER) {
        LI->m_pManualResource = NULL;
        LI->resourceMode = RSMODE_SERVER;
    }
    else if (res >= MENUITEM_RESOURCES) {
        LI->m_pManualResource = LI->arResources[res - MENUITEM_RESOURCES];
        LI->resourceMode = RSMODE_MANUAL;
    }

    UpdateMirVer(LI);
    MenuUpdateSrmmIcon(LI);
    return 0;
}
Exemple #3
0
void CJabberProto::ListRemoveResource( JABBER_LIST list, const TCHAR* jid )
{
	EnterCriticalSection( &m_csLists );
	int i = ListExist( list, jid );
	JABBER_LIST_ITEM* LI = m_lstRoster[i-1];
	if ( !i || LI == NULL ) {
		LeaveCriticalSection( &m_csLists );
		return;
	}

	const TCHAR* p = _tcschr( jid, '@' );
	const TCHAR* q = _tcschr(( p == NULL ) ? jid : p, '/' );
	if ( q ) {
		const TCHAR* resource = q+1;
		if ( resource[0] ) {
			JABBER_RESOURCE_STATUS* r = LI->resource;
			int j;
			for ( j=0; j < LI->resourceCount; j++, r++ ) {
				if ( !_tcsicmp( r->resourceName, resource ))
					break;
			}
			if ( j < LI->resourceCount ) {
				// Found last seen resource ID to be removed
				if ( LI->lastSeenResource == j )
					LI->lastSeenResource = -1;
				else if ( LI->lastSeenResource > j )
					LI->lastSeenResource--;
				// update manually selected resource ID
				if (LI->resourceMode == RSMODE_MANUAL)
				{
					if ( LI->manualResource == j )
					{
						LI->resourceMode = RSMODE_LASTSEEN;
						LI->manualResource = -1;
					} else if ( LI->manualResource > j )
						LI->manualResource--;
				}

				// Update MirVer due to possible resource changes
				UpdateMirVer(LI);

				JabberListFreeResourceInternal( r );

				if ( LI->resourceCount-- == 1 ) {
					mir_free( r );
					LI->resource = NULL;
				}
				else {
					memmove( r, r+1, ( LI->resourceCount-j )*sizeof( JABBER_RESOURCE_STATUS ));
					LI->resource = ( JABBER_RESOURCE_STATUS* )mir_realloc( LI->resource, LI->resourceCount*sizeof( JABBER_RESOURCE_STATUS ));
	}	}	}	}

	LeaveCriticalSection( &m_csLists );

	MenuUpdateSrmmIcon(LI);
}
Exemple #4
0
int CJabberProto::OnProcessSrmmIconClick(WPARAM hContact, LPARAM lParam)
{
    StatusIconClickData *sicd = (StatusIconClickData *)lParam;
    if (mir_strcmp(sicd->szModule, m_szModuleName))
        return 0;

    if (!hContact)
        return 0;

    JABBER_LIST_ITEM *LI = ListGetItemPtr(LIST_ROSTER, ptrT(getTStringA(hContact, "jid")));
    if (LI == NULL)
        return 0;

    HMENU hMenu = CreatePopupMenu();
    TCHAR buf[256];

    mir_sntprintf(buf, TranslateT("Last active (%s)"),
                  LI->m_pLastSeenResource ? LI->m_pLastSeenResource->m_tszResourceName : TranslateT("No activity yet, use server's choice"));
    AppendMenu(hMenu, MF_STRING, MENUITEM_LASTSEEN, buf);

    AppendMenu(hMenu, MF_STRING, MENUITEM_SERVER, TranslateT("Highest priority (server's choice)"));

    AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
    for (int i = 0; i < LI->arResources.getCount(); i++)
        AppendMenu(hMenu, MF_STRING, MENUITEM_RESOURCES + i, LI->arResources[i]->m_tszResourceName);

    if (LI->resourceMode == RSMODE_LASTSEEN)
        CheckMenuItem(hMenu, MENUITEM_LASTSEEN, MF_BYCOMMAND | MF_CHECKED);
    else if (LI->resourceMode == RSMODE_SERVER)
        CheckMenuItem(hMenu, MENUITEM_SERVER, MF_BYCOMMAND | MF_CHECKED);
    else if (LI->m_pManualResource)
        CheckMenuItem(hMenu, MENUITEM_RESOURCES + LI->arResources.indexOf(LI->m_pManualResource), MF_BYCOMMAND | MF_CHECKED);

    int res = TrackPopupMenu(hMenu, TPM_RETURNCMD, sicd->clickLocation.x, sicd->clickLocation.y, 0, WindowList_Find(hDialogsList, hContact), NULL);

    if (res == MENUITEM_LASTSEEN) {
        LI->m_pManualResource = NULL;
        LI->resourceMode = RSMODE_LASTSEEN;
    }
    else if (res == MENUITEM_SERVER) {
        LI->m_pManualResource = NULL;
        LI->resourceMode = RSMODE_SERVER;
    }
    else if (res >= MENUITEM_RESOURCES) {
        LI->m_pManualResource = LI->arResources[res - MENUITEM_RESOURCES];
        LI->resourceMode = RSMODE_MANUAL;
    }

    UpdateMirVer(LI);
    MenuUpdateSrmmIcon(LI);

    return 0;
}
Exemple #5
0
void CJabberProto::UpdateMirVer(JABBER_LIST_ITEM *item)
{
	MCONTACT hContact = HContactFromJID(item->jid);
	if (!hContact)
		return;

	debugLog(_T("JabberUpdateMirVer: for jid %s"), item->jid);

	pResourceStatus p(NULL);
	if (item->resourceMode == RSMODE_LASTSEEN)
		p = item->m_pLastSeenResource;
	else if (item->resourceMode == RSMODE_MANUAL)
		p = item->m_pManualResource;

	if (p)
		UpdateMirVer(hContact, p);
}