(purple) Disconnection of accounts, quit server w/o Cardie
This commit is contained in:
parent
588b32b9c3
commit
f755fa298b
|
@ -26,7 +26,9 @@
|
||||||
#include <libpurple/purple.h>
|
#include <libpurple/purple.h>
|
||||||
|
|
||||||
#include <MessageRunner.h>
|
#include <MessageRunner.h>
|
||||||
|
#include <Roster.h>
|
||||||
|
|
||||||
|
#include <Cardie.h>
|
||||||
#include <ChatProtocolMessages.h>
|
#include <ChatProtocolMessages.h>
|
||||||
|
|
||||||
#include "Purple.h"
|
#include "Purple.h"
|
||||||
|
@ -51,7 +53,8 @@ PurpleApp::PurpleApp()
|
||||||
std::cerr << "libpurple initialization failed. Please report!\n";
|
std::cerr << "libpurple initialization failed. Please report!\n";
|
||||||
|
|
||||||
_GetProtocolsInfo();
|
_GetProtocolsInfo();
|
||||||
fGRunner = new BMessageRunner(this, new BMessage(G_MAIN_LOOP), 100000, -1);
|
new BMessageRunner(this, new BMessage(G_MAIN_LOOP), 100000, -1);
|
||||||
|
new BMessageRunner(this, new BMessage(CHECK_APP), 60000000, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,14 +84,13 @@ PurpleApp::MessageReceived(BMessage* msg)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PURPLE_LOAD_ACCOUNT:
|
case PURPLE_CONNECT_ACCOUNT:
|
||||||
{
|
{
|
||||||
_ParseCardieSettings(msg);
|
_ParseCardieSettings(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PURPLE_REGISTER_THREAD:
|
case PURPLE_REGISTER_THREAD:
|
||||||
{
|
{
|
||||||
msg->PrintToStream();
|
|
||||||
BString accName = msg->FindString("account_name");
|
BString accName = msg->FindString("account_name");
|
||||||
BString username = fAccounts.ValueFor(accName);
|
BString username = fAccounts.ValueFor(accName);
|
||||||
int64 thread;
|
int64 thread;
|
||||||
|
@ -98,6 +100,29 @@ PurpleApp::MessageReceived(BMessage* msg)
|
||||||
fAccountThreads.AddItem(username, thread);
|
fAccountThreads.AddItem(username, thread);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PURPLE_REQUEST_DISCONNECT:
|
||||||
|
{
|
||||||
|
PurpleAccount* account = _AccountFromMessage(msg);
|
||||||
|
if (account == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BString account_name = msg->FindString("account_name");
|
||||||
|
const char* username = purple_account_get_username(account);
|
||||||
|
fAccountThreads.RemoveItemFor(BString(username));
|
||||||
|
fAccounts.RemoveItemFor(account_name);
|
||||||
|
|
||||||
|
purple_account_disconnect(account);
|
||||||
|
|
||||||
|
if (fAccountThreads.CountItems() == 0 || fAccounts.CountItems() == 0)
|
||||||
|
Quit();
|
||||||
|
}
|
||||||
|
case CHECK_APP:
|
||||||
|
{
|
||||||
|
BRoster roster;
|
||||||
|
if (roster.IsRunning(APP_SIGNATURE) == false)
|
||||||
|
Quit();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case G_MAIN_LOOP:
|
case G_MAIN_LOOP:
|
||||||
g_main_context_iteration(g_main_loop_get_context(fGloop), false);
|
g_main_context_iteration(g_main_loop_get_context(fGloop), false);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -34,6 +34,7 @@ typedef KeyMap<BString, BString> Accounts; // Cardie username → Purple usernam
|
||||||
typedef KeyMap<BString, thread_id> AccountThreads; // Purple username → Thread
|
typedef KeyMap<BString, thread_id> AccountThreads; // Purple username → Thread
|
||||||
|
|
||||||
const uint32 G_MAIN_LOOP = 'GLml';
|
const uint32 G_MAIN_LOOP = 'GLml';
|
||||||
|
const uint32 CHECK_APP = 'Paca';
|
||||||
|
|
||||||
|
|
||||||
#define PURPLE_GLIB_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
|
#define PURPLE_GLIB_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
|
||||||
|
@ -60,6 +61,7 @@ int main(int argc, char** argv);
|
||||||
class PurpleApp : public BApplication {
|
class PurpleApp : public BApplication {
|
||||||
public:
|
public:
|
||||||
PurpleApp();
|
PurpleApp();
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* msg);
|
virtual void MessageReceived(BMessage* msg);
|
||||||
void SendMessage(thread_id thread, BMessage msg);
|
void SendMessage(thread_id thread, BMessage msg);
|
||||||
void SendMessage(PurpleAccount* account, BMessage msg);
|
void SendMessage(PurpleAccount* account, BMessage msg);
|
||||||
|
@ -79,7 +81,6 @@ private:
|
||||||
BObjectList<ProtocolInfo> fProtocols;
|
BObjectList<ProtocolInfo> fProtocols;
|
||||||
|
|
||||||
GMainLoop* fGloop;
|
GMainLoop* fGloop;
|
||||||
BMessageRunner* fGRunner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ enum purple_message {
|
||||||
* Just the account's settings message from Cardie's end.
|
* Just the account's settings message from Cardie's end.
|
||||||
* It's the server's job to tie the Cardie account name
|
* It's the server's job to tie the Cardie account name
|
||||||
* to the PurpleAccount. */
|
* to the PurpleAccount. */
|
||||||
PURPLE_LOAD_ACCOUNT = 'PAla',
|
PURPLE_CONNECT_ACCOUNT = 'PAla',
|
||||||
|
|
||||||
/*! Associate account with thread →Server
|
/*! Associate account with thread →Server
|
||||||
* Makes the server associate the given account with
|
* Makes the server associate the given account with
|
||||||
|
@ -52,7 +52,11 @@ enum purple_message {
|
||||||
* messages related to the account will be sent to this
|
* messages related to the account will be sent to this
|
||||||
* thread.
|
* thread.
|
||||||
* Requires: String account_name, int64 thread_id */
|
* Requires: String account_name, int64 thread_id */
|
||||||
PURPLE_REGISTER_THREAD = 'PArl'
|
PURPLE_REGISTER_THREAD = 'PArl',
|
||||||
|
|
||||||
|
/*! Disconnect add-on's account →Server
|
||||||
|
* Requires: String account_name */
|
||||||
|
PURPLE_REQUEST_DISCONNECT = 'Axwx'
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _PURPLE_MESSAGES_H
|
#endif // _PURPLE_MESSAGES_H
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#include "PurpleProtocol.h"
|
#include "PurpleProtocol.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <Roster.h>
|
#include <Roster.h>
|
||||||
|
|
||||||
|
@ -117,11 +119,8 @@ status_t
|
||||||
connect_thread(void* data)
|
connect_thread(void* data)
|
||||||
{
|
{
|
||||||
PurpleProtocol* protocol = (PurpleProtocol*)data;
|
PurpleProtocol* protocol = (PurpleProtocol*)data;
|
||||||
|
while (true)
|
||||||
while (true) {
|
protocol->SendMessage(new BMessage(receive_message()));
|
||||||
BMessage msg = receive_message();
|
|
||||||
protocol->SendMessage(new BMessage(msg));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -147,6 +146,12 @@ PurpleProtocol::PurpleProtocol(BString name, BString id, BMessage settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PurpleProtocol::~PurpleProtocol()
|
||||||
|
{
|
||||||
|
Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
PurpleProtocol::Init(ChatProtocolMessengerInterface* interface)
|
PurpleProtocol::Init(ChatProtocolMessengerInterface* interface)
|
||||||
{
|
{
|
||||||
|
@ -158,6 +163,10 @@ PurpleProtocol::Init(ChatProtocolMessengerInterface* interface)
|
||||||
status_t
|
status_t
|
||||||
PurpleProtocol::Shutdown()
|
PurpleProtocol::Shutdown()
|
||||||
{
|
{
|
||||||
|
BMessage* disconnect = new BMessage(PURPLE_REQUEST_DISCONNECT);
|
||||||
|
_SendPrplMessage(disconnect);
|
||||||
|
|
||||||
|
kill_thread(fBirdThread);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +183,7 @@ PurpleProtocol::UpdateSettings(BMessage* msg)
|
||||||
{
|
{
|
||||||
ensure_app();
|
ensure_app();
|
||||||
fPrplMessenger = new BMessenger(PURPLE_SIGNATURE);
|
fPrplMessenger = new BMessenger(PURPLE_SIGNATURE);
|
||||||
msg->what = PURPLE_LOAD_ACCOUNT;
|
msg->what = PURPLE_CONNECT_ACCOUNT;
|
||||||
_SendPrplMessage(msg);
|
_SendPrplMessage(msg);
|
||||||
|
|
||||||
thread_id thread = spawn_thread(connect_thread, "bird_superiority",
|
thread_id thread = spawn_thread(connect_thread, "bird_superiority",
|
||||||
|
|
|
@ -44,6 +44,8 @@ public:
|
||||||
PurpleProtocol(BString name, BString id,
|
PurpleProtocol(BString name, BString id,
|
||||||
BMessage settings);
|
BMessage settings);
|
||||||
|
|
||||||
|
~PurpleProtocol();
|
||||||
|
|
||||||
// ChatProtocol inheritance
|
// ChatProtocol inheritance
|
||||||
virtual status_t Init(ChatProtocolMessengerInterface* interface);
|
virtual status_t Init(ChatProtocolMessengerInterface* interface);
|
||||||
virtual status_t Shutdown();
|
virtual status_t Shutdown();
|
||||||
|
@ -81,7 +83,7 @@ private:
|
||||||
|
|
||||||
ChatProtocolMessengerInterface* fMessenger;
|
ChatProtocolMessengerInterface* fMessenger;
|
||||||
BMessenger* fPrplMessenger;
|
BMessenger* fPrplMessenger;
|
||||||
thread_id fServerThread;
|
thread_id fBirdThread;
|
||||||
|
|
||||||
BString fName;
|
BString fName;
|
||||||
BPath fAddOnPath;
|
BPath fAddOnPath;
|
||||||
|
|
Ŝarĝante…
Reference in New Issue