Ejemplo n.º 1
0
        private void ChatSession_onMsrpEvent(object sender, MsrpEventArgs e)
        {
            if (this.ChatSession == null || this.ChatSession.Id != e.SessionId)
            {
                LOG.Error("Invalid chat session");
                return;
            }

            if (this.Dispatcher.Thread != Thread.CurrentThread)
            {
                this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                        new EventHandler<MsrpEventArgs>(this.ChatSession_onMsrpEvent), sender, new object[] { e });
                return;
            }

            switch (e.Type)
            {
                case MsrpEventTypes.CONNECTED:
                    break;

                case MsrpEventTypes.DISCONNECTED:
                    {
                        this.ChatSession = null;
                        break;
                    }

                case MsrpEventTypes.DATA:
                    {
                        byte[] data = (e.GetExtra(MsrpEventArgs.EXTRA_DATA) as byte[]);
                        if (data != null)
                        {
                            String contentType = (e.GetExtra(MsrpEventArgs.EXTRA_CONTENT_TYPE) as String);

                            if (contentType != null)
                            {
                                contentType = contentType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0];
                                if (contentType.Equals(ContentType.CPIM, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    Object wrappedContentType = e.GetExtra(MsrpEventArgs.EXTRA_WRAPPED_CONTENT_TYPE);
                                    contentType = wrappedContentType == null ? "UnknowWrappedType" : wrappedContentType as String;
                                }
                            }

                            if (ContentType.IS_COMPOSING.Equals(contentType, StringComparison.InvariantCultureIgnoreCase))
                            {
                                this.imActivityIndicator.OnIndicationReceived(Encoding.UTF8.GetString(data));
                                return;
                            }

                            HistoryShortMessageEvent @event = new HistoryShortMessageEvent(this.remotePartyUri);
                            @event.Status = HistoryEvent.StatusType.Incoming;
                            if (contentType.Equals(ContentType.TEXT_PLAIN, StringComparison.InvariantCultureIgnoreCase))
                            {
                                @event.Content = Encoding.UTF8.GetString(data);
                            }
                            else
                            {
                                @event.Content = String.Format("{0} not supported as content type", contentType);
                                LOG.Warn(@event.Content);
                            }

                            if (this.IsComposingAlertEnabled)
                            {
                                this.imActivityIndicator.OnContentReceived();
                            }

                            this.AddMessagingEvent(@event);
                        }
                        break;
                    }

                case MsrpEventTypes.ERROR:
                    break;

                case MsrpEventTypes.SUCCESS_2XX:
                    break;

                case MsrpEventTypes.SUCCESS_REPORT:
                    break;
            }
        }
Ejemplo n.º 2
0
            private void ProcessResponse(MsrpMessage message)
            {
                short code = message.getCode();

                if (code >= 200 && code <= 299)
                {
                    // File Transfer => ProgressBar
                    if (this.session.MediaType == MediaType.FileTransfer)
                    {
                        long start = -1, end = -1, total = -1;
                #if WINRT
                #if WINDOWS_PHONE
                        doubango_rt.BackEnd.rtMsrpByteRange byteRange = message.getByteRange();
                        start = byteRange.Start;
                        end = byteRange.End;
                        total = byteRange.Total;
                #else
                        message.getByteRange(mStart, mEnd, mTotal);
                        start = Marshal.ReadInt64(mStart);
                        end = Marshal.ReadInt64(mEnd);
                        total = Marshal.ReadInt64(mTotal);
                #endif
                #else
                        message.getByteRange(out start, out end, out total);
                #endif
                        MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.SUCCESS_2XX);
                        eargs.AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_START, start)
                            .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END, end)
                            .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL, total)
                            .AddExtra(MsrpEventArgs.EXTRA_RESPONSE_CODE, code)
                            .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                        EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);
                    }
                }
                else if (code >= 300)
                {
                    MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.ERROR);
                        eargs.AddExtra(MsrpEventArgs.EXTRA_RESPONSE_CODE, code)
                            .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                    EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);
                }
            }
Ejemplo n.º 3
0
        private void FileTransfer_onMsrpEvent(object sender, MsrpEventArgs e)
        {
            if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
            {
                this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                        new EventHandler<MsrpEventArgs>(this.FileTransfer_onMsrpEvent), sender, new object[] { e });
                return;
            }

            MyMsrpSession session = (e.GetExtra(MsrpEventArgs.EXTRA_SESSION) as MyMsrpSession);
            if (session == null)
            {
                LOG.Error("No matching MSRP session could be found");
                return;
            }

            switch (e.Type)
            {
                case MsrpEventTypes.CONNECTED:
                    break;

                case MsrpEventTypes.DISCONNECTED:
                    {
                        lock (this.fileTransferSessions)
                        {
                            this.fileTransferSessions.Remove(session);
                        }
                        break;
                    }

                case MsrpEventTypes.ERROR:
                    LOG.Error(String.Format("MSRP session error code={0}", e.GetExtra(MsrpEventArgs.EXTRA_RESPONSE_CODE)));
                    session.HangUp();
                    break;

                case MsrpEventTypes.SUCCESS_2XX:
                    {
                        long? end = e.GetExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END) as long?;
                        long? total = e.GetExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL) as long?;

                        if (end.HasValue && total.HasValue && end.Value >= 0 && total.Value >= 0)
                        {
                            if (end.Value >= total.Value)
                            {
                                session.HangUp();
                            }
                        }
                        else
                        {
                            LOG.Error(String.Format("Invalid MSRP byte-range: {0}-{1}", end, total));
                        }

                        break;
                    }

                case MsrpEventTypes.SUCCESS_REPORT:
                    {
                        break;
                    }
            }
        }
Ejemplo n.º 4
0
            private void ProcessRequest(MsrpMessage message)
            {
                tmsrp_request_type_t type = message.getRequestType();

                switch (type)
                {
                    case tmsrp_request_type_t.tmsrp_SEND:
                        {
                            uint clen = message.getMsrpContentLength();
                            uint read = 0;
                            if (clen == 0)
                            {
                                LOG.Info("Empty MSRP message");
                                return;
                            }

                            if (this.tempBuffer == null || this.tempBufferPtr == IntPtr.Zero || this.tempBuffer.Length < clen)
                            {
                #if !WINDOWS_PHONE
                                this.tempBuffer = new byte[(int)clen];
                #endif
                                if (this.tempBufferPtr != IntPtr.Zero)
                                {
                                    Marshal.FreeHGlobal(this.tempBufferPtr);
                                }
                                this.tempBufferPtr = Marshal.AllocHGlobal((int)clen);
                            }

                #if WINDOWS_PHONE
                            this.tempBuffer = Encoding.UTF8.GetBytes(message.getMsrpContent(clen));
                            read = (uint)this.tempBuffer.Length;
                #else
                            read = message.getMsrpContent(this.tempBufferPtr, (uint)this.tempBuffer.Length);
                            Marshal.Copy(this.tempBufferPtr, this.tempBuffer, 0, this.tempBuffer.Length);
                #endif
                            if (message.isFirstChunck())
                            {
                                this.contentType = message.getMsrpHeaderValue("Content-Type");
                                if (!String.IsNullOrEmpty(contentType) && contentType.StartsWith(ContentType.CPIM, StringComparison.InvariantCultureIgnoreCase))
                                {
                #if !WINRT
                                    MediaContentCPIM mediaContent = MediaContent.parse(this.tempBufferPtr, read);
                                    Marshal.Copy(this.tempBufferPtr, this.tempBuffer, 0, this.tempBuffer.Length);
                                    if (mediaContent != null)
                                    {
                                        this.wContentType = mediaContent.getHeaderValue("Content-Type");
                                        this.tempBuffer = mediaContent.getPayload();
                                        read = (uint)this.tempBuffer.Length;
                                        mediaContent.Dispose(); // Hi GC, I want my memory right now
                                    }
                #endif
                                }
                            }

                            this.AppenData(this.tempBuffer, read);

                            // File Transfer => ProgressBar
                            if (this.session.MediaType == MediaType.FileTransfer)
                            {
                                long start = -1, end = -1, total = -1;
                #if WINRT
                #if WINDOWS_PHONE
                                doubango_rt.BackEnd.rtMsrpByteRange byteRange = message.getByteRange();
                                start = byteRange.Start;
                                end = byteRange.End;
                                total = byteRange.Total;
                #else
                                message.getByteRange(mStart, mEnd, mTotal);
                                start = Marshal.ReadInt64(mStart);
                                end = Marshal.ReadInt64(mEnd);
                                total = Marshal.ReadInt64(mTotal);
                #endif
                #else
                                message.getByteRange(out start, out end, out total);
                #endif
                                MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.DATA);
                                eargs.AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_START, start)
                                    .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END, end)
                                    .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL, total)
                                    .AddExtra(MsrpEventArgs.EXTRA_REQUEST_TYPE, "SEND")
                                    .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                                EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);
                            }

                            if (message.isLastChunck())
                            {
                                if (this.session.MediaType == MediaType.Chat && this.chatStream != null)
                                {
                                    MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.DATA);
                                    eargs.AddExtra(MsrpEventArgs.EXTRA_CONTENT_TYPE, this.contentType)
                                        .AddExtra(MsrpEventArgs.EXTRA_WRAPPED_CONTENT_TYPE, this.wContentType)
                                        .AddExtra(MsrpEventArgs.EXTRA_DATA, this.chatStream.ToArray())
                                        .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                                    EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);
                                    this.chatStream.SetLength(0);
                                }
                                else if (this.session.MediaType == MediaType.FileTransfer)
                                {
                                    if (this.session.mOutFileStream != null)
                                    {
                                        lock (this.session.mOutFileStream)
                                        {
                                            this.session.mOutFileStream.Close();
                                            this.session.mOutFileStream = null;
                                        }
                                    }
                                }
                            }

                            break;
                        }

                    case tmsrp_request_type_t.tmsrp_REPORT:
                        {
                            // File Transfer => ProgressBar
                            if (this.session.MediaType == MediaType.FileTransfer)
                            {
                                long start = -1, end = -1, total = -1;
                #if WINRT
                #if WINDOWS_PHONE
                                doubango_rt.BackEnd.rtMsrpByteRange byteRange = message.getByteRange();
                                start = byteRange.Start;
                                end = byteRange.End;
                                total = byteRange.Total;
                #else
                                message.getByteRange(mStart, mEnd, mTotal);
                                start = Marshal.ReadInt64(mStart);
                                end = Marshal.ReadInt64(mEnd);
                                total = Marshal.ReadInt64(mTotal);
                #endif
                #else
                                message.getByteRange(out start, out end, out total);
                #endif
                                bool isSuccessReport = message.isSuccessReport();
                                MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, isSuccessReport ? MsrpEventTypes.SUCCESS_REPORT : MsrpEventTypes.FAILURE_REPORT);
                                eargs.AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_START, start)
                                    .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END, end)
                                    .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL, total)
                                    .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                                EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);
                            }
                            break;
                        }

                    case tmsrp_request_type_t.tmsrp_NONE:
                    case tmsrp_request_type_t.tmsrp_AUTH:
                    default:
                        break;
                }
            }
Ejemplo n.º 5
0
            public override int OnEvent(MsrpEvent e)
            {
                tmsrp_event_type_t type = e.getType();
                SipSession session = e.getSipSession();

                if (session == null || session.getId() != this.session.Id)
                {
                    LOG.Error("Invalid session");
                    return -1;
                }

                switch (type)
                {
                    case tmsrp_event_type_t.tmsrp_event_type_connected:
                        {
                            MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.CONNECTED);
                            eargs.AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                            EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);

                            if (this.session.mPendingMessages != null && this.session.mPendingMessages.Count > 0)
                            {
                                if (this.session.IsConnected)
                                {
                                    foreach (PendingMessage pendingMsg in this.session.mPendingMessages)
                                    {
                                        LOG.Info("Sending pending message...");
                                        this.session.SendMessage(pendingMsg.Message, pendingMsg.ContentType, pendingMsg.WContentType);
                                    }
                                    this.session.mPendingMessages.Clear();
                                }
                                else
                                {
                                    LOG.Warn("There are pending messages but we are not connected");
                                }
                            }
                            break;
                        }

                    case tmsrp_event_type_t.tmsrp_event_type_disconnected:
                        {
                            if (this.session.mOutFileStream != null)
                            {
                                lock (this.session.mOutFileStream)
                                {
                                    if (this.session.mOutFileStream != null)
                                    {
                                        this.session.mOutFileStream.Close();
                                        this.session.mOutFileStream = null;
                                    }
                                }
                            }

                            MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.DISCONNECTED);
                            eargs.AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                            EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.mOnMsrpEvent, this.session, eargs);
                            break;
                        }

                    case tmsrp_event_type_t.tmsrp_event_type_message:
                        {
                            MsrpMessage message = e.getMessage();
                            if (message == null)
                            {
                                LOG.Error("Invalid MSRP content");
                                return -1;
                            }

                            if (message.isRequest())
                            {
                                this.ProcessRequest(message);
                            }
                            else
                            {
                                this.ProcessResponse(message);
                            }

                            break;
                        }

                    default:
                        break;
                }

                return 0;
            }
Ejemplo n.º 6
0
        private void MsrpSession_onMsrpEvent(object sender, BogheCore.Sip.Events.MsrpEventArgs e)
        {
            if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
            {
                this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                                            new EventHandler <MsrpEventArgs>(this.MsrpSession_onMsrpEvent), sender, new object[] { e });
                return;
            }

            MyMsrpSession session = (e.GetExtra(MsrpEventArgs.EXTRA_SESSION) as MyMsrpSession);

            if (session == null || [email protected] == null || [email protected] != session.Id)
            {
                LOG.Error("No matching MSRP session could be found");
                return;
            }

            switch (e.Type)
            {
            case MsrpEventTypes.CONNECTED:
                break;

            case MsrpEventTypes.DISCONNECTED:
                if (!this.done)
                {
                    this.buttonAccept.Visibility  = Visibility.Collapsed;
                    this.buttonDecline.Visibility = Visibility.Collapsed;
                    this.progressBar.Visibility   = Visibility.Collapsed;

                    this.labelDescription.Content = "File transfer Failed";
                    this.borderHdr.Background     = Brushes.Red;
                }

                if (this.@event != null && [email protected] != null)
                {
                    [email protected] -= this.MsrpSession_onMsrpEvent;
                }
                break;

            case MsrpEventTypes.ERROR:
                break;

            case MsrpEventTypes.SUCCESS_2XX:
            case MsrpEventTypes.DATA:
            {
                long?end   = e.GetExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END) as long?;
                long?total = e.GetExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL) as long?;

                if (end.HasValue && total.HasValue && end.Value >= 0 && total.Value >= 0)
                {
                    this.progressBar.Maximum      = total.Value;
                    this.progressBar.Value        = end.Value;
                    this.textBlockTransfered.Text = String.Format("Transfered: {0}", this.GetFriendlySize(end.Value));
                    this.textBlockName.Text       = String.Format("{0} ({1})", this.fileName, this.GetFriendlySize(total.Value));

                    if (end.Value >= total.Value)
                    {
                        this.done = true;
                        this.buttonAccept.Visibility  = Visibility.Collapsed;
                        this.buttonDecline.Visibility = Visibility.Collapsed;
                        this.progressBar.Visibility   = Visibility.Collapsed;
                        switch ([email protected])
                        {
                        case HistoryEvent.StatusType.Incoming:
                            this.labelDescription.Content = "File successfully received";
                            break;

                        case HistoryEvent.StatusType.Outgoing:
                            this.labelDescription.Content = "File successfully sent";
                            break;

                        case HistoryEvent.StatusType.Failed:
                        default:
                            this.labelDescription.Content = "File transfer Failed";
                            this.gradientStop.Color       = Colors.Red;
                            break;
                        }
                    }
                }
                else
                {
                    this.progressBar.IsIndeterminate = true;
                }

                break;
            }

            case MsrpEventTypes.SUCCESS_REPORT:
            {
                break;
            }
            }
        }
Ejemplo n.º 7
0
            private void ProcessResponse(MsrpMessage message)
            {
                short code = message.getCode();

                if (code >= 200 && code <= 299)
                {
                    // File Transfer => ProgressBar
                    if (this.session.MediaType == MediaType.FileTransfer)
                    {
                        long start = -1, end = -1, total = -1;
                        message.getByteRange(out start, out end, out total);
                        MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.SUCCESS_2XX);
                        eargs.AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_START, start)
                            .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END, end)
                            .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL, total)
                            .AddExtra(MsrpEventArgs.EXTRA_RESPONSE_CODE, code)
                            .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                        EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.onMsrpEvent, this.session, eargs);
                    }
                }
                else if (code >= 300)
                {
                    MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.ERROR);
                        eargs.AddExtra(MsrpEventArgs.EXTRA_RESPONSE_CODE, code)
                            .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                    EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.onMsrpEvent, this.session, eargs);
                }
            }
Ejemplo n.º 8
0
            private void ProcessRequest(MsrpMessage message)
            {
                tmsrp_request_type_t type = message.getRequestType();

                switch (type)
                {
                    case tmsrp_request_type_t.tmsrp_SEND:
                        {
                            uint clen = message.getMsrpContentLength();
                            uint read = 0;
                            if (clen == 0)
                            {
                                LOG.Info("Empty MSRP message");
                                return;
                            }

                            if (this.tempBuffer == null || this.tempBuffer.Length < clen)
                            {
                                this.tempBuffer = new byte[(int)clen];
                            }

                            read = message.getMsrpContent(this.tempBuffer, (uint)this.tempBuffer.Length);
                            if (message.isFirstChunck())
                            {
                                this.contentType = message.getMsrpHeaderValue("Content-Type");
                                if (!String.IsNullOrEmpty(contentType) && contentType.StartsWith(ContentType.CPIM, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    MediaContentCPIM mediaContent = MediaContent.parse(this.tempBuffer, read);
                                    if (mediaContent != null)
                                    {
                                        this.wContentType = mediaContent.getHeaderValue("Content-Type");
                                        this.tempBuffer = mediaContent.getPayload();
                                        read = (uint)this.tempBuffer.Length;
                                        mediaContent.Dispose(); // Hi GC, I want my memory right now
                                    }
                                }
                            }

                            this.AppenData(this.tempBuffer, read);

                            // File Transfer => ProgressBar
                            if (this.session.MediaType == MediaType.FileTransfer)
                            {
                                long start = -1, end = -1, total = -1;
                                message.getByteRange(out start, out end, out total);
                                MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.DATA);
                                eargs.AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_START, start)
                                    .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_END, end)
                                    .AddExtra(MsrpEventArgs.EXTRA_BYTE_RANGE_TOTAL, total)
                                    .AddExtra(MsrpEventArgs.EXTRA_REQUEST_TYPE, "SEND")
                                    .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                                EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.onMsrpEvent, this.session, eargs);
                            }

                            if (message.isLastChunck())
                            {
                                if (this.session.MediaType == MediaType.Chat && this.chatStream != null)
                                {
                                    MsrpEventArgs eargs = new MsrpEventArgs(this.session.Id, MsrpEventTypes.DATA);
                                    eargs.AddExtra(MsrpEventArgs.EXTRA_CONTENT_TYPE, this.contentType)
                                        .AddExtra(MsrpEventArgs.EXTRA_WRAPPED_CONTENT_TYPE, this.wContentType)
                                        .AddExtra(MsrpEventArgs.EXTRA_DATA, this.chatStream.ToArray())
                                        .AddExtra(MsrpEventArgs.EXTRA_SESSION, this.session);
                                    EventHandlerTrigger.TriggerEvent<MsrpEventArgs>(this.session.onMsrpEvent, this.session, eargs);
                                    this.chatStream.SetLength(0);
                                }
                                else if (this.session.MediaType == MediaType.FileTransfer)
                                {
                                    if (this.session.outFileStream != null)
                                    {
                                        lock (this.session.outFileStream)
                                        {
                                            this.session.outFileStream.Close();
                                            this.session.outFileStream = null;
                                        }
                                    }
                                }
                            }

                            break;
                        }

                    case tmsrp_request_type_t.tmsrp_REPORT:
                        {
                            break;
                        }

                    case tmsrp_request_type_t.tmsrp_NONE:
                    case tmsrp_request_type_t.tmsrp_AUTH:
                    default:
                        break;
                }
            }