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.cs894
1 files changed, 748 insertions, 146 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 8752404..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;
@@ -54,14 +55,16 @@ using PermissionMask = OpenSim.Framework.PermissionMask;
54namespace OpenSim.Region.ClientStack.Linden 55namespace OpenSim.Region.ClientStack.Linden
55{ 56{
56 public delegate void UpLoadedAsset( 57 public delegate void UpLoadedAsset(
57 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, 58 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder,
58 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);
59 62
60 public delegate UUID UpdateItem(UUID itemID, byte[] data); 63 public delegate UUID UpdateItem(UUID itemID, byte[] data);
61 64
62 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);
63 66
64 public delegate void NewInventoryItem(UUID userID, InventoryItemBase item); 67 public delegate void NewInventoryItem(UUID userID, InventoryItemBase item, uint cost);
65 68
66 public delegate void NewAsset(AssetBase asset); 69 public delegate void NewAsset(AssetBase asset);
67 70
@@ -87,6 +90,7 @@ namespace OpenSim.Region.ClientStack.Linden
87 90
88 private Scene m_Scene; 91 private Scene m_Scene;
89 private Caps m_HostCapsObj; 92 private Caps m_HostCapsObj;
93 private ModelCost m_ModelCost;
90 94
91 private static readonly string m_requestPath = "0000/"; 95 private static readonly string m_requestPath = "0000/";
92 // private static readonly string m_mapLayerPath = "0001/"; 96 // private static readonly string m_mapLayerPath = "0001/";
@@ -98,7 +102,8 @@ namespace OpenSim.Region.ClientStack.Linden
98 private static readonly string m_copyFromNotecardPath = "0007/"; 102 private static readonly string m_copyFromNotecardPath = "0007/";
99 // 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.
100 private static readonly string m_getObjectPhysicsDataPath = "0101/"; 104 private static readonly string m_getObjectPhysicsDataPath = "0101/";
101 /* 0102 - 0103 RESERVED */ 105 private static readonly string m_getObjectCostPath = "0102/";
106 private static readonly string m_ResourceCostSelectedPath = "0103/";
102 private static readonly string m_UpdateAgentInformationPath = "0500/"; 107 private static readonly string m_UpdateAgentInformationPath = "0500/";
103 108
104 // 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
@@ -114,12 +119,50 @@ namespace OpenSim.Region.ClientStack.Linden
114 private IAssetService m_assetService; 119 private IAssetService m_assetService;
115 private bool m_dumpAssetsToFile = false; 120 private bool m_dumpAssetsToFile = false;
116 private string m_regionName; 121 private string m_regionName;
122
117 private int m_levelUpload = 0; 123 private int m_levelUpload = 0;
118 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
119 public BunchOfCaps(Scene scene, Caps caps) 145 public BunchOfCaps(Scene scene, Caps caps)
120 { 146 {
121 m_Scene = scene; 147 m_Scene = scene;
122 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
123 IConfigSource config = m_Scene.Config; 166 IConfigSource config = m_Scene.Config;
124 if (config != null) 167 if (config != null)
125 { 168 {
@@ -134,6 +177,37 @@ namespace OpenSim.Region.ClientStack.Linden
134 { 177 {
135 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); 178 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
136 } 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 }
137 } 211 }
138 212
139 m_assetService = m_Scene.AssetService; 213 m_assetService = m_Scene.AssetService;
@@ -145,6 +219,8 @@ namespace OpenSim.Region.ClientStack.Linden
145 ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset; 219 ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset;
146 TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset; 220 TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset;
147 GetClient = m_Scene.SceneGraph.GetControllingClient; 221 GetClient = m_Scene.SceneGraph.GetControllingClient;
222
223 m_FileAgentInventoryState = FileAgentInventoryState.idle;
148 } 224 }
149 225
150 /// <summary> 226 /// <summary>
@@ -190,7 +266,6 @@ namespace OpenSim.Region.ClientStack.Linden
190 { 266 {
191 try 267 try
192 { 268 {
193 // I don't think this one works...
194 m_HostCapsObj.RegisterHandler( 269 m_HostCapsObj.RegisterHandler(
195 "NewFileAgentInventory", 270 "NewFileAgentInventory",
196 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>( 271 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>(
@@ -209,6 +284,10 @@ namespace OpenSim.Region.ClientStack.Linden
209 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); 284 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
210 IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData); 285 IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData);
211 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);
212 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation); 291 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation);
213 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler); 292 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
214 293
@@ -264,6 +343,9 @@ namespace OpenSim.Region.ClientStack.Linden
264 m_log.DebugFormat( 343 m_log.DebugFormat(
265 "[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);
266 345
346 if (!m_HostCapsObj.WaitForActivation())
347 return string.Empty;
348
267 if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) 349 if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint))
268 { 350 {
269 m_log.WarnFormat( 351 m_log.WarnFormat(
@@ -393,62 +475,176 @@ namespace OpenSim.Region.ClientStack.Linden
393 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString()); 475 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString());
394 //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);
395 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
396 if (llsdRequest.asset_type == "texture" || 520 if (llsdRequest.asset_type == "texture" ||
397 llsdRequest.asset_type == "animation" || 521 llsdRequest.asset_type == "animation" ||
522 llsdRequest.asset_type == "mesh" ||
398 llsdRequest.asset_type == "sound") 523 llsdRequest.asset_type == "sound")
399 { 524 {
400 ScenePresence avatar = null; 525 ScenePresence avatar = null;
401 IClientAPI client = null;
402 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar); 526 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar);
403 527
404 // check user level 528 // check user level
405 if (avatar != null) 529 if (avatar != null)
406 { 530 {
407 client = avatar.ControllingClient;
408
409 if (avatar.UserLevel < m_levelUpload) 531 if (avatar.UserLevel < m_levelUpload)
410 { 532 {
411 if (client != null) 533 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
412 client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); 534 resperror.message = "Insufficient permissions to upload";
535 resperror.identifier = UUID.Zero;
413 536
414 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 537 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
415 errorResponse.uploader = ""; 538 errorResponse.uploader = "";
416 errorResponse.state = "error"; 539 errorResponse.state = "error";
540 errorResponse.error = resperror;
541 lock (m_ModelCost)
542 m_FileAgentInventoryState = FileAgentInventoryState.idle;
417 return errorResponse; 543 return errorResponse;
418 } 544 }
419 } 545 }
420 546
421 // check funds 547 // check test upload and funds
422 if (client != null) 548 if (client != null)
423 { 549 {
424 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>(); 550 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
425 551
552 int baseCost = 0;
426 if (mm != null) 553 if (mm != null)
554 baseCost = mm.UploadCharge;
555
556 string warning = String.Empty;
557
558 if (llsdRequest.asset_type == "mesh")
427 { 559 {
428 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))
429 { 565 {
430 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); 566 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
567 resperror.message = error;
568 resperror.identifier = UUID.Zero;
431 569
432 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 570 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
433 errorResponse.uploader = ""; 571 errorResponse.uploader = "";
434 errorResponse.state = "error"; 572 errorResponse.state = "error";
573 errorResponse.error = resperror;
574
575 lock (m_ModelCost)
576 m_FileAgentInventoryState = FileAgentInventoryState.idle;
435 return errorResponse; 577 return errorResponse;
436 } 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 }
437 } 626 }
627
628 if (client != null && warning != String.Empty)
629 client.SendAgentAlertMessage(warning, true);
438 } 630 }
439 } 631 }
440 632
441 string assetName = llsdRequest.name;
442 string assetDes = llsdRequest.description; 633 string assetDes = llsdRequest.description;
443 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath; 634 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath;
444 UUID newAsset = UUID.Random(); 635 UUID newAsset = UUID.Random();
445 UUID newInvItem = UUID.Random(); 636 UUID newInvItem = UUID.Random();
446 UUID parentFolder = llsdRequest.folder_id; 637 UUID parentFolder = llsdRequest.folder_id;
447 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;
448 643
449 AssetUploader uploader = 644 AssetUploader uploader =
450 new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, 645 new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
451 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);
452 648
453 m_HostCapsObj.HttpListener.AddStreamHandler( 649 m_HostCapsObj.HttpListener.AddStreamHandler(
454 new BinaryStreamHandler( 650 new BinaryStreamHandler(
@@ -466,10 +662,22 @@ namespace OpenSim.Region.ClientStack.Linden
466 string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + capsBase + 662 string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + capsBase +
467 uploaderPath; 663 uploaderPath;
468 664
665
469 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse(); 666 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
470 uploadResponse.uploader = uploaderURL; 667 uploadResponse.uploader = uploaderURL;
471 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
472 uploader.OnUpLoad += UploadCompleteHandler; 676 uploader.OnUpLoad += UploadCompleteHandler;
677
678 lock (m_ModelCost)
679 m_FileAgentInventoryState = FileAgentInventoryState.waitUpload;
680
473 return uploadResponse; 681 return uploadResponse;
474 } 682 }
475 683
@@ -481,8 +689,14 @@ namespace OpenSim.Region.ClientStack.Linden
481 /// <param name="data"></param> 689 /// <param name="data"></param>
482 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID, 690 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
483 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, 691 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
484 string assetType) 692 string assetType, int cost,
693 UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
694 bool IsAtestUpload, ref string error)
485 { 695 {
696
697 lock (m_ModelCost)
698 m_FileAgentInventoryState = FileAgentInventoryState.processUpload;
699
486 m_log.DebugFormat( 700 m_log.DebugFormat(
487 "[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}",
488 assetID, inventoryItem, inventoryType, assetType); 702 assetID, inventoryItem, inventoryType, assetType);
@@ -490,117 +704,247 @@ namespace OpenSim.Region.ClientStack.Linden
490 sbyte assType = 0; 704 sbyte assType = 0;
491 sbyte inType = 0; 705 sbyte inType = 0;
492 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
493 if (inventoryType == "sound") 735 if (inventoryType == "sound")
494 { 736 {
495 inType = 1; 737 inType = (sbyte)InventoryType.Sound;
496 assType = 1; 738 assType = (sbyte)AssetType.Sound;
497 } 739 }
498 else if (inventoryType == "animation") 740 else if (inventoryType == "animation")
499 { 741 {
500 inType = 19; 742 inType = (sbyte)InventoryType.Animation;
501 assType = 20; 743 assType = (sbyte)AssetType.Animation;
502 } 744 }
503 else if (inventoryType == "wearable") 745 else if (inventoryType == "wearable")
504 { 746 {
505 inType = 18; 747 inType = (sbyte)InventoryType.Wearable;
506 switch (assetType) 748 switch (assetType)
507 { 749 {
508 case "bodypart": 750 case "bodypart":
509 assType = 13; 751 assType = (sbyte)AssetType.Bodypart;
510 break; 752 break;
511 case "clothing": 753 case "clothing":
512 assType = 5; 754 assType = (sbyte)AssetType.Clothing;
513 break; 755 break;
514 } 756 }
515 } 757 }
516 else if (inventoryType == "object") 758 else if (inventoryType == "object")
517 { 759 {
518 inType = (sbyte)InventoryType.Object; 760 if (assetType == "mesh") // this code for now is for mesh models uploads only
519 assType = (sbyte)AssetType.Object;
520
521 List<Vector3> positions = new List<Vector3>();
522 List<Quaternion> rotations = new List<Quaternion>();
523 OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
524 OSDArray instance_list = (OSDArray)request["instance_list"];
525 OSDArray mesh_list = (OSDArray)request["mesh_list"];
526 OSDArray texture_list = (OSDArray)request["texture_list"];
527 SceneObjectGroup grp = null;
528
529 List<UUID> textures = new List<UUID>();
530 for (int i = 0; i < texture_list.Count; i++)
531 { 761 {
532 AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, ""); 762 inType = (sbyte)InventoryType.Object;
533 textureAsset.Data = texture_list[i].AsBinary(); 763 assType = (sbyte)AssetType.Object;
534 m_assetService.Store(textureAsset);
535 textures.Add(textureAsset.FullID);
536 }
537 764
538 for (int i = 0; i < mesh_list.Count; i++) 765 List<Vector3> positions = new List<Vector3>();
539 { 766 List<Quaternion> rotations = new List<Quaternion>();
540 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox(); 767 OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
768
769 // compare and get updated information
541 770
542 Primitive.TextureEntry textureEntry 771 bool mismatchError = true;
543 = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
544 OSDMap inner_instance_list = (OSDMap)instance_list[i];
545 772
546 OSDArray face_list = (OSDArray)inner_instance_list["face_list"]; 773 while (mismatchError)
547 for (uint face = 0; face < face_list.Count; face++)
548 { 774 {
549 OSDMap faceMap = (OSDMap)face_list[(int)face]; 775 mismatchError = false;
550 Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face); 776 }
551 if(faceMap.ContainsKey("fullbright"))
552 f.Fullbright = faceMap["fullbright"].AsBoolean();
553 if (faceMap.ContainsKey ("diffuse_color"))
554 f.RGBA = faceMap["diffuse_color"].AsColor4();
555 777
556 int textureNum = faceMap["image"].AsInteger(); 778 if (mismatchError)
557 float imagerot = faceMap["imagerot"].AsInteger(); 779 {
558 float offsets = (float)faceMap["offsets"].AsReal(); 780 error = "Upload and fee estimation information don't match";
559 float offsett = (float)faceMap["offsett"].AsReal(); 781 lock (m_ModelCost)
560 float scales = (float)faceMap["scales"].AsReal(); 782 m_FileAgentInventoryState = FileAgentInventoryState.idle;
561 float scalet = (float)faceMap["scalet"].AsReal();
562 783
563 if(imagerot != 0) 784 return;
564 f.Rotation = imagerot; 785 }
565 786
566 if(offsets != 0) 787 OSDArray instance_list = (OSDArray)request["instance_list"];
567 f.OffsetU = offsets; 788 OSDArray mesh_list = (OSDArray)request["mesh_list"];
789 OSDArray texture_list = (OSDArray)request["texture_list"];
790 SceneObjectGroup grp = null;
568 791
569 if (offsett != 0) 792 // create and store texture assets
570 f.OffsetV = offsett; 793 bool doTextInv = (!istest && m_enableModelUploadTextureToInventory &&
794 texturesFolder != UUID.Zero);
571 795
572 if (scales != 0)
573 f.RepeatU = scales;
574 796
575 if (scalet != 0) 797 List<UUID> textures = new List<UUID>();
576 f.RepeatV = scalet;
577 798
578 if (textures.Count > textureNum) 799
579 f.TextureID = textures[textureNum]; 800 if (doTextInv)
580 else 801 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
581 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 }
582 845
583 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);
584 } 856 }
585 857
586 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);
587 877
588 AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, "");
589 meshAsset.Data = mesh_list[i].AsBinary();
590 m_assetService.Store(meshAsset);
591 878
592 pbs.SculptEntry = true; 879 OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
593 pbs.SculptTexture = meshAsset.FullID; 880 for (uint face = 0; face < face_list.Count; face++)
594 pbs.SculptType = (byte)SculptType.Mesh; 881 {
595 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();
596 937
597 Vector3 position = inner_instance_list["position"].AsVector3(); 938 // for now viwers do send fixed defaults
598 Vector3 scale = inner_instance_list["scale"].AsVector3(); 939 // but this may change
599 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;
600 946
601// no longer used - begin ------------------------ 947// no longer used - begin ------------------------
602// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
603// int material = inner_instance_list["material"].AsInteger();
604// int mesh = inner_instance_list["mesh"].AsInteger(); 948// int mesh = inner_instance_list["mesh"].AsInteger();
605 949
606// OSDMap permissions = (OSDMap)inner_instance_list["permissions"]; 950// OSDMap permissions = (OSDMap)inner_instance_list["permissions"];
@@ -615,24 +959,42 @@ namespace OpenSim.Region.ClientStack.Linden
615// UUID owner_id = permissions["owner_id"].AsUUID(); 959// UUID owner_id = permissions["owner_id"].AsUUID();
616// int owner_mask = permissions["owner_mask"].AsInteger(); 960// int owner_mask = permissions["owner_mask"].AsInteger();
617// 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();
618 981
619 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 }
620 990
621 SceneObjectPart prim 991 if(istest)
622 = 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 = "";
623 995
624 prim.Scale = scale; 996 prim.Material = material;
625 //prim.OffsetPosition = position; 997 prim.PhysicsShapeType = physicsShapeType;
626 rotations.Add(rotation);
627 positions.Add(position);
628 prim.UUID = UUID.Random();
629 prim.CreatorID = owner_id;
630 prim.OwnerID = owner_id;
631 prim.GroupID = UUID.Zero;
632 prim.LastOwnerID = prim.OwnerID;
633 prim.CreationDate = Util.UnixTimeSinceEpoch();
634 prim.Name = assetName;
635 prim.Description = "";
636 998
637// prim.BaseMask = (uint)base_mask; 999// prim.BaseMask = (uint)base_mask;
638// prim.EveryoneMask = (uint)everyone_mask; 1000// prim.EveryoneMask = (uint)everyone_mask;
@@ -640,52 +1002,64 @@ namespace OpenSim.Region.ClientStack.Linden
640// prim.NextOwnerMask = (uint)next_owner_mask; 1002// prim.NextOwnerMask = (uint)next_owner_mask;
641// prim.OwnerMask = (uint)owner_mask; 1003// prim.OwnerMask = (uint)owner_mask;
642 1004
643 if (grp == null) 1005 if (grp == null)
644 grp = new SceneObjectGroup(prim); 1006 {
645 else 1007 grp = new SceneObjectGroup(prim);
646 grp.AddPart(prim); 1008 grp.LastOwnerID = creatorID;
647 } 1009 }
1010 else
1011 grp.AddPart(prim);
1012 }
648 1013
649 Vector3 rootPos = positions[0]; 1014 Vector3 rootPos = positions[0];
650 1015
651 if (grp.Parts.Length > 1) 1016 if (grp.Parts.Length > 1)
652 { 1017 {
653 // Fix first link number 1018 // Fix first link number
654 grp.RootPart.LinkNum++; 1019 grp.RootPart.LinkNum++;
655 1020
656 Quaternion rootRotConj = Quaternion.Conjugate(rotations[0]); 1021 Quaternion rootRotConj = Quaternion.Conjugate(rotations[0]);
657 Quaternion tmprot; 1022 Quaternion tmprot;
658 Vector3 offset; 1023 Vector3 offset;
659 1024
660 // fix children rotations and positions 1025 // fix children rotations and positions
661 for (int i = 1; i < rotations.Count; i++) 1026 for (int i = 1; i < rotations.Count; i++)
662 { 1027 {
663 tmprot = rotations[i]; 1028 tmprot = rotations[i];
664 tmprot = rootRotConj * tmprot; 1029 tmprot = rootRotConj * tmprot;
665 1030
666 grp.Parts[i].RotationOffset = tmprot; 1031 grp.Parts[i].RotationOffset = tmprot;
667 1032
668 offset = positions[i] - rootPos; 1033 offset = positions[i] - rootPos;
1034
1035 offset *= rootRotConj;
1036 grp.Parts[i].OffsetPosition = offset;
1037 }
669 1038
670 offset *= rootRotConj; 1039 grp.AbsolutePosition = rootPos;
671 grp.Parts[i].OffsetPosition = offset; 1040 grp.UpdateGroupRotationR(rotations[0]);
1041 }
1042 else
1043 {
1044 grp.AbsolutePosition = rootPos;
1045 grp.UpdateGroupRotationR(rotations[0]);
672 } 1046 }
673 1047
674 grp.AbsolutePosition = rootPos; 1048 data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
675 grp.UpdateGroupRotationR(rotations[0]);
676 } 1049 }
677 else 1050
1051 else // not a mesh model
678 { 1052 {
679 grp.AbsolutePosition = rootPos; 1053 m_log.ErrorFormat("[CAPS Asset Upload] got unsuported assetType for object upload");
680 grp.UpdateGroupRotationR(rotations[0]); 1054 return;
681 } 1055 }
682
683 data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
684 } 1056 }
685 1057
686 AssetBase asset; 1058 AssetBase asset;
687 asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString()); 1059 asset = new AssetBase(assetID, assetName, assType, creatorIDstr);
688 asset.Data = data; 1060 asset.Data = data;
1061 if (istest)
1062 asset.Local = true;
689 if (AddNewAsset != null) 1063 if (AddNewAsset != null)
690 AddNewAsset(asset); 1064 AddNewAsset(asset);
691 else if (m_assetService != null) 1065 else if (m_assetService != null)
@@ -693,11 +1067,17 @@ namespace OpenSim.Region.ClientStack.Linden
693 1067
694 InventoryItemBase item = new InventoryItemBase(); 1068 InventoryItemBase item = new InventoryItemBase();
695 item.Owner = m_HostCapsObj.AgentID; 1069 item.Owner = m_HostCapsObj.AgentID;
696 item.CreatorId = m_HostCapsObj.AgentID.ToString(); 1070 item.CreatorId = creatorIDstr;
697 item.CreatorData = String.Empty; 1071 item.CreatorData = String.Empty;
698 item.ID = inventoryItem; 1072 item.ID = inventoryItem;
699 item.AssetID = asset.FullID; 1073 item.AssetID = asset.FullID;
700 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;
701 item.Name = assetName; 1081 item.Name = assetName;
702 item.AssetType = assType; 1082 item.AssetType = assType;
703 item.InvType = inType; 1083 item.InvType = inType;
@@ -705,18 +1085,60 @@ namespace OpenSim.Region.ClientStack.Linden
705 1085
706 // 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
707 // (owner) permissions. This becomes a problem if next permissions are changed. 1087 // (owner) permissions. This becomes a problem if next permissions are changed.
708 item.CurrentPermissions
709 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Export);
710 1088
711 item.BasePermissions = (uint)PermissionMask.All | (uint)PermissionMask.Export; 1089 if (restrictPerms)
712 item.EveryOnePermissions = 0; 1090 {
713 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
714 item.CreationDate = Util.UnixTimeSinceEpoch(); 1108 item.CreationDate = Util.UnixTimeSinceEpoch();
715 1109
1110 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
1111
716 if (AddNewInventoryItem != null) 1112 if (AddNewInventoryItem != null)
717 { 1113 {
718 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 }
719 } 1138 }
1139
1140 lock (m_ModelCost)
1141 m_FileAgentInventoryState = FileAgentInventoryState.idle;
720 } 1142 }
721 1143
722 /// <summary> 1144 /// <summary>
@@ -909,6 +1331,120 @@ namespace OpenSim.Region.ClientStack.Linden
909 return response; 1331 return response;
910 } 1332 }
911 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
912 public string UpdateAgentInformation(string request, string path, 1448 public string UpdateAgentInformation(string request, string path,
913 string param, IOSHttpRequest httpRequest, 1449 string param, IOSHttpRequest httpRequest,
914 IOSHttpResponse httpResponse) 1450 IOSHttpResponse httpResponse)
@@ -928,6 +1464,10 @@ namespace OpenSim.Region.ClientStack.Linden
928 1464
929 public class AssetUploader 1465 public class AssetUploader
930 { 1466 {
1467 private static readonly ILog m_log =
1468 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
1469
1470
931 public event UpLoadedAsset OnUpLoad; 1471 public event UpLoadedAsset OnUpLoad;
932 private UpLoadedAsset handlerUpLoad = null; 1472 private UpLoadedAsset handlerUpLoad = null;
933 1473
@@ -942,10 +1482,21 @@ namespace OpenSim.Region.ClientStack.Linden
942 1482
943 private string m_invType = String.Empty; 1483 private string m_invType = String.Empty;
944 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;
945 1494
946 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem, 1495 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
947 UUID parentFolderID, string invType, string assetType, string path, 1496 UUID parentFolderID, string invType, string assetType, string path,
948 IHttpServer httpServer, bool dumpAssetsToFile) 1497 IHttpServer httpServer, bool dumpAssetsToFile,
1498 int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
1499 bool IsAtestUpload)
949 { 1500 {
950 m_assetName = assetName; 1501 m_assetName = assetName;
951 m_assetDes = description; 1502 m_assetDes = description;
@@ -957,6 +1508,18 @@ namespace OpenSim.Region.ClientStack.Linden
957 m_assetType = assetType; 1508 m_assetType = assetType;
958 m_invType = invType; 1509 m_invType = invType;
959 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();
960 } 1523 }
961 1524
962 /// <summary> 1525 /// <summary>
@@ -971,12 +1534,14 @@ namespace OpenSim.Region.ClientStack.Linden
971 UUID inv = inventoryItemID; 1534 UUID inv = inventoryItemID;
972 string res = String.Empty; 1535 string res = String.Empty;
973 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); 1536 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
1537/*
974 uploadComplete.new_asset = newAssetID.ToString(); 1538 uploadComplete.new_asset = newAssetID.ToString();
975 uploadComplete.new_inventory_item = inv; 1539 uploadComplete.new_inventory_item = inv;
976 uploadComplete.state = "complete"; 1540 uploadComplete.state = "complete";
977 1541
978 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); 1542 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
979 1543*/
1544 m_timeoutTimer.Stop();
980 httpListener.RemoveStreamHandler("POST", uploaderPath); 1545 httpListener.RemoveStreamHandler("POST", uploaderPath);
981 1546
982 // TODO: probably make this a better set of extensions here 1547 // TODO: probably make this a better set of extensions here
@@ -993,12 +1558,49 @@ namespace OpenSim.Region.ClientStack.Linden
993 handlerUpLoad = OnUpLoad; 1558 handlerUpLoad = OnUpLoad;
994 if (handlerUpLoad != null) 1559 if (handlerUpLoad != null)
995 { 1560 {
996 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";
997 } 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;
998 1588
1589 uploadComplete.error = resperror;
1590 uploadComplete.state = "failed";
1591 }
1592 }
1593
1594 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
999 return res; 1595 return res;
1000 } 1596 }
1001 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
1002 ///Left this in and commented in case there are unforseen issues 1604 ///Left this in and commented in case there are unforseen issues
1003 //private void SaveAssetToFile(string filename, byte[] data) 1605 //private void SaveAssetToFile(string filename, byte[] data)
1004 //{ 1606 //{