Kaydet (Commit) 466edaa9 authored tarafından Matúš Kukan's avatar Matúš Kukan

tubes: move getContacts() to TeleManager where it belongs, I believe

Change-Id: I69ca3bde24890d809d8fad60398687c54aa1ca54
üst f72ff01d
......@@ -30,11 +30,6 @@ $(eval $(call gb_CppunitTest_add_exception_objects,tubes_test, \
tubes/qa/test_manager \
))
$(eval $(call gb_CppunitTest_set_include,tubes_test, \
-I$(SRCDIR)/tubes/inc \
$$(INCLUDE) \
))
$(eval $(call gb_CppunitTest_use_libraries,tubes_test, \
sal \
tubes \
......
......@@ -60,7 +60,6 @@ $(eval $(call gb_Library_use_externals,tubes,\
$(eval $(call gb_Library_add_exception_objects,tubes,\
tubes/source/collaboration \
tubes/source/conference \
tubes/source/contact-list \
tubes/source/contacts \
tubes/source/manager \
))
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Version: MPL 1.1 / GPLv3+ / LGPLv3+
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License or as specified alternatively below. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* Major Contributor(s):
* Copyright (C) 2012 Collabora Ltd.
*
* All Rights Reserved.
*
* For minor contributions see the git repository.
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 3 or later (the "GPLv3+"), or
* the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
* in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
* instead of those above.
*/
#ifndef INCLUDED_TUBES_CONTACT_LIST_HXX
#define INCLUDED_TUBES_CONTACT_LIST_HXX
#include <tubes/tubesdllapi.h>
#include <set>
#include <utility>
#include <vector>
typedef struct _TpAccount TpAccount;
typedef struct _TpContact TpContact;
typedef struct _TpAccountManager TpAccountManager;
typedef ::std::pair< TpAccount *, TpContact * > AccountContactPair;
typedef ::std::vector< AccountContactPair > AccountContactPairV;
class ContactList
{
public:
ContactList(TpAccountManager *pAccountManager);
~ContactList();
// exported for unit test
TUBES_DLLPUBLIC AccountContactPairV getContacts();
private:
TpAccountManager* mpAccountManager;
std::set< TpContact* > maRegistered;
};
#endif // INCLUDED_TUBES_CONTACT_LIST_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -33,6 +33,9 @@
#include <tubes/tubesdllapi.h>
#include <rtl/ustring.hxx>
#include <utility>
#include <vector>
// For testing purposes, we might need more in future.
#define LIBO_TUBES_DBUS_INTERFACE "org.libreoffice.calc"
#define LIBO_TUBES_DBUS_MSG_METHOD "LibOMsg"
......@@ -40,12 +43,15 @@
namespace osl { class Mutex; }
class Collaboration;
class ContactList;
class TeleConference;
class TeleManagerImpl;
typedef struct _TpAccount TpAccount;
typedef struct _TpContact TpContact;
typedef ::std::pair< TpAccount *, TpContact * > AccountContactPair;
typedef ::std::vector< AccountContactPair > AccountContactPairV;
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/** Interface to Telepathy DBus Tubes.
Fragile, not working yet.
......@@ -78,11 +84,11 @@ public:
/** Setup client handlers. */
static bool registerClients();
/** Fetches the contact list. Returns 0 before connect() is called successfully.
Is non-functional until prepareAccountManager().
/** Fetches the contact list.
Is non-functional until createAccountManager().
*/
// exported for unit test
TUBES_DLLPUBLIC static ContactList* getContactList();
TUBES_DLLPUBLIC static AccountContactPairV getContacts();
/** Start a demo session where all local documents are shared to each other */
static TeleConference* startDemoSession();
......
......@@ -36,7 +36,6 @@
#include <rtl/string.hxx>
#include <rtl/ustring.hxx>
#include <tubes/collaboration.hxx>
#include <tubes/contact-list.hxx>
#include <tubes/manager.hxx>
#include <unotools/localfilehelper.hxx>
......@@ -137,7 +136,7 @@ void TestTeleTubes::testInitTeleManager()
void TestTeleTubes::testContactList()
{
AccountContactPairV pairs = TeleManager::getContactList()->getContacts();
AccountContactPairV pairs = TeleManager::getContacts();
/* Both our accounts are meant to be signed in, and they both should be
* capable of LibreOffice tubes because this test runs after we register
* our handler. */
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Version: MPL 1.1 / GPLv3+ / LGPLv3+
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License or as specified alternatively below. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* Major Contributor(s):
* Copyright (C) 2012 Collabora Ltd.
*
* All Rights Reserved.
*
* For minor contributions see the git repository.
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 3 or later (the "GPLv3+"), or
* the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
* in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
* instead of those above.
*/
#include <utility>
#include <vector>
#include <telepathy-glib/telepathy-glib.h>
#include <tubes/constants.h>
#include <tubes/contact-list.hxx>
#include <tubes/manager.hxx>
ContactList::ContactList(TpAccountManager *pAccountManager)
: mpAccountManager(pAccountManager)
{
SAL_WARN_IF( !mpAccountManager, "tubes",
"ContactList::ContactList: passed a null account manager");
g_object_ref( mpAccountManager);
}
ContactList::~ContactList()
{
g_object_unref(mpAccountManager);
mpAccountManager = NULL;
}
static bool tb_presence_is_online( const TpConnectionPresenceType& presence )
{
switch (presence)
{
case TP_CONNECTION_PRESENCE_TYPE_UNSET:
case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
return false;
case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
case TP_CONNECTION_PRESENCE_TYPE_AWAY:
case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
case TP_CONNECTION_PRESENCE_TYPE_BUSY:
return true;
case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
case TP_CONNECTION_PRESENCE_TYPE_ERROR:
default:
return false;
}
}
static bool tb_contact_is_online( TpContact *contact )
{
return tb_presence_is_online (tp_contact_get_presence_type (contact));
}
static void presence_changed_cb( TpContact* /* contact */,
guint /* type */,
gchar* /* status */,
gchar* /* message */,
gpointer /* pContactList*/ )
{
TeleManager::displayAllContacts();
}
AccountContactPairV ContactList::getContacts()
{
GList *accounts;
AccountContactPairV pairs;
for (accounts = tp_account_manager_get_valid_accounts (mpAccountManager);
accounts != NULL;
accounts = g_list_delete_link (accounts, accounts))
{
TpAccount *account = reinterpret_cast<TpAccount *>(accounts->data);
TpConnection *connection = tp_account_get_connection (account);
TpContact *self;
GPtrArray *contacts;
guint i;
/* Verify account is online and received its contact list. If state is not
* SUCCESS this means we didn't received the roster from server yet and
* we would have to wait for the "notify:contact-list-state" signal. */
if (connection == NULL ||
tp_connection_get_contact_list_state (connection) !=
TP_CONTACT_LIST_STATE_SUCCESS)
continue;
self = tp_connection_get_self_contact (connection);
contacts = tp_connection_dup_contact_list (connection);
for (i = 0; i < contacts->len; i++)
{
TpContact *contact =
reinterpret_cast<TpContact *>(g_ptr_array_index (contacts, i));
if (maRegistered.find (contact) == maRegistered.end())
{
maRegistered.insert (contact);
g_signal_connect (contact, "presence-changed",
G_CALLBACK (presence_changed_cb), this );
}
if (contact != self &&
tb_contact_is_online (contact))
{
g_object_ref (account);
g_object_ref (contact);
AccountContactPair pair(account, contact);
pairs.push_back(pair);
}
}
g_ptr_array_unref (contacts);
}
return pairs;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -34,7 +34,6 @@
#include <tools/resid.hxx>
#include <tubes/conference.hxx>
#include <tubes/collaboration.hxx>
#include <tubes/contact-list.hxx>
#include <tubes/manager.hxx>
#include <unotools/confignode.hxx>
#include <vcl/fixed.hxx>
......@@ -196,44 +195,41 @@ public:
SAL_INFO( "tubes", "Populating contact list dialog" );
maList.Clear();
maACs.clear();
ContactList *pContacts = TeleManager::getContactList();
if ( pContacts )
AccountContactPairV aPairs = TeleManager::getContacts();
AccountContactPairV::iterator it;
// make sure we have enough memory to not need re-allocation
// which would invalidate pointers stored in maList entries
maACs.reserve( aPairs.size() );
for( it = aPairs.begin(); it != aPairs.end(); ++it )
{
AccountContactPairV aPairs = pContacts->getContacts();
AccountContactPairV::iterator it;
// make sure we have enough memory to not need re-allocation
// which would invalidate pointers stored in maList entries
maACs.reserve( aPairs.size() );
for( it = aPairs.begin(); it != aPairs.end(); ++it )
Image aImage;
GFile *pAvatarFile = tp_contact_get_avatar_file( it->second );
if( pAvatarFile )
{
Image aImage;
GFile *pAvatarFile = tp_contact_get_avatar_file( it->second );
if( pAvatarFile )
const rtl::OUString sAvatarFileUrl = fromUTF8( g_file_get_path ( pAvatarFile ) );
Graphic aGraphic;
if( GRFILTER_OK == GraphicFilter::LoadGraphic( sAvatarFileUrl, rtl::OUString(""), aGraphic ) )
{
const rtl::OUString sAvatarFileUrl = fromUTF8( g_file_get_path ( pAvatarFile ) );
Graphic aGraphic;
if( GRFILTER_OK == GraphicFilter::LoadGraphic( sAvatarFileUrl, rtl::OUString(""), aGraphic ) )
{
BitmapEx aBitmap = aGraphic.GetBitmapEx();
double fScale = 30.0 / aBitmap.GetSizePixel().Height();
aBitmap.Scale( fScale, fScale );
aImage = Image( aBitmap );
}
BitmapEx aBitmap = aGraphic.GetBitmapEx();
double fScale = 30.0 / aBitmap.GetSizePixel().Height();
aBitmap.Scale( fScale, fScale );
aImage = Image( aBitmap );
}
rtl::OUStringBuffer aEntry( 128 );
aEntry.append( sal_Unicode( '\t' ) );
aEntry.append( fromUTF8 ( tp_contact_get_alias( it->second ) ) );
aEntry.append( sal_Unicode( '\t' ) );
aEntry.append( fromUTF8 ( tp_contact_get_identifier( it->second ) ) );
aEntry.append( sal_Unicode( '\t' ) );
SvLBoxEntry* pEntry = maList.InsertEntry( aEntry.makeStringAndClear(), aImage, aImage );
// FIXME: ref the TpAccount, TpContact ...
maACs.push_back( AccountContactPair( it->first, it->second ) );
pEntry->SetUserData( &maACs.back() );
g_object_unref (it->first);
g_object_unref (it->second);
}
rtl::OUStringBuffer aEntry( 128 );
aEntry.append( sal_Unicode( '\t' ) );
aEntry.append( fromUTF8 ( tp_contact_get_alias( it->second ) ) );
aEntry.append( sal_Unicode( '\t' ) );
aEntry.append( fromUTF8 ( tp_contact_get_identifier( it->second ) ) );
aEntry.append( sal_Unicode( '\t' ) );
SvLBoxEntry* pEntry = maList.InsertEntry( aEntry.makeStringAndClear(), aImage, aImage );
// FIXME: ref the TpAccount, TpContact ...
maACs.push_back( AccountContactPair( it->first, it->second ) );
pEntry->SetUserData( &maACs.back() );
g_object_unref (it->first);
g_object_unref (it->second);
}
Show();
}
......
......@@ -31,7 +31,6 @@
#include <tubes/collaboration.hxx>
#include <tubes/conference.hxx>
#include <tubes/constants.h>
#include <tubes/contact-list.hxx>
#include <tubes/file-transfer-helper.h>
#include <com/sun/star/uno/Sequence.hxx>
......@@ -91,7 +90,6 @@ public:
static bool mbAccountManagerReady;
static bool mbAccountManagerReadyHandlerInvoked;
static bool mbChannelReadyHandlerInvoked;
ContactList* mpContactList;
OString msCurrentUUID;
OString msNameSuffix;
typedef std::map< OString, TeleConference* > MapStringConference;
......@@ -100,6 +98,8 @@ public:
DemoConferences maDemoConferences;
typedef std::set< Collaboration* > Collaborations;
Collaborations maCollaborations;
typedef std::set< TpContact* > RegisteredContacts;
RegisteredContacts maRegisteredContacts;
TeleManagerImpl();
~TeleManagerImpl();
......@@ -756,12 +756,90 @@ TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact *
return pConference;
}
ContactList* TeleManager::getContactList()
static bool tb_presence_is_online( const TpConnectionPresenceType& presence )
{
if (!pImpl->mpContactList)
pImpl->mpContactList = new ContactList (pImpl->mpAccountManager);
switch (presence)
{
case TP_CONNECTION_PRESENCE_TYPE_UNSET:
case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
return false;
case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
case TP_CONNECTION_PRESENCE_TYPE_AWAY:
case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
case TP_CONNECTION_PRESENCE_TYPE_BUSY:
return true;
case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
case TP_CONNECTION_PRESENCE_TYPE_ERROR:
default:
return false;
}
}
static bool tb_contact_is_online( TpContact *contact )
{
return tb_presence_is_online (tp_contact_get_presence_type (contact));
}
static void presence_changed_cb( TpContact* /* contact */,
guint /* type */,
gchar* /* status */,
gchar* /* message */,
gpointer /* pContactList*/ )
{
TeleManager::displayAllContacts();
}
AccountContactPairV TeleManager::getContacts()
{
GList *accounts;
AccountContactPairV pairs;
for (accounts = tp_account_manager_get_valid_accounts (pImpl->mpAccountManager);
accounts != NULL;
accounts = g_list_delete_link (accounts, accounts))
{
TpAccount *account = reinterpret_cast<TpAccount *>(accounts->data);
TpConnection *connection = tp_account_get_connection (account);
TpContact *self;
GPtrArray *contacts;
guint i;
/* Verify account is online and received its contact list. If state is not
* SUCCESS this means we didn't received the roster from server yet and
* we would have to wait for the "notify:contact-list-state" signal. */
if (connection == NULL ||
tp_connection_get_contact_list_state (connection) !=
TP_CONTACT_LIST_STATE_SUCCESS)
continue;
self = tp_connection_get_self_contact (connection);
contacts = tp_connection_dup_contact_list (connection);
for (i = 0; i < contacts->len; i++)
{
TpContact *contact =
reinterpret_cast<TpContact *>(g_ptr_array_index (contacts, i));
if (pImpl->maRegisteredContacts.find (contact) == pImpl->maRegisteredContacts.end())
{
pImpl->maRegisteredContacts.insert (contact);
g_signal_connect (contact, "presence-changed",
G_CALLBACK (presence_changed_cb), NULL );
}
if (contact != self &&
tb_contact_is_online (contact))
{
g_object_ref (account);
g_object_ref (contact);
AccountContactPair pair(account, contact);
pairs.push_back(pair);
}
}
g_ptr_array_unref (contacts);
}
return pImpl->mpContactList;
return pairs;
}
rtl::OString TeleManager::getFullClientName()
......@@ -823,8 +901,7 @@ TeleManagerImpl::TeleManagerImpl()
mpFactory( NULL),
mpClient( NULL),
mpFileTransferClient( NULL),
mpAccountManager( NULL),
mpContactList( NULL)
mpAccountManager( NULL)
{
g_type_init();
}
......@@ -850,8 +927,6 @@ TeleManagerImpl::~TeleManagerImpl()
g_object_unref( mpFactory);
if (mpAccountManager)
g_object_unref( mpAccountManager);
if (mpContactList)
delete mpContactList;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment