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
        }
Esempio n. 3
0
        /// <summary>
        /// Get the Asset data for an item, must be used when requesting a Notecard
        /// </summary>
        /// <remarks>It is the responsibility of the calling party to retrieve the asset data from the request object when it is compelte.</remarks>
        /// <param name="item"></param>
        public AssetRequestDownload RequestInventoryAsset(InventoryItem item)
        {
            if (!(item is InventoryWearable))
            {
                if ((item.OwnerMask & (uint)AssetPermission.Copy) == 0)
                {
                    throw new AssetPermissionException(item, slClient, "Asset data refused, Copy permission needed.");
                }
                if ((item.OwnerMask & (uint)AssetPermission.Modify) == 0 && (item.Type == 10))
                {
                    throw new AssetPermissionException(item, slClient, "Asset data refused, Modify permission needed for scripts.");
                }
            }

            LLUUID TransferID = LLUUID.Random();

            AssetRequestDownload request = new AssetRequestDownload(slClient.Assets, TransferID, item.AssetID);

            request.UpdateLastPacketTime(); // last time we recevied a packet for this request

            htDownloadRequests[TransferID] = request;

            // prep packet based on asset type
            Packet packet;

            switch (item.Type)
            {
            case 5:      //Shirt
            case 13:     //Bodyshape
                packet = AssetPacketHelpers.TransferRequestDirect(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, item.AssetID, item.Type);
                break;

            default:
                packet = AssetPacketHelpers.TransferRequest(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, item);
                break;
            }

            // Send packet
            slClient.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            slClient.Log(packet.ToString(), Helpers.LogLevel.Info);
            #endif

            return(request);
        }
        internal void SendFirstPacket()
        {
            Packet packet;

            if (this.MyAsset.AssetData.Length > 1000)
            {
                packet = AssetPacketHelpers.AssetUploadRequestHeaderOnly(this.MyAsset, this.TransactionID);
            }
            else
            {
                packet = AssetPacketHelpers.AssetUploadRequest(this.MyAsset, this.TransactionID);
            }

            slClient.Network.SendPacket(packet);
#if DEBUG_PACKETS
            Console.WriteLine(packet);
#endif
        }
Esempio n. 5
0
        /// <summary>
        /// Get Asset data, works with BodyShapes (type 13) but does not work with Notecards(type 7)
        /// </summary>
        public AssetRequestDownload RequestInventoryAsset(LLUUID AssetID, sbyte Type)
        {
            LLUUID TransferID = LLUUID.Random();

            AssetRequestDownload request = new AssetRequestDownload(slClient.Assets, TransferID, AssetID);

            request.UpdateLastPacketTime(); // last time we recevied a packet for this request

            htDownloadRequests[TransferID] = request;

            Packet packet = AssetPacketHelpers.TransferRequestDirect(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, AssetID, Type);

            slClient.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            slClient.Log(packet.ToString(), Helpers.LogLevel.Info);
            #endif

            return(request);
        }
        protected void SendFirstPacket()
        {
            Packet packet;

            if (AssetBeingTransferd._AssetData.Length > 1000)
            {
                packet = AssetPacketHelpers.AssetUploadRequestHeaderOnly(AssetBeingTransferd, _TransactionID);
            }
            else
            {
                packet = AssetPacketHelpers.AssetUploadRequest(AssetBeingTransferd, _TransactionID);
            }

            _Client.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            slClient.DebugLog(packet);
            #endif
            #if DEBUG_HEADERS
            _Client.DebugLog(packet.Header.ToString());
            #endif
        }
        internal void SendFirstPacket()
        {
            Packet packet;

            if (this.MyAsset._AssetData.Length > 1000)
            {
                packet = AssetPacketHelpers.AssetUploadRequestHeaderOnly(this.MyAsset, this.TransactionID);
            }
            else
            {
                packet = AssetPacketHelpers.AssetUploadRequest(this.MyAsset, this.TransactionID);
            }

            slClient.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            slClient.DebugLog(packet);
            #endif
            #if DEBUG_HEADERS
            slClient.DebugLog(packet.Header.ToString());
            #endif
        }
Esempio n. 8
0
        /// <summary>
        /// Get the Asset data for an item, must be used when requesting a Notecard
        /// </summary>
        /// <param name="item"></param>
        public void GetInventoryAsset(InventoryItem item)
        {
            LLUUID TransferID = LLUUID.Random();

            AssetRequestDownload request = new AssetRequestDownload(TransferID);

            request.Size     = int.MaxValue; // Number of bytes expected
            request.Received = 0;            // Number of bytes received
            request.UpdateLastPacketTime();  // last time we recevied a packet for this request

            htDownloadRequests[TransferID] = request;

            // prep packet based on asset type
            Packet packet;

            switch (item.Type)
            {
            case 5:      //Shirt
            case 13:     //Bodyshape
                packet = AssetPacketHelpers.TransferRequestDirect(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, item.AssetID, item.Type);
                break;

            default:
                packet = AssetPacketHelpers.TransferRequest(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, item);
                break;
            }

            // Send packet
            slClient.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            slClient.DebugLog(packet);
            #endif

            request.Completed.WaitOne();

            item.SetAssetData(request.AssetData);
        }
Esempio n. 9
0
        /// <summary>
        /// Get Asset data, works with BodyShapes (type 13) but does not work with Notecards(type 7)
        /// </summary>
        /// <param name="asset"></param>
        public void GetInventoryAsset(Asset asset)
        {
            LLUUID TransferID = LLUUID.Random();

            AssetRequestDownload request = new AssetRequestDownload(TransferID);

            request.Size     = int.MaxValue; // Number of bytes expected
            request.Received = 0;            // Number of bytes received
            request.UpdateLastPacketTime();  // last time we recevied a packet for this request

            htDownloadRequests[TransferID] = request;

            Packet packet = AssetPacketHelpers.TransferRequestDirect(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, asset.AssetID, asset.Type);

            slClient.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            slClient.DebugLog(packet);
            #endif

            request.Completed.WaitOne();

            asset.SetAssetData(request.AssetData);
        }
Esempio n. 10
0
        /// <summary>
        /// Get the Asset data for an item
        /// </summary>
        /// <param name="item"></param>
        public void GetInventoryAsset(InventoryItem item)
        {
            LLUUID TransferID = LLUUID.GenerateUUID();

            AssetRequestDownload request = new AssetRequestDownload(TransferID);

            request.Size     = int.MaxValue; // Number of bytes expected
            request.Received = 0;            // Number of bytes received
            request.UpdateLastPacketTime();  // last time we recevied a packet for this request

            htDownloadRequests[TransferID] = request;

            Packet packet = AssetPacketHelpers.TransferRequest(slClient.Network.SessionID, slClient.Network.AgentID, TransferID, item);

            slClient.Network.SendPacket(packet);

            #if DEBUG_PACKETS
            Console.WriteLine(packet);
            #endif

            request.Completed.WaitOne();

            item.SetAssetData(request.AssetData);
        }