private Task getElementInformationAsync(CitpPeer peer, GetElementInformationMessagePacket requestPacket) { CitpPacket packet; switch (requestPacket.LibraryType) { case MsexLibraryType.Media: var mediaPacket = new MediaElementInformationMessagePacket { LibraryNumber = requestPacket.LibraryNumber, LibraryId = requestPacket.LibraryId, Media = _device.GetMediaElementInformation(new MsexId(requestPacket.LibraryId, requestPacket.LibraryNumber), requestPacket.RequestedElementNumbers).ToList() }; packet = mediaPacket; break; case MsexLibraryType.Effects: var effectPacket = new EffectElementInformationMessagePacket { LibraryNumber = requestPacket.LibraryNumber, LibraryId = requestPacket.LibraryId, Effects = _device.GetEffectElementInformation(new MsexId(requestPacket.LibraryId, requestPacket.LibraryNumber), requestPacket.RequestedElementNumbers).ToList() }; packet = effectPacket; break; default: Debug.Assert(requestPacket.LibraryId.HasValue, "Generic elements are unsupported in MSEX V1.0"); var genericPacket = new GenericElementInformationMessagePacket { LibraryId = requestPacket.LibraryId.Value, LibraryType = requestPacket.LibraryType, Information = _device.GetGenericElementInformation(requestPacket.LibraryType, requestPacket.LibraryId.Value, requestPacket.RequestedElementNumbers).ToList() }; packet = genericPacket; break; } return(_networkService.SendPacketAsync(packet, peer, requestPacket)); }
public static CitpPacket FromByteArray(byte[] data, IpEndpoint?remoteEndpoint = null) { CitpPacket packet; var layerType = getLayerType(data); if (layerType == null) { var layerTypeArray = new byte[4]; Buffer.BlockCopy(data, CitpContentTypePosition, layerTypeArray, 0, 4); throw new InvalidOperationException( $"Unrecognised CITP content type: {Encoding.UTF8.GetString(layerTypeArray, 0, layerTypeArray.Length)}"); } switch (layerType) { case CitpLayerType.PeerInformationLayer: { var messageType = PinfPacket.GetMessageType(data); if (messageType == null) { var messageTypeArray = new byte[4]; Buffer.BlockCopy(data, PinfPacket.CitpMessageTypePosition, messageTypeArray, 0, 4); throw new InvalidOperationException( $"Unrecognised PING message type: {Encoding.UTF8.GetString(messageTypeArray, 0, messageTypeArray.Length)}"); } switch (messageType) { case PinfMessageType.PeerLocationMessage: packet = new PeerLocationMessagePacket(); break; case PinfMessageType.PeerNameMessage: packet = new PeerNameMessagePacket(); break; default: throw new NotImplementedException("Unimplemented PINF message type"); } break; } case CitpLayerType.MediaServerExtensionsLayer: { var messageType = MsexPacket.GetMessageType(data); if (messageType == null) { var messageTypeArray = new byte[4]; Buffer.BlockCopy(data, MsexPacket.CitpMessageTypePosition, messageTypeArray, 0, 4); throw new InvalidOperationException( $"Unrecognised MSEX message type: {Encoding.UTF8.GetString(messageTypeArray, 0, messageTypeArray.Length)}"); } switch (messageType) { case MsexMessageType.ClientInformationMessage: packet = new ClientInformationMessagePacket(); break; case MsexMessageType.ServerInformationMessage: packet = new ServerInformationMessagePacket(); break; case MsexMessageType.NegativeAcknowledgeMessage: packet = new NegativeAcknowledgeMessagePacket(); break; case MsexMessageType.LayerStatusMessage: packet = new LayerStatusMessagePacket(); break; case MsexMessageType.GetElementLibraryInformationMessage: packet = new GetElementLibraryInformationMessagePacket(); break; case MsexMessageType.ElementLibraryInformationMessage: packet = new ElementLibraryInformationMessagePacket(); break; case MsexMessageType.ElementLibraryUpdatedMessage: packet = new ElementLibraryUpdatedMessagePacket(); break; case MsexMessageType.GetElementInformationMessage: packet = new GetElementInformationMessagePacket(); break; case MsexMessageType.MediaElementInformationMessage: packet = new MediaElementInformationMessagePacket(); break; case MsexMessageType.EffectElementInformationMessage: packet = new EffectElementInformationMessagePacket(); break; case MsexMessageType.GenericElementInformationMessage: packet = new GenericElementInformationMessagePacket(); break; case MsexMessageType.GetElementLibraryThumbnailMessage: packet = new GetElementLibraryThumbnailMessagePacket(); break; case MsexMessageType.ElementLibraryThumbnailMessage: packet = new ElementLibraryThumbnailMessagePacket(); break; case MsexMessageType.GetElementThumbnailMessage: packet = new GetElementThumbnailMessagePacket(); break; case MsexMessageType.ElementThumbnailMessage: packet = new ElementThumbnailMessagePacket(); break; case MsexMessageType.GetVideoSourcesMessage: packet = new GetVideoSourcesMessagePacket(); break; case MsexMessageType.RequestStreamMessage: packet = new RequestStreamMessagePacket(); break; case MsexMessageType.StreamFrameMessage: packet = new StreamFrameMessagePacket(); break; default: throw new NotImplementedException("Unimplemented MSEX message type"); } break; } default: throw new NotImplementedException("Unimplemented CITP content type"); } using (var reader = new CitpBinaryReader(new MemoryStream(data))) packet.DeserializeFromStream(reader); packet.RemoteEndpoint = remoteEndpoint; return(packet); }