// ISSUE 23 should use constructor ? public static byte[] CreateHeader( byte ver, RelayCode msgCode, byte contentCode, byte mask, byte destCode, PlayerId srcPid, ObjectId srcOid, UInt16 destLen, UInt16 contentLen ) { var header = new Header(); header.Ver = Definitions.FrameVersion; header.RelayCode = (byte)msgCode; header.ContentCode = contentCode; header.Mask = mask; header.DestCode = destCode; header.SrcPid = srcPid; header.SrcOid = srcOid; header.DestLen = destLen; header.ContentLen = contentLen; var headerSize = Marshal.SizeOf <Header>(header); var headerBytes = new byte[headerSize]; var gch = GCHandle.Alloc(headerBytes, GCHandleType.Pinned); Marshal.StructureToPtr(header, gch.AddrOfPinnedObject(), false); gch.Free(); return(headerBytes); }
private void SyncPrivate(RelayCode relayCode, byte contentCode, byte[] content, ObjectId senderOid, BroadcastFilter filter) { if (!_roomJoined) { OrLog(LogLevel.VeryVerbose, "Couldnt send Sync"); return; } if (filter.DestCode == DestinationCode.MasterOnly) { OrLog(LogLevel.VeryVerbose, "send receivers type master client " + filter.DestCode + " master client id is :" + MasterClient.ID.ToString()); } else if (filter.DestCode == DestinationCode.Include && filter.Destinations.Length > 0) { OrLog(LogLevel.VeryVerbose, "send receivers type include " + filter.DestCode); foreach (var t in filter.Destinations) { OrLog(LogLevel.VeryVerbose, "send target id " + t.ToString()); } } else if (filter.DestCode == DestinationCode.Exclude && filter.Destinations.Length > 0) { OrLog(LogLevel.VeryVerbose, "send receivers type exclude " + filter.DestCode); foreach (var t in filter.Destinations) { OrLog(LogLevel.VeryVerbose, "send target id " + t.ToString()); } } //else if(options.DestCode == DestinationCode.All) //else if (options.DestCode == DestinationCode.Broadcast) else { OrLog(LogLevel.VeryVerbose, "send receivers type all " + filter.DestCode); } var headerBytes = Header.CreateHeader( Definitions.FrameVersion, relayCode, (byte)contentCode, 0, (byte)filter.DestCode, (PlayerId)LoginId, (ObjectId)senderOid, (UInt16)filter.Destinations.Length, (UInt16)content.Length ); var destPidsSize = sizeof(UInt16) * filter.Destinations.Length; var contentSize = content.Length; var messageBytes = new byte[headerBytes.Length + destPidsSize + contentSize]; var stream = new MemoryStream(messageBytes); var message = new EndiannessBinaryWriter(stream); try { message.Write(headerBytes); if (destPidsSize > 0) { message.Write(new byte[destPidsSize]); Buffer.BlockCopy(filter.Destinations, 0, messageBytes, headerBytes.Length, destPidsSize); } message.Write(content); OrLog(LogLevel.VeryVerbose, "prepare Sync: " + BitConverter.ToString(messageBytes)); statefullQueue.Enqueue(messageBytes); } catch (Exception e) { OrLogError(LogLevel.Info, "error: " + e.Message); OrLogError(LogLevel.Verbose, "stacktrace: " + e.StackTrace); } message.Close(); stream.Close(); }