Move command/menu-item registration to call

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.
This commit is contained in:
Jaidyn Ann 2021-06-20 01:24:34 -05:00
parent d4f82dccc6
commit b1920dad47
12 changed files with 122 additions and 187 deletions

View File

@ -8,6 +8,7 @@
#define _CAYA_PROTOCOL_H #define _CAYA_PROTOCOL_H
#include <Messenger.h> #include <Messenger.h>
#include <ObjectList.h>
class BBitmap; class BBitmap;
@ -39,10 +40,38 @@ public:
virtual status_t UpdateSettings(BMessage*) = 0; virtual status_t UpdateSettings(BMessage*) = 0;
//! Return a settings template //! Return a settings template
// Currently there are two: "account" (used when creating/editing // Currently there are three: "account" (used when creating/editing
// the user's account) and "room" (used when creating a room). // the user's account), "room" (used when creating a room), and "roster"
// (used when adding or editing a roster member.
virtual BMessage SettingsTemplate(const char* name) = 0; virtual BMessage SettingsTemplate(const char* name) = 0;
//! Custom chat commands― archived ChatCommand objects
// Requires: String "_name", String "_desc", Bool "_proto",
// Message "_msg", int32s "_argtype",
// String "class" = "ChatCommand"
virtual BObjectList<BMessage> Commands() {
return BObjectList<BMessage>();
}
//! Custom menu items used in the userlist right-click menu.
// Archived BMenuItem with some extra slots.
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
// Bool "x_to_protocol", Bool "x_priority", int32 "x_perms",
// int32 "x_target_perms", int32 "x_target_antiperms"
virtual BObjectList<BMessage> UserPopUpItems() = 0;
//! Custom menu items used in the conversation-list right-click menu.
// Archived BMenuItem with some extra slots.
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
// Bool "x_to_protocol", int32 "x_perms"
virtual BObjectList<BMessage> ChatPopUpItems() = 0;
//! Custom menubar items (in the "Protocol" menu).
// Archived BMenuItem with some extra slots.
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
// Bool "x_to_protocol"
virtual BObjectList<BMessage> MenuBarItems() = 0;
//! Protocol signature //! Protocol signature
virtual const char* Signature() const = 0; virtual const char* Signature() const = 0;

View File

@ -388,44 +388,6 @@ enum im_what_code {
//! Protocol is ready to receive messages //! Protocol is ready to receive messages
IM_PROTOCOL_READY = 1002, IM_PROTOCOL_READY = 1002,
/*
* GUI-related messages
*/
//! Register a chat command →Caya
// Just an archived ChatCommand; if "instance" isn't specified, the command
// is global, rather than protocol-only.
// Requires: String "_name", String "_desc", Bool "_proto",
// Message "_msg", int32s "_argtype",
// String "class" = "ChatCommand"
// Allowed: int64 "instance"
IM_REGISTER_COMMAND = 1100,
//! Register a pop-up item →Caya
// Just an archived BMenuItem with extra slots; if "instance" isn't
// specified, the item is global, rather than protocol-only.
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
// Bool "x_to_protocol", Bool "x_priority", int32 "x_perms",
// int32 "x_target_perms", int32 "x_target_antiperms"
// Allowed: int64 "instance"
IM_REGISTER_USERLIST_ITEM = 1101,
//! Register a pop-up item →Caya
// Just an archived BMenuItem with extra slots; if "instance" isn't
// specified, the item is global, rather than protocol-only.
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
// Bool "x_to_protocol", int32 "x_perms"
// Allowed: int64 "instance"
IM_REGISTER_CHATLIST_ITEM = 1102,
//! Register a "Protocol" menu item →Caya
// Just an archived BMenuItem with extra slots; it adds a menu item to
// the menubar's "Protocol" menu.
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
// Bool "x_to_protocol", int64 "instance"
IM_REGISTER_MENUBAR_ITEM = 1103
}; };

View File

@ -14,8 +14,8 @@
#include "Role.h" #include "Role.h"
void BObjectList<BMessage>
DefaultCommands(BLooper* target) DefaultCommands()
{ {
List<int32> roomUser; List<int32> roomUser;
roomUser.AddItem(CMD_ROOM_PARTICIPANT); roomUser.AddItem(CMD_ROOM_PARTICIPANT);
@ -85,71 +85,75 @@ DefaultCommands(BLooper* target)
help->SetDesc("List all current commands, or get help for certain command."); help->SetDesc("List all current commands, or get help for certain command.");
commands.AddItem("help", help); commands.AddItem("help", help);
BObjectList<BMessage> cmds;
for (int i = 0; i < commands.CountItems(); i++) { for (int i = 0; i < commands.CountItems(); i++) {
BMessage* item = new BMessage(IM_MESSAGE);
item->AddInt32("im_what", IM_REGISTER_COMMAND);
ChatCommand* cmd = commands.ValueAt(i); ChatCommand* cmd = commands.ValueAt(i);
BMessage* item = new BMessage();
cmd->Archive(item); cmd->Archive(item);
target->PostMessage(item); cmds.AddItem(item);
} }
return cmds;
} }
void BObjectList<BMessage>
DefaultChatPopUpItems(BLooper* target) DefaultChatPopUpItems()
{ {
BObjectList<BMessage> items;
BMessage* leave = new BMessage(IM_MESSAGE); BMessage* leave = new BMessage(IM_MESSAGE);
leave->AddInt32("im_what", IM_LEAVE_ROOM); leave->AddInt32("im_what", IM_LEAVE_ROOM);
BMessage* item = new BMessage(IM_MESSAGE); BMessage* item = new BMessage(IM_MESSAGE);
item->AddInt32("im_what", IM_REGISTER_CHATLIST_ITEM);
item->AddString("class", "BMenuItem"); item->AddString("class", "BMenuItem");
item->AddString("_label", "Leave chat"); item->AddString("_label", "Leave chat");
item->AddMessage("_msg", leave); item->AddMessage("_msg", leave);
item->AddBool("x_to_protocol", true); item->AddBool("x_to_protocol", true);
items.AddItem(item);
target->PostMessage(item);
return items;
} }
void BObjectList<BMessage>
DefaultUserPopUpItems(BLooper* target) DefaultUserPopUpItems()
{ {
BObjectList<BMessage> items; BObjectList<BMessage> items;
BMessage* infoMsg = new BMessage(CAYA_USER_INFO); BMessage* infoMsg = new BMessage(CAYA_USER_INFO);
target->PostMessage(_UserMenuItem("User info" B_UTF8_ELLIPSIS, infoMsg, 0, items.AddItem(_UserMenuItem("User info" B_UTF8_ELLIPSIS, infoMsg, 0,
0, 0, false, false)); 0, 0, false, false));
BMessage* kickMsg = new BMessage(IM_MESSAGE); BMessage* kickMsg = new BMessage(IM_MESSAGE);
kickMsg->AddInt32("im_what", IM_ROOM_KICK_PARTICIPANT); kickMsg->AddInt32("im_what", IM_ROOM_KICK_PARTICIPANT);
target->PostMessage(_UserMenuItem("Kick user", kickMsg, PERM_KICK, 0, 0, items.AddItem(_UserMenuItem("Kick user", kickMsg, PERM_KICK, 0, 0,
false, true)); false, true));
BMessage* banMsg = new BMessage(IM_MESSAGE); BMessage* banMsg = new BMessage(IM_MESSAGE);
banMsg->AddInt32("im_what", IM_ROOM_BAN_PARTICIPANT); banMsg->AddInt32("im_what", IM_ROOM_BAN_PARTICIPANT);
target->PostMessage(_UserMenuItem("Ban user", banMsg, PERM_BAN, 0, 0, false, items.AddItem(_UserMenuItem("Ban user", banMsg, PERM_BAN, 0, 0, false,
true)); true));
BMessage* muteMsg = new BMessage(IM_MESSAGE); BMessage* muteMsg = new BMessage(IM_MESSAGE);
muteMsg->AddInt32("im_what", IM_ROOM_MUTE_PARTICIPANT); muteMsg->AddInt32("im_what", IM_ROOM_MUTE_PARTICIPANT);
target->PostMessage(_UserMenuItem("Mute user", muteMsg, PERM_MUTE, items.AddItem(_UserMenuItem("Mute user", muteMsg, PERM_MUTE,
PERM_WRITE, 0, false, true)); PERM_WRITE, 0, false, true));
BMessage* unmuteMsg = new BMessage(IM_MESSAGE); BMessage* unmuteMsg = new BMessage(IM_MESSAGE);
unmuteMsg->AddInt32("im_what", IM_ROOM_UNMUTE_PARTICIPANT); unmuteMsg->AddInt32("im_what", IM_ROOM_UNMUTE_PARTICIPANT);
target->PostMessage(_UserMenuItem("Unmute user", unmuteMsg, PERM_MUTE, 0, items.AddItem(_UserMenuItem("Unmute user", unmuteMsg, PERM_MUTE, 0,
PERM_WRITE, false, true)); PERM_WRITE, false, true));
BMessage* deafenMsg = new BMessage(IM_MESSAGE); BMessage* deafenMsg = new BMessage(IM_MESSAGE);
deafenMsg->AddInt32("im_what", IM_ROOM_DEAFEN_PARTICIPANT); deafenMsg->AddInt32("im_what", IM_ROOM_DEAFEN_PARTICIPANT);
target->PostMessage(_UserMenuItem("Deafen user", deafenMsg, PERM_DEAFEN, items.AddItem(_UserMenuItem("Deafen user", deafenMsg, PERM_DEAFEN,
PERM_READ, 0, false, true)); PERM_READ, 0, false, true));
BMessage* undeafenMsg = new BMessage(IM_MESSAGE); BMessage* undeafenMsg = new BMessage(IM_MESSAGE);
undeafenMsg->AddInt32("im_what", IM_ROOM_UNDEAFEN_PARTICIPANT); undeafenMsg->AddInt32("im_what", IM_ROOM_UNDEAFEN_PARTICIPANT);
target->PostMessage(_UserMenuItem("Undeafen user", undeafenMsg, PERM_DEAFEN, items.AddItem(_UserMenuItem("Undeafen user", undeafenMsg, PERM_DEAFEN,
0, PERM_READ, false, true)); 0, PERM_READ, false, true));
return items;
} }
@ -159,8 +163,6 @@ _UserMenuItem(const char* label, BMessage* msg, int32 user_perms,
bool toProtocol) bool toProtocol)
{ {
BMessage* item = new BMessage(IM_MESSAGE); BMessage* item = new BMessage(IM_MESSAGE);
item->AddInt32("im_what", IM_REGISTER_USERLIST_ITEM);
item->AddString("class", "BMenuItem"); item->AddString("class", "BMenuItem");
item->AddString("_label", label); item->AddString("_label", label);
item->AddMessage("_msg", msg); item->AddMessage("_msg", msg);

View File

@ -7,13 +7,12 @@
#include <ObjectList.h> #include <ObjectList.h>
class BLooper;
class BMessage; class BMessage;
void DefaultCommands(BLooper* target); BObjectList<BMessage> DefaultCommands();
void DefaultChatPopUpItems(BLooper* target); BObjectList<BMessage> DefaultChatPopUpItems();
void DefaultUserPopUpItems(BLooper* target); BObjectList<BMessage> DefaultUserPopUpItems();
BMessage* _UserMenuItem(const char* label, BMessage* msg, BMessage* _UserMenuItem(const char* label, BMessage* msg,
int32 user_perms, int32 target_perms, int32 user_perms, int32 target_perms,
int32 target_lacks, bool ignorePriority, int32 target_lacks, bool ignorePriority,

View File

@ -29,6 +29,8 @@ ProtocolLooper::ProtocolLooper(CayaProtocol* protocol, int64 instance)
Account* account = reinterpret_cast<Account*>( Account* account = reinterpret_cast<Account*>(
protocol->MessengerInterface()); protocol->MessengerInterface());
_InitCommands();
BString name(protocol->FriendlySignature()); BString name(protocol->FriendlySignature());
name << " - " << account->Name(); name << " - " << account->Name();
@ -165,55 +167,6 @@ ProtocolLooper::CommandById(BString id)
} }
void
ProtocolLooper::AddCommand(ChatCommand* cmd)
{
fCommands.AddItem(cmd->GetName(), cmd);
}
BObjectList<BMessage>
ProtocolLooper::UserPopUpItems() const
{
return fUserItems;
}
void
ProtocolLooper::AddUserPopUpItem(BMessage* archived)
{
fUserItems.AddItem(archived);
}
BObjectList<BMessage>
ProtocolLooper::ChatPopUpItems() const
{
return fChatItems;
}
void
ProtocolLooper::AddChatPopUpItem(BMessage* archived)
{
fChatItems.AddItem(archived);
}
BObjectList<BMessage>
ProtocolLooper::MenuBarItems() const
{
return fMenuItems;
}
void
ProtocolLooper::AddMenuBarItem(BMessage* archived)
{
fMenuItems.AddItem(archived);
}
BString BString
ProtocolLooper::GetOwnId() ProtocolLooper::GetOwnId()
{ {
@ -245,3 +198,12 @@ ProtocolLooper::GetListItem()
} }
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);
}
}

View File

@ -52,19 +52,6 @@ public:
CommandMap Commands() const; CommandMap Commands() const;
ChatCommand* CommandById(BString id); ChatCommand* CommandById(BString id);
void AddCommand(ChatCommand* cmd);
BObjectList<BMessage>
UserPopUpItems() const;
void AddUserPopUpItem(BMessage* archived);
BObjectList<BMessage>
ChatPopUpItems() const;
void AddChatPopUpItem(BMessage* archived);
BObjectList<BMessage>
MenuBarItems() const;
void AddMenuBarItem(BMessage* archived);
BString GetOwnId(); BString GetOwnId();
void SetOwnId(BString user_id); void SetOwnId(BString user_id);
@ -75,6 +62,8 @@ public:
GetListItem(); GetListItem();
private: private:
void _InitCommands();
CayaProtocol* fProtocol; CayaProtocol* fProtocol;
int64 fInstance; int64 fInstance;
@ -83,11 +72,7 @@ private:
ChatMap fChatMap; ChatMap fChatMap;
RosterMap fRosterMap; RosterMap fRosterMap;
UserMap fUserMap; UserMap fUserMap;
CommandMap fCommands; CommandMap fCommands;
BObjectList<BMessage> fUserItems;
BObjectList<BMessage> fChatItems;
BObjectList<BMessage> fMenuItems;
ConversationAccountItem* ConversationAccountItem*
fListItem; fListItem;

View File

@ -42,8 +42,15 @@
Server::Server() Server::Server()
: :
BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE) BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
fChatItems(DefaultChatPopUpItems()),
fUserItems(DefaultUserPopUpItems())
{ {
BObjectList<BMessage> commands = DefaultCommands();
for (int i = 0; i < commands.CountItems(); i++) {
ChatCommand* cmd = new ChatCommand(commands.ItemAt(i));
fCommands.AddItem(cmd->GetName(), cmd);
}
} }
@ -535,43 +542,6 @@ Server::ImMessage(BMessage* msg)
break; break;
} }
case IM_REGISTER_COMMAND:
{
ChatCommand* cmd = new ChatCommand(msg);
if (cmd == NULL) break;
ProtocolLooper* looper = _LooperFromMessage(msg);
if (looper == NULL)
fCommands.AddItem(cmd->GetName(), cmd);
else
looper->AddCommand(cmd);
break;
}
case IM_REGISTER_USERLIST_ITEM:
{
ProtocolLooper* looper = _LooperFromMessage(msg);
if (looper == NULL)
fUserItems.AddItem(new BMessage(*msg));
else
looper->AddUserPopUpItem(new BMessage(*msg));
break;
}
case IM_REGISTER_CHATLIST_ITEM:
{
ProtocolLooper* looper = _LooperFromMessage(msg);
if (looper == NULL)
fChatItems.AddItem(new BMessage(*msg));
else
looper->AddChatPopUpItem(new BMessage(*msg));
break;
}
case IM_REGISTER_MENUBAR_ITEM:
{
ProtocolLooper* looper = _LooperFromMessage(msg);
if (looper != NULL)
looper->AddMenuBarItem(new BMessage(*msg));
break;
}
case IM_PROTOCOL_READY: case IM_PROTOCOL_READY:
{ {
// Ready notification // Ready notification
@ -956,5 +926,3 @@ Server::_GetRole(BMessage* msg)
return new Role(title, perms, priority); return new Role(title, perms, priority);
} }

View File

@ -167,7 +167,7 @@ ConversationListView::_ConversationPopUp()
Server* server = ((TheApp*)be_app)->GetMainWindow()->GetServer(); Server* server = ((TheApp*)be_app)->GetMainWindow()->GetServer();
BObjectList<BMessage> items = server->ChatPopUpItems(); BObjectList<BMessage> items = server->ChatPopUpItems();
BObjectList<BMessage> protoItems = looper->ChatPopUpItems(); BObjectList<BMessage> protoItems = looper->Protocol()->ChatPopUpItems();
items.AddList(&protoItems); items.AddList(&protoItems);
for (int i = 0; i < items.CountItems(); i++) { for (int i = 0; i < items.CountItems(); i++) {

View File

@ -65,7 +65,7 @@ UserListView::_UserPopUp()
Server* server = ((TheApp*)be_app)->GetMainWindow()->GetServer(); Server* server = ((TheApp*)be_app)->GetMainWindow()->GetServer();
BObjectList<BMessage> items = server->UserPopUpItems(); BObjectList<BMessage> items = server->UserPopUpItems();
BObjectList<BMessage> protoItems = fChat->GetProtocolLooper()->UserPopUpItems(); BObjectList<BMessage> protoItems = fChat->GetProtocolLooper()->Protocol()->UserPopUpItems();
items.AddList(&protoItems); items.AddList(&protoItems);
for (int i = 0; i < items.CountItems(); i++) { for (int i = 0; i < items.CountItems(); i++) {

View File

@ -54,11 +54,6 @@ MainWindow::MainWindow()
fServer = new Server(); fServer = new Server();
AddFilter(fServer); AddFilter(fServer);
// Register default commands & items
DefaultCommands(this);
DefaultUserPopUpItems(this);
DefaultChatPopUpItems(this);
// Also through the editing filter (enter to send) // Also through the editing filter (enter to send)
AddCommonFilter(new EditingFilter(fSendView)); AddCommonFilter(new EditingFilter(fSendView));
fSendView->MakeFocus(true); fSendView->MakeFocus(true);
@ -382,7 +377,7 @@ MainWindow::SetConversation(Conversation* chat)
// Add and populate "Protocol" menu, if appropriate // Add and populate "Protocol" menu, if appropriate
if (fConversation != NULL) { if (fConversation != NULL) {
ProtocolLooper* looper = fConversation->GetProtocolLooper(); ProtocolLooper* looper = fConversation->GetProtocolLooper();
BObjectList<BMessage> menuItems = looper->MenuBarItems(); BObjectList<BMessage> menuItems = looper->Protocol()->MenuBarItems();
for (int i = 0; i < menuItems.CountItems(); i++) { for (int i = 0; i < menuItems.CountItems(); i++) {
BMessage* itemMsg = menuItems.ItemAt(i); BMessage* itemMsg = menuItems.ItemAt(i);
BMessage* msg = new BMessage(*itemMsg); BMessage* msg = new BMessage(*itemMsg);

View File

@ -345,6 +345,34 @@ JabberHandler::GetName()
} }
BObjectList<BMessage>
JabberHandler::Commands()
{
return BObjectList<BMessage>();
}
BObjectList<BMessage>
JabberHandler::ChatPopUpItems()
{
return BObjectList<BMessage>();
}
BObjectList<BMessage>
JabberHandler::UserPopUpItems()
{
return BObjectList<BMessage>();
}
BObjectList<BMessage>
JabberHandler::MenuBarItems()
{
return BObjectList<BMessage>();
}
status_t status_t
JabberHandler::UpdateSettings(BMessage* msg) JabberHandler::UpdateSettings(BMessage* msg)
{ {

View File

@ -68,6 +68,11 @@ public:
virtual void SetName(const char* name); virtual void SetName(const char* name);
virtual const char* GetName(); virtual const char* GetName();
virtual BObjectList<BMessage> Commands();
virtual BObjectList<BMessage> ChatPopUpItems();
virtual BObjectList<BMessage> UserPopUpItems();
virtual BObjectList<BMessage> MenuBarItems();
virtual status_t UpdateSettings(BMessage* msg); virtual status_t UpdateSettings(BMessage* msg);
virtual uint32 GetEncoding(); virtual uint32 GetEncoding();