diff --git a/application/CayaProtocolMessages.h b/application/CayaProtocolMessages.h index 15537cc..d5c3918 100644 --- a/application/CayaProtocolMessages.h +++ b/application/CayaProtocolMessages.h @@ -41,14 +41,18 @@ enum im_what_code { // "roster" template (CayaProtocol::SettingsTemplate("roster")) IM_CONTACT_LIST_ADD_CONTACT = 3, - //! Someone has been added →Caya + //! Remove a contact →Protocol // Requires: String "user_id" - // Allows: String "user_name" - IM_CONTACT_LIST_CONTACT_ADDED = 4, + IM_CONTACT_LIST_REMOVE_CONTACT = 4, //! Contact(s) removed from the server-side list →Caya // Requires: String "user_id" - IM_CONTACT_LIST_REMOVED_CONTACT = 4, + IM_CONTACT_LIST_REMOVED_CONTACT = 5, + + //! Edit some data on contact →Protocol + // The slots for this message are determined by the protocol's + // "roster" template (CayaProtocol::SettingsTemplate("roster")) + IM_CONTACT_LIST_EDIT_CONTACT = 6, /* diff --git a/application/windows/MainWindow.cpp b/application/windows/MainWindow.cpp index 714261e..3b30567 100644 --- a/application/windows/MainWindow.cpp +++ b/application/windows/MainWindow.cpp @@ -46,7 +46,6 @@ MainWindow::MainWindow() fWorkspaceChanged(false), fConversation(NULL), fRosterWindow(NULL), - fRosterEditWindow(NULL), fServer(NULL) { _InitInterface(); @@ -173,8 +172,7 @@ MainWindow::MessageReceived(BMessage* message) } case CAYA_EDIT_ROSTER: { - fRosterEditWindow = new RosterEditWindow(fServer); - fRosterEditWindow->Show(); + RosterEditWindow::Get(fServer)->Show(); break; } case CAYA_MOVE_UP: @@ -292,8 +290,8 @@ MainWindow::ImMessage(BMessage* msg) case IM_STATUS_SET: if (fRosterWindow != NULL) fRosterWindow->PostMessage(msg); - if (fRosterEditWindow != NULL) - fRosterEditWindow->PostMessage(msg); + if (RosterEditWindow::Check() == true) + RosterEditWindow::Get(fServer)->PostMessage(msg); break; case IM_PROTOCOL_READY: diff --git a/application/windows/RosterEditWindow.cpp b/application/windows/RosterEditWindow.cpp index 25f2411..eb2ec3c 100644 --- a/application/windows/RosterEditWindow.cpp +++ b/application/windows/RosterEditWindow.cpp @@ -36,12 +36,15 @@ const uint32 kEditMember = 'RWEM'; const uint32 kSelAccount = 'RWSA'; const uint32 kSelNoAccount = 'RWNA'; +RosterEditWindow* RosterEditWindow::fInstance = NULL; + RosterEditWindow::RosterEditWindow(Server* server) : BWindow(BRect(0, 0, 300, 400), "Roster", B_FLOATING_WINDOW, 0), fAccounts(server->GetAccounts()), - fServer(server) + fServer(server), + fEditingWindow(NULL) { fRosterView = new RosterView("buddyView", server); fRosterView->SetInvocationMessage(new BMessage(kEditMember)); @@ -85,22 +88,69 @@ RosterEditWindow::RosterEditWindow(Server* server) } +RosterEditWindow::~RosterEditWindow() +{ + fInstance = NULL; +} + + +RosterEditWindow* +RosterEditWindow::Get(Server* server) +{ + if (fInstance == NULL) { + fInstance = new RosterEditWindow(server); + } + return fInstance; +} + + +bool +RosterEditWindow::Check() +{ + return (fInstance != NULL); +} + + void RosterEditWindow::MessageReceived(BMessage* message) { switch (message->what) { case kEditMember: { + if (fEditingWindow != NULL && fEditingWindow->Lock()) { + fEditingWindow->Quit(); + fEditingUser.SetTo(""); + } + int index = message->FindInt32("index"); RosterItem* ritem = fRosterView->ListView()->RosterItemAt(index); if (ritem == NULL) return; - User* user = ritem->GetContact(); - TemplateWindow* win = - new TemplateWindow("Editing contact", "roster", new BMessage(), - fServer, user->GetProtocolLooper()->GetInstance()); - win->Show(); + User* user = ritem->GetContact(); + fEditingUser.SetTo(user->GetId().String()); + + // The response IM_EXTENDED_CONTACT_INFO is used to populate the + // TemplateWindow. + BMessage* request = new BMessage(IM_MESSAGE); + request->AddInt32("im_what", IM_GET_EXTENDED_CONTACT_INFO); + request->AddString("user_id", user->GetId()); + user->GetProtocolLooper()->PostMessage(request); + + BMessage* edit = new BMessage(IM_MESSAGE); + edit->AddInt32("im_what", IM_CONTACT_LIST_EDIT_CONTACT); + + fEditingWindow = + new TemplateWindow("Editing contact", "roster", edit, fServer, + user->GetProtocolLooper()->GetInstance()); + fEditingWindow->Show(); + break; + } + case IM_MESSAGE: { + if (message->GetInt32("im_what", 0) == IM_EXTENDED_CONTACT_INFO) + if (message->GetString("user_id", "") == fEditingUser) + fEditingWindow->PostMessage(message); + fRosterView->MessageReceived(message); break; } case kAddMember: diff --git a/application/windows/RosterEditWindow.h b/application/windows/RosterEditWindow.h index 975e852..03dddd5 100644 --- a/application/windows/RosterEditWindow.h +++ b/application/windows/RosterEditWindow.h @@ -19,23 +19,32 @@ class BMenuField; class RosterItem; class RosterView; +class TemplateWindow; /* A window with the a list of the user's contacts, will send a message to the server with contact info, once a contact is selected. */ class RosterEditWindow : public BWindow { public: - RosterEditWindow(Server* server); - void MessageReceived(BMessage* message); + RosterEditWindow(Server* server); + ~RosterEditWindow(); + static RosterEditWindow* Get(Server* server); + static bool Check(); - void UpdateListItem(RosterItem* item); + void MessageReceived(BMessage* message); + void UpdateListItem(RosterItem* item); private: BMenuField* fAccountField; AccountInstances fAccounts; + BString fEditingUser; + TemplateWindow* fEditingWindow; + Server* fServer; RosterView* fRosterView; + + static RosterEditWindow* fInstance; }; #endif // _ROSTER_EDIT_WINDOW_H diff --git a/application/windows/TemplateWindow.cpp b/application/windows/TemplateWindow.cpp index be4382b..9e1ec3b 100644 --- a/application/windows/TemplateWindow.cpp +++ b/application/windows/TemplateWindow.cpp @@ -17,6 +17,7 @@ #include #include +#include "CayaProtocolMessages.h" #include "CayaUtils.h" #include "TemplateView.h" @@ -69,12 +70,13 @@ void TemplateWindow::MessageReceived(BMessage* msg) { switch (msg->what) { - case kAccSelected: - { - int32 index; - if (msg->FindInt32("index", &index) == B_OK) - fSelectedAcc = index; - _LoadTemplate(); + case IM_MESSAGE: { + // If IM_MESSAGE, assume it should be treated as current settings + if (fTemplate == NULL) + break; + for (int i = 0; fTemplateView->CountChildren(); i++) + fTemplateView->RemoveChild(fTemplateView->ChildAt(i)); + fTemplate->Load(fTemplateView, msg); break; } case kOK: { @@ -100,8 +102,14 @@ TemplateWindow::MessageReceived(BMessage* msg) Close(); break; } - case kChanged: + case kAccSelected: + { + int32 index; + if (msg->FindInt32("index", &index) == B_OK) + fSelectedAcc = index; + _LoadTemplate(); break; + } default: BWindow::MessageReceived(msg); } diff --git a/protocols/xmpp/JabberHandler.cpp b/protocols/xmpp/JabberHandler.cpp index ede34f5..d7bc4f5 100644 --- a/protocols/xmpp/JabberHandler.cpp +++ b/protocols/xmpp/JabberHandler.cpp @@ -242,6 +242,13 @@ JabberHandler::Process(BMessage* msg) _MUCModeration(msg); break; + case IM_GET_EXTENDED_CONTACT_INFO: { + BString user_id; + if (msg->FindString("user_id", &user_id) == B_OK) + fVCardManager->fetchVCard(gloox::JID(user_id.String()), this); + break; + } + case IM_CONTACT_LIST_ADD_CONTACT: { BString user_name = msg->FindString("user_name"); BString user_id; @@ -254,6 +261,24 @@ JabberHandler::Process(BMessage* msg) fClient->rosterManager()->synchronize(); break; } + + case IM_CONTACT_LIST_EDIT_CONTACT: { + BString user_id; + BString user_name = msg->FindString("user_name"); + if (msg->FindString("user_id", &user_id) != B_OK) + break; + + gloox::JID jid(user_id.String()); + gloox::RosterItem* item = + fClient->rosterManager()->getRosterItem(jid); + + if (item != NULL && user_name.IsEmpty() == false) { + item->setName(user_name.String()); + fClient->rosterManager()->synchronize(); + } + break; + } + default: return B_ERROR; } @@ -1761,13 +1786,18 @@ JabberHandler::handleVCard(const gloox::JID& jid, const gloox::VCard* card) gloox::VCard::Name name = card->name(); gloox::VCard::Photo photo = card->photo(); + BString nick(card->nickname().c_str()); + + gloox::RosterItem* item = fClient->rosterManager()->getRosterItem(jid); + if (item != NULL) + nick = item->name().c_str(); std::string fullName = name.family + " " + name.given; BMessage msg(IM_MESSAGE); msg.AddInt32("im_what", IM_EXTENDED_CONTACT_INFO); msg.AddString("user_id", jid.bare().c_str()); - msg.AddString("user_name", card->nickname().c_str()); + msg.AddString("user_name", nick); msg.AddString("family_name", name.family.c_str()); msg.AddString("given_name", name.given.c_str()); msg.AddString("middle_name", name.middle.c_str());