Re-enable logging, make appending messages to ConversationView safer
Now all instances of sending messages (bar status changes) to a conversation's CayaRenderView only happen when attached to the window. Messages sent by user appear after the protocol confirms it's been sent (IM_MESSAGE_SENT), rather than appearing right after the user sends it to the protocol (IM_SEND_MESSAGE). Logs are now re-enabled (since they can safely be appended under any circumstance).
This commit is contained in:
parent
3e202e3609
commit
cd3eb3cbf3
|
@ -57,12 +57,18 @@ Conversation::ImMessage(BMessage* msg)
|
||||||
GetView()->MessageReceived(msg);
|
GetView()->MessageReceived(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IM_SEND_MESSAGE:
|
case IM_MESSAGE_SENT:
|
||||||
{
|
{
|
||||||
_LogChatMessage(msg);
|
_LogChatMessage(msg);
|
||||||
|
GetView()->MessageReceived(msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IM_SEND_MESSAGE:
|
||||||
|
{
|
||||||
fMessenger.SendMessage(msg);
|
fMessenger.SendMessage(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IM_LOGS_RECEIVED:
|
||||||
default:
|
default:
|
||||||
GetView()->MessageReceived(msg);
|
GetView()->MessageReceived(msg);
|
||||||
}
|
}
|
||||||
|
@ -169,8 +175,20 @@ Conversation::AddUser(User* user)
|
||||||
ConversationView*
|
ConversationView*
|
||||||
Conversation::GetView()
|
Conversation::GetView()
|
||||||
{
|
{
|
||||||
if (fChatView == NULL)
|
if (fChatView != NULL)
|
||||||
|
return fChatView;
|
||||||
|
|
||||||
fChatView = new ConversationView(this);
|
fChatView = new ConversationView(this);
|
||||||
|
|
||||||
|
if (fLooper->Protocol()->SaveLogs() == false)
|
||||||
|
return fChatView;
|
||||||
|
|
||||||
|
BStringList logs = _GetChatLogs();
|
||||||
|
BMessage logMsg(IM_MESSAGE);
|
||||||
|
logMsg.AddInt32("im_what", IM_LOGS_RECEIVED);
|
||||||
|
logMsg.AddStrings("body", logs);
|
||||||
|
fChatView->MessageReceived(&logMsg);
|
||||||
|
|
||||||
return fChatView;
|
return fChatView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -347,6 +347,7 @@ Server::ImMessage(BMessage* msg)
|
||||||
conversation->GetProtocolLooper()->PostMessage(msg);
|
conversation->GetProtocolLooper()->PostMessage(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IM_MESSAGE_SENT:
|
||||||
case IM_MESSAGE_RECEIVED:
|
case IM_MESSAGE_RECEIVED:
|
||||||
{
|
{
|
||||||
Conversation* item = _EnsureConversation(msg);
|
Conversation* item = _EnsureConversation(msg);
|
||||||
|
|
|
@ -123,8 +123,6 @@ ConversationView::MessageReceived(BMessage* message)
|
||||||
if (text == "")
|
if (text == "")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fReceiveView->AppendOwnMessage(text.String());
|
|
||||||
|
|
||||||
BMessage msg(IM_MESSAGE);
|
BMessage msg(IM_MESSAGE);
|
||||||
msg.AddInt32("im_what", IM_SEND_MESSAGE);
|
msg.AddInt32("im_what", IM_SEND_MESSAGE);
|
||||||
msg.AddString("chat_id", fConversation->GetId());
|
msg.AddString("chat_id", fConversation->GetId());
|
||||||
|
@ -192,33 +190,17 @@ ConversationView::ImMessage(BMessage* msg)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If not attached to the chat window, then re-handle this message
|
_AppendOrEnqueueMessage(msg);
|
||||||
// later [AttachedToWindow()], since that's required to append to
|
|
||||||
// fReceiveview.
|
|
||||||
if (Window() == NULL) {
|
|
||||||
fMessageQueue.AddItem(new BMessage(*msg));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now we're free to append!
|
|
||||||
Window()->LockLooper();
|
|
||||||
fReceiveView->AppendOtherMessage(uname.String(), message.String());
|
|
||||||
Window()->UnlockLooper();
|
|
||||||
|
|
||||||
// Message received, clear status anyway
|
// Message received, clear status anyway
|
||||||
fStatus->SetText("");
|
// fStatus->SetText("");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IM_MESSAGE_SENT:
|
||||||
case IM_LOGS_RECEIVED:
|
case IM_LOGS_RECEIVED:
|
||||||
{
|
{
|
||||||
BStringList logs;
|
_AppendOrEnqueueMessage(msg);
|
||||||
if (msg->FindStrings("log", &logs) != B_OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int i = logs.CountStrings(); i >= 0; i--)
|
|
||||||
fReceiveView->AppendGenericMessage(logs.StringAt(i).String());
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IM_CONTACT_STARTED_TYPING:
|
case IM_CONTACT_STARTED_TYPING:
|
||||||
|
@ -309,3 +291,52 @@ ConversationView::AppendStatus(CayaStatus status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
ConversationView::_AppendOrEnqueueMessage(BMessage* msg)
|
||||||
|
{
|
||||||
|
// If not attached to the chat window, then re-handle this message
|
||||||
|
// later [AttachedToWindow()], since you can't edit an unattached
|
||||||
|
// RenderView.
|
||||||
|
if (Window() == NULL) {
|
||||||
|
fMessageQueue.AddItem(new BMessage(*msg));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alright, we're good to append!
|
||||||
|
_AppendMessage(msg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ConversationView::_AppendMessage(BMessage* msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
BString message = msg->FindString("body");
|
||||||
|
BString id = msg->FindString("user_id");
|
||||||
|
BString uname = "";
|
||||||
|
|
||||||
|
if (id.IsEmpty() == false) {
|
||||||
|
User* sender = fConversation->UserById(id);
|
||||||
|
|
||||||
|
if (sender == NULL || (uname = sender->GetName()) == NULL)
|
||||||
|
uname = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg->FindInt32("im_what") == IM_MESSAGE_SENT)
|
||||||
|
fReceiveView->AppendOwnMessage(message.String());
|
||||||
|
|
||||||
|
else if (uname.IsEmpty() == false)
|
||||||
|
fReceiveView->AppendOtherMessage(uname.String(), message.String());
|
||||||
|
|
||||||
|
else {
|
||||||
|
BStringList bodies;
|
||||||
|
if (msg->FindStrings("body", &bodies) != B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = bodies.CountStrings(); i >= 0; i--)
|
||||||
|
fReceiveView->AppendGenericMessage(bodies.StringAt(i).String());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,9 @@ public:
|
||||||
void AvoidFocus(bool avoid);
|
void AvoidFocus(bool avoid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool _AppendOrEnqueueMessage(BMessage* msg);
|
||||||
|
void _AppendMessage(BMessage* msg);
|
||||||
|
|
||||||
Conversation* fConversation;
|
Conversation* fConversation;
|
||||||
Contact* fContact;
|
Contact* fContact;
|
||||||
CayaRenderView* fReceiveView;
|
CayaRenderView* fReceiveView;
|
||||||
|
|
Ŝarĝante…
Reference in New Issue