aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs895
1 files changed, 749 insertions, 146 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 20df8a6..921d3bf 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Timers;
29using System.Collections; 30using System.Collections;
30using System.Collections.Generic; 31using System.Collections.Generic;
31using System.IO; 32using System.IO;
@@ -49,18 +50,21 @@ using OpenSim.Services.Interfaces;
49using Caps = OpenSim.Framework.Capabilities.Caps; 50using Caps = OpenSim.Framework.Capabilities.Caps;
50using OSDArray = OpenMetaverse.StructuredData.OSDArray; 51using OSDArray = OpenMetaverse.StructuredData.OSDArray;
51using OSDMap = OpenMetaverse.StructuredData.OSDMap; 52using OSDMap = OpenMetaverse.StructuredData.OSDMap;
53using PermissionMask = OpenSim.Framework.PermissionMask;
52 54
53namespace OpenSim.Region.ClientStack.Linden 55namespace OpenSim.Region.ClientStack.Linden
54{ 56{
55 public delegate void UpLoadedAsset( 57 public delegate void UpLoadedAsset(
56 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, 58 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder,
57 byte[] data, string inventoryType, string assetType); 59 byte[] data, string inventoryType, string assetType,
60 int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
61 bool IsAtestUpload, ref string error);
58 62
59 public delegate UUID UpdateItem(UUID itemID, byte[] data); 63 public delegate UUID UpdateItem(UUID itemID, byte[] data);
60 64
61 public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors); 65 public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors);
62 66
63 public delegate void NewInventoryItem(UUID userID, InventoryItemBase item); 67 public delegate void NewInventoryItem(UUID userID, InventoryItemBase item, uint cost);
64 68
65 public delegate void NewAsset(AssetBase asset); 69 public delegate void NewAsset(AssetBase asset);
66 70
@@ -86,6 +90,7 @@ namespace OpenSim.Region.ClientStack.Linden
86 90
87 private Scene m_Scene; 91 private Scene m_Scene;
88 private Caps m_HostCapsObj; 92 private Caps m_HostCapsObj;
93 private ModelCost m_ModelCost;
89 94
90 private static readonly string m_requestPath = "0000/"; 95 private static readonly string m_requestPath = "0000/";
91 // private static readonly string m_mapLayerPath = "0001/"; 96 // private static readonly string m_mapLayerPath = "0001/";
@@ -97,7 +102,8 @@ namespace OpenSim.Region.ClientStack.Linden
97 private static readonly string m_copyFromNotecardPath = "0007/"; 102 private static readonly string m_copyFromNotecardPath = "0007/";
98 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule. 103 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule.
99 private static readonly string m_getObjectPhysicsDataPath = "0101/"; 104 private static readonly string m_getObjectPhysicsDataPath = "0101/";
100 /* 0102 - 0103 RESERVED */ 105 private static readonly string m_getObjectCostPath = "0102/";
106 private static readonly string m_ResourceCostSelectedPath = "0103/";
101 private static readonly string m_UpdateAgentInformationPath = "0500/"; 107 private static readonly string m_UpdateAgentInformationPath = "0500/";
102 108
103 // These are callbacks which will be setup by the scene so that we can update scene data when we 109 // These are callbacks which will be setup by the scene so that we can update scene data when we
@@ -113,12 +119,50 @@ namespace OpenSim.Region.ClientStack.Linden
113 private IAssetService m_assetService; 119 private IAssetService m_assetService;
114 private bool m_dumpAssetsToFile = false; 120 private bool m_dumpAssetsToFile = false;
115 private string m_regionName; 121 private string m_regionName;
122
116 private int m_levelUpload = 0; 123 private int m_levelUpload = 0;
117 124
125 private bool m_enableFreeTestUpload = false; // allows "TEST-" prefix hack
126 private bool m_ForceFreeTestUpload = false; // forces all uploads to be test
127
128 private bool m_enableModelUploadTextureToInventory = false; // place uploaded textures also in inventory
129 // may not be visible till relog
130
131 private bool m_RestrictFreeTestUploadPerms = false; // reduces also the permitions. Needs a creator defined!!
132 private UUID m_testAssetsCreatorID = UUID.Zero;
133
134 private float m_PrimScaleMin = 0.001f;
135
136 private enum FileAgentInventoryState : int
137 {
138 idle = 0,
139 processRequest = 1,
140 waitUpload = 2,
141 processUpload = 3
142 }
143 private FileAgentInventoryState m_FileAgentInventoryState = FileAgentInventoryState.idle;
144
118 public BunchOfCaps(Scene scene, Caps caps) 145 public BunchOfCaps(Scene scene, Caps caps)
119 { 146 {
120 m_Scene = scene; 147 m_Scene = scene;
121 m_HostCapsObj = caps; 148 m_HostCapsObj = caps;
149
150 // create a model upload cost provider
151 m_ModelCost = new ModelCost();
152 // tell it about scene object limits
153 m_ModelCost.NonPhysicalPrimScaleMax = m_Scene.m_maxNonphys;
154 m_ModelCost.PhysicalPrimScaleMax = m_Scene.m_maxPhys;
155
156// m_ModelCost.ObjectLinkedPartsMax = ??
157// m_ModelCost.PrimScaleMin = ??
158
159 m_PrimScaleMin = m_ModelCost.PrimScaleMin;
160 float modelTextureUploadFactor = m_ModelCost.ModelTextureCostFactor;
161 float modelUploadFactor = m_ModelCost.ModelMeshCostFactor;
162 float modelMinUploadCostFactor = m_ModelCost.ModelMinCostFactor;
163 float modelPrimCreationCost = m_ModelCost.primCreationCost;
164 float modelMeshByteCost = m_ModelCost.bytecost;
165
122 IConfigSource config = m_Scene.Config; 166 IConfigSource config = m_Scene.Config;
123 if (config != null) 167 if (config != null)
124 { 168 {
@@ -133,6 +177,37 @@ namespace OpenSim.Region.ClientStack.Linden
133 { 177 {
134 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); 178 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
135 } 179 }
180 // economy for model upload
181 IConfig EconomyConfig = config.Configs["Economy"];
182 if (EconomyConfig != null)
183 {
184 modelUploadFactor = EconomyConfig.GetFloat("MeshModelUploadCostFactor", modelUploadFactor);
185 modelTextureUploadFactor = EconomyConfig.GetFloat("MeshModelUploadTextureCostFactor", modelTextureUploadFactor);
186 modelMinUploadCostFactor = EconomyConfig.GetFloat("MeshModelMinCostFactor", modelMinUploadCostFactor);
187 // next 2 are normalized so final cost is afected by modelUploadFactor above and normal cost
188 modelPrimCreationCost = EconomyConfig.GetFloat("ModelPrimCreationCost", modelPrimCreationCost);
189 modelMeshByteCost = EconomyConfig.GetFloat("ModelMeshByteCost", modelMeshByteCost);
190
191 m_enableModelUploadTextureToInventory = EconomyConfig.GetBoolean("MeshModelAllowTextureToInventory", m_enableModelUploadTextureToInventory);
192
193 m_RestrictFreeTestUploadPerms = EconomyConfig.GetBoolean("m_RestrictFreeTestUploadPerms", m_RestrictFreeTestUploadPerms);
194 m_enableFreeTestUpload = EconomyConfig.GetBoolean("AllowFreeTestUpload", m_enableFreeTestUpload);
195 m_ForceFreeTestUpload = EconomyConfig.GetBoolean("ForceFreeTestUpload", m_ForceFreeTestUpload);
196 string testcreator = EconomyConfig.GetString("TestAssetsCreatorID", "");
197 if (testcreator != "")
198 {
199 UUID id;
200 UUID.TryParse(testcreator, out id);
201 if (id != null)
202 m_testAssetsCreatorID = id;
203 }
204
205 m_ModelCost.ModelMeshCostFactor = modelUploadFactor;
206 m_ModelCost.ModelTextureCostFactor = modelTextureUploadFactor;
207 m_ModelCost.ModelMinCostFactor = modelMinUploadCostFactor;
208 m_ModelCost.primCreationCost = modelPrimCreationCost;
209 m_ModelCost.bytecost = modelMeshByteCost;
210 }
136 } 211 }
137 212
138 m_assetService = m_Scene.AssetService; 213 m_assetService = m_Scene.AssetService;
@@ -144,6 +219,8 @@ namespace OpenSim.Region.ClientStack.Linden
144 ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset; 219 ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset;
145 TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset; 220 TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset;
146 GetClient = m_Scene.SceneGraph.GetControllingClient; 221 GetClient = m_Scene.SceneGraph.GetControllingClient;
222
223 m_FileAgentInventoryState = FileAgentInventoryState.idle;
147 } 224 }
148 225
149 /// <summary> 226 /// <summary>
@@ -189,7 +266,6 @@ namespace OpenSim.Region.ClientStack.Linden
189 { 266 {
190 try 267 try
191 { 268 {
192 // I don't think this one works...
193 m_HostCapsObj.RegisterHandler( 269 m_HostCapsObj.RegisterHandler(
194 "NewFileAgentInventory", 270 "NewFileAgentInventory",
195 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>( 271 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>(
@@ -208,6 +284,10 @@ namespace OpenSim.Region.ClientStack.Linden
208 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); 284 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
209 IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData); 285 IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData);
210 m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler); 286 m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler);
287 IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost);
288 m_HostCapsObj.RegisterHandler("GetObjectCost", getObjectCostHandler);
289 IRequestHandler ResourceCostSelectedHandler = new RestStreamHandler("POST", capsBase + m_ResourceCostSelectedPath, ResourceCostSelected);
290 m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler);
211 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation); 291 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation);
212 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler); 292 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
213 293
@@ -263,6 +343,9 @@ namespace OpenSim.Region.ClientStack.Linden
263 m_log.DebugFormat( 343 m_log.DebugFormat(
264 "[CAPS]: Received SEED caps request in {0} for agent {1}", m_regionName, m_HostCapsObj.AgentID); 344 "[CAPS]: Received SEED caps request in {0} for agent {1}", m_regionName, m_HostCapsObj.AgentID);
265 345
346 if (!m_HostCapsObj.WaitForActivation())
347 return string.Empty;
348
266 if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) 349 if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint))
267 { 350 {
268 m_log.WarnFormat( 351 m_log.WarnFormat(
@@ -392,62 +475,176 @@ namespace OpenSim.Region.ClientStack.Linden
392 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString()); 475 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString());
393 //m_log.Debug("asset upload request via CAPS" + llsdRequest.inventory_type + " , " + llsdRequest.asset_type); 476 //m_log.Debug("asset upload request via CAPS" + llsdRequest.inventory_type + " , " + llsdRequest.asset_type);
394 477
478 // start by getting the client
479 IClientAPI client = null;
480 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
481
482 // check current state so we only have one service at a time
483 lock (m_ModelCost)
484 {
485 switch (m_FileAgentInventoryState)
486 {
487 case FileAgentInventoryState.processRequest:
488 case FileAgentInventoryState.processUpload:
489 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
490 resperror.message = "Uploader busy processing previus request";
491 resperror.identifier = UUID.Zero;
492
493 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
494 errorResponse.uploader = "";
495 errorResponse.state = "error";
496 errorResponse.error = resperror;
497 return errorResponse;
498 break;
499 case FileAgentInventoryState.waitUpload:
500 // todo stop current uploader server
501 break;
502 case FileAgentInventoryState.idle:
503 default:
504 break;
505 }
506
507 m_FileAgentInventoryState = FileAgentInventoryState.processRequest;
508 }
509
510 int cost = 0;
511 int nreqtextures = 0;
512 int nreqmeshs= 0;
513 int nreqinstances = 0;
514 bool IsAtestUpload = false;
515
516 string assetName = llsdRequest.name;
517
518 LLSDAssetUploadResponseData meshcostdata = new LLSDAssetUploadResponseData();
519
395 if (llsdRequest.asset_type == "texture" || 520 if (llsdRequest.asset_type == "texture" ||
396 llsdRequest.asset_type == "animation" || 521 llsdRequest.asset_type == "animation" ||
522 llsdRequest.asset_type == "mesh" ||
397 llsdRequest.asset_type == "sound") 523 llsdRequest.asset_type == "sound")
398 { 524 {
399 ScenePresence avatar = null; 525 ScenePresence avatar = null;
400 IClientAPI client = null;
401 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar); 526 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar);
402 527
403 // check user level 528 // check user level
404 if (avatar != null) 529 if (avatar != null)
405 { 530 {
406 client = avatar.ControllingClient;
407
408 if (avatar.UserLevel < m_levelUpload) 531 if (avatar.UserLevel < m_levelUpload)
409 { 532 {
410 if (client != null) 533 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
411 client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); 534 resperror.message = "Insufficient permissions to upload";
535 resperror.identifier = UUID.Zero;
412 536
413 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 537 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
414 errorResponse.uploader = ""; 538 errorResponse.uploader = "";
415 errorResponse.state = "error"; 539 errorResponse.state = "error";
540 errorResponse.error = resperror;
541 lock (m_ModelCost)
542 m_FileAgentInventoryState = FileAgentInventoryState.idle;
416 return errorResponse; 543 return errorResponse;
417 } 544 }
418 } 545 }
419 546
420 // check funds 547 // check test upload and funds
421 if (client != null) 548 if (client != null)
422 { 549 {
423 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>(); 550 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
424 551
552 int baseCost = 0;
425 if (mm != null) 553 if (mm != null)
554 baseCost = mm.UploadCharge;
555
556 string warning = String.Empty;
557
558 if (llsdRequest.asset_type == "mesh")
426 { 559 {
427 if (!mm.UploadCovered(client.AgentId, mm.UploadCharge)) 560 string error;
561 int modelcost;
562
563 if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost,
564 meshcostdata, out error, ref warning))
428 { 565 {
429 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); 566 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
567 resperror.message = error;
568 resperror.identifier = UUID.Zero;
430 569
431 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 570 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
432 errorResponse.uploader = ""; 571 errorResponse.uploader = "";
433 errorResponse.state = "error"; 572 errorResponse.state = "error";
573 errorResponse.error = resperror;
574
575 lock (m_ModelCost)
576 m_FileAgentInventoryState = FileAgentInventoryState.idle;
434 return errorResponse; 577 return errorResponse;
435 } 578 }
579 cost = modelcost;
580 }
581 else
582 {
583 cost = baseCost;
584 }
585
586 if (cost > 0 && mm != null)
587 {
588 // check for test upload
589
590 if (m_ForceFreeTestUpload) // all are test
591 {
592 if (!(assetName.Length > 5 && assetName.StartsWith("TEST-"))) // has normal name lets change it
593 assetName = "TEST-" + assetName;
594
595 IsAtestUpload = true;
596 }
597
598 else if (m_enableFreeTestUpload) // only if prefixed with "TEST-"
599 {
600
601 IsAtestUpload = (assetName.Length > 5 && assetName.StartsWith("TEST-"));
602 }
603
604
605 if(IsAtestUpload) // let user know, still showing cost estimation
606 warning += "Upload will have no cost, for testing purposes only. Other uses are prohibited. Items will not work after 48 hours or on other regions";
607
608 // check funds
609 else
610 {
611 if (!mm.UploadCovered(client.AgentId, (int)cost))
612 {
613 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
614 resperror.message = "Insuficient funds";
615 resperror.identifier = UUID.Zero;
616
617 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
618 errorResponse.uploader = "";
619 errorResponse.state = "error";
620 errorResponse.error = resperror;
621 lock (m_ModelCost)
622 m_FileAgentInventoryState = FileAgentInventoryState.idle;
623 return errorResponse;
624 }
625 }
436 } 626 }
627
628 if (client != null && warning != String.Empty)
629 client.SendAgentAlertMessage(warning, true);
437 } 630 }
438 } 631 }
439 632
440 string assetName = llsdRequest.name;
441 string assetDes = llsdRequest.description; 633 string assetDes = llsdRequest.description;
442 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath; 634 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath;
443 UUID newAsset = UUID.Random(); 635 UUID newAsset = UUID.Random();
444 UUID newInvItem = UUID.Random(); 636 UUID newInvItem = UUID.Random();
445 UUID parentFolder = llsdRequest.folder_id; 637 UUID parentFolder = llsdRequest.folder_id;
446 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); 638 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
639 UUID texturesFolder = UUID.Zero;
640
641 if(!IsAtestUpload && m_enableModelUploadTextureToInventory)
642 texturesFolder = llsdRequest.texture_folder_id;
447 643
448 AssetUploader uploader = 644 AssetUploader uploader =
449 new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, 645 new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
450 llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile); 646 llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost,
647 texturesFolder, nreqtextures, nreqmeshs, nreqinstances, IsAtestUpload);
451 648
452 m_HostCapsObj.HttpListener.AddStreamHandler( 649 m_HostCapsObj.HttpListener.AddStreamHandler(
453 new BinaryStreamHandler( 650 new BinaryStreamHandler(
@@ -465,10 +662,22 @@ namespace OpenSim.Region.ClientStack.Linden
465 string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + capsBase + 662 string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + capsBase +
466 uploaderPath; 663 uploaderPath;
467 664
665
468 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse(); 666 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
469 uploadResponse.uploader = uploaderURL; 667 uploadResponse.uploader = uploaderURL;
470 uploadResponse.state = "upload"; 668 uploadResponse.state = "upload";
669 uploadResponse.upload_price = (int)cost;
670
671 if (llsdRequest.asset_type == "mesh")
672 {
673 uploadResponse.data = meshcostdata;
674 }
675
471 uploader.OnUpLoad += UploadCompleteHandler; 676 uploader.OnUpLoad += UploadCompleteHandler;
677
678 lock (m_ModelCost)
679 m_FileAgentInventoryState = FileAgentInventoryState.waitUpload;
680
472 return uploadResponse; 681 return uploadResponse;
473 } 682 }
474 683
@@ -480,8 +689,14 @@ namespace OpenSim.Region.ClientStack.Linden
480 /// <param name="data"></param> 689 /// <param name="data"></param>
481 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID, 690 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
482 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, 691 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
483 string assetType) 692 string assetType, int cost,
693 UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
694 bool IsAtestUpload, ref string error)
484 { 695 {
696
697 lock (m_ModelCost)
698 m_FileAgentInventoryState = FileAgentInventoryState.processUpload;
699
485 m_log.DebugFormat( 700 m_log.DebugFormat(
486 "[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}", 701 "[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
487 assetID, inventoryItem, inventoryType, assetType); 702 assetID, inventoryItem, inventoryType, assetType);
@@ -489,117 +704,247 @@ namespace OpenSim.Region.ClientStack.Linden
489 sbyte assType = 0; 704 sbyte assType = 0;
490 sbyte inType = 0; 705 sbyte inType = 0;
491 706
707 IClientAPI client = null;
708
709 UUID owner_id = m_HostCapsObj.AgentID;
710 UUID creatorID;
711
712 bool istest = IsAtestUpload && m_enableFreeTestUpload && (cost > 0);
713
714 bool restrictPerms = m_RestrictFreeTestUploadPerms && istest;
715
716 if (istest && m_testAssetsCreatorID != UUID.Zero)
717 creatorID = m_testAssetsCreatorID;
718 else
719 creatorID = owner_id;
720
721 string creatorIDstr = creatorID.ToString();
722
723 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
724 if (mm != null)
725 {
726 // make sure client still has enougth credit
727 if (!mm.UploadCovered(m_HostCapsObj.AgentID, (int)cost))
728 {
729 error = "Insufficient funds.";
730 return;
731 }
732 }
733
734 // strings to types
492 if (inventoryType == "sound") 735 if (inventoryType == "sound")
493 { 736 {
494 inType = 1; 737 inType = (sbyte)InventoryType.Sound;
495 assType = 1; 738 assType = (sbyte)AssetType.Sound;
496 } 739 }
497 else if (inventoryType == "animation") 740 else if (inventoryType == "animation")
498 { 741 {
499 inType = 19; 742 inType = (sbyte)InventoryType.Animation;
500 assType = 20; 743 assType = (sbyte)AssetType.Animation;
501 } 744 }
502 else if (inventoryType == "wearable") 745 else if (inventoryType == "wearable")
503 { 746 {
504 inType = 18; 747 inType = (sbyte)InventoryType.Wearable;
505 switch (assetType) 748 switch (assetType)
506 { 749 {
507 case "bodypart": 750 case "bodypart":
508 assType = 13; 751 assType = (sbyte)AssetType.Bodypart;
509 break; 752 break;
510 case "clothing": 753 case "clothing":
511 assType = 5; 754 assType = (sbyte)AssetType.Clothing;
512 break; 755 break;
513 } 756 }
514 } 757 }
515 else if (inventoryType == "object") 758 else if (inventoryType == "object")
516 { 759 {
517 inType = (sbyte)InventoryType.Object; 760 if (assetType == "mesh") // this code for now is for mesh models uploads only
518 assType = (sbyte)AssetType.Object;
519
520 List<Vector3> positions = new List<Vector3>();
521 List<Quaternion> rotations = new List<Quaternion>();
522 OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
523 OSDArray instance_list = (OSDArray)request["instance_list"];
524 OSDArray mesh_list = (OSDArray)request["mesh_list"];
525 OSDArray texture_list = (OSDArray)request["texture_list"];
526 SceneObjectGroup grp = null;
527
528 List<UUID> textures = new List<UUID>();
529 for (int i = 0; i < texture_list.Count; i++)
530 { 761 {
531 AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, ""); 762 inType = (sbyte)InventoryType.Object;
532 textureAsset.Data = texture_list[i].AsBinary(); 763 assType = (sbyte)AssetType.Object;
533 m_assetService.Store(textureAsset);
534 textures.Add(textureAsset.FullID);
535 }
536 764
537 for (int i = 0; i < mesh_list.Count; i++) 765 List<Vector3> positions = new List<Vector3>();
538 { 766 List<Quaternion> rotations = new List<Quaternion>();
539 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox(); 767 OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
768
769 // compare and get updated information
540 770
541 Primitive.TextureEntry textureEntry 771 bool mismatchError = true;
542 = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
543 OSDMap inner_instance_list = (OSDMap)instance_list[i];
544 772
545 OSDArray face_list = (OSDArray)inner_instance_list["face_list"]; 773 while (mismatchError)
546 for (uint face = 0; face < face_list.Count; face++)
547 { 774 {
548 OSDMap faceMap = (OSDMap)face_list[(int)face]; 775 mismatchError = false;
549 Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face); 776 }
550 if(faceMap.ContainsKey("fullbright"))
551 f.Fullbright = faceMap["fullbright"].AsBoolean();
552 if (faceMap.ContainsKey ("diffuse_color"))
553 f.RGBA = faceMap["diffuse_color"].AsColor4();
554 777
555 int textureNum = faceMap["image"].AsInteger(); 778 if (mismatchError)
556 float imagerot = faceMap["imagerot"].AsInteger(); 779 {
557 float offsets = (float)faceMap["offsets"].AsReal(); 780 error = "Upload and fee estimation information don't match";
558 float offsett = (float)faceMap["offsett"].AsReal(); 781 lock (m_ModelCost)
559 float scales = (float)faceMap["scales"].AsReal(); 782 m_FileAgentInventoryState = FileAgentInventoryState.idle;
560 float scalet = (float)faceMap["scalet"].AsReal();
561 783
562 if(imagerot != 0) 784 return;
563 f.Rotation = imagerot; 785 }
564 786
565 if(offsets != 0) 787 OSDArray instance_list = (OSDArray)request["instance_list"];
566 f.OffsetU = offsets; 788 OSDArray mesh_list = (OSDArray)request["mesh_list"];
789 OSDArray texture_list = (OSDArray)request["texture_list"];
790 SceneObjectGroup grp = null;
567 791
568 if (offsett != 0) 792 // create and store texture assets
569 f.OffsetV = offsett; 793 bool doTextInv = (!istest && m_enableModelUploadTextureToInventory &&
794 texturesFolder != UUID.Zero);
570 795
571 if (scales != 0)
572 f.RepeatU = scales;
573 796
574 if (scalet != 0) 797 List<UUID> textures = new List<UUID>();
575 f.RepeatV = scalet;
576 798
577 if (textures.Count > textureNum) 799
578 f.TextureID = textures[textureNum]; 800 if (doTextInv)
579 else 801 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
580 f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE; 802
803 if(client == null) // don't put textures in inventory if there is no client
804 doTextInv = false;
805
806 for (int i = 0; i < texture_list.Count; i++)
807 {
808 AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, creatorIDstr);
809 textureAsset.Data = texture_list[i].AsBinary();
810 if (istest)
811 textureAsset.Local = true;
812 m_assetService.Store(textureAsset);
813 textures.Add(textureAsset.FullID);
814
815 if (doTextInv)
816 {
817 string name = assetName;
818 if (name.Length > 25)
819 name = name.Substring(0, 24);
820 name += "_Texture#" + i.ToString();
821 InventoryItemBase texitem = new InventoryItemBase();
822 texitem.Owner = m_HostCapsObj.AgentID;
823 texitem.CreatorId = creatorIDstr;
824 texitem.CreatorData = String.Empty;
825 texitem.ID = UUID.Random();
826 texitem.AssetID = textureAsset.FullID;
827 texitem.Description = "mesh model texture";
828 texitem.Name = name;
829 texitem.AssetType = (int)AssetType.Texture;
830 texitem.InvType = (int)InventoryType.Texture;
831 texitem.Folder = texturesFolder;
832
833 texitem.CurrentPermissions
834 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Export);
835
836 texitem.BasePermissions = (uint)PermissionMask.All | (uint)PermissionMask.Export;
837 texitem.EveryOnePermissions = 0;
838 texitem.NextPermissions = (uint)PermissionMask.All;
839 texitem.CreationDate = Util.UnixTimeSinceEpoch();
840
841 m_Scene.AddInventoryItem(client, texitem);
842 texitem = null;
843 }
844 }
581 845
582 textureEntry.FaceTextures[face] = f; 846 // create and store meshs assets
847 List<UUID> meshAssets = new List<UUID>();
848 for (int i = 0; i < mesh_list.Count; i++)
849 {
850 AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, creatorIDstr);
851 meshAsset.Data = mesh_list[i].AsBinary();
852 if (istest)
853 meshAsset.Local = true;
854 m_assetService.Store(meshAsset);
855 meshAssets.Add(meshAsset.FullID);
583 } 856 }
584 857
585 pbs.TextureEntry = textureEntry.GetBytes(); 858 int skipedMeshs = 0;
859 // build prims from instances
860 for (int i = 0; i < instance_list.Count; i++)
861 {
862 OSDMap inner_instance_list = (OSDMap)instance_list[i];
863
864 // skip prims that are 2 small
865 Vector3 scale = inner_instance_list["scale"].AsVector3();
866
867 if (scale.X < m_PrimScaleMin || scale.Y < m_PrimScaleMin || scale.Z < m_PrimScaleMin)
868 {
869 skipedMeshs++;
870 continue;
871 }
872
873 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
874
875 Primitive.TextureEntry textureEntry
876 = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
586 877
587 AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, "");
588 meshAsset.Data = mesh_list[i].AsBinary();
589 m_assetService.Store(meshAsset);
590 878
591 pbs.SculptEntry = true; 879 OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
592 pbs.SculptTexture = meshAsset.FullID; 880 for (uint face = 0; face < face_list.Count; face++)
593 pbs.SculptType = (byte)SculptType.Mesh; 881 {
594 pbs.SculptData = meshAsset.Data; 882 OSDMap faceMap = (OSDMap)face_list[(int)face];
883 Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face);
884 if (faceMap.ContainsKey("fullbright"))
885 f.Fullbright = faceMap["fullbright"].AsBoolean();
886 if (faceMap.ContainsKey("diffuse_color"))
887 f.RGBA = faceMap["diffuse_color"].AsColor4();
888
889 int textureNum = faceMap["image"].AsInteger();
890 float imagerot = faceMap["imagerot"].AsInteger();
891 float offsets = (float)faceMap["offsets"].AsReal();
892 float offsett = (float)faceMap["offsett"].AsReal();
893 float scales = (float)faceMap["scales"].AsReal();
894 float scalet = (float)faceMap["scalet"].AsReal();
895
896 if (imagerot != 0)
897 f.Rotation = imagerot;
898
899 if (offsets != 0)
900 f.OffsetU = offsets;
901
902 if (offsett != 0)
903 f.OffsetV = offsett;
904
905 if (scales != 0)
906 f.RepeatU = scales;
907
908 if (scalet != 0)
909 f.RepeatV = scalet;
910
911 if (textures.Count > textureNum)
912 f.TextureID = textures[textureNum];
913 else
914 f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE;
915
916 textureEntry.FaceTextures[face] = f;
917 }
918
919 pbs.TextureEntry = textureEntry.GetBytes();
920
921 bool hasmesh = false;
922 if (inner_instance_list.ContainsKey("mesh")) // seems to happen always but ...
923 {
924 int meshindx = inner_instance_list["mesh"].AsInteger();
925 if (meshAssets.Count > meshindx)
926 {
927 pbs.SculptEntry = true;
928 pbs.SculptType = (byte)SculptType.Mesh;
929 pbs.SculptTexture = meshAssets[meshindx]; // actual asset UUID after meshs suport introduction
930 // data will be requested from asset on rez (i hope)
931 hasmesh = true;
932 }
933 }
934
935 Vector3 position = inner_instance_list["position"].AsVector3();
936 Quaternion rotation = inner_instance_list["rotation"].AsQuaternion();
595 937
596 Vector3 position = inner_instance_list["position"].AsVector3(); 938 // for now viwers do send fixed defaults
597 Vector3 scale = inner_instance_list["scale"].AsVector3(); 939 // but this may change
598 Quaternion rotation = inner_instance_list["rotation"].AsQuaternion(); 940// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
941 byte physicsShapeType = (byte)PhysShapeType.prim; // default for mesh is simple convex
942 if(hasmesh)
943 physicsShapeType = (byte) PhysShapeType.convex; // default for mesh is simple convex
944// int material = inner_instance_list["material"].AsInteger();
945 byte material = (byte)Material.Wood;
599 946
600// no longer used - begin ------------------------ 947// no longer used - begin ------------------------
601// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
602// int material = inner_instance_list["material"].AsInteger();
603// int mesh = inner_instance_list["mesh"].AsInteger(); 948// int mesh = inner_instance_list["mesh"].AsInteger();
604 949
605// OSDMap permissions = (OSDMap)inner_instance_list["permissions"]; 950// OSDMap permissions = (OSDMap)inner_instance_list["permissions"];
@@ -614,24 +959,42 @@ namespace OpenSim.Region.ClientStack.Linden
614// UUID owner_id = permissions["owner_id"].AsUUID(); 959// UUID owner_id = permissions["owner_id"].AsUUID();
615// int owner_mask = permissions["owner_mask"].AsInteger(); 960// int owner_mask = permissions["owner_mask"].AsInteger();
616// no longer used - end ------------------------ 961// no longer used - end ------------------------
962
963
964 SceneObjectPart prim
965 = new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero);
966
967 prim.Scale = scale;
968 rotations.Add(rotation);
969 positions.Add(position);
970 prim.UUID = UUID.Random();
971 prim.CreatorID = creatorID;
972 prim.OwnerID = owner_id;
973 prim.GroupID = UUID.Zero;
974 prim.LastOwnerID = creatorID;
975 prim.CreationDate = Util.UnixTimeSinceEpoch();
976
977 if (grp == null)
978 prim.Name = assetName;
979 else
980 prim.Name = assetName + "#" + i.ToString();
617 981
618 UUID owner_id = m_HostCapsObj.AgentID; 982 if (restrictPerms)
983 {
984 prim.BaseMask = (uint)(PermissionMask.Move | PermissionMask.Modify);
985 prim.EveryoneMask = 0;
986 prim.GroupMask = 0;
987 prim.NextOwnerMask = 0;
988 prim.OwnerMask = (uint)(PermissionMask.Move | PermissionMask.Modify);
989 }
619 990
620 SceneObjectPart prim 991 if(istest)
621 = new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero); 992 prim.Description = "For testing only. Other uses are prohibited";
993 else
994 prim.Description = "";
622 995
623 prim.Scale = scale; 996 prim.Material = material;
624 //prim.OffsetPosition = position; 997 prim.PhysicsShapeType = physicsShapeType;
625 rotations.Add(rotation);
626 positions.Add(position);
627 prim.UUID = UUID.Random();
628 prim.CreatorID = owner_id;
629 prim.OwnerID = owner_id;
630 prim.GroupID = UUID.Zero;
631 prim.LastOwnerID = prim.OwnerID;
632 prim.CreationDate = Util.UnixTimeSinceEpoch();
633 prim.Name = assetName;
634 prim.Description = "";
635 998
636// prim.BaseMask = (uint)base_mask; 999// prim.BaseMask = (uint)base_mask;
637// prim.EveryoneMask = (uint)everyone_mask; 1000// prim.EveryoneMask = (uint)everyone_mask;
@@ -639,52 +1002,64 @@ namespace OpenSim.Region.ClientStack.Linden
639// prim.NextOwnerMask = (uint)next_owner_mask; 1002// prim.NextOwnerMask = (uint)next_owner_mask;
640// prim.OwnerMask = (uint)owner_mask; 1003// prim.OwnerMask = (uint)owner_mask;
641 1004
642 if (grp == null) 1005 if (grp == null)
643 grp = new SceneObjectGroup(prim); 1006 {
644 else 1007 grp = new SceneObjectGroup(prim);
645 grp.AddPart(prim); 1008 grp.LastOwnerID = creatorID;
646 } 1009 }
1010 else
1011 grp.AddPart(prim);
1012 }
647 1013
648 Vector3 rootPos = positions[0]; 1014 Vector3 rootPos = positions[0];
649 1015
650 if (grp.Parts.Length > 1) 1016 if (grp.Parts.Length > 1)
651 { 1017 {
652 // Fix first link number 1018 // Fix first link number
653 grp.RootPart.LinkNum++; 1019 grp.RootPart.LinkNum++;
654 1020
655 Quaternion rootRotConj = Quaternion.Conjugate(rotations[0]); 1021 Quaternion rootRotConj = Quaternion.Conjugate(rotations[0]);
656 Quaternion tmprot; 1022 Quaternion tmprot;
657 Vector3 offset; 1023 Vector3 offset;
658 1024
659 // fix children rotations and positions 1025 // fix children rotations and positions
660 for (int i = 1; i < rotations.Count; i++) 1026 for (int i = 1; i < rotations.Count; i++)
661 { 1027 {
662 tmprot = rotations[i]; 1028 tmprot = rotations[i];
663 tmprot = rootRotConj * tmprot; 1029 tmprot = rootRotConj * tmprot;
664 1030
665 grp.Parts[i].RotationOffset = tmprot; 1031 grp.Parts[i].RotationOffset = tmprot;
666 1032
667 offset = positions[i] - rootPos; 1033 offset = positions[i] - rootPos;
1034
1035 offset *= rootRotConj;
1036 grp.Parts[i].OffsetPosition = offset;
1037 }
668 1038
669 offset *= rootRotConj; 1039 grp.AbsolutePosition = rootPos;
670 grp.Parts[i].OffsetPosition = offset; 1040 grp.UpdateGroupRotationR(rotations[0]);
1041 }
1042 else
1043 {
1044 grp.AbsolutePosition = rootPos;
1045 grp.UpdateGroupRotationR(rotations[0]);
671 } 1046 }
672 1047
673 grp.AbsolutePosition = rootPos; 1048 data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
674 grp.UpdateGroupRotationR(rotations[0]);
675 } 1049 }
676 else 1050
1051 else // not a mesh model
677 { 1052 {
678 grp.AbsolutePosition = rootPos; 1053 m_log.ErrorFormat("[CAPS Asset Upload] got unsuported assetType for object upload");
679 grp.UpdateGroupRotationR(rotations[0]); 1054 return;
680 } 1055 }
681
682 data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
683 } 1056 }
684 1057
685 AssetBase asset; 1058 AssetBase asset;
686 asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString()); 1059 asset = new AssetBase(assetID, assetName, assType, creatorIDstr);
687 asset.Data = data; 1060 asset.Data = data;
1061 if (istest)
1062 asset.Local = true;
688 if (AddNewAsset != null) 1063 if (AddNewAsset != null)
689 AddNewAsset(asset); 1064 AddNewAsset(asset);
690 else if (m_assetService != null) 1065 else if (m_assetService != null)
@@ -692,11 +1067,17 @@ namespace OpenSim.Region.ClientStack.Linden
692 1067
693 InventoryItemBase item = new InventoryItemBase(); 1068 InventoryItemBase item = new InventoryItemBase();
694 item.Owner = m_HostCapsObj.AgentID; 1069 item.Owner = m_HostCapsObj.AgentID;
695 item.CreatorId = m_HostCapsObj.AgentID.ToString(); 1070 item.CreatorId = creatorIDstr;
696 item.CreatorData = String.Empty; 1071 item.CreatorData = String.Empty;
697 item.ID = inventoryItem; 1072 item.ID = inventoryItem;
698 item.AssetID = asset.FullID; 1073 item.AssetID = asset.FullID;
699 item.Description = assetDescription; 1074 if (istest)
1075 {
1076 item.Description = "For testing only. Other uses are prohibited";
1077 item.Flags = (uint) (InventoryItemFlags.SharedSingleReference);
1078 }
1079 else
1080 item.Description = assetDescription;
700 item.Name = assetName; 1081 item.Name = assetName;
701 item.AssetType = assType; 1082 item.AssetType = assType;
702 item.InvType = inType; 1083 item.InvType = inType;
@@ -704,18 +1085,60 @@ namespace OpenSim.Region.ClientStack.Linden
704 1085
705 // If we set PermissionMask.All then when we rez the item the next permissions will replace the current 1086 // If we set PermissionMask.All then when we rez the item the next permissions will replace the current
706 // (owner) permissions. This becomes a problem if next permissions are changed. 1087 // (owner) permissions. This becomes a problem if next permissions are changed.
707 item.CurrentPermissions
708 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
709 1088
710 item.BasePermissions = (uint)PermissionMask.All; 1089 if (restrictPerms)
711 item.EveryOnePermissions = 0; 1090 {
712 item.NextPermissions = (uint)PermissionMask.All; 1091 item.CurrentPermissions
1092 = (uint)(PermissionMask.Move | PermissionMask.Modify);
1093
1094 item.BasePermissions = (uint)(PermissionMask.Move | PermissionMask.Modify);
1095 item.EveryOnePermissions = 0;
1096 item.NextPermissions = 0;
1097 }
1098 else
1099 {
1100 item.CurrentPermissions
1101 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Export);
1102
1103 item.BasePermissions = (uint)PermissionMask.All | (uint)PermissionMask.Export;
1104 item.EveryOnePermissions = 0;
1105 item.NextPermissions = (uint)PermissionMask.All;
1106 }
1107
713 item.CreationDate = Util.UnixTimeSinceEpoch(); 1108 item.CreationDate = Util.UnixTimeSinceEpoch();
714 1109
1110 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
1111
715 if (AddNewInventoryItem != null) 1112 if (AddNewInventoryItem != null)
716 { 1113 {
717 AddNewInventoryItem(m_HostCapsObj.AgentID, item); 1114 if (istest)
1115 {
1116 m_Scene.AddInventoryItem(client, item);
1117/*
1118 AddNewInventoryItem(m_HostCapsObj.AgentID, item, 0);
1119 if (client != null)
1120 client.SendAgentAlertMessage("Upload will have no cost, for personal test purposes only. Other uses are forbiden. Items may not work on a another region" , true);
1121 */
1122 }
1123 else
1124 {
1125 AddNewInventoryItem(m_HostCapsObj.AgentID, item, (uint)cost);
1126// if (client != null)
1127// {
1128// // let users see anything.. i don't so far
1129// string str;
1130// if (cost > 0)
1131// // dont remember where is money unit name to put here
1132// str = "Upload complete. charged " + cost.ToString() + "$";
1133// else
1134// str = "Upload complete";
1135// client.SendAgentAlertMessage(str, true);
1136// }
1137 }
718 } 1138 }
1139
1140 lock (m_ModelCost)
1141 m_FileAgentInventoryState = FileAgentInventoryState.idle;
719 } 1142 }
720 1143
721 /// <summary> 1144 /// <summary>
@@ -908,6 +1331,120 @@ namespace OpenSim.Region.ClientStack.Linden
908 return response; 1331 return response;
909 } 1332 }
910 1333
1334 public string GetObjectCost(string request, string path,
1335 string param, IOSHttpRequest httpRequest,
1336 IOSHttpResponse httpResponse)
1337 {
1338 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
1339 OSDMap resp = new OSDMap();
1340
1341 OSDArray object_ids = (OSDArray)req["object_ids"];
1342
1343 for (int i = 0; i < object_ids.Count; i++)
1344 {
1345 UUID uuid = object_ids[i].AsUUID();
1346
1347 SceneObjectPart part = m_Scene.GetSceneObjectPart(uuid);
1348
1349 if (part != null)
1350 {
1351 SceneObjectGroup grp = part.ParentGroup;
1352 if (grp != null)
1353 {
1354 float linksetCost;
1355 float linksetPhysCost;
1356 float partCost;
1357 float partPhysCost;
1358
1359 grp.GetResourcesCosts(part, out linksetCost, out linksetPhysCost, out partCost, out partPhysCost);
1360
1361 OSDMap object_data = new OSDMap();
1362 object_data["linked_set_resource_cost"] = linksetCost;
1363 object_data["resource_cost"] = partCost;
1364 object_data["physics_cost"] = partPhysCost;
1365 object_data["linked_set_physics_cost"] = linksetPhysCost;
1366
1367 resp[uuid.ToString()] = object_data;
1368 }
1369 }
1370 }
1371
1372 string response = OSDParser.SerializeLLSDXmlString(resp);
1373 return response;
1374 }
1375
1376 public string ResourceCostSelected(string request, string path,
1377 string param, IOSHttpRequest httpRequest,
1378 IOSHttpResponse httpResponse)
1379 {
1380 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
1381 OSDMap resp = new OSDMap();
1382
1383
1384 float phys=0;
1385 float stream=0;
1386 float simul=0;
1387
1388 if (req.ContainsKey("selected_roots"))
1389 {
1390 OSDArray object_ids = (OSDArray)req["selected_roots"];
1391
1392 // should go by SOG suming costs for all parts
1393 // ll v3 works ok with several objects select we get the list and adds ok
1394 // FS calls per object so results are wrong guess fs bug
1395 for (int i = 0; i < object_ids.Count; i++)
1396 {
1397 UUID uuid = object_ids[i].AsUUID();
1398 float Physc;
1399 float simulc;
1400 float streamc;
1401
1402 SceneObjectGroup grp = m_Scene.GetGroupByPrim(uuid);
1403 if (grp != null)
1404 {
1405 grp.GetSelectedCosts(out Physc, out streamc, out simulc);
1406 phys += Physc;
1407 stream += streamc;
1408 simul += simulc;
1409 }
1410 }
1411 }
1412 else if (req.ContainsKey("selected_prims"))
1413 {
1414 OSDArray object_ids = (OSDArray)req["selected_prims"];
1415
1416 // don't see in use in any of the 2 viewers
1417 // guess it should be for edit linked but... nothing
1418 // should go to SOP per part
1419 for (int i = 0; i < object_ids.Count; i++)
1420 {
1421 UUID uuid = object_ids[i].AsUUID();
1422
1423 SceneObjectPart part = m_Scene.GetSceneObjectPart(uuid);
1424 if (part != null)
1425 {
1426 phys += part.PhysicsCost;
1427 stream += part.StreamingCost;
1428 simul += part.SimulationCost;
1429 }
1430 }
1431 }
1432
1433 if (simul != 0)
1434 {
1435 OSDMap object_data = new OSDMap();
1436
1437 object_data["physics"] = phys;
1438 object_data["streaming"] = stream;
1439 object_data["simulation"] = simul;
1440
1441 resp["selected"] = object_data;
1442 }
1443
1444 string response = OSDParser.SerializeLLSDXmlString(resp);
1445 return response;
1446 }
1447
911 public string UpdateAgentInformation(string request, string path, 1448 public string UpdateAgentInformation(string request, string path,
912 string param, IOSHttpRequest httpRequest, 1449 string param, IOSHttpRequest httpRequest,
913 IOSHttpResponse httpResponse) 1450 IOSHttpResponse httpResponse)
@@ -927,6 +1464,10 @@ namespace OpenSim.Region.ClientStack.Linden
927 1464
928 public class AssetUploader 1465 public class AssetUploader
929 { 1466 {
1467 private static readonly ILog m_log =
1468 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
1469
1470
930 public event UpLoadedAsset OnUpLoad; 1471 public event UpLoadedAsset OnUpLoad;
931 private UpLoadedAsset handlerUpLoad = null; 1472 private UpLoadedAsset handlerUpLoad = null;
932 1473
@@ -941,10 +1482,21 @@ namespace OpenSim.Region.ClientStack.Linden
941 1482
942 private string m_invType = String.Empty; 1483 private string m_invType = String.Empty;
943 private string m_assetType = String.Empty; 1484 private string m_assetType = String.Empty;
1485 private int m_cost;
1486 private string m_error = String.Empty;
1487
1488 private Timer m_timeoutTimer = new Timer();
1489 private UUID m_texturesFolder;
1490 private int m_nreqtextures;
1491 private int m_nreqmeshs;
1492 private int m_nreqinstances;
1493 private bool m_IsAtestUpload;
944 1494
945 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem, 1495 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
946 UUID parentFolderID, string invType, string assetType, string path, 1496 UUID parentFolderID, string invType, string assetType, string path,
947 IHttpServer httpServer, bool dumpAssetsToFile) 1497 IHttpServer httpServer, bool dumpAssetsToFile,
1498 int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
1499 bool IsAtestUpload)
948 { 1500 {
949 m_assetName = assetName; 1501 m_assetName = assetName;
950 m_assetDes = description; 1502 m_assetDes = description;
@@ -956,6 +1508,18 @@ namespace OpenSim.Region.ClientStack.Linden
956 m_assetType = assetType; 1508 m_assetType = assetType;
957 m_invType = invType; 1509 m_invType = invType;
958 m_dumpAssetsToFile = dumpAssetsToFile; 1510 m_dumpAssetsToFile = dumpAssetsToFile;
1511 m_cost = totalCost;
1512
1513 m_texturesFolder = texturesFolder;
1514 m_nreqtextures = nreqtextures;
1515 m_nreqmeshs = nreqmeshs;
1516 m_nreqinstances = nreqinstances;
1517 m_IsAtestUpload = IsAtestUpload;
1518
1519 m_timeoutTimer.Elapsed += TimedOut;
1520 m_timeoutTimer.Interval = 120000;
1521 m_timeoutTimer.AutoReset = false;
1522 m_timeoutTimer.Start();
959 } 1523 }
960 1524
961 /// <summary> 1525 /// <summary>
@@ -970,12 +1534,14 @@ namespace OpenSim.Region.ClientStack.Linden
970 UUID inv = inventoryItemID; 1534 UUID inv = inventoryItemID;
971 string res = String.Empty; 1535 string res = String.Empty;
972 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); 1536 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
1537/*
973 uploadComplete.new_asset = newAssetID.ToString(); 1538 uploadComplete.new_asset = newAssetID.ToString();
974 uploadComplete.new_inventory_item = inv; 1539 uploadComplete.new_inventory_item = inv;
975 uploadComplete.state = "complete"; 1540 uploadComplete.state = "complete";
976 1541
977 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); 1542 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
978 1543*/
1544 m_timeoutTimer.Stop();
979 httpListener.RemoveStreamHandler("POST", uploaderPath); 1545 httpListener.RemoveStreamHandler("POST", uploaderPath);
980 1546
981 // TODO: probably make this a better set of extensions here 1547 // TODO: probably make this a better set of extensions here
@@ -992,12 +1558,49 @@ namespace OpenSim.Region.ClientStack.Linden
992 handlerUpLoad = OnUpLoad; 1558 handlerUpLoad = OnUpLoad;
993 if (handlerUpLoad != null) 1559 if (handlerUpLoad != null)
994 { 1560 {
995 handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType); 1561 handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,
1562 m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload, ref m_error);
1563 }
1564 if (m_IsAtestUpload)
1565 {
1566 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
1567 resperror.message = "Upload SUCESSEFULL for testing purposes only. Other uses are prohibited. Item will not work after 48 hours or on other regions";
1568 resperror.identifier = inv;
1569
1570 uploadComplete.error = resperror;
1571 uploadComplete.state = "Upload4Testing";
996 } 1572 }
1573 else
1574 {
1575 if (m_error == String.Empty)
1576 {
1577 uploadComplete.new_asset = newAssetID.ToString();
1578 uploadComplete.new_inventory_item = inv;
1579 // if (m_texturesFolder != UUID.Zero)
1580 // uploadComplete.new_texture_folder_id = m_texturesFolder;
1581 uploadComplete.state = "complete";
1582 }
1583 else
1584 {
1585 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
1586 resperror.message = m_error;
1587 resperror.identifier = inv;
997 1588
1589 uploadComplete.error = resperror;
1590 uploadComplete.state = "failed";
1591 }
1592 }
1593
1594 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
998 return res; 1595 return res;
999 } 1596 }
1000 1597
1598 private void TimedOut(object sender, ElapsedEventArgs args)
1599 {
1600 m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out mesh upload");
1601 httpListener.RemoveStreamHandler("POST", uploaderPath);
1602 }
1603
1001 ///Left this in and commented in case there are unforseen issues 1604 ///Left this in and commented in case there are unforseen issues
1002 //private void SaveAssetToFile(string filename, byte[] data) 1605 //private void SaveAssetToFile(string filename, byte[] data)
1003 //{ 1606 //{