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
        }
예제 #2
0
        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
        }