public static ChannelMessage CreateBroadcast(Atom value) { var collection = new AtomCollection(); collection.Add(value); return(new ChannelMessage { Timestamp = Timestamp.Now, Type = MessageType.Broadcast, Content = null, Data = collection, }); }
private Atom CreateBroadcastPacket(BroadcastGroup group, Atom packet) { var bcst = new AtomCollection(); bcst.SetBcstFrom(PeerCast.SessionID); bcst.SetBcstGroup(group); bcst.SetBcstHops(0); bcst.SetBcstTTL(11); PCPVersion.SetBcstVersion(bcst); bcst.SetBcstChannelID(Channel.ChannelID); bcst.Add(packet); return(new Atom(Atom.PCP_BCST, bcst)); }
/// <summary> /// 指定したパケットを含むブロードキャストパケットを作成します /// </summary> /// <param name="group">配送先グループ</param> /// <param name="packet">配送するパケット</param> /// <returns>作成したPCP_BCSTパケット</returns> public virtual Atom CreateBroadcastPacket(BroadcastGroup group, Atom packet) { var bcst = new AtomCollection(); bcst.SetBcstFrom(PeerCast.SessionID); bcst.SetBcstGroup(group); bcst.SetBcstHops(0); bcst.SetBcstTTL(11); bcst.SetBcstVersion(PCP_VERSION); bcst.SetBcstVersionVP(PCP_VERSION_VP); bcst.SetBcstChannelID(Channel.ChannelID); bcst.Add(packet); return(new Atom(Atom.PCP_BCST, bcst)); }
/// <summary> /// 指定したパケットを含むブロードキャストパケットを作成します /// </summary> /// <param name="group">配送先グループ</param> /// <param name="packet">配送するパケット</param> /// <returns>作成したPCP_BCSTパケット</returns> private Atom CreateBroadcastPacket(BroadcastGroup group, Atom packet) { var bcst = new AtomCollection(); bcst.SetBcstFrom(PeerCast.SessionID); bcst.SetBcstGroup(group); bcst.SetBcstHops(0); bcst.SetBcstTTL(11); PCPVersion.SetBcstVersion(bcst); bcst.SetBcstChannelID(Channel.ChannelID); bcst.Add(packet); return new Atom(Atom.PCP_BCST, bcst); }
static public Atom ReadAtom(this Stream stream) { var header = stream.ReadBytes(8); var name = new ID4(header, 0); if (!BitConverter.IsLittleEndian) Array.Reverse(header, 4, 4); uint len = BitConverter.ToUInt32(header, 4); if ((len & 0x80000000U)!=0) { if ((len&0x7FFFFFFF)>1024) { throw new InvalidDataException("Atom has too many children"); } var children = new AtomCollection(); for (var i=0; i<(len&0x7FFFFFFF); i++) { children.Add(stream.ReadAtom()); } return new Atom(name, children); } else { if (len>1024*1024) { throw new InvalidDataException("Atom length too long"); } var value = stream.ReadBytes((int)len); return new Atom(name, value); } }
static public async Task<Atom> ReadAtomAsync(this Stream stream, CancellationToken cancel_token) { var header = await stream.ReadBytesAsync(8, cancel_token); var name = new ID4(header, 0); if (!BitConverter.IsLittleEndian) Array.Reverse(header, 4, 4); uint len = BitConverter.ToUInt32(header, 4); if ((len & 0x80000000U)!=0) { if ((len&0x7FFFFFFF)>1024) { throw new InvalidDataException("Atom has too many children"); } var children = new AtomCollection(); for (var i=0; i<(len&0x7FFFFFFF); i++) { children.Add(await stream.ReadAtomAsync(cancel_token)); } return new Atom(name, children); } else { if (len>1024*1024) { throw new InvalidDataException("Atom length too long"); } var value = await stream.ReadBytesAsync((int)len, cancel_token); return new Atom(name, value); } }