Kaydet (Commit) 766a0247 authored tarafından Matúš Kukan's avatar Matúš Kukan

tubes: also prepare the Account Manager when creating; and simplify

Change-Id: I7705d627d17f20c3c81de7aa4debbefc127354b0
üst bd465b57
...@@ -57,16 +57,8 @@ class TeleManager ...@@ -57,16 +57,8 @@ class TeleManager
{ {
TeleManager(); TeleManager();
~TeleManager(); ~TeleManager();
public:
enum AccountManagerStatus
{
AMS_UNINITIALIZED = 0,
AMS_INPREPARATION,
AMS_UNPREPARABLE,
AMS_PREPARED
};
public:
/** Prepare tube manager with account and service to be offered/listened /** Prepare tube manager with account and service to be offered/listened
to. to.
*/ */
...@@ -80,23 +72,12 @@ public: ...@@ -80,23 +72,12 @@ public:
/** Get a conference with current UUID to set a session. */ /** Get a conference with current UUID to set a session. */
TUBES_DLLPUBLIC static TeleConference* getConference(); TUBES_DLLPUBLIC static TeleConference* getConference();
/** Connect to DBus and create AccountManager. */ /** Connect to DBus, create and prepare the Telepathy Account Manager. */
static bool createAccountManager(); static bool createAccountManager();
/** Setup client handlers. */ /** Setup client handlers. */
static bool registerClients(); static bool registerClients();
/** Prepare the Telepathy Account Manager.
Requires createAccountManager() to have succeeded.
Invokes an async call that is not ready until meAccountManagerStatus is
set! Until that is AMS_PREPARED nothing else will work.
TODO: this needs some signalling mechanism
*/
static void prepareAccountManager();
static AccountManagerStatus getAccountManagerStatus();
/** Fetches the contact list. Returns 0 before connect() is called successfully. /** Fetches the contact list. Returns 0 before connect() is called successfully.
Is non-functional until prepareAccountManager(). Is non-functional until prepareAccountManager().
*/ */
...@@ -151,12 +132,10 @@ public: ...@@ -151,12 +132,10 @@ public:
static void addConference( TeleConference* pConference ); static void addConference( TeleConference* pConference );
static void setChannelReadyHandlerInvoked( bool b ); static void setChannelReadyHandlerInvoked( bool b );
static bool isChannelReadyHandlerInvoked(); static bool isChannelReadyHandlerInvoked();
static void setAccountManagerReady( bool bPrepared);
static void setAccountManagerReadyHandlerInvoked( bool b ); static void setAccountManagerReadyHandlerInvoked( bool b );
static bool isAccountManagerReadyHandlerInvoked(); static bool isAccountManagerReadyHandlerInvoked();
/** Only the callback of prepareAccountManager() is to set this. */
static void setAccountManagerReady( bool bPrepared);
/// "LibreOfficeWhatEver" /// "LibreOfficeWhatEver"
static rtl::OString getFullClientName(); static rtl::OString getFullClientName();
......
...@@ -55,7 +55,6 @@ public: ...@@ -55,7 +55,6 @@ public:
void testCreateAccountManager(); void testCreateAccountManager();
void testRegisterClients(); void testRegisterClients();
void testContactList(); void testContactList();
void testPrepareAccountManager();
void testStartBuddySession(); void testStartBuddySession();
void testSendPacket(); void testSendPacket();
void testReceivePacket(); void testReceivePacket();
...@@ -70,7 +69,6 @@ public: ...@@ -70,7 +69,6 @@ public:
CPPUNIT_TEST( testInitialize ); CPPUNIT_TEST( testInitialize );
CPPUNIT_TEST( testCreateAccountManager ); CPPUNIT_TEST( testCreateAccountManager );
CPPUNIT_TEST( testRegisterClients ); CPPUNIT_TEST( testRegisterClients );
CPPUNIT_TEST( testPrepareAccountManager );
CPPUNIT_TEST( testContactList ); CPPUNIT_TEST( testContactList );
CPPUNIT_TEST( testStartBuddySession ); CPPUNIT_TEST( testStartBuddySession );
CPPUNIT_TEST( testSendPacket ); CPPUNIT_TEST( testSendPacket );
...@@ -129,8 +127,6 @@ void TestTeleTubes::testInitialize() ...@@ -129,8 +127,6 @@ void TestTeleTubes::testInitialize()
void TestTeleTubes::testContactList() void TestTeleTubes::testContactList()
{ {
CPPUNIT_ASSERT( TeleManager::getAccountManagerStatus() == TeleManager::AMS_PREPARED);
ContactList *cl = TeleManager::getContactList(); ContactList *cl = TeleManager::getContactList();
AccountContactPairV pairs; AccountContactPairV pairs;
...@@ -172,13 +168,6 @@ void TestTeleTubes::testContactList() ...@@ -172,13 +168,6 @@ void TestTeleTubes::testContactList()
mpAccepterContact); mpAccepterContact);
} }
void TestTeleTubes::testPrepareAccountManager()
{
TeleManager::prepareAccountManager();
TeleManager::AccountManagerStatus eStatus = TeleManager::getAccountManagerStatus();
CPPUNIT_ASSERT( eStatus == TeleManager::AMS_PREPARED);
}
void TestTeleTubes::testStartBuddySession() void TestTeleTubes::testStartBuddySession()
{ {
TpAccount *pAcc1 = TeleManager::getAccount(maOffererIdentifier); TpAccount *pAcc1 = TeleManager::getAccount(maOffererIdentifier);
......
...@@ -40,29 +40,6 @@ ContactList::ContactList(TpAccountManager *pAccountManager) ...@@ -40,29 +40,6 @@ ContactList::ContactList(TpAccountManager *pAccountManager)
SAL_WARN_IF( !mpAccountManager, "tubes", SAL_WARN_IF( !mpAccountManager, "tubes",
"ContactList::ContactList: passed a null account manager"); "ContactList::ContactList: passed a null account manager");
g_object_ref( mpAccountManager); g_object_ref( mpAccountManager);
/* Tell the client factory (which creates and prepares proxy objects) to
* get the features we need ready before giving us any objects.
*/
TpSimpleClientFactory *factory = tp_proxy_get_factory (mpAccountManager);
/* We need every online account's connection object to be available... */
tp_simple_client_factory_add_account_features_varargs (factory,
TP_ACCOUNT_FEATURE_CONNECTION,
0);
/* ...and we want those connection objects to have the contact list
* available... */
tp_simple_client_factory_add_connection_features_varargs (factory,
TP_CONNECTION_FEATURE_CONTACT_LIST,
0);
/* ...and those contacts should have their alias and their capabilities
* available.
*/
tp_simple_client_factory_add_contact_features_varargs (factory,
TP_CONTACT_FEATURE_ALIAS,
TP_CONTACT_FEATURE_AVATAR_DATA,
TP_CONTACT_FEATURE_CAPABILITIES,
TP_CONTACT_FEATURE_PRESENCE,
TP_CONTACT_FEATURE_INVALID);
} }
ContactList::~ContactList() ContactList::~ContactList()
......
...@@ -83,11 +83,11 @@ using namespace osl; ...@@ -83,11 +83,11 @@ using namespace osl;
class TeleManagerImpl class TeleManagerImpl
{ {
public: public:
TpAutomaticClientFactory* mpFactory; TpSimpleClientFactory* mpFactory;
TpBaseClient* mpClient; TpBaseClient* mpClient;
TpBaseClient* mpFileTransferClient; TpBaseClient* mpFileTransferClient;
TpAccountManager* mpAccountManager; TpAccountManager* mpAccountManager;
TeleManager::AccountManagerStatus meAccountManagerStatus; bool mbAccountManagerReady : 1;
bool mbAccountManagerReadyHandlerInvoked : 1; bool mbAccountManagerReadyHandlerInvoked : 1;
bool mbChannelReadyHandlerInvoked : 1; bool mbChannelReadyHandlerInvoked : 1;
ContactList* mpContactList; ContactList* mpContactList;
...@@ -441,7 +441,6 @@ bool TeleManager::init( bool bListen ) ...@@ -441,7 +441,6 @@ bool TeleManager::init( bool bListen )
{ {
if (createAccountManager()) if (createAccountManager())
{ {
prepareAccountManager();
if (bListen && !registerClients()) if (bListen && !registerClients())
SAL_WARN( "tubes", "TeleManager::init: Could not register client handlers." ); SAL_WARN( "tubes", "TeleManager::init: Could not register client handlers." );
...@@ -478,22 +477,41 @@ bool TeleManager::createAccountManager() ...@@ -478,22 +477,41 @@ bool TeleManager::createAccountManager()
return false; return false;
} }
pImpl->mpFactory = tp_automatic_client_factory_new( pDBus); pImpl->mpFactory = TP_SIMPLE_CLIENT_FACTORY( tp_automatic_client_factory_new( pDBus));
g_object_unref( pDBus); g_object_unref( pDBus);
SAL_WARN_IF( !pImpl->mpFactory, "tubes", "TeleManager::createAccountManager: no client factory"); SAL_WARN_IF( !pImpl->mpFactory, "tubes", "TeleManager::createAccountManager: no client factory");
if (!pImpl->mpFactory) if (!pImpl->mpFactory)
return false; return false;
TpAccountManager* pAccountManager = tp_account_manager_new_with_factory ( /* Tell the client factory (which creates and prepares proxy objects) to
TP_SIMPLE_CLIENT_FACTORY (pImpl->mpFactory)); * get the features we need ready before giving us any objects.
tp_account_manager_set_default( pAccountManager); */
/* We need every online account's connection object to be available... */
/* Takes our ref. */ tp_simple_client_factory_add_account_features_varargs (pImpl->mpFactory,
pImpl->mpAccountManager = pAccountManager; TP_ACCOUNT_FEATURE_CONNECTION,
0);
/* ...and we want those connection objects to have the contact list
* available... */
tp_simple_client_factory_add_connection_features_varargs (pImpl->mpFactory,
TP_CONNECTION_FEATURE_CONTACT_LIST,
0);
/* ...and those contacts should have their alias and their capabilities
* available.
*/
tp_simple_client_factory_add_contact_features_varargs (pImpl->mpFactory,
TP_CONTACT_FEATURE_ALIAS,
TP_CONTACT_FEATURE_AVATAR_DATA,
TP_CONTACT_FEATURE_CAPABILITIES,
TP_CONTACT_FEATURE_PRESENCE,
TP_CONTACT_FEATURE_INVALID);
pImpl->mpContactList = new ContactList(pAccountManager); pImpl->mpAccountManager = tp_account_manager_new_with_factory (pImpl->mpFactory);
tp_account_manager_set_default (pImpl->mpAccountManager);
return true; setAccountManagerReadyHandlerInvoked( false);
tp_proxy_prepare_async( pImpl->mpAccountManager, NULL, TeleManager_AccountManagerReadyHandler, NULL);
lcl_iterateLoop( &TeleManager::isAccountManagerReadyHandlerInvoked);
return pImpl->mbAccountManagerReady;
} }
bool TeleManager::registerClients() bool TeleManager::registerClients()
...@@ -508,7 +526,7 @@ bool TeleManager::registerClients() ...@@ -508,7 +526,7 @@ bool TeleManager::registerClients()
return true; return true;
pImpl->mpClient = tp_simple_handler_new_with_factory( pImpl->mpClient = tp_simple_handler_new_with_factory(
TP_SIMPLE_CLIENT_FACTORY (pImpl->mpFactory), // factory pImpl->mpFactory, // factory
FALSE, // bypass_approval FALSE, // bypass_approval
FALSE, // requests FALSE, // requests
getFullClientName().getStr(), // name getFullClientName().getStr(), // name
...@@ -556,7 +574,7 @@ bool TeleManager::registerClients() ...@@ -556,7 +574,7 @@ bool TeleManager::registerClients()
* user isn't prompted before the channel gets passed to us. * user isn't prompted before the channel gets passed to us.
*/ */
pImpl->mpFileTransferClient = tp_simple_handler_new_with_factory ( pImpl->mpFileTransferClient = tp_simple_handler_new_with_factory (
TP_SIMPLE_CLIENT_FACTORY( pImpl->mpFactory), // factory pImpl->mpFactory, // factory
TRUE, // bypass_approval TRUE, // bypass_approval
FALSE, // requests FALSE, // requests
getFullClientName().getStr(), // name getFullClientName().getStr(), // name
...@@ -731,45 +749,6 @@ TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact * ...@@ -731,45 +749,6 @@ TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact *
return pConference; return pConference;
} }
void TeleManager::prepareAccountManager()
{
INFO_LOGGER_F( "TeleManager::prepareAccountManager");
MutexGuard aGuard( GetMutex());
SAL_INFO_IF( pImpl->meAccountManagerStatus == AMS_PREPARED, "tubes",
"TeleManager::prepareAccountManager: already prepared");
if (pImpl->meAccountManagerStatus == AMS_PREPARED)
return;
SAL_WARN_IF( pImpl->meAccountManagerStatus == AMS_INPREPARATION, "tubes",
"TeleManager::prepareAccountManager: already in preparation");
if (pImpl->meAccountManagerStatus == AMS_INPREPARATION)
return;
SAL_WARN_IF( pImpl->meAccountManagerStatus != AMS_UNINITIALIZED, "tubes",
"TeleManager::prepareAccountManager: yet another attempt");
SAL_WARN_IF( !pImpl->mpAccountManager, "tubes",
"TeleManager::prepareAccountManager: called before ::connect()");
if (!pImpl->mpAccountManager)
return;
pImpl->meAccountManagerStatus = AMS_INPREPARATION;
setAccountManagerReadyHandlerInvoked( false);
tp_proxy_prepare_async( pImpl->mpAccountManager, NULL, TeleManager_AccountManagerReadyHandler, NULL);
lcl_iterateLoop( &TeleManager::isAccountManagerReadyHandlerInvoked);
}
TeleManager::AccountManagerStatus TeleManager::getAccountManagerStatus()
{
return pImpl->meAccountManagerStatus;
}
void TeleManager::setAccountManagerReadyHandlerInvoked( bool b ) void TeleManager::setAccountManagerReadyHandlerInvoked( bool b )
{ {
pImpl->mbAccountManagerReadyHandlerInvoked = b; pImpl->mbAccountManagerReadyHandlerInvoked = b;
...@@ -792,6 +771,9 @@ bool TeleManager::isChannelReadyHandlerInvoked() ...@@ -792,6 +771,9 @@ bool TeleManager::isChannelReadyHandlerInvoked()
ContactList* TeleManager::getContactList() ContactList* TeleManager::getContactList()
{ {
if (!pImpl->mpContactList)
pImpl->mpContactList = new ContactList (pImpl->mpAccountManager);
return pImpl->mpContactList; return pImpl->mpContactList;
} }
...@@ -799,9 +781,9 @@ TpAccount* TeleManager::getAccount( const rtl::OString& rAccountID ) ...@@ -799,9 +781,9 @@ TpAccount* TeleManager::getAccount( const rtl::OString& rAccountID )
{ {
INFO_LOGGER_F( "TeleManager::getMyAccount"); INFO_LOGGER_F( "TeleManager::getMyAccount");
SAL_WARN_IF( pImpl->meAccountManagerStatus != AMS_PREPARED, "tubes", SAL_WARN_IF( !pImpl->mbAccountManagerReady, "tubes",
"TeleManager::getMyAccount: Account Manager not prepared"); "TeleManager::getMyAccount: Account Manager not prepared");
if (pImpl->meAccountManagerStatus != AMS_PREPARED) if (!pImpl->mbAccountManagerReady)
return NULL; return NULL;
GList* pAccounts = tp_account_manager_get_valid_accounts( pImpl->mpAccountManager); GList* pAccounts = tp_account_manager_get_valid_accounts( pImpl->mpAccountManager);
...@@ -832,7 +814,7 @@ TpAccount* TeleManager::getAccount( const rtl::OString& rAccountID ) ...@@ -832,7 +814,7 @@ TpAccount* TeleManager::getAccount( const rtl::OString& rAccountID )
void TeleManager::setAccountManagerReady( bool bPrepared) void TeleManager::setAccountManagerReady( bool bPrepared)
{ {
pImpl->meAccountManagerStatus = (bPrepared ? AMS_PREPARED : AMS_UNPREPARABLE); pImpl->mbAccountManagerReady = bPrepared;
} }
...@@ -898,9 +880,10 @@ TeleManagerImpl::TeleManagerImpl() ...@@ -898,9 +880,10 @@ TeleManagerImpl::TeleManagerImpl()
mpClient( NULL), mpClient( NULL),
mpFileTransferClient( NULL), mpFileTransferClient( NULL),
mpAccountManager( NULL), mpAccountManager( NULL),
meAccountManagerStatus( TeleManager::AMS_UNINITIALIZED), mbAccountManagerReady( false),
mbAccountManagerReadyHandlerInvoked( false), mbAccountManagerReadyHandlerInvoked( false),
mbChannelReadyHandlerInvoked( false) mbChannelReadyHandlerInvoked( false),
mpContactList( NULL)
{ {
g_type_init(); g_type_init();
} }
......
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