private bool AskMessageInfo(String msgId, String msgStamp)
        {
            Boolean          result      = false;
            ManualResetEvent manualEvent = new ManualResetEvent(false);

            XamarinApplication.RbInstantMessaging.GetOneMessageFromConversationId(this.conversationId, msgId, msgStamp, callback =>
            {
                if (callback.Result.Success)
                {
                    result = true;
                    Rainbow.Model.Message rbMessage = callback.Data;
                    if (rbMessage != null)
                    {
                        List <Model.Message> messagesList = GetMessagesByReplyId(msgId);
                        foreach (Model.Message message in messagesList)
                        {
                            SetReplyPartOfMessage(message, rbMessage);
                        }
                    }
                }
                manualEvent.Set();
            });

            manualEvent.WaitOne();
            manualEvent.Dispose();

            return(result);
        }
Example #2
0
        private void SdkWrapper_FileUploadUpdated(object sender, FileUploadEventArgs e)
        {
            if (e.FileDescriptor.Id == uploadFileDescriptorIdInProgress)
            {
                if (!e.InProgress)
                {
                    FileUploadModel fileUploadModel = GetFileUploadByFileDescriptorId(uploadFileDescriptorIdInProgress);
                    if (e.Completed)
                    {
                        // Send message
                        Conversation          conversation = Helper.SdkWrapper.GetConversationByPeerIdFromCache(fileUploadModel.PeerId);
                        Rainbow.Model.Message message      = fileUploadModel.RbMessage;
                        Helper.SdkWrapper.SendMessage(conversation, ref message);

                        // Remove this file from dictionaries
                        RemoveFileByFullPath(fileUploadModel.FileFullPath); // The stream is closed in this method
                    }
                    else
                    {
                        UploadCannnotBeDone(fileUploadModel);
                    }

                    // The upload is finished
                    uploadFileDescriptorIdInProgress = null;

                    // Use upload pool
                    UseUploadPool();
                }
            }
        }
Example #3
0
        private Rainbow.Model.Message CreateRbMessage(FileUploadModel fileUploadModel, String toJid)
        {
            String fromJid      = Helper.SdkWrapper.GetCurrentContactJid();
            String fromResource = Helper.SdkWrapper.GetResourceId();

            Restrictions.SDKMessageStorageMode messageStorageMode = Helper.SdkWrapper.GetMessageStorageMode();

            // Create Rainbow.Message
            Rainbow.Model.Message message = Rainbow.Model.Message.FromTextAndFileDescriptor(fromJid, fromResource, toJid, fileUploadModel.PeerType, "", fileUploadModel.Urgency, null, null, messageStorageMode, fileUploadModel.FileDescriptor);
            message.Content = "";

            return(message);
        }
 private void AskMessageInfo()
 {
     Helper.SdkWrapper.GetOneMessageFromConversationId(message.ConversationId, message.Reply.Id, message.Reply.Stamp, callback =>
     {
         if (callback.Result.Success)
         {
             Rainbow.Model.Message rbMessage = callback.Data;
             if (rbMessage != null)
             {
                 log.LogDebug("[AskMessageInfo] Id:[{0}] - Reply.Id:[{1}] - Content:[2}]", message.Id, message.Reply.Id, rbMessage.Content);
                 SetReplyPartOfMessage(rbMessage);
             }
         }
     });
 }
        private void MessageContentReply_BindingContextChanged(object sender, EventArgs e)
        {
            if (BindingContext != null)
            {
                try
                {
                    message = (MessageElementModel)BindingContext;
                }
                catch { }

                if ((message != null) && !String.IsNullOrEmpty(message.ConversationId))
                {
                    String backgroundColorKey;
                    if ((message.Peer.Id != Helper.SdkWrapper.GetCurrentContactId()) || usedAsInput)
                    {
                        backgroundColorKey = "ColorConversationStreamMessageOtherUserBackGround";
                    }
                    else
                    {
                        backgroundColorKey = "ColorConversationStreamMessageCurrentUserBackGround";
                    }
                    BackgroundColor = Helper.GetResourceDictionaryById <Color>(backgroundColorKey);

                    // By default there is no Image visible
                    Image.IsVisible = true;

                    InitEvents();

                    // We need to get Name and text of the replied message ...
                    Rainbow.Model.Message rbRepliedMessage = Helper.SdkWrapper.GetOneMessageFromConversationIdFromCache(message.ConversationId, message.Reply.Id);

                    if (rbRepliedMessage != null)
                    {
                        log.LogDebug("[MessageContentReply_BindingContextChanged] Id:[{0}] - Reply.Id:[{1}] - Content:[2}]", message.Id, message.Reply.Id, rbRepliedMessage.Content);
                        SetReplyPartOfMessage(rbRepliedMessage);
                    }
                    else
                    {
                        AskMessageInfo();
                    }
                }
            }
        }
        private void SetReplyPartOfMessage(Model.Message message, Rainbow.Model.Message rbRepliedMessage)
        {
            // Store Jid of the message sender
            message.ReplyPeerJid = rbRepliedMessage.FromJid;
            if (String.IsNullOrEmpty(rbRepliedMessage.Content))
            {
                if (rbRepliedMessage.FileAttachment != null)
                {
                    message.ReplyBody = rbRepliedMessage.FileAttachment.Name;
                }
                else
                {
                    message.ReplyBody = rbRepliedMessage.Id; // Bad display but should permit to debug this situation
                }
            }
            else
            {
                message.ReplyBody = rbRepliedMessage.Content;
            }


            log.Debug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - replyBody:[{2}] - ContactJid:[{3}]", message.Id, rbRepliedMessage.Id, message.ReplyBody, rbRepliedMessage.FromJid);

            Rainbow.Model.Contact contactReply = XamarinApplication.RbContacts.GetContactFromContactJid(rbRepliedMessage.FromJid);
            if (contactReply != null)
            {
                // Reply part is visible
                message.ReplyPartIsVisible = "True";

                message.ReplyPeerId          = contactReply.Id;
                message.ReplyPeerDisplayName = Util.GetContactDisplayName(contactReply);
            }
            else
            {
                log.Debug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - UnknownContactJid[{2}]", message.Id, rbRepliedMessage.Id, rbRepliedMessage.FromJid);
                // We ask to have more info about this contact using AvatarPool
                avatarPool.AddUnknownContactToPoolByJid(rbRepliedMessage.FromJid);
            }

            // We store info about this contact in reply context
            AddRepliedContactInvolved(rbRepliedMessage.FromJid);
        }
        private InstantMessaging.Model.Message GetMessageFromRBMessage(Rainbow.Model.Message rbMessage, String conversationType)
        {
            InstantMessaging.Model.Message message = null;
            if (rbMessage != null)
            {
                InstantMessaging.App XamarinApplication = (InstantMessaging.App)Xamarin.Forms.Application.Current;
                AvatarPool           avatarPool         = AvatarPool.Instance;

                //log.Debug("[GetMessageFromRBMessage] Message.Id:[{0}] - Message.ReplaceId:[{1}] - DateTime:[{2}] - Content:[{3}]", rbMessage.Id, rbMessage.ReplaceId, rbMessage.Date.ToString("o"), rbMessage.Content);

                message = new InstantMessaging.Model.Message();
                message.EventMessageBodyPart2Color = Color.Black; // Set default value

                Rainbow.Model.Contact contact = XamarinApplication.RbContacts.GetContactFromContactJid(rbMessage.FromJid);
                if (contact != null)
                {
                    message.PeerId = contact.Id;

                    message.PeerDisplayName = Util.GetContactDisplayName(contact);
                    message.BackgroundColor = Color.FromHex(Rainbow.Helpers.AvatarPool.GetColorFromDisplayName(message.PeerDisplayName));
                }
                else
                {
                    message.BackgroundColor = Color.FromHex(Rainbow.Helpers.AvatarPool.GetColorFromDisplayName(""));

                    // We ask to have more info about this contact usin AvatarPool
                    avatarPool.AddUnknownContactToPoolByJid(rbMessage.FromJid);
                }

                // We have the display name only in Room / Bubble context
                message.PeerDisplayNameIsVisible = (conversationType == Rainbow.Model.Conversation.ConversationType.Room) ? "True" : "False";

                message.Id      = rbMessage.Id;
                message.PeerJid = rbMessage.FromJid;

                message.MessageDateTime    = rbMessage.Date;
                message.MessageDateDisplay = Helper.HumanizeDateTime(rbMessage.Date);

                // Receipt
                SetReceiptPartOfMessage(message, rbMessage.Receipt);

                // Is-it an "Event message" ?
                String content;
                if (!String.IsNullOrEmpty(rbMessage.BubbleEvent))
                {
                    message.IsEventMessage        = "True";
                    message.EventMessageBodyPart1 = Helper.GetBubbleEventMessageBody(contact, rbMessage.BubbleEvent);
                }
                // Is-it an "CallLog message" ?
                else if (rbMessage.CallLogAttachment != null)
                {
                    SetCallLogPartOfMessage(message, rbMessage.CallLogAttachment);
                }
                else
                {
                    message.IsEventMessage     = "False";
                    message.BodyFontAttributes = FontAttributes.None;
                    message.BodyColor          = (message.PeerJid == currentContactJid) ? Color.Black : Color.White;

                    if (!String.IsNullOrEmpty(rbMessage.Content))
                    {
                        content = rbMessage.Content;
                    }
                    else
                    {
                        if (String.IsNullOrEmpty(rbMessage.ReplaceId))
                        {
                            content = "";
                        }
                        else
                        {
                            content = "This message was deleted.";
                            message.BodyFontAttributes = FontAttributes.Italic;
                            message.BodyColor          = (message.PeerJid == currentContactJid) ? Color.Gray : Color.FromHex(Rainbow.Helpers.AvatarPool.GetDarkerColorFromDisplayName(message.PeerDisplayName));
                        }
                    }

                    // Edited text visible ?
                    message.EditedIsVisible = String.IsNullOrEmpty(rbMessage.ReplaceId) ? "False" : "True";

                    // Reply part
                    // By default is not displayed
                    message.ReplyPartIsVisible = "False";
                    if (rbMessage.ReplyMessage != null)
                    {
                        // Store Id of this reply message
                        message.ReplyId = rbMessage.ReplyMessage.Id;

                        // Set background color
                        message.ReplyBackgroundColor = Color.FromHex(Rainbow.Helpers.AvatarPool.GetDarkerColorFromDisplayName(message.PeerDisplayName));

                        // We need to get Name and text of the replied message ...
                        Rainbow.Model.Message rbRepliedMessage = XamarinApplication.RbInstantMessaging.GetOneMessageFromConversationIdFromCache(this.conversationId, rbMessage.ReplyMessage.Id);
                        if (rbRepliedMessage != null)
                        {
                            SetReplyPartOfMessage(message, rbRepliedMessage);
                        }
                        else
                        {
                            AddUnknownRepliedMessageInvolved(rbMessage.ReplyMessage.Id, rbMessage.ReplyMessage.Stamp);
                        }
                    }
                    else
                    {
                        // Set default color to avoir warning
                        message.ReplyBackgroundColor = Color.White;
                    }

                    // FileAttachment
                    if (rbMessage.FileAttachment != null)
                    {
                        // Set Global info
                        message.FileAttachmentIsVisible  = "True";
                        message.FileDefaultInfoIsVisible = "True";
                        message.FileId   = rbMessage.FileAttachment.Id;
                        message.FileName = rbMessage.FileAttachment.Name;
                        message.FileSize = Helper.HumanizeFileSize(rbMessage.FileAttachment.Size);

                        if (filePool.IsThumbnailFileAvailable(conversationId, rbMessage.FileAttachment.Id, rbMessage.FileAttachment.Name))
                        {
                            SetFileAttachmentSourceOfMessage(message, rbMessage.FileAttachment.Id);
                        }
                        else
                        {
                            // Ask more info about this file
                            filePool.AskFileDescriptorDownload(this.conversationId, rbMessage.FileAttachment.Id);

                            // Set default icon
                            message.FileAttachmentSource       = "icon_unknown_blue";
                            message.FileAttachmentSourceWidth  = 50;
                            message.FileAttachmentSourceHeight = 50;
                        }
                    }
                    else
                    {
                        message.FileAttachmentIsVisible  = "False";
                        message.FileDefaultInfoIsVisible = "False";

                        message.FileAttachmentSourceWidth  = 0;
                        message.FileAttachmentSourceHeight = 0;
                    }

                    message.Body          = content;
                    message.BodyIsVisible = String.IsNullOrEmpty(message.Body) ? "False" : "True";
                }

                // We store info about this contact in message context
                AddContactInvolved(message.PeerJid);
            }
            return(message);
        }
        private void SetReplyPartOfMessage(Rainbow.Model.Message rbRepliedMessage)
        {
            if (message == null)
            {
                return;
            }

            if (message.Reply == null)
            {
                return;
            }

            // Store Jid of the message sender
            message.Reply.Peer.Jid = rbRepliedMessage.FromJid;
            peerJid = rbRepliedMessage.FromJid;

            if (String.IsNullOrEmpty(rbRepliedMessage.Content))
            {
                if (rbRepliedMessage.FileAttachment != null)
                {
                    message.Reply.Content.Body       = rbRepliedMessage.FileAttachment.Name;
                    message.Reply.Content.Attachment = new MessageAttachmentModel()
                    {
                        Id   = rbRepliedMessage.FileAttachment.Id,
                        Name = rbRepliedMessage.FileAttachment.Name,
                        Size = Helper.HumanizeFileSize(rbRepliedMessage.FileAttachment.Size)
                    };

                    attachmentId = message.Reply.Content.Attachment.Id;

                    // Need to manage Thumbnail
                    if (Helper.SdkWrapper.IsThumbnailFileAvailable(message.ConversationId, attachmentId, message.Reply.Content.Attachment.Name))
                    {
                        UpdateThumbnailDisplay();
                    }
                    else
                    {
                        // Manage event(s) from FilePool
                        Helper.SdkWrapper.ThumbnailAvailable += SdkWrapper_ThumbnailAvailable;

                        // Ask more info about this file
                        Helper.SdkWrapper.AskFileDescriptorDownload(message.ConversationId, attachmentId);

                        DisplayAttachment(rbRepliedMessage.FileAttachment.Name);
                    }
                }
                else
                {
                    message.Reply.Content.Body = "File id: " + rbRepliedMessage.Id; // Bad display but should permit to debug this situation
                }
            }
            else
            {
                message.Reply.Content.Body = Helper.ReplaceCRLFFromString(rbRepliedMessage.Content, " ");
            }

            log.LogDebug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - replyBody:[{2}] - ContactJid:[{3}]", message.Id, rbRepliedMessage.Id, message.Reply.Content.Body, rbRepliedMessage.FromJid);


            if (!UpdateContactInfo())
            {
                log.LogDebug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - Unknown Contact Jid:[{2}]", message.Id, rbRepliedMessage.Id, rbRepliedMessage.FromJid);

                // We ask to have more info about this contact using AvatarPool
                Helper.SdkWrapper.AddUnknownContactToPoolByJid(rbRepliedMessage.FromJid);
            }
            else
            {
                UpdateDisplay();
            }
        }