2010-05-07 04:47:10 -05:00
|
|
|
/*
|
2011-12-03 16:38:03 -06:00
|
|
|
* Copyright 2009-2011, Andrea Anzani. All rights reserved.
|
|
|
|
* Copyright 2009-2011, Pier Luigi Fiorini. All rights reserved.
|
2010-05-07 04:47:10 -05:00
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Andrea Anzani, andrea.anzani@gmail.com
|
|
|
|
* Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
|
2011-12-14 17:36:27 -06:00
|
|
|
*
|
|
|
|
* Contributors:
|
|
|
|
* Dario Casalinuovo
|
2010-05-07 04:47:10 -05:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <Application.h>
|
2010-05-16 16:02:50 -05:00
|
|
|
#include <Debug.h>
|
2010-05-07 04:47:10 -05:00
|
|
|
#include <Entry.h>
|
2010-05-30 07:17:32 -05:00
|
|
|
#include <Notification.h>
|
2010-05-07 04:47:10 -05:00
|
|
|
#include <Path.h>
|
2021-06-02 16:53:03 -05:00
|
|
|
#include <StringList.h>
|
2010-05-07 04:47:10 -05:00
|
|
|
#include <TranslationUtils.h>
|
|
|
|
|
2010-05-16 16:02:50 -05:00
|
|
|
#include "Account.h"
|
2010-05-07 04:47:10 -05:00
|
|
|
#include "AccountManager.h"
|
2010-05-16 16:02:50 -05:00
|
|
|
#include "ProtocolLooper.h"
|
|
|
|
#include "CayaMessages.h"
|
|
|
|
#include "CayaProtocol.h"
|
2012-03-08 16:55:13 -06:00
|
|
|
#include "CayaPreferences.h"
|
2010-05-19 15:37:26 -05:00
|
|
|
#include "CayaProtocolMessages.h"
|
2010-05-07 04:47:10 -05:00
|
|
|
#include "ImageCache.h"
|
|
|
|
#include "ProtocolManager.h"
|
|
|
|
#include "RosterItem.h"
|
2010-05-16 16:02:50 -05:00
|
|
|
#include "Server.h"
|
2010-05-07 04:47:10 -05:00
|
|
|
|
2010-05-16 16:02:50 -05:00
|
|
|
|
|
|
|
Server::Server()
|
2010-05-19 17:28:26 -05:00
|
|
|
:
|
2012-02-27 18:46:15 -06:00
|
|
|
BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE)
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-05-19 17:28:26 -05:00
|
|
|
void
|
2010-05-07 04:47:10 -05:00
|
|
|
Server::Quit()
|
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
Contact* contact = NULL;
|
|
|
|
Conversation* conversation = NULL;
|
2010-05-16 16:02:50 -05:00
|
|
|
|
2021-05-24 01:47:21 -05:00
|
|
|
while (contact = fRosterMap.ValueAt(0)) {
|
|
|
|
contact->DeletePopUp();
|
2010-05-07 04:47:10 -05:00
|
|
|
fRosterMap.RemoveItemAt(0);
|
|
|
|
}
|
2021-05-24 01:47:21 -05:00
|
|
|
|
|
|
|
while (conversation = fChatMap.ValueAt(0)) {
|
|
|
|
fChatMap.RemoveItemAt(0);
|
2021-05-28 22:26:32 -05:00
|
|
|
delete conversation;
|
2021-05-24 01:47:21 -05:00
|
|
|
}
|
2010-05-07 04:47:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-05-16 16:02:50 -05:00
|
|
|
void
|
|
|
|
Server::LoginAll()
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
2010-05-16 16:02:50 -05:00
|
|
|
for (uint32 i = 0; i < fLoopers.CountItems(); i++) {
|
|
|
|
ProtocolLooper* looper = fLoopers.ValueAt(i);
|
|
|
|
|
|
|
|
BMessage* msg = new BMessage(IM_MESSAGE);
|
2010-05-19 15:37:26 -05:00
|
|
|
msg->AddInt32("im_what", IM_SET_OWN_STATUS);
|
2010-05-16 16:02:50 -05:00
|
|
|
msg->AddInt32("status", CAYA_ONLINE);
|
|
|
|
looper->PostMessage(msg);
|
|
|
|
}
|
2010-05-07 04:47:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
filter_result
|
|
|
|
Server::Filter(BMessage* message, BHandler **target)
|
|
|
|
{
|
|
|
|
filter_result result = B_DISPATCH_MESSAGE;
|
|
|
|
|
2010-05-19 17:28:26 -05:00
|
|
|
switch (message->what) {
|
2011-12-14 17:36:27 -06:00
|
|
|
case CAYA_CLOSE_CHAT_WINDOW:
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
BString id = message->FindString("chat_id");
|
2010-05-16 16:02:50 -05:00
|
|
|
if (id.Length() > 0) {
|
2010-05-07 04:47:10 -05:00
|
|
|
bool found = false;
|
2021-05-24 01:47:21 -05:00
|
|
|
Conversation* item = fChatMap.ValueFor(id, &found);
|
2010-05-07 04:47:10 -05:00
|
|
|
}
|
|
|
|
result = B_SKIP_MESSAGE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IM_MESSAGE:
|
|
|
|
result = ImMessage(message);
|
|
|
|
break;
|
2011-12-14 17:36:27 -06:00
|
|
|
|
|
|
|
case CAYA_REPLICANT_MESSENGER:
|
|
|
|
{
|
2012-02-27 18:46:15 -06:00
|
|
|
BMessenger* messenger = new BMessenger();
|
2011-12-14 17:36:27 -06:00
|
|
|
|
|
|
|
status_t ret = message->FindMessenger(
|
2012-02-27 18:46:15 -06:00
|
|
|
"messenger", messenger);
|
2011-12-14 17:36:27 -06:00
|
|
|
|
2012-02-27 18:46:15 -06:00
|
|
|
if (ret != B_OK || !messenger->IsValid()) {
|
2011-12-14 17:36:27 -06:00
|
|
|
message->PrintToStream();
|
|
|
|
printf("err %s\n", strerror(ret));
|
2012-02-27 18:46:15 -06:00
|
|
|
break;
|
2011-12-14 17:36:27 -06:00
|
|
|
}
|
2012-02-27 18:46:15 -06:00
|
|
|
AccountManager* accountManager = AccountManager::Get();
|
|
|
|
accountManager->SetReplicantMessenger(messenger);
|
2012-03-03 20:27:16 -06:00
|
|
|
accountManager->ReplicantStatusNotify(accountManager->Status());
|
2011-12-14 17:36:27 -06:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2010-05-16 16:02:50 -05:00
|
|
|
default:
|
|
|
|
// Dispatch not handled messages to main window
|
|
|
|
break;
|
2010-05-07 04:47:10 -05:00
|
|
|
}
|
|
|
|
|
2010-05-28 17:38:16 -05:00
|
|
|
return result;
|
2010-05-07 04:47:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
filter_result
|
|
|
|
Server::ImMessage(BMessage* msg)
|
2010-05-28 17:38:16 -05:00
|
|
|
{
|
2010-05-07 04:47:10 -05:00
|
|
|
filter_result result = B_DISPATCH_MESSAGE;
|
|
|
|
int32 im_what = msg->FindInt32("im_what");
|
|
|
|
|
|
|
|
switch (im_what) {
|
2010-05-19 15:37:26 -05:00
|
|
|
case IM_CONTACT_LIST:
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
BString id;
|
2021-05-31 13:04:58 -05:00
|
|
|
while (msg->FindString("user_id", i++, &id) == B_OK)
|
|
|
|
_EnsureContact(msg);
|
2010-05-19 15:37:26 -05:00
|
|
|
result = B_SKIP_MESSAGE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IM_OWN_STATUS_SET:
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
|
|
|
int32 status;
|
|
|
|
const char* protocol;
|
|
|
|
if (msg->FindInt32("status", &status) != B_OK)
|
|
|
|
return B_SKIP_MESSAGE;
|
|
|
|
if (msg->FindString("protocol", &protocol) != B_OK)
|
|
|
|
return B_SKIP_MESSAGE;
|
|
|
|
|
|
|
|
AccountManager* accountManager = AccountManager::Get();
|
|
|
|
accountManager->SetStatus((CayaStatus)status);
|
2011-12-14 17:36:27 -06:00
|
|
|
|
2010-05-07 04:47:10 -05:00
|
|
|
break;
|
|
|
|
}
|
2010-05-19 15:37:26 -05:00
|
|
|
case IM_STATUS_SET:
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
|
|
|
int32 status;
|
|
|
|
|
|
|
|
if (msg->FindInt32("status", &status) != B_OK)
|
|
|
|
return B_SKIP_MESSAGE;
|
|
|
|
|
2021-06-02 16:53:03 -05:00
|
|
|
User* user = _EnsureUser(msg);
|
|
|
|
if (!user)
|
2010-05-29 23:28:04 -05:00
|
|
|
break;
|
|
|
|
|
2021-06-02 16:53:03 -05:00
|
|
|
user->SetNotifyStatus((CayaStatus)status);
|
2012-03-07 18:47:00 -06:00
|
|
|
BString statusMsg;
|
|
|
|
if (msg->FindString("message", &statusMsg) == B_OK) {
|
2021-06-02 16:53:03 -05:00
|
|
|
user->SetNotifyPersonalStatus(statusMsg);
|
2021-05-28 22:26:32 -05:00
|
|
|
// contact->GetView()->UpdatePersonalMessage();
|
2012-03-07 18:47:00 -06:00
|
|
|
}
|
2010-05-07 04:47:10 -05:00
|
|
|
break;
|
|
|
|
}
|
2021-05-31 13:04:58 -05:00
|
|
|
case IM_OWN_CONTACT_INFO:
|
|
|
|
{
|
|
|
|
Contact* contact = _EnsureContact(msg);
|
|
|
|
if (contact != NULL) {
|
|
|
|
fMySelf = contact->GetId();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2010-05-19 15:37:26 -05:00
|
|
|
case IM_CONTACT_INFO:
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
Contact* contact = _EnsureContact(msg);
|
|
|
|
if (!contact)
|
2010-05-29 23:28:04 -05:00
|
|
|
break;
|
2010-05-16 16:02:50 -05:00
|
|
|
|
2010-05-19 12:11:22 -05:00
|
|
|
const char* name = NULL;
|
|
|
|
|
2010-05-28 16:31:53 -05:00
|
|
|
if ((msg->FindString("name", &name) == B_OK)
|
|
|
|
&& (strcmp(name, "") != 0))
|
2021-05-24 01:47:21 -05:00
|
|
|
contact->SetNotifyName(name);
|
2012-03-07 13:22:09 -06:00
|
|
|
|
|
|
|
BString status;
|
2012-03-07 18:47:00 -06:00
|
|
|
if (msg->FindString("message", &status) == B_OK) {
|
2021-05-24 01:47:21 -05:00
|
|
|
contact->SetNotifyPersonalStatus(status);
|
|
|
|
// contact->GetChatWindow()->UpdatePersonalMessage();
|
2012-03-07 18:47:00 -06:00
|
|
|
}
|
2010-05-28 16:31:53 -05:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IM_EXTENDED_CONTACT_INFO:
|
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
Contact* contact = _EnsureContact(msg);
|
|
|
|
if (!contact)
|
2010-05-29 23:28:04 -05:00
|
|
|
break;
|
2010-05-28 16:31:53 -05:00
|
|
|
|
2021-05-24 01:47:21 -05:00
|
|
|
if (contact->GetName().Length() > 0)
|
2010-05-29 23:28:04 -05:00
|
|
|
break;
|
2010-05-28 16:31:53 -05:00
|
|
|
|
|
|
|
const char* name = NULL;
|
|
|
|
|
|
|
|
if ((msg->FindString("full name", &name) == B_OK)
|
|
|
|
&& (strcmp(name, "") != 0))
|
2021-05-24 01:47:21 -05:00
|
|
|
contact->SetNotifyName(name);
|
2010-05-07 04:47:10 -05:00
|
|
|
break;
|
|
|
|
}
|
2010-05-19 15:37:26 -05:00
|
|
|
case IM_AVATAR_SET:
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
2021-05-31 11:56:45 -05:00
|
|
|
User* user = _EnsureUser(msg);
|
|
|
|
if (!user)
|
2010-05-29 23:28:04 -05:00
|
|
|
break;
|
|
|
|
|
2010-05-07 04:47:10 -05:00
|
|
|
entry_ref ref;
|
2010-05-29 23:28:04 -05:00
|
|
|
|
|
|
|
if (msg->FindRef("ref", &ref) == B_OK) {
|
|
|
|
BBitmap* bitmap = BTranslationUtils::GetBitmap(&ref);
|
2021-05-31 11:56:45 -05:00
|
|
|
user->SetNotifyAvatarBitmap(bitmap);
|
2010-05-29 23:28:04 -05:00
|
|
|
} else
|
2021-05-31 11:56:45 -05:00
|
|
|
user->SetNotifyAvatarBitmap(NULL);
|
2010-05-07 04:47:10 -05:00
|
|
|
break;
|
|
|
|
}
|
2021-05-26 07:48:25 -05:00
|
|
|
case IM_CREATE_CHAT:
|
|
|
|
{
|
|
|
|
BString user_id = msg->FindString("user_id");
|
|
|
|
if (user_id.IsEmpty() == false) {
|
|
|
|
User* user = ContactById(user_id);
|
|
|
|
user->GetProtocolLooper()->PostMessage(msg);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IM_CHAT_CREATED:
|
|
|
|
{
|
|
|
|
Conversation* chat = _EnsureConversation(msg);
|
2021-05-31 11:56:45 -05:00
|
|
|
User* user = _EnsureUser(msg);
|
2021-05-26 07:48:25 -05:00
|
|
|
|
|
|
|
if (chat != NULL && user != NULL) {
|
|
|
|
chat->AddUser(user);
|
2021-05-28 22:26:32 -05:00
|
|
|
chat->ShowView(false, true);
|
2021-05-26 07:48:25 -05:00
|
|
|
}
|
2021-05-27 11:15:30 -05:00
|
|
|
|
2021-05-26 07:48:25 -05:00
|
|
|
break;
|
|
|
|
}
|
2021-06-01 21:43:19 -05:00
|
|
|
case IM_JOIN_ROOM:
|
|
|
|
{
|
|
|
|
SendProtocolMessage(msg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IM_ROOM_JOINED:
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2021-06-02 16:53:03 -05:00
|
|
|
case IM_ROOM_PARTICIPANTS:
|
|
|
|
{
|
|
|
|
Conversation* chat = _EnsureConversation(msg);
|
|
|
|
BStringList ids;
|
|
|
|
BStringList name;
|
|
|
|
|
|
|
|
msg->FindStrings("user_name", &name);
|
|
|
|
if (msg->FindStrings("user_id", &ids) != B_OK)
|
|
|
|
break;
|
|
|
|
|
|
|
|
ProtocolLooper* protoLooper = _LooperFromMessage(msg);
|
|
|
|
|
|
|
|
for (int i = 0; i < ids.CountStrings(); i++) {
|
|
|
|
User* user = _EnsureUser(ids.StringAt(i), protoLooper);
|
|
|
|
|
|
|
|
if (name.CountStrings() >= i) {
|
|
|
|
user->SetNotifyName(name.StringAt(i));
|
|
|
|
}
|
|
|
|
chat->AddUser(user);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IM_ROOM_PARTICIPANT_LEFT:
|
|
|
|
{
|
|
|
|
Conversation* chat = _EnsureConversation(msg);
|
|
|
|
User* user = _EnsureUser(msg);
|
|
|
|
|
|
|
|
if (user == NULL || chat == NULL)
|
|
|
|
break;
|
|
|
|
chat->RemoveUser(user);
|
|
|
|
break;
|
|
|
|
}
|
2012-03-11 10:11:29 -05:00
|
|
|
case IM_SEND_MESSAGE:
|
|
|
|
{
|
2010-05-16 16:02:50 -05:00
|
|
|
// Route this message through the appropriate ProtocolLooper
|
2021-05-24 01:47:21 -05:00
|
|
|
Conversation* conversation = _EnsureConversation(msg);
|
|
|
|
if (conversation->GetProtocolLooper())
|
|
|
|
conversation->GetProtocolLooper()->PostMessage(msg);
|
2010-05-07 04:47:10 -05:00
|
|
|
break;
|
2010-05-16 16:02:50 -05:00
|
|
|
}
|
2021-05-30 19:07:50 -05:00
|
|
|
case IM_MESSAGE_SENT:
|
2010-05-07 04:47:10 -05:00
|
|
|
case IM_MESSAGE_RECEIVED:
|
2012-03-08 18:35:02 -06:00
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
Conversation* item = _EnsureConversation(msg);
|
|
|
|
item->ImMessage(msg);
|
2021-05-27 11:15:30 -05:00
|
|
|
|
2012-03-08 18:35:02 -06:00
|
|
|
break;
|
|
|
|
}
|
2010-05-28 17:38:16 -05:00
|
|
|
case IM_CONTACT_STARTED_TYPING:
|
|
|
|
case IM_CONTACT_STOPPED_TYPING:
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
BString id = msg->FindString("chat_id");
|
|
|
|
Conversation* item = _EnsureConversation(msg);
|
|
|
|
item->ImMessage(msg);
|
|
|
|
|
2010-05-07 04:47:10 -05:00
|
|
|
result = B_SKIP_MESSAGE;
|
|
|
|
break;
|
|
|
|
}
|
2010-05-30 07:17:32 -05:00
|
|
|
case IM_PROGRESS:
|
|
|
|
{
|
|
|
|
const char* protocol = NULL;
|
|
|
|
const char* title = NULL;
|
|
|
|
const char* message = NULL;
|
|
|
|
float progress = 0.0f;
|
|
|
|
|
|
|
|
if (msg->FindString("protocol", &protocol) != B_OK)
|
|
|
|
return result;
|
|
|
|
if (msg->FindString("title", &title) != B_OK)
|
|
|
|
return result;
|
|
|
|
if (msg->FindString("message", &message) != B_OK)
|
|
|
|
return result;
|
|
|
|
if (msg->FindFloat("progress", &progress) != B_OK)
|
|
|
|
return result;
|
2012-03-08 16:55:13 -06:00
|
|
|
|
|
|
|
if (!CayaPreferences::Item()->NotifyProtocolStatus)
|
|
|
|
break;
|
2010-05-30 07:17:32 -05:00
|
|
|
|
|
|
|
CayaProtocolAddOn* addOn
|
|
|
|
= ProtocolManager::Get()->ProtocolAddOn(protocol);
|
|
|
|
|
|
|
|
BNotification notification(B_PROGRESS_NOTIFICATION);
|
2010-07-03 02:55:23 -05:00
|
|
|
notification.SetGroup(BString("Caya"));
|
2010-05-30 07:17:32 -05:00
|
|
|
notification.SetTitle(title);
|
2021-05-22 12:05:44 -05:00
|
|
|
notification.SetIcon(addOn->ProtoIcon());
|
2010-05-30 07:17:32 -05:00
|
|
|
notification.SetContent(message);
|
|
|
|
notification.SetProgress(progress);
|
2010-07-03 02:55:23 -05:00
|
|
|
notification.Send();
|
2012-03-08 16:55:13 -06:00
|
|
|
|
2010-05-30 07:17:32 -05:00
|
|
|
break;
|
|
|
|
}
|
2010-05-30 13:56:24 -05:00
|
|
|
case IM_NOTIFICATION:
|
|
|
|
{
|
|
|
|
int32 type = (int32)B_INFORMATION_NOTIFICATION;
|
|
|
|
const char* protocol = NULL;
|
|
|
|
const char* title = NULL;
|
|
|
|
const char* message = NULL;
|
|
|
|
|
|
|
|
if (msg->FindString("protocol", &protocol) != B_OK)
|
|
|
|
return result;
|
|
|
|
if (msg->FindInt32("type", &type) != B_OK)
|
|
|
|
return result;
|
|
|
|
if (msg->FindString("title", &title) != B_OK)
|
|
|
|
return result;
|
|
|
|
if (msg->FindString("message", &message) != B_OK)
|
|
|
|
return result;
|
|
|
|
|
2012-03-08 16:55:13 -06:00
|
|
|
if (!CayaPreferences::Item()->NotifyProtocolStatus)
|
|
|
|
break;
|
|
|
|
|
2010-05-30 13:56:24 -05:00
|
|
|
CayaProtocolAddOn* addOn
|
|
|
|
= ProtocolManager::Get()->ProtocolAddOn(protocol);
|
|
|
|
|
|
|
|
BNotification notification((notification_type)type);
|
2010-07-03 02:55:23 -05:00
|
|
|
notification.SetGroup(BString("Caya"));
|
2010-05-30 13:56:24 -05:00
|
|
|
notification.SetTitle(title);
|
2021-05-22 12:05:44 -05:00
|
|
|
notification.SetIcon(addOn->ProtoIcon());
|
2010-05-30 13:56:24 -05:00
|
|
|
notification.SetContent(message);
|
2010-07-03 02:55:23 -05:00
|
|
|
notification.Send();
|
2012-03-08 16:55:13 -06:00
|
|
|
|
2010-05-30 13:56:24 -05:00
|
|
|
break;
|
|
|
|
}
|
2011-12-14 17:36:27 -06:00
|
|
|
|
2010-05-07 04:47:10 -05:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-05-31 13:04:58 -05:00
|
|
|
void
|
|
|
|
Server::AddProtocolLooper(bigtime_t instanceId, CayaProtocol* cayap)
|
|
|
|
{
|
|
|
|
ProtocolLooper* looper = new ProtocolLooper(cayap);
|
|
|
|
fLoopers.AddItem(instanceId, looper);
|
2021-06-01 21:43:19 -05:00
|
|
|
fAccounts.AddItem(cayap->GetName(), instanceId);
|
2021-05-31 13:04:58 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
Server::RemoveProtocolLooper(bigtime_t instanceId)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-06-01 21:43:19 -05:00
|
|
|
ProtocolLooper*
|
|
|
|
Server::GetProtocolLooper(bigtime_t instanceId)
|
|
|
|
{
|
|
|
|
bool found = false;
|
|
|
|
return fLoopers.ValueFor(instanceId, &found);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AccountInstances
|
|
|
|
Server::GetAccounts()
|
|
|
|
{
|
|
|
|
return fAccounts;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-05-31 13:04:58 -05:00
|
|
|
void
|
|
|
|
Server::SendProtocolMessage(BMessage* msg)
|
|
|
|
{
|
|
|
|
// Skip null messages
|
|
|
|
if (!msg)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Check if message contains the instance field
|
|
|
|
bigtime_t id;
|
|
|
|
if (msg->FindInt64("instance", &id) == B_OK) {
|
|
|
|
bool found = false;
|
|
|
|
ProtocolLooper* looper
|
|
|
|
= fLoopers.ValueFor(id, &found);
|
|
|
|
|
|
|
|
if (found)
|
|
|
|
looper->PostMessage(msg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
Server::SendAllProtocolMessage(BMessage* msg)
|
|
|
|
{
|
|
|
|
// Skip null messages
|
|
|
|
if (!msg)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Send message to all protocols
|
|
|
|
for (uint32 i = 0; i < fLoopers.CountItems(); i++) {
|
|
|
|
ProtocolLooper* looper = fLoopers.ValueAt(i);
|
|
|
|
looper->PostMessage(msg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
RosterMap
|
|
|
|
Server::Contacts() const
|
|
|
|
{
|
|
|
|
return fRosterMap;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-05-23 14:39:07 -05:00
|
|
|
Contact*
|
2021-05-31 13:04:58 -05:00
|
|
|
Server::ContactById(BString id)
|
|
|
|
{
|
|
|
|
bool found = false;
|
|
|
|
return fRosterMap.ValueFor(id, &found);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
Server::AddContact(Contact* contact)
|
|
|
|
{
|
|
|
|
fRosterMap.AddItem(contact->GetId(), contact);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UserMap
|
|
|
|
Server::Users() const
|
|
|
|
{
|
|
|
|
UserMap users = fUserMap;
|
|
|
|
|
|
|
|
for (int i = 0; i < fRosterMap.CountItems(); i++) {
|
|
|
|
User* user = (User*)fRosterMap.ValueAt(i);
|
|
|
|
users.AddItem(user->GetId(), user);
|
|
|
|
}
|
|
|
|
|
|
|
|
return users;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
User*
|
|
|
|
Server::UserById(BString id)
|
|
|
|
{
|
|
|
|
bool found = false;
|
|
|
|
User* user = ContactById(id);
|
|
|
|
if (user == NULL)
|
|
|
|
user = fUserMap.ValueFor(id, &found);
|
|
|
|
|
|
|
|
return user;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
Server::AddUser(User* user)
|
|
|
|
{
|
|
|
|
fUserMap.AddItem(user->GetId(), user);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ChatMap
|
|
|
|
Server::Conversations() const
|
|
|
|
{
|
|
|
|
return fChatMap;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Conversation*
|
|
|
|
Server::ConversationById(BString id)
|
|
|
|
{
|
|
|
|
bool found = false;
|
|
|
|
return fChatMap.ValueFor(id, &found);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
Server::AddConversation(Conversation* chat)
|
|
|
|
{
|
|
|
|
fChatMap.AddItem(chat->GetId(), chat);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BString
|
2010-05-16 16:02:50 -05:00
|
|
|
Server::GetOwnContact()
|
|
|
|
{
|
|
|
|
return fMySelf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ProtocolLooper*
|
|
|
|
Server::_LooperFromMessage(BMessage* message)
|
2010-05-07 04:47:10 -05:00
|
|
|
{
|
2010-05-16 16:02:50 -05:00
|
|
|
if (!message)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
bigtime_t identifier;
|
|
|
|
|
|
|
|
if (message->FindInt64("instance", &identifier) == B_OK) {
|
|
|
|
bool found = false;
|
|
|
|
|
|
|
|
ProtocolLooper* looper = fLoopers.ValueFor(identifier, &found);
|
|
|
|
if (found)
|
|
|
|
return looper;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-05-23 14:39:07 -05:00
|
|
|
Contact*
|
2021-05-31 11:56:45 -05:00
|
|
|
Server::_EnsureContact(BMessage* message)
|
2010-05-16 16:02:50 -05:00
|
|
|
{
|
2021-05-24 01:47:21 -05:00
|
|
|
BString id = message->FindString("user_id");
|
2021-05-31 11:56:45 -05:00
|
|
|
Contact* contact = ContactById(id);
|
2010-05-16 16:02:50 -05:00
|
|
|
|
2021-05-31 11:56:45 -05:00
|
|
|
if (contact == NULL && id.IsEmpty() == false) {
|
|
|
|
contact = new Contact(id, Looper());
|
|
|
|
contact->SetProtocolLooper(_LooperFromMessage(message));
|
2021-05-31 13:04:58 -05:00
|
|
|
AddContact(contact);
|
2021-05-24 01:47:21 -05:00
|
|
|
}
|
|
|
|
|
2021-05-31 11:56:45 -05:00
|
|
|
return contact;
|
2021-05-24 01:47:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-05-31 11:56:45 -05:00
|
|
|
User*
|
|
|
|
Server::_EnsureUser(BMessage* message)
|
2021-05-24 01:47:21 -05:00
|
|
|
{
|
|
|
|
BString id = message->FindString("user_id");
|
2021-06-02 16:53:03 -05:00
|
|
|
return _EnsureUser(id, _LooperFromMessage(message));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
User*
|
|
|
|
Server::_EnsureUser(BString id, ProtocolLooper* protoLooper)
|
|
|
|
{
|
2021-05-31 11:56:45 -05:00
|
|
|
User* user = UserById(id);
|
2021-05-24 01:47:21 -05:00
|
|
|
|
2021-05-31 11:56:45 -05:00
|
|
|
if (user == NULL && id.IsEmpty() == false) {
|
|
|
|
user = new User(id, Looper());
|
2021-06-02 16:53:03 -05:00
|
|
|
user->SetProtocolLooper(protoLooper);
|
2021-05-31 13:04:58 -05:00
|
|
|
AddUser(user);
|
2021-05-24 01:47:21 -05:00
|
|
|
}
|
|
|
|
|
2021-05-31 11:56:45 -05:00
|
|
|
return user;
|
2021-05-24 01:47:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Conversation*
|
|
|
|
Server::_EnsureConversation(BMessage* message)
|
|
|
|
{
|
|
|
|
if (!message)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
BString chat_id = message->FindString("chat_id");
|
|
|
|
Conversation* item = NULL;
|
|
|
|
|
|
|
|
if (chat_id.IsEmpty() == false) {
|
|
|
|
bool found = false;
|
|
|
|
item = fChatMap.ValueFor(chat_id, &found);
|
2010-05-07 04:47:10 -05:00
|
|
|
|
|
|
|
if (!found) {
|
2021-05-24 01:47:21 -05:00
|
|
|
item = new Conversation(chat_id, Looper());
|
2010-05-16 16:02:50 -05:00
|
|
|
item->SetProtocolLooper(_LooperFromMessage(message));
|
2021-05-31 13:04:58 -05:00
|
|
|
item->AddUser(ContactById(fMySelf));
|
2021-05-24 01:47:21 -05:00
|
|
|
fChatMap.AddItem(chat_id, item);
|
2010-05-07 04:47:10 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return item;
|
|
|
|
}
|
2021-05-23 14:39:07 -05:00
|
|
|
|
|
|
|
|