private void SendCurrentPacket() { Packet uploadPacket; // technically we don't need this lock, because no state is updated here! // lock (this) { // THREADING: snapshot this num so we use a consistent value throughout uint packetNum = CurrentPacket; if (packetNum == 0) { if (MyAsset._AssetData.Length <= 1000) { throw new Exception("Should not use xfer for small assets"); } int dataSize = 1000; byte[] packetData = new byte[dataSize + 4]; // Extra space is for leading data length bytes // Prefix the first Xfer packet with the data length // FIXME: Apply endianness patch Array.Copy(BitConverter.GetBytes((int)MyAsset._AssetData.Length), 0, packetData, 0, 4); Array.Copy(MyAsset._AssetData, 0, packetData, 4, dataSize); uploadPacket = AssetPacketHelpers.SendXferPacket(XferID, packetData, packetNum); } else if (packetNum < this.NumPackets) { byte[] packetData = new byte[1000]; Array.Copy(this.MyAsset._AssetData, packetNum * 1000, packetData, 0, 1000); uploadPacket = AssetPacketHelpers.SendXferPacket(this.XferID, packetData, packetNum); } else { // The last packet has to be handled slightly differently int lastLen = this.MyAsset._AssetData.Length - (this.NumPackets * 1000); byte[] packetData = new byte[lastLen]; Array.Copy(this.MyAsset._AssetData, this.NumPackets * 1000, packetData, 0, lastLen); uint lastPacket = (uint)int.MaxValue + (uint)this.NumPackets + (uint)1; uploadPacket = AssetPacketHelpers.SendXferPacket(this.XferID, packetData, lastPacket); } } slClient.Network.SendPacket(uploadPacket); #if DEBUG_PACKETS slClient.DebugLog(uploadPacket); #endif #if DEBUG_HEADERS slClient.DebugLog(uploadPacket.Header.ToString()); #endif }
protected void SendCurrentPacket() { Packet uploadPacket; // THREADING: snapshot this num so we use a consistent value throughout uint packetNum = _CurrentPacket; if (packetNum == 0) { if (AssetBeingTransferd._AssetData.Length <= 1000) { throw new Exception("Should not use xfer for small assets"); } int dataSize = 1000; byte[] packetData = new byte[dataSize + 4]; // Extra space is for leading data length bytes // Prefix the first Xfer packet with the data length // FIXME: Apply endianness patch Buffer.BlockCopy(BitConverter.GetBytes((int)AssetBeingTransferd._AssetData.Length), 0, packetData, 0, 4); Buffer.BlockCopy(AssetBeingTransferd._AssetData, 0, packetData, 4, dataSize); uploadPacket = AssetPacketHelpers.SendXferPacket(_XferID, packetData, packetNum); } else if (packetNum < _NumPackets2Send) { byte[] packetData = new byte[1000]; Buffer.BlockCopy(AssetBeingTransferd._AssetData, (int)packetNum * 1000, packetData, 0, 1000); uploadPacket = AssetPacketHelpers.SendXferPacket(_XferID, packetData, packetNum); } else { // The last packet has to be handled slightly differently int lastLen = this.AssetBeingTransferd._AssetData.Length - (_NumPackets2Send * 1000); byte[] packetData = new byte[lastLen]; Buffer.BlockCopy(this.AssetBeingTransferd._AssetData, _NumPackets2Send * 1000, packetData, 0, lastLen); uint lastPacket = (uint)int.MaxValue + (uint)_NumPackets2Send + (uint)1; uploadPacket = AssetPacketHelpers.SendXferPacket(_XferID, packetData, lastPacket); } _Client.Network.SendPacket(uploadPacket); #if DEBUG_PACKETS slClient.DebugLog(uploadPacket); #endif #if DEBUG_HEADERS _Client.DebugLog(uploadPacket.Header.ToString()); #endif }