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; } }
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); } }
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; } } }
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; } }
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; }
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; } } }
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); } }
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; } }