public HistoryCallEventViewModel(VATRPCallEvent callEvent, VATRPContact contact)
            : this()
        {
            this._callEvent = callEvent;
            this._backColor = callEvent.Status == VATRPHistoryEvent.StatusType.Missed ? new SolidColorBrush(Color.FromArgb(255, 0xFE, 0xCD, 0xCD)) : new SolidColorBrush(Color.FromArgb(255, 0xE9, 0xEF, 0xE9));

            UpdateContact(contact);
            LoadCallStateIndicator();

            DateTime callTime =
                VATRP.Core.Model.Utils.Time.ConvertUtcTimeToLocalTime(
                    VATRP.Core.Model.Utils.Time.ConvertDateTimeToLong(callEvent.StartTime) / 1000);
            string dateFormat = "d/MM h:mm tt";
            var    diffTime   = DateTime.Now - callTime;

            if (diffTime.Days == 0)
            {
                dateFormat = "h:mm tt";
            }
            else if (diffTime.Days < 8)
            {
                dateFormat = "ddd h:mm tt";
            }
            else if (diffTime.Days > 365)
            {
                dateFormat = "dd/MM/yy h:mm tt";  //Added YY in date format by MK on dated 02-NOV-2016 TO DISPLAY YEAR IN CALL DATE
            }
            CallDate = callTime.ToString(dateFormat);
        }
Ejemplo n.º 2
0
        internal void UpdateLoggedinContact()
        {
            if (App.CurrentAccount == null || !App.CurrentAccount.Username.NotBlank())
            {
                return;
            }
            var contactAddress = string.Format("{0}@{1}", App.CurrentAccount.Username,
                                               App.CurrentAccount.ProxyHostname);
            VATRPContact contact           = this.ContactService.FindLoggedInContact();
            bool         addLogedInContact = true;

            if (contact != null)
            {
                if (contact.SipUsername == contactAddress)
                {
                    contact.IsLoggedIn = false;
                    addLogedInContact  = false;
                }
            }

            if (addLogedInContact)
            {
                var contactID = new ContactID(contactAddress, IntPtr.Zero);
                contact = new VATRPContact(contactID)
                {
                    IsLoggedIn       = true,
                    Fullname         = App.CurrentAccount.Username,
                    DisplayName      = App.CurrentAccount.DisplayName,
                    RegistrationName =
                        string.Format("sip:{0}@{1}", App.CurrentAccount.Username, App.CurrentAccount.ProxyHostname)
                };
                contact.Initials = contact.Fullname.Substring(0, 1).ToUpper();
                this.ContactService.AddContact(contact, string.Empty);
            }
        }
Ejemplo n.º 3
0
        private void OnConversationClosed(object sender, ConversationEventArgs e)
        {
            if (ServiceManager.Instance.Dispatcher.Thread != Thread.CurrentThread)
            {
                ServiceManager.Instance.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                               new EventHandler <ConversationEventArgs>(OnConversationClosed), sender, new object[] { e });
                return;
            }
            VATRPContact contact = e.Conversation.Contact;

            if (contact != null)
            {
                if (ChatViewContact != null && ChatViewContact.Contact == e.Conversation.Contact)
                {
                    ChatViewContact = null;
                }

                RemoveContact(contact);

                if (this.Chat == e.Conversation)
                {
                    this._chat       = null;
                    MessagesListView = null;
                }
                OnPropertyChanged("Chat");
            }
        }
        internal bool CheckReceiverContact()
        {
            //****************************************************************************************
            // Check Chat message receiver contact. it should not be null.
            //*****************************************************************************************
            var receiver = string.Empty;

            if (ReceiverAddress != null)
            {
                receiver = ReceiverAddress.Trim();
            }

            if (ChatViewContact != null && receiver == ChatViewContact.Contact.RegistrationName)
            {
                return(true);
            }

            VATRPContact contact = _chatsManager.FindContact(new ContactID(receiver, IntPtr.Zero));

            if (contact == null)
            {
                string un, host, dn;
                int    port;
                if (!VATRPCall.ParseSipAddress(receiver, out un,
                                               out host, out port))
                {
                    un = "";
                }

                if (!un.NotBlank())
                {
                    return(false);
                }

                if (string.IsNullOrEmpty(host))
                {
                    host = App.CurrentAccount.ProxyHostname;
                }
                var contactAddress = string.Format("{0}@{1}", un, host);
                var contactID      = new ContactID(contactAddress, IntPtr.Zero);

                contact = new VATRPContact(contactID)
                {
                    DisplayName      = un,
                    Fullname         = un,
                    SipUsername      = un,
                    RegistrationName = contactAddress
                };
                _contactsManager.AddContact(contact, "");
            }

            SetActiveChatContact(contact, IntPtr.Zero);
            if (ReceiverAddress != contact.RegistrationName)
            {
                ReceiverAddress = contact.RegistrationName;
            }

            return(true);
        }
Ejemplo n.º 5
0
        public ContactViewModel(VATRPContact contact)
        {
            //****************************************************************************************************
            // Setting the Contact Status color. If online then Green else Grey
            //****************************************************************************************************
            this._viewModelID = ++IdIncremental;
            this._contact     = contact;

            this.backColor = contact.Status != UserStatus.Offline ? new SolidColorBrush(Color.FromArgb(255, 115, 215, 120)) : new SolidColorBrush(Color.FromArgb(255, 200, 200, 200));
            this._contact.PropertyChanged += _contact_PropertyChanged;
            LoadContactAvatar();
        }
Ejemplo n.º 6
0
 private object FindContact(VATRPContact contact)
 {
     lock (this.Contacts)
     {
         foreach (var c in Contacts)
         {
             if (c.Contact == contact)
             {
                 return(contact);
             }
         }
     }
     return(null);
 }
        internal void DeclineCall(CallViewModel viewModel, string message)
        {
            //***********************************************************************************************************************************
            // Call Declined, Message will contain a message like I am in meeting which was selected when call is declined.
            //***********************************************************************************************************************************
            lock (CallsViewModelList)
            {
                if (FindCallViewModel(viewModel))
                {
                    LOG.Info(String.Format("Declining call for {0}. {1}", viewModel.CallerInfo,
                                           viewModel.ActiveCall.NativeCallPtr));
                    var contactID = new ContactID(
                        string.Format("{0}@{1}", viewModel.ActiveCall.RemoteParty.Username,
                                      viewModel.ActiveCall.RemoteParty.HostAddress), IntPtr.Zero);
                    var contact = ServiceManager.Instance.ContactService.FindContact(contactID);
                    if (contact == null)
                    {
                        contact = new VATRPContact(contactID)
                        {
                            Fullname         = viewModel.ActiveCall.RemoteParty.Username,
                            DisplayName      = viewModel.ActiveCall.RemoteParty.Username,
                            SipUsername      = viewModel.ActiveCall.RemoteParty.Username,
                            RegistrationName = contactID.ID
                        };
                        ServiceManager.Instance.ContactService.AddContact(contact, string.Empty);
                    }
                    viewModel.DeclineCall(false);
                    try
                    {
                        _linphoneService.DeclineCall(viewModel.ActiveCall.NativeCallPtr);
                    }
                    catch (Exception ex)
                    {
                        ServiceManager.LogError("DeclineCall", ex);
                    }

                    if (message.NotBlank())
                    {
                        if (_simpleMessageViewModel != null)
                        {
                            _simpleMessageViewModel.SetActiveChatContact(contact, IntPtr.Zero);
                            _simpleMessageViewModel.SendSimpleMessage(string.Format("{0}{1}", VATRPChatMessage.DECLINE_PREFIX, message));
                        }
                    }
                }
            }
        }
        internal void UpdateContact(VATRPContact newContact)
        {
            if (_contact != null && newContact == null)
            {
                _contact.PropertyChanged -= OnContactPropertyChanged;
            }

            _contact           = newContact;
            _callEvent.Contact = newContact;
            if (_contact != null)
            {
                _contact.PropertyChanged += OnContactPropertyChanged;
                if (_contact.IsLinphoneContact)
                {
                    _allowAddContact = false;
                }
            }
            LoadContactAvatar();
        }
Ejemplo n.º 9
0
        private void AddContact(VATRPContact contact, bool refreshNow = false)
        {
            if (!contact.SipUsername.NotBlank() || !contact.IsLinphoneContact)
            {
                return;
            }

            if (FindContact(contact) != null)
            {
                return;
            }

            lock (this.Contacts)
            {
                contact.PropertyChanged += OnContactPropertyChanged;
                Contacts.Add(new ContactViewModel(contact));
            }

            if (refreshNow)
            {
                ContactsListView.Refresh();
            }
        }
        internal void DeclineCall(CallViewModel viewModel, string message)
        {
            lock (CallsViewModelList)
            {
                if (FindCallViewModel(viewModel))
                {
                    LOG.Info(String.Format("Declining call for {0}. {1}", viewModel.CallerInfo,
                        viewModel.ActiveCall.NativeCallPtr));
                    var contactID = new ContactID(
                            string.Format("{0}@{1}", viewModel.ActiveCall.RemoteParty.Username,
                                viewModel.ActiveCall.RemoteParty.HostAddress), IntPtr.Zero);
                    var contact = ServiceManager.Instance.ContactService.FindContact(contactID);
                    if (contact == null)
                    {
                        contact = new VATRPContact(contactID)
                        {
                            Fullname = viewModel.ActiveCall.RemoteParty.Username,
                            DisplayName = viewModel.ActiveCall.RemoteParty.Username,
                            SipUsername = viewModel.ActiveCall.RemoteParty.Username,
                            RegistrationName = contactID.ID
                        };
                        ServiceManager.Instance.ContactService.AddContact(contact, string.Empty);
                    }
                    viewModel.DeclineCall(false);
                    try
                    {
                        _linphoneService.DeclineCall(viewModel.ActiveCall.NativeCallPtr);
                    }
                    catch (Exception ex)
                    {
                        ServiceManager.LogError("DeclineCall", ex);
                    }

                    if (message.NotBlank())
                    {
                        if (_simpleMessageViewModel != null)
                        {
                            _simpleMessageViewModel.SetActiveChatContact(contact, IntPtr.Zero);
                            _simpleMessageViewModel.SendMessage(string.Format("{0}{1}", VATRPChatMessage.DECLINE_PREFIX, message));
                        }
                    }
                }
            }
        }
        public void SetActiveChatContact(VATRPContact contact, IntPtr callPtr)
        {
            if (contact == null)
                return;

            if (Chat != null && Chat.Contact == contact)
            {
                Chat.Contact.UnreadMsgCount = 0;
                Chat.UnreadMsgCount = 0;
                ChangeUnreadCounter();
                _chatsManager.ActivateChat(Chat);
                return;
            }

            Console.WriteLine("SetActiveChat " + contact.Fullname);

            this._chat = _chatsManager.GetChat(contact);

            var contactVM = FindContactViewModel(contact);
            if (contactVM == null)
            {
                contactVM = new ContactViewModel(contact);
                this.Contacts.Add(contactVM);
            }

            if (_contactViewModel != null && _contactViewModel.Contact != contactVM.Contact)
            {
                _contactViewModel.IsSelected = false;
            }

            _contactViewModel = contactVM;

            if (Chat != null)
            {
                Chat.CallPtr = callPtr;

                if (Chat.Contact != null)
                {
                    Chat.Contact.UnreadMsgCount = 0;
                    this.Chat.Contact.PropertyChanged += this.Contact_PropertyChanged;
                }

                Chat.CharsCountInBubble = 0;
                Chat.UnreadMsgCount = 0;
                ChangeUnreadCounter();
                _chatsManager.ActivateChat(Chat);
                if (App.CurrentAccount != null)
                {
                    Chat.MessageFont = App.CurrentAccount.RTTFontFamily;
                }
            }

            _contactViewModel.IsSelected = true;
            IsMessagesLoaded = false;

            if ( Messages != null)
            {
                this.MessagesListView = CollectionViewSource.GetDefaultView(this.Messages);
                this.MessagesListView.SortDescriptions.Add(new SortDescription("MessageTime",
                    ListSortDirection.Ascending));
            }

            OnPropertyChanged("Chat");
            if (MessagesListView != null)
                 MessagesListView.Refresh();
            if (ConversationUpdated != null)
                ConversationUpdated(this, EventArgs.Empty);
        }
Ejemplo n.º 12
0
        internal void UpdateLoggedinContact()
        {
            if (App.CurrentAccount == null || !App.CurrentAccount.Username.NotBlank())
                return;
            var contactAddress = string.Format("{0}@{1}", App.CurrentAccount.Username,
                App.CurrentAccount.ProxyHostname);
            VATRPContact contact = this.ContactService.FindLoggedInContact();
            bool addLogedInContact = true;
            if (contact != null)
            {
                if (contact.SipUsername == contactAddress)
                {
                    contact.IsLoggedIn = false;
                    addLogedInContact = false;
                }
            }

            if (addLogedInContact)
            {
                var contactID = new ContactID(contactAddress, IntPtr.Zero);
                contact = new VATRPContact(contactID)
                {
                    IsLoggedIn = true,
                    Fullname = App.CurrentAccount.Username,
                    DisplayName = App.CurrentAccount.DisplayName,
                    RegistrationName =
                        string.Format("sip:{0}@{1}", App.CurrentAccount.Username, App.CurrentAccount.ProxyHostname)
                };
                contact.Initials = contact.Fullname.Substring(0, 1).ToUpper();
                this.ContactService.AddContact(contact, string.Empty);
            }
        }
Ejemplo n.º 13
0
        private void LoadLinphoneContacts()
        {
            if (_manager.LinphoneService.LinphoneCore == IntPtr.Zero)
                return;

            IntPtr contactsPtr =
                LinphoneAPI.linphone_core_get_friend_list(_manager.LinphoneService.LinphoneCore);
            if (contactsPtr != IntPtr.Zero)
            {
                MSList curStruct;

                do
                {
                    curStruct.next = IntPtr.Zero;
                    curStruct.prev = IntPtr.Zero;
                    curStruct.data = IntPtr.Zero;

                    curStruct = (MSList)Marshal.PtrToStructure(contactsPtr, typeof(MSList));
                    if (curStruct.data != IntPtr.Zero)
                    {
                        IntPtr addressPtr = LinphoneAPI.linphone_friend_get_address(curStruct.data);
                        if (addressPtr == IntPtr.Zero)
                            continue;

                        string dn = "";
                        IntPtr tmpPtr = LinphoneAPI.linphone_address_get_display_name(addressPtr);
                        if (tmpPtr != IntPtr.Zero)
                        {
                            dn = Marshal.PtrToStringAnsi(tmpPtr);
                        }

                        string un = "";
                        tmpPtr = LinphoneAPI.linphone_address_get_username(addressPtr);
                        if (tmpPtr != IntPtr.Zero)
                        {
                            un = Marshal.PtrToStringAnsi(tmpPtr);
                        }

                        string host = "";
                        tmpPtr = LinphoneAPI.linphone_address_get_domain(addressPtr);
                        if (tmpPtr != IntPtr.Zero)
                        {
                            host = Marshal.PtrToStringAnsi(tmpPtr);
                        }

                        string refKey = "";
                        tmpPtr = LinphoneAPI.linphone_friend_get_ref_key(curStruct.data);
                        if (tmpPtr != IntPtr.Zero)
                            refKey = Marshal.PtrToStringAnsi(tmpPtr);

                        if (string.IsNullOrEmpty(refKey))
                        {
                            // generate refkey
                            refKey = Guid.NewGuid().ToString();
                            LinphoneAPI.linphone_friend_set_ref_key(curStruct.data, refKey);
                        }

                        int port = LinphoneAPI.linphone_address_get_port(addressPtr);

                        if (!string.IsNullOrWhiteSpace(un))
                        {
                            var cfgSipaddress = port == 0 ? string.Format("{0}@{1}", un, host):
                                string.Format("{0}@{1}:{2}", un, host, port);
                            VATRPContact contact = new VATRPContact(new ContactID(cfgSipaddress, IntPtr.Zero))
                            {
                                DisplayName = dn,
                                Fullname = dn.NotBlank() ? dn : un,
                                Gender = "male",
                                SipUsername = un,
                                RegistrationName = cfgSipaddress,
                                IsLinphoneContact = true,
                                LinphoneRefKey = refKey
                            };
                            UpdateAvatar(contact);
                            Contacts.Add(contact);
                        }
                    }
                    contactsPtr = curStruct.next;
                } while (curStruct.next != IntPtr.Zero);

            }

            LoadContactsOptions();

            if ( ContactsLoadCompleted != null)
                ContactsLoadCompleted(this, EventArgs.Empty);
        }
Ejemplo n.º 14
0
 private void UpdateAvatar(VATRPContact contact)
 {
     var supportedFormats = new[] {"jpg", "jpeg", "png", "bmp"};
     for (var i = 0; i < supportedFormats.Length; i++)
     {
         var avatar = _manager.BuildDataPath(string.Format("{0}.{1}", contact.ID, supportedFormats[i]));
         if (File.Exists(avatar))
         {
             contact.Avatar = avatar;
             return;
         }
     }
 }
Ejemplo n.º 15
0
        public void EditLinphoneContact(VATRPContact contact, string newname, string newsipassdress)
        {
            if (_manager.LinphoneService.LinphoneCore == IntPtr.Zero)
                return;

            IntPtr friendList = LinphoneAPI.linphone_core_get_default_friend_list(_manager.LinphoneService.LinphoneCore);
            if (friendList == IntPtr.Zero)
                return;
            IntPtr friendPtr = LinphoneAPI.linphone_friend_list_find_friend_by_ref_key(friendList,
                contact.LinphoneRefKey);
            if (friendPtr == IntPtr.Zero)
                return;

            var newfqdn = string.Format("sip:{0}", newsipassdress);
            IntPtr addressPtr = LinphoneAPI.linphone_core_create_address(
                _manager.LinphoneService.LinphoneCore, string.Format("{0} <{1}>", newname, newfqdn));
            if (addressPtr != IntPtr.Zero)
            {
                LinphoneAPI.linphone_friend_edit(friendPtr);
                LinphoneAPI.linphone_friend_set_name(friendPtr, newname);
                LinphoneAPI.linphone_friend_set_address(friendPtr, addressPtr);
                LinphoneAPI.linphone_friend_enable_subscribes(friendPtr, false);
                LinphoneAPI.linphone_friend_set_inc_subscribe_policy(friendPtr, 1);
                LinphoneAPI.linphone_friend_done(friendPtr);

                string un = "";
                IntPtr unPtr = LinphoneAPI.linphone_address_get_username(addressPtr);
                if (unPtr != IntPtr.Zero)
                {
                    un = Marshal.PtrToStringAnsi(unPtr);
                }

                contact.ID = newsipassdress;
                contact.DisplayName = newname;
                contact.Fullname = newname;
                contact.SipUsername = un;
                contact.RegistrationName = newsipassdress;
            }
            UpdateAvatar(contact);
            UpdateContactDbId(contact);

            if (ContactsChanged != null)
                ContactsChanged(this, new ContactEventArgs(new ContactID(contact)));
        }
Ejemplo n.º 16
0
        private void OnChatMessageReceived(IntPtr chatPtr, IntPtr callChatPtr, string remoteUser, VATRPChatMessage chatMessage)
        {
            string dn, un, host;
            int port;
            if (callChatPtr == chatPtr /*&& RttEnabled*/)
            {
                return;
            }

            System.Windows.Threading.Dispatcher dispatcher = null;
            try
            {
               dispatcher = this._serviceManager.Dispatcher;
            }
            catch (NullReferenceException)
            {
                return;
            }

            if (dispatcher != null)
                dispatcher.BeginInvoke((Action) delegate()
                {
                    if (!VATRPCall.ParseSipAddressEx(remoteUser, out dn, out un,
                        out host, out port))
                        un = "";

                    if (!un.NotBlank())
                        return;

                    var contactAddress = string.Format("{0}@{1}", un, host);
                    var contactID = new ContactID(contactAddress, IntPtr.Zero);
                    VATRPContact contact = FindContact(contactID);

                    if (contact == null)
                    {
                        contact = new VATRPContact(contactID)
                        {
                            DisplayName = dn,
                            Fullname = dn.NotBlank() ? dn : un,
                            SipUsername = un,
                            RegistrationName = contactAddress
                        };
                        _contactSvc.AddContact(contact, "");
                        Contacts.Add(contact);
                        if (ContactAdded != null)
                            ContactAdded(this, new ContactEventArgs(new ContactID(contact)));
                    }

                    VATRPChat chat = GetChat(contact);
                    chat.NativePtr = chatPtr;

                    if (chat.CheckMessage(chatMessage))
                    {
                        chat.UnreadMsgCount++;
                        if (!chat.IsSelected)
                            contact.UnreadMsgCount++;
                        chatMessage.IsRTTMessage = false;
                        chatMessage.IsIncompleteMessage = false;
                        chatMessage.Chat = chat;
                        if (chatMessage.Content.StartsWith(VATRPChatMessage.DECLINE_PREFIX))
                        {
                            chatMessage.Content = chatMessage.Content.Substring(VATRPChatMessage.DECLINE_PREFIX.Length);

                            chatMessage.IsDeclineMessage = true;
                            if (ConversationDeclineMessageReceived != null)
                            {
                                var declineArgs = new DeclineMessageArgs(chatMessage.Content) { Sender = contact };
                                ConversationDeclineMessageReceived(this, declineArgs);
                            }
                        }

                        chat.AddMessage(chatMessage, false);
                        chat.UpdateLastMessage(false);

                        OnConversationUnReadStateChanged(chat);
                        this.OnConversationUpdated(chat, true);
                    }
                });
        }
 private object FindContact(VATRPContact contact)
 {
     lock (this.Contacts)
     {
         foreach (var c in Contacts)
         {
             if (c.Contact == contact)
             {
                 return contact;
             }
         }
     }
     return null;
 }
        private void AddContact(VATRPContact contact, bool refreshNow = false)
        {
            if (!contact.SipUsername.NotBlank() || !contact.IsLinphoneContact)
                return;

            if (FindContact(contact) != null)
                return;

            lock (this.Contacts)
            {
                contact.PropertyChanged += OnContactPropertyChanged;
                Contacts.Add(new ContactViewModel(contact));
            }

            if (refreshNow)
                ContactsListView.Refresh();
        }
Ejemplo n.º 19
0
        public VATRPChat CreateChat(VATRPContact contact, string dialogId)
        {
            if (contact == null)
            {
                return null;
            }

            VATRPChat chatRoom = new VATRPChat(contact, dialogId);
            var loggedContact = _contactSvc.FindLoggedInContact();
            if (loggedContact != null)
                chatRoom.AddContact(loggedContact);

            _chatItems.InsertToTop<VATRPChat>(chatRoom);
            this.OnNewConversationCreated(chatRoom);
            return chatRoom;
        }
Ejemplo n.º 20
0
 public VATRPChat CreateChat(VATRPContact contact)
 {
     if (contact == null)
     {
         return null;
     }
     return this.CreateChat(contact, string.Empty);
 }
Ejemplo n.º 21
0
 private void UpdateContactStatusInChats(VATRPContact contact)
 {
     foreach (VATRPChat chat in this._chatItems)
     {
         for (int i = 0; i < chat.Contacts.Count; i++)
         {
             if (contact.Equals(chat.Contacts[i]))
             {
                 chat.Contacts[i].Status = contact.Status;
             }
         }
     }
 }
Ejemplo n.º 22
0
        public void SetActiveChatContact(VATRPContact contact, IntPtr callPtr)
        {
            if (contact == null)
            {
                return;
            }

            if (Chat != null && Chat.Contact == contact)
            {
                Chat.Contact.UnreadMsgCount = 0;
                Chat.UnreadMsgCount         = 0;
                ChangeUnreadCounter();
                _chatsManager.ActivateChat(Chat);
                return;
            }

            this._chat = _chatsManager.GetChat(contact, false);

            var contactVM = FindContactViewModel(contact);

            if (contactVM == null)
            {
                contactVM = new ContactViewModel(contact);
                this.Contacts.Add(contactVM);
            }

            if (ChatViewContact != null && ChatViewContact.Contact != contactVM.Contact)
            {
                ChatViewContact.IsSelected = false;
            }

            ChatViewContact = contactVM;

            if (Chat != null)
            {
                Chat.CallPtr = callPtr;

                if (Chat.Contact != null)
                {
                    Chat.Contact.UnreadMsgCount        = 0;
                    this.Chat.Contact.PropertyChanged += this.Contact_PropertyChanged;
                }

                Chat.CharsCountInBubble = 0;
                Chat.UnreadMsgCount     = 0;
                ChangeUnreadCounter();
                _chatsManager.ActivateChat(Chat);
                if (App.CurrentAccount != null)
                {
                    Chat.MessageFont = App.CurrentAccount.RTTFontFamily;
                }
            }

            ChatViewContact.IsSelected = true;
            IsMessagesLoaded           = false;

            this.MessagesListView = CollectionViewSource.GetDefaultView(this.Messages);
            this.MessagesListView.SortDescriptions.Add(new SortDescription("MessageTime",
                                                                           ListSortDirection.Ascending));

            OnPropertyChanged("Chat");
            try
            {
                if (MessagesListView != null && this.Messages != null)
                {
                    MessagesListView.Refresh();
                }
            }
            catch (Exception)
            {
            }
            if (ConversationUpdated != null)
            {
                ConversationUpdated(this, EventArgs.Empty);
            }
        }
Ejemplo n.º 23
0
 internal bool SearchContactIfExistOrCreateNew(ContactID contactID, out VATRPContact contact)
 {
     bool flag = false;
     contact = this.FindContact(contactID);
     if (contact == null)
     {
         flag = true;
         contact = new VATRPContact(contactID);
     }
     return flag;
 }
        internal bool CheckReceiverContact()
        {
            var receiver = string.Empty;
            if (ReceiverAddress != null)
            {
                receiver = ReceiverAddress.Trim();
            }

            if (Contact != null && receiver == Contact.Contact.RegistrationName)
                return true;

            VATRPContact contact = _chatsManager.FindContact(new ContactID(receiver, IntPtr.Zero));
            if (contact == null)
            {
                string un, host, dn;
                int port;
                if (!VATRPCall.ParseSipAddress(receiver, out un,
                    out host, out port))
                    un = "";

                if (!un.NotBlank())
                    return false;

                if (string.IsNullOrEmpty(host))
                    host = App.CurrentAccount.ProxyHostname;
                var contactAddress = string.Format("{0}@{1}", un, host);
                var contactID = new ContactID(contactAddress, IntPtr.Zero);

                contact = new VATRPContact(contactID)
                {
                    DisplayName = un,
                    Fullname = un,
                    SipUsername = un,
                    RegistrationName = contactAddress
                };
                _contactsManager.AddContact(contact, "");
            }

            SetActiveChatContact(contact, IntPtr.Zero);
            if ( ReceiverAddress != contact.RegistrationName )
                ReceiverAddress = contact.RegistrationName;

            return true;
        }
Ejemplo n.º 25
0
 internal ContactStatusChangedEventArgs(VATRPContact _contact, UserStatus oldStatus)
 {
     this.OldStatus = oldStatus;
     this.contact   = _contact;
 }
Ejemplo n.º 26
0
 public VATRPChat FindChat(VATRPContact contact)
 {
     if (contact == null)
     {
         return null;
     }
     return this.FindChat(new ContactID(contact.ID, contact.NativePtr));
 }
Ejemplo n.º 27
0
        public void AddLinphoneContact(string name, string username, string address)
        {
            if (_manager.LinphoneService.LinphoneCore == IntPtr.Zero)
                return;

            var sipAddress = address.TrimSipPrefix();

            var fqdn = string.Format("{0} <sip:{1}>", name, sipAddress);
            IntPtr friendPtr = LinphoneAPI.linphone_friend_new_with_address(fqdn);
            if (friendPtr != IntPtr.Zero)
            {
                IntPtr friendList =
                    LinphoneAPI.linphone_core_get_default_friend_list(_manager.LinphoneService.LinphoneCore);
                LinphoneAPI.linphone_friend_set_name(friendPtr, name);
                LinphoneAPI.linphone_friend_enable_subscribes(friendPtr, false);
                LinphoneAPI.linphone_friend_set_inc_subscribe_policy(friendPtr, 1);
                LinphoneAPI.linphone_friend_list_add_friend(friendList, friendPtr);

                var refKey = Guid.NewGuid().ToString();
                LinphoneAPI.linphone_friend_set_ref_key(friendPtr, refKey);

                var contactID = new ContactID(sipAddress, IntPtr.Zero);
                VATRPContact contact = FindContact(contactID);
                if (contact == null)
                {
                    contact = new VATRPContact(new ContactID(sipAddress, IntPtr.Zero))
                    {
                        DisplayName = name,
                        Fullname = name,
                        Gender = "male",
                        SipUsername = username,
                        RegistrationName = sipAddress,
                        IsLinphoneContact = true,
                        LinphoneRefKey = refKey
                    };
                    Contacts.Add(contact);
                }
                else
                {
                    contact.DisplayName = name;
                    contact.Fullname = name;
                    contact.IsLinphoneContact = true;
                    contact.SipUsername = username;
                    contact.LinphoneRefKey = refKey;
                }
                UpdateAvatar(contact);
                UpdateContactDbId(contact);

                if (ContactAdded != null)
                {
                    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
                    {
                        ContactAdded(this, new ContactEventArgs(new ContactID(contact)));
                    }));
                }
            }
        }
Ejemplo n.º 28
0
        public void AddContact(VATRPContact contact, string group)
        {
            // update avatar
            UpdateAvatar(contact);
            Contacts.Add(contact);
            if (ContactAdded != null)
                ContactAdded(this, new ContactEventArgs(new ContactID(contact)));

            if (contact.IsLoggedIn && LoggedInContactUpdated != null)
            {
                LoggedInContactUpdated(this, new ContactEventArgs(new ContactID(contact)));
            }
        }
Ejemplo n.º 29
0
 public VATRPChat GetChat(VATRPContact contact)
 {
     VATRPChat chat = this.FindChat(contact);
     if (chat == null)
     {
         chat = this.AddChat(contact, string.Empty);
         this.Contacts.Add(contact);
         if (ContactAdded != null)
             ContactAdded(this, new ContactEventArgs(new ContactID(contact)));
     }
     return chat;
 }
Ejemplo n.º 30
0
        public void DeleteLinphoneContact(VATRPContact contact)
        {
            if (_manager.LinphoneService.LinphoneCore == IntPtr.Zero)
                return;

            IntPtr friendList = LinphoneAPI.linphone_core_get_default_friend_list(_manager.LinphoneService.LinphoneCore);
            if (friendList != IntPtr.Zero)
            {
                IntPtr friendPtr = LinphoneAPI.linphone_friend_list_find_friend_by_ref_key(friendList,
                    contact.LinphoneRefKey);
                if (friendPtr == IntPtr.Zero)
                    return;

                if (friendList != IntPtr.Zero)
                    LinphoneAPI.linphone_friend_list_remove_friend(friendList, friendPtr);
                RemoveFavoriteOption(contact);
                try
                {
                    if (contact.Avatar.NotBlank() && File.Exists(contact.Avatar))
                    {
                        File.Delete(contact.Avatar);
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("failed to remove file: " + ex.Message);
                }
                RemoveContact(contact.ID, true);
            }
        }
Ejemplo n.º 31
0
 internal void SetStatusForMessage(VATRPContact contact, string msgId, LinphoneChatMessageState status)
 {
     if (msgId.NotBlank())
     {
         if (contact != null)
         {
             VATRPChat chat = this.FindChat(contact);
             if ((chat != null) && msgId.NotBlank())
             {
                 foreach (VATRPChatMessage message in chat.Messages)
                 {
                     if (message.ID == msgId)
                     {
                         if (status > message.Status)
                         {
                             message.Status = status;
                         }
                         break;
                     }
                 }
             }
         }
         else
         {
             using (IEnumerator<VATRPChat> enumerator2 = this._chatItems.GetEnumerator())
             {
                 while (enumerator2.MoveNext())
                 {
                     foreach (VATRPChatMessage message2 in enumerator2.Current.Messages)
                     {
                         if (message2.ID == msgId)
                         {
                             if (status > message2.Status)
                             {
                                 message2.Status = status;
                             }
                             return;
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 32
0
        public void UpdateFavoriteOption(VATRPContact contact)
        {
            if (contact.DbID == 0)
                return;
            if (editing)
                return;
            editing = true;
            try
            {
                var connectionString = string.Format("data source={0}", _manager.LinphoneService.ContactsDbPath);
                using (var dbConnection = new SQLiteConnection(connectionString))
                {
                    dbConnection.Open();

                    using (
                        var cmd = new SQLiteCommand(dbConnection)
                        {
                            CommandText = @"INSERT OR REPLACE INTO friend_options (id, is_favorite) VALUES ( ?, ?)"
                        })
                    {
                        var idParam = new SQLiteParameter(DbType.Int32) {Value = contact.DbID};
                        cmd.Parameters.Add(idParam);

                        var favParam = new SQLiteParameter(DbType.Int32) {Value = contact.IsFavorite ? 1 : 0};
                        cmd.Parameters.Add(favParam);

                        cmd.ExecuteNonQuery();
                    }
                    dbConnection.Close();
                }
            }
            catch (SQLiteException ex)
            {
                Debug.WriteLine("Sqlite error: " + ex.ToString());
            }
            finally
            {
                editing = false;
            }
        }
Ejemplo n.º 33
0
 internal void SetStatusLastMessageInActiveChat(VATRPContact contact, string msgText, LinphoneChatMessageState status)
 {
     if ((msgText != null) && (contact != null))
     {
         VATRPChat chat = this.FindChat(contact);
         if ((((chat != null) && ((chat.Messages != null) && (chat.Messages.Count != 0))) &&
              msgText.Equals(chat.Messages[chat.Messages.Count - 1])) &&
             (status > chat.Messages[chat.Messages.Count - 1].Status))
         {
             chat.Messages[chat.Messages.Count - 1].Status = status;
         }
     }
 }
Ejemplo n.º 34
0
        private void LinphoneCardDavContactCreated(CardDavContactEventArgs args)
        {
            if (args.NewContactPtr == IntPtr.Zero) return;
            IntPtr addressPtr = LinphoneAPI.linphone_friend_get_address(args.NewContactPtr);
            if (addressPtr == IntPtr.Zero)
                return;
            string dn = "";
            IntPtr tmpPtr = LinphoneAPI.linphone_address_get_display_name(addressPtr);
            if (tmpPtr != IntPtr.Zero)
            {
                dn = Marshal.PtrToStringAnsi(tmpPtr);
            }

            string un = "";
            tmpPtr = LinphoneAPI.linphone_address_get_username(addressPtr);
            if (tmpPtr != IntPtr.Zero)
            {
                un = Marshal.PtrToStringAnsi(tmpPtr);
            }

            string host = "";
            tmpPtr = LinphoneAPI.linphone_address_get_domain(addressPtr);
            if (tmpPtr != IntPtr.Zero)
            {
                host = Marshal.PtrToStringAnsi(tmpPtr);
            }

            int port = LinphoneAPI.linphone_address_get_port(addressPtr);

            if (string.IsNullOrWhiteSpace(un)) return;
            var cfgSipaddress = port == 0 ? string.Format("{0}@{1}", un, host) :
                string.Format("{0}@{1}:{2}", un, host, port);

            var refKey = "";
            IntPtr refKeyPtr = LinphoneAPI.linphone_friend_get_ref_key(args.NewContactPtr);
            if (refKeyPtr != IntPtr.Zero)
                refKey = Marshal.PtrToStringAnsi(refKeyPtr);

            if (String.IsNullOrEmpty(refKey))
            {
                refKey = Guid.NewGuid().ToString();
                LinphoneAPI.linphone_friend_set_ref_key(args.NewContactPtr, refKey);
            }
            VATRPContact contact = new VATRPContact(new ContactID(cfgSipaddress, IntPtr.Zero))
            {
                DisplayName = dn,
                Fullname = dn.NotBlank() ? dn : un,
                Gender = "male",
                SipUsername = un,
                RegistrationName = cfgSipaddress,
                IsLinphoneContact = true,
                LinphoneRefKey = refKey
            };
            AddContact(contact, string.Empty);
        }
Ejemplo n.º 35
0
 private VATRPChat AddChat(VATRPContact contact, string dialogId)
 {
     VATRPChat item = null;
     if (contact != null)
     {
         item = this.FindChat(contact);
         if (item == null)
         {
             item = this.CreateChat(contact, dialogId);
         }
     }
     return item;
 }
Ejemplo n.º 36
0
        private void RemoveFavoriteOption(VATRPContact contact)
        {
            if (contact.DbID == 0)
                return;
            if (editing)
                return;
            editing = true;
            try
            {
                var connectionString = string.Format("data source={0}", _manager.LinphoneService.ContactsDbPath);
                using (var dbConnection = new SQLiteConnection(connectionString))
                {
                    dbConnection.Open();

                    using (
                        var cmd = new SQLiteCommand(dbConnection)
                        {
                            CommandText = @"DELETE FROM friend_options WHERE id = ?"
                        })
                    {
                        var idParam = new SQLiteParameter(DbType.Int32) {Value = contact.DbID};
                        cmd.Parameters.Add(idParam);
                        cmd.ExecuteNonQuery();
                    }
                    dbConnection.Close();
                }
            }
            catch (SQLiteException ex)
            {
                Debug.WriteLine("Sqlite error: " + ex.ToString());
            }
            finally
            {
                editing = false;
            }
        }
Ejemplo n.º 37
0
        private void LoadLinphoneChatEvents()
        {
            if (_chatItems == null)
                _chatItems = new ObservableCollection<VATRPChat>();

            if (_linphoneSvc.LinphoneCore == IntPtr.Zero)
                return;

            IntPtr chatRoomPtr = LinphoneAPI.linphone_core_get_chat_rooms(_linphoneSvc.LinphoneCore);
            if (chatRoomPtr != IntPtr.Zero)
            {
                MSList msChatRoomList;

                do
                {
                    msChatRoomList.next = IntPtr.Zero;
                    msChatRoomList.prev = IntPtr.Zero;
                    msChatRoomList.data = IntPtr.Zero;

                    msChatRoomList = (MSList)Marshal.PtrToStructure(chatRoomPtr, typeof(MSList));
                    if (msChatRoomList.data != IntPtr.Zero)
                    {
                        IntPtr tmpPtr = LinphoneAPI.linphone_chat_room_get_peer_address(msChatRoomList.data);
                        if (tmpPtr != IntPtr.Zero)
                        {
                            tmpPtr = LinphoneAPI.linphone_address_as_string(tmpPtr);
                            if (tmpPtr != IntPtr.Zero)
                            {
                                var remoteParty = LinphoneAPI.PtrToStringUtf8(tmpPtr);
                                LinphoneAPI.ortp_free(tmpPtr);
                                 string dn, un, host;
                                int port;
                                if (
                                    !VATRPCall.ParseSipAddressEx( remoteParty, out dn, out un,
                                        out host, out port))
                                    un = "";

                                if (un.NotBlank())
                                {
                                    var contactAddress = string.Format("{0}@{1}", un, host);
                                    var contactId = new ContactID(contactAddress, IntPtr.Zero);
                                    VATRPContact contact = _contactSvc.FindContact(contactId);
                                    if (contact == null)
                                    {
                                        contact = new VATRPContact(contactId)
                                        {
                                            DisplayName = dn,
                                            Fullname = un,
                                            SipUsername = un,
                                            RegistrationName = contactAddress
                                        };
                                        _contactSvc.AddContact(contact, string.Empty);
                                    }

                                    var chat = this.AddChat(contact, string.Empty);
                                    chat.NativePtr = msChatRoomList.data;
                                    LoadMessages(chat, chat.NativePtr);
                                    OnConversationUpdated(chat, true);
                                }
                            }
                        }
                    }
                    chatRoomPtr = msChatRoomList.next;
                } while (msChatRoomList.next != IntPtr.Zero);

            }
            if (ServiceStarted != null)
                ServiceStarted(this, EventArgs.Empty);
        }
Ejemplo n.º 38
0
 private void UpdateContactDbId(VATRPContact contact)
 {
     if (editing)
         return;
     editing = true;
     try
     {
         var connectionString = string.Format("data source={0}", _manager.LinphoneService.ContactsDbPath);
         using (var dbConnection = new SQLiteConnection(connectionString))
         {
             dbConnection.Open();
             using (
                 var cmd = new SQLiteCommand(dbConnection)
                 {
                     CommandText = @"SELECT id FROM friends WHERE sip_uri = ?"
                 })
             {
                 var sipUri = string.Format(@"""{0}"" <sip:{1}>", contact.DisplayName, contact.ID);
                 var uriParam = new SQLiteParameter(DbType.AnsiString) {Value = sipUri};
                 cmd.Parameters.Add(uriParam);
                 var dbReader = cmd.ExecuteReader();
                 if (dbReader.Read())
                 {
                     contact.DbID = dbReader.GetInt32(0);
                 }
             }
             dbConnection.Close();
         }
     }
     catch (SQLiteException ex)
     {
         Debug.WriteLine("Sqlite error: " + ex.ToString());
     }
     finally
     {
         editing = false;
     }
 }
Ejemplo n.º 39
0
        private void LoadMessages(VATRPChat chat, IntPtr chatRoomPtr)
        {
            IntPtr msgListPtr = LinphoneAPI.linphone_chat_room_get_history(chatRoomPtr, 0);
            if (msgListPtr != IntPtr.Zero)
            {
                MSList msMessagePtr;

                var loggedInContact = _contactSvc.FindLoggedInContact();
                if (loggedInContact == null)
                    return;
                do
                {
                    msMessagePtr.next = IntPtr.Zero;
                    msMessagePtr.prev = IntPtr.Zero;
                    msMessagePtr.data = IntPtr.Zero;

                    msMessagePtr = (MSList) Marshal.PtrToStructure(msgListPtr, typeof (MSList));
                    if (msMessagePtr.data != IntPtr.Zero)
                    {
                        IntPtr tmpPtr = LinphoneAPI.linphone_chat_message_get_from_address(msMessagePtr.data);
                        tmpPtr = LinphoneAPI.linphone_address_as_string(tmpPtr);
                        if (tmpPtr != IntPtr.Zero)
                        {
                            var fromParty = LinphoneAPI.PtrToStringUtf8(tmpPtr).TrimSipPrefix();
                            LinphoneAPI.ortp_free(tmpPtr);

                            tmpPtr = LinphoneAPI.linphone_chat_message_get_to_address(msMessagePtr.data);
                            if (tmpPtr != IntPtr.Zero)
                            {
                                tmpPtr = LinphoneAPI.linphone_address_as_string(tmpPtr);
                                var toParty = LinphoneAPI.PtrToStringUtf8(tmpPtr).TrimSipPrefix();
                                LinphoneAPI.ortp_free(tmpPtr);

                                string dn, un, host;
                                int port;

                                if (fromParty == loggedInContact.ID || toParty == loggedInContact.ID)
                                {
                                    bool isOutgoing = false;
                                    string remoteParty = fromParty;
                                    if (fromParty == loggedInContact.ID)
                                    {
                                        isOutgoing = true;
                                        remoteParty = toParty;
                                    }

                                    if (
                                        !VATRPCall.ParseSipAddressEx(remoteParty, out dn, out un,
                                            out host, out port))
                                        un = "";

                                    if (un.NotBlank())
                                    {
                                        var contactAddress = string.Format("{0}@{1}", un, host);
                                        var contactID = new ContactID(contactAddress, IntPtr.Zero);
                                        var contact = FindContact(contactID);

                                        if (contact == null)
                                        {
                                            contact = new VATRPContact(contactID)
                                            {
                                                DisplayName = dn,
                                                Fullname = un,
                                                SipUsername = un,
                                                RegistrationName = contactAddress
                                            };
                                            _contactSvc.AddContact(contact, "");
                                        }

                                        IntPtr msgPtr = LinphoneAPI.linphone_chat_message_get_text(msMessagePtr.data);
                                        var messageString = string.Empty;
                                        if (msgPtr != IntPtr.Zero)
                                            messageString = LinphoneAPI.PtrToStringUtf8(msgPtr);

                                        if (messageString.NotBlank())
                                        {
                                            var localTime =
                                                Time.ConvertUtcTimeToLocalTime(
                                                    LinphoneAPI.linphone_chat_message_get_time(msMessagePtr.data));
                                            var declineMessage = false;
                                            if (messageString.StartsWith(VATRPChatMessage.DECLINE_PREFIX))
                                            {
                                                messageString = messageString.Substring(VATRPChatMessage.DECLINE_PREFIX.Length);
                                                declineMessage = true;
                                            }
                                            var chatMessage = new VATRPChatMessage(MessageContentType.Text)
                                            {
                                                Direction =
                                                    isOutgoing
                                                        ? MessageDirection.Outgoing
                                                        : MessageDirection.Incoming,
                                                IsIncompleteMessage = false,
                                                MessageTime = localTime,
                                                Content = messageString,
                                                IsRTTMessage = false,
                                                IsDeclineMessage = declineMessage,
                                                IsRead = LinphoneAPI.linphone_chat_message_is_read(msMessagePtr.data) == 1,
                                                Status = LinphoneAPI.linphone_chat_message_get_state(msMessagePtr.data),
                                                Chat = chat
                                            };

                                            chat.AddMessage(chatMessage, false);
                                            chat.UpdateLastMessage(false);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    msgListPtr = msMessagePtr.next;
                } while (msMessagePtr.next != IntPtr.Zero);

            }
        }
Ejemplo n.º 40
0
		private void OnCallStateChanged(IntPtr lc, IntPtr callPtr, LinphoneCallState cstate, string message)
		{
			if (linphoneCore == IntPtr.Zero) return;

			LOG.Info(string.Format( "OnCallStateChanged: State - {0}, CallPtr - {1}, Message: {2}", cstate, callPtr, message));

			var newstate = VATRPCallState.None;
			var direction = LinphoneCallDir.LinphoneCallIncoming;
			string remoteParty = "";
			IntPtr addressStringPtr;
		    bool removeCall = false;
			// detecting direction, state and source-destination data by state
			switch (cstate)
			{
				case LinphoneCallState.LinphoneCallIncomingReceived:
				case LinphoneCallState.LinphoneCallIncomingEarlyMedia:
					newstate = cstate == LinphoneCallState.LinphoneCallIncomingReceived
						? VATRPCallState.InProgress
						: VATRPCallState.EarlyMedia;
					addressStringPtr = LinphoneAPI.linphone_call_get_remote_address_as_string(callPtr);
			        if (addressStringPtr != IntPtr.Zero)
			        {
			            identity = Marshal.PtrToStringAnsi(addressStringPtr);
                        LinphoneAPI.ortp_free(addressStringPtr);
			        }
					remoteParty = identity;
					break;

                case LinphoneCallState.LinphoneCallOutgoingEarlyMedia:
				case LinphoneCallState.LinphoneCallConnected:
					newstate = VATRPCallState.Connected;
					break;
				case LinphoneCallState.LinphoneCallStreamsRunning:
                    newstate = VATRPCallState.StreamsRunning;
					break;
				case LinphoneCallState.LinphoneCallPausedByRemote:
                    newstate = VATRPCallState.RemotePaused;
			        break;
				case LinphoneCallState.LinphoneCallPausing:
                    newstate = VATRPCallState.LocalPausing;
					break;
                case LinphoneCallState.LinphoneCallPaused:
                    newstate = VATRPCallState.LocalPaused;
                    break;
                case LinphoneCallState.LinphoneCallResuming:
                    newstate = VATRPCallState.LocalResuming;
			        break;
				case LinphoneCallState.LinphoneCallOutgoingInit:
				case LinphoneCallState.LinphoneCallOutgoingProgress:
				case LinphoneCallState.LinphoneCallOutgoingRinging:
                    newstate = cstate != LinphoneCallState.LinphoneCallOutgoingRinging
						? VATRPCallState.Trying
						: VATRPCallState.Ringing;
					direction = LinphoneCallDir.LinphoneCallOutgoing;
					addressStringPtr = LinphoneAPI.linphone_call_get_remote_address_as_string(callPtr);
			        if (addressStringPtr != IntPtr.Zero)
			        {
			            remoteParty = Marshal.PtrToStringAnsi(addressStringPtr);
                        LinphoneAPI.ortp_free(addressStringPtr);
			        }
					break;

				case LinphoneCallState.LinphoneCallError:
                    string linphoneLibraryVersion = VATRP.LinphoneWrapper.LinphoneAPI.linphone_core_get_version_asString();
                    LOG.Info("OnCallStateChanged: CallState=LinphoneCallError .LinphoneLib Version: " + linphoneLibraryVersion);
					newstate = VATRPCallState.Error;
			        removeCall = true;
					break;

				case LinphoneCallState.LinphoneCallEnd:
					newstate = VATRPCallState.Closed;
                    removeCall = true;
					break;
				case LinphoneCallState.LinphoneCallReleased:
			        if ((_declinedCallsList != null) && _declinedCallsList.Contains(callPtr))
			        {
                        LOG.Info("   trying to remove callPtr from declinedCallList");
			            _declinedCallsList.Remove(callPtr);
                    }
                    LOG.Info("   calling linphone_call_unref");
                    try
                    {
                        LinphoneAPI.linphone_call_unref(callPtr);
                        LOG.Info("   passed unref");
                    }
                    catch (Exception ex)
                    {
                        LOG.Error("LinphoneService.OnCallStateChanged: Exception occured while calling linphone_call_unref. Details: " + ex.Message);
                    }
			        return;
			}

		    lock (callLock)
		    {
		        VATRPCall call = FindCall(callPtr);

		        if (call == null)
		        {
		            if (_declinedCallsList.Contains(callPtr))
		                return;

		            if (GetActiveCallsCount > 1)
		            {
                        callPtr = LinphoneAPI.linphone_call_ref(callPtr);
                        var cmd = new DeclineCallCommand(callPtr, LinphoneReason.LinphoneReasonBusy);
		                commandQueue.Enqueue(cmd);
                        _declinedCallsList.Add(callPtr);
		                return;
		            }

		            if (!removeCall)
		            {
		                LOG.Info("Call not found. Adding new call into list. ID - " + callPtr + " Calls count: " +
		                         callsList.Count);
                        callPtr = LinphoneAPI.linphone_call_ref(callPtr);
		                call = new VATRPCall(callPtr) {CallState = newstate, CallDirection = direction};
		                CallParams from = direction == LinphoneCallDir.LinphoneCallIncoming ? call.From : call.To;
		                CallParams to = direction == LinphoneCallDir.LinphoneCallIncoming ? call.To : call.From;

		                if (
		                    !VATRPCall.ParseSipAddressEx(remoteParty, out from.DisplayName, out from.Username,
		                        out from.HostAddress,
		                        out from.HostPort))
		                    from.Username = "******";

		                if (
		                    !VATRPCall.ParseSipAddressEx(remoteParty, out to.DisplayName, out to.Username, out to.HostAddress,
		                        out to.HostPort))
		                    to.Username = "******";

		                IntPtr chatPtr = LinphoneAPI.linphone_call_get_chat_room(callPtr);

		                if (chatPtr != IntPtr.Zero)
		                {
		                    VATRPContact contact;
		                    var contactAddress = string.Empty;
		                    if (direction == LinphoneCallDir.LinphoneCallIncoming)
		                    {
		                        contactAddress = string.Format("{0}@{1}", from.Username, from.HostAddress);
		                        contact = new VATRPContact(new ContactID(contactAddress, chatPtr))
		                        {
		                            DisplayName = from.DisplayName,
		                            Fullname = from.Username,
		                            SipUsername = from.Username
		                        };
		                    }
		                    else
		                    {
		                        contactAddress = string.Format("{0}@{1}", to.Username, to.HostAddress);
		                        contact = new VATRPContact(new ContactID(contactAddress, chatPtr))
		                        {
		                            DisplayName = to.DisplayName,
		                            Fullname = to.Username,
		                            SipUsername = to.Username
		                        };
		                    }
		                    contact.RegistrationName = contactAddress;
                            call.ChatRoom = manager.ChatService.InsertRttChat(contact, chatPtr, callPtr);
		                    var loggedContact = manager.ContactService.FindLoggedInContact();
		                    if (loggedContact != null)
		                        call.ChatRoom.AddContact(loggedContact);
		                }

		                callsList.Add(call);
		            }
		        }

		        if (call != null)
		        {
		            call.LinphoneMessage = message;
		            call.CallState = newstate;

                    if (call.CallState == VATRPCallState.Error || call.CallState == VATRPCallState.Closed)
		            {
		                IntPtr errorReason = LinphoneAPI.linphone_call_get_error_info(callPtr);
		                if (errorReason != IntPtr.Zero)
		                {
                            call.SipErrorCode = LinphoneAPI.linphone_error_info_get_protocol_code(errorReason);
		                }
		            }
                    if (CallStateChangedEvent != null)
                        CallStateChangedEvent(call);
		            if (removeCall)
		            {
		                callsList.Remove(call);
		                LOG.Info(string.Format("Call removed from list. Call - {0}. Total calls in list: {1}", callPtr,
		                    callsList.Count));
		            }
		        }
		    }
		}
Ejemplo n.º 41
0
        private void OnChatMessageComposing(string remoteUser, IntPtr chatPtr, uint rttCode)
        {
            string dn, un, host;
            int port;
            System.Windows.Threading.Dispatcher dispatcher = null;
            try
            {
                dispatcher = this._serviceManager.Dispatcher;
            }
            catch (NullReferenceException)
            {
                return;
            }
            if (dispatcher != null)
                dispatcher.BeginInvoke((Action) delegate()
                {
                    if (!VATRPCall.ParseSipAddressEx(remoteUser, out dn, out un,
                        out host, out port))
                        un = "";

                    if (!un.NotBlank() )
                        return;
                    var contactAddress = string.Format("{0}@{1}", un, host);
                    var contactID = new ContactID(contactAddress, IntPtr.Zero);

                    VATRPContact contact = FindContact(contactID);

                    if (contact == null)
                    {
                        contact = new VATRPContact(contactID)
                        {
                            DisplayName = dn,
                            Fullname = dn.NotBlank() ? dn : un,
                            RegistrationName = remoteUser,
                            SipUsername = un
                        };
                        _contactSvc.AddContact(contact, "");
                    }

                    VATRPChat chat = GetChat(contact);

                    chat.UnreadMsgCount++;

                    chat.CharsCountInBubble++;
                    var rttCodeArray = new char[2];
                    var rttCodearrayLength = 1;
                    if (chat.CharsCountInBubble == 201)
                    {
                        rttCodeArray[0] = UNLF;
                        try
                        {
                            rttCodeArray[1] = Convert.ToChar(rttCode);
                        }
                        catch (Exception)
                        {

                        }
                        rttCodearrayLength = 2;
                        chat.CharsCountInBubble = 0;
                    }
                    else
                    {
                        try
                        {
                            rttCodeArray[0] = Convert.ToChar(rttCode);
                        }
                        catch
                        {

                        }
                    }

                    for (int i = 0; i < rttCodearrayLength; i++)
                    {
                        VATRPChatMessage message = chat.SearchIncompleteMessage(MessageDirection.Incoming);

                        if (message == null)
                        {
                            message = new VATRPChatMessage(MessageContentType.Text)
                            {
                                Direction = MessageDirection.Incoming,
                                IsIncompleteMessage = true,
                                Chat = chat,
                                IsRTTMarker = false,
                            };

                            chat.AddMessage(message, false);
                        }

                        try
                        {
                            var sb = new StringBuilder(message.Content);
                            switch (rttCodeArray[i])
                            {
                                case UNLF: //
                                case CR:
                                case LF:
                                    message.IsIncompleteMessage = false;
                                    break;
                                case '\b':
                                    if (sb.Length > 0)
                                        sb.Remove(sb.Length - 1, 1);
                                    break;
                                default:
                                    sb.Append(rttCodeArray[i]);
                                    break;
                            }
                            if (message.IsIncompleteMessage)
                                message.Content = sb.ToString();
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("Error in OnChatMessageComposing: " + ex.Message);
                            message.IsIncompleteMessage = false;
                        }
                        if (string.IsNullOrEmpty(message.Content))
                            chat.DeleteMessage(message);
                        else
                            chat.UpdateLastMessage(false);
                        this.OnConversationUpdated(chat, true);

                        if (this.RttReceived != null)
                        {
                            this.RttReceived(this, EventArgs.Empty);
                        }
                    }
                });
        }