b1920dad47
Registration of custom chat commands and menu-items for protocols was done by the IM_REGISTER_* messages, and is now done through direct calls to the CayaProtocol object. The new model for call/message for protocols is this: Temporary information (chat messages, roster members, etc.) should be accessed through messages. Relatively static data (protocol name, commands) should be accessed through direct calls to the protocol object.
210 lines
3.2 KiB
C++
210 lines
3.2 KiB
C++
/*
|
|
* Copyright 2009-2011, Andrea Anzani. All rights reserved.
|
|
* Copyright 2009-2011, Pier Luigi Fiorini. All rights reserved.
|
|
* Copyright 2021, Jaidyn Levesque. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Andrea Anzani, andrea.anzani@gmail.com
|
|
* Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
|
|
* Jaidyn Levesque, jadedctrl@teknik.io
|
|
*/
|
|
|
|
#include "ProtocolLooper.h"
|
|
|
|
#include <String.h>
|
|
|
|
#include "Account.h"
|
|
#include "Conversation.h"
|
|
#include "ConversationAccountItem.h"
|
|
|
|
|
|
ProtocolLooper::ProtocolLooper(CayaProtocol* protocol, int64 instance)
|
|
:
|
|
BLooper(),
|
|
fProtocol(protocol),
|
|
fInstance(instance),
|
|
fListItem(NULL)
|
|
{
|
|
Account* account = reinterpret_cast<Account*>(
|
|
protocol->MessengerInterface());
|
|
|
|
_InitCommands();
|
|
|
|
BString name(protocol->FriendlySignature());
|
|
name << " - " << account->Name();
|
|
|
|
SetName(name.String());
|
|
Run();
|
|
}
|
|
|
|
|
|
ProtocolLooper::~ProtocolLooper()
|
|
{
|
|
fProtocol->Shutdown();
|
|
delete fProtocol;
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::MessageReceived(BMessage* msg)
|
|
{
|
|
if (Protocol()->Process(msg) != B_OK)
|
|
BLooper::MessageReceived(msg);
|
|
}
|
|
|
|
|
|
CayaProtocol*
|
|
ProtocolLooper::Protocol()
|
|
{
|
|
return fProtocol;
|
|
}
|
|
|
|
|
|
ChatMap
|
|
ProtocolLooper::Conversations() const
|
|
{
|
|
return fChatMap;
|
|
}
|
|
|
|
|
|
Conversation*
|
|
ProtocolLooper::ConversationById(BString id)
|
|
{
|
|
bool found = false;
|
|
return fChatMap.ValueFor(id, &found);
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::AddConversation(Conversation* chat)
|
|
{
|
|
fChatMap.AddItem(chat->GetId(), chat);
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::RemoveConversation(Conversation* chat)
|
|
{
|
|
fChatMap.RemoveItemFor(chat->GetId());
|
|
}
|
|
|
|
|
|
RosterMap
|
|
ProtocolLooper::Contacts() const
|
|
{
|
|
return fRosterMap;
|
|
}
|
|
|
|
|
|
Contact*
|
|
ProtocolLooper::ContactById(BString id)
|
|
{
|
|
bool found = false;
|
|
return fRosterMap.ValueFor(id, &found);
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::AddContact(Contact* contact)
|
|
{
|
|
fRosterMap.AddItem(contact->GetId(), contact);
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::RemoveContact(Contact* contact)
|
|
{
|
|
fRosterMap.RemoveItemFor(contact->GetId());
|
|
fUserMap.AddItem(contact->GetId(), (User*)contact);
|
|
}
|
|
|
|
|
|
UserMap
|
|
ProtocolLooper::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*
|
|
ProtocolLooper::UserById(BString id)
|
|
{
|
|
bool found = false;
|
|
User* user = ContactById(id);
|
|
if (user == NULL)
|
|
user = fUserMap.ValueFor(id, &found);
|
|
|
|
return user;
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::AddUser(User* user)
|
|
{
|
|
fUserMap.AddItem(user->GetId(), user);
|
|
}
|
|
|
|
|
|
CommandMap
|
|
ProtocolLooper::Commands() const
|
|
{
|
|
return fCommands;
|
|
}
|
|
|
|
|
|
ChatCommand*
|
|
ProtocolLooper::CommandById(BString id)
|
|
{
|
|
return fCommands.ValueFor(id);
|
|
}
|
|
|
|
|
|
BString
|
|
ProtocolLooper::GetOwnId()
|
|
{
|
|
return fMySelf;
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::SetOwnId(BString user_id)
|
|
{
|
|
fMySelf = user_id;
|
|
}
|
|
|
|
|
|
int64
|
|
ProtocolLooper::GetInstance()
|
|
{
|
|
return fInstance;
|
|
}
|
|
|
|
|
|
ConversationAccountItem*
|
|
ProtocolLooper::GetListItem()
|
|
{
|
|
if (fListItem == NULL)
|
|
fListItem = new ConversationAccountItem(fProtocol->GetName(),
|
|
fInstance);
|
|
return fListItem;
|
|
}
|
|
|
|
|
|
void
|
|
ProtocolLooper::_InitCommands()
|
|
{
|
|
BObjectList<BMessage> commands = fProtocol->Commands();
|
|
for (int i = 0; i < commands.CountItems(); i++) {
|
|
ChatCommand* cmd = new ChatCommand(commands.ItemAt(i));
|
|
fCommands.AddItem(cmd->GetName(), cmd);
|
|
}
|
|
}
|