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 }
/// <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 }
/// <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 }
/// <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); }
/// <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); }
/// <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); }