aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
diff options
context:
space:
mode:
authorMelanie2012-09-27 17:29:44 +0100
committerMelanie2012-09-27 17:29:44 +0100
commit001ec0e2e6f8c426af8f4a1c1eb9be4db066aea4 (patch)
tree11170fddbd0f4c71c6f8288b5848442dfdc90d76 /OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
parentRemove a core undo call that we don't need. (diff)
parentMerge branch 'ubitwork' into avination (diff)
downloadopensim-SC_OLD-001ec0e2e6f8c426af8f4a1c1eb9be4db066aea4.zip
opensim-SC_OLD-001ec0e2e6f8c426af8f4a1c1eb9be4db066aea4.tar.gz
opensim-SC_OLD-001ec0e2e6f8c426af8f4a1c1eb9be4db066aea4.tar.bz2
opensim-SC_OLD-001ec0e2e6f8c426af8f4a1c1eb9be4db066aea4.tar.xz
Merge branch 'avination' into careminster
Conflicts: OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs OpenSim/Region/Framework/Scenes/Scene.cs
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs810
1 files changed, 603 insertions, 207 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 580c005..c705f10 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -54,8 +54,10 @@ using OSDMap = OpenMetaverse.StructuredData.OSDMap;
54namespace OpenSim.Region.ClientStack.Linden 54namespace OpenSim.Region.ClientStack.Linden
55{ 55{
56 public delegate void UpLoadedAsset( 56 public delegate void UpLoadedAsset(
57 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, 57 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder,
58 byte[] data, string inventoryType, string assetType); 58 byte[] data, string inventoryType, string assetType,
59 int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
60 bool IsAtestUpload, ref string error);
59 61
60 public delegate UUID UpdateItem(UUID itemID, byte[] data); 62 public delegate UUID UpdateItem(UUID itemID, byte[] data);
61 63
@@ -87,6 +89,7 @@ namespace OpenSim.Region.ClientStack.Linden
87 89
88 private Scene m_Scene; 90 private Scene m_Scene;
89 private Caps m_HostCapsObj; 91 private Caps m_HostCapsObj;
92 private ModelCost m_ModelCost;
90 93
91 private static readonly string m_requestPath = "0000/"; 94 private static readonly string m_requestPath = "0000/";
92 // private static readonly string m_mapLayerPath = "0001/"; 95 // private static readonly string m_mapLayerPath = "0001/";
@@ -115,12 +118,50 @@ namespace OpenSim.Region.ClientStack.Linden
115 private IAssetService m_assetService; 118 private IAssetService m_assetService;
116 private bool m_dumpAssetsToFile = false; 119 private bool m_dumpAssetsToFile = false;
117 private string m_regionName; 120 private string m_regionName;
121
118 private int m_levelUpload = 0; 122 private int m_levelUpload = 0;
119 123
124 private bool m_enableFreeTestUpload = false; // allows "TEST-" prefix hack
125 private bool m_ForceFreeTestUpload = false; // forces all uploads to be test
126
127 private bool m_enableModelUploadTextureToInventory = false; // place uploaded textures also in inventory
128 // may not be visible till relog
129
130 private bool m_RestrictFreeTestUploadPerms = false; // reduces also the permitions. Needs a creator defined!!
131 private UUID m_testAssetsCreatorID = UUID.Zero;
132
133 private float m_PrimScaleMin = 0.001f;
134
135 private enum FileAgentInventoryState : int
136 {
137 idle = 0,
138 processRequest = 1,
139 waitUpload = 2,
140 processUpload = 3
141 }
142 private FileAgentInventoryState m_FileAgentInventoryState = FileAgentInventoryState.idle;
143
120 public BunchOfCaps(Scene scene, Caps caps) 144 public BunchOfCaps(Scene scene, Caps caps)
121 { 145 {
122 m_Scene = scene; 146 m_Scene = scene;
123 m_HostCapsObj = caps; 147 m_HostCapsObj = caps;
148
149 // create a model upload cost provider
150 m_ModelCost = new ModelCost();
151 // tell it about scene object limits
152 m_ModelCost.NonPhysicalPrimScaleMax = m_Scene.m_maxNonphys;
153 m_ModelCost.PhysicalPrimScaleMax = m_Scene.m_maxPhys;
154
155// m_ModelCost.ObjectLinkedPartsMax = ??
156// m_ModelCost.PrimScaleMin = ??
157
158 m_PrimScaleMin = m_ModelCost.PrimScaleMin;
159 float modelTextureUploadFactor = m_ModelCost.ModelTextureCostFactor;
160 float modelUploadFactor = m_ModelCost.ModelMeshCostFactor;
161 float modelMinUploadCostFactor = m_ModelCost.ModelMinCostFactor;
162 float modelPrimCreationCost = m_ModelCost.primCreationCost;
163 float modelMeshByteCost = m_ModelCost.bytecost;
164
124 IConfigSource config = m_Scene.Config; 165 IConfigSource config = m_Scene.Config;
125 if (config != null) 166 if (config != null)
126 { 167 {
@@ -135,6 +176,37 @@ namespace OpenSim.Region.ClientStack.Linden
135 { 176 {
136 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); 177 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
137 } 178 }
179 // economy for model upload
180 IConfig EconomyConfig = config.Configs["Economy"];
181 if (EconomyConfig != null)
182 {
183 modelUploadFactor = EconomyConfig.GetFloat("MeshModelUploadCostFactor", modelUploadFactor);
184 modelTextureUploadFactor = EconomyConfig.GetFloat("MeshModelUploadTextureCostFactor", modelTextureUploadFactor);
185 modelMinUploadCostFactor = EconomyConfig.GetFloat("MeshModelMinCostFactor", modelMinUploadCostFactor);
186 // next 2 are normalized so final cost is afected by modelUploadFactor above and normal cost
187 modelPrimCreationCost = EconomyConfig.GetFloat("ModelPrimCreationCost", modelPrimCreationCost);
188 modelMeshByteCost = EconomyConfig.GetFloat("ModelMeshByteCost", modelMeshByteCost);
189
190 m_enableModelUploadTextureToInventory = EconomyConfig.GetBoolean("MeshModelAllowTextureToInventory", m_enableModelUploadTextureToInventory);
191
192 m_RestrictFreeTestUploadPerms = EconomyConfig.GetBoolean("m_RestrictFreeTestUploadPerms", m_RestrictFreeTestUploadPerms);
193 m_enableFreeTestUpload = EconomyConfig.GetBoolean("AllowFreeTestUpload", m_enableFreeTestUpload);
194 m_ForceFreeTestUpload = EconomyConfig.GetBoolean("ForceFreeTestUpload", m_ForceFreeTestUpload);
195 string testcreator = EconomyConfig.GetString("TestAssetsCreatorID", "");
196 if (testcreator != "")
197 {
198 UUID id;
199 UUID.TryParse(testcreator, out id);
200 if (id != null)
201 m_testAssetsCreatorID = id;
202 }
203
204 m_ModelCost.ModelMeshCostFactor = modelUploadFactor;
205 m_ModelCost.ModelTextureCostFactor = modelTextureUploadFactor;
206 m_ModelCost.ModelMinCostFactor = modelMinUploadCostFactor;
207 m_ModelCost.primCreationCost = modelPrimCreationCost;
208 m_ModelCost.bytecost = modelMeshByteCost;
209 }
138 } 210 }
139 211
140 m_assetService = m_Scene.AssetService; 212 m_assetService = m_Scene.AssetService;
@@ -146,6 +218,8 @@ namespace OpenSim.Region.ClientStack.Linden
146 ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset; 218 ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset;
147 TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset; 219 TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset;
148 GetClient = m_Scene.SceneGraph.GetControllingClient; 220 GetClient = m_Scene.SceneGraph.GetControllingClient;
221
222 m_FileAgentInventoryState = FileAgentInventoryState.idle;
149 } 223 }
150 224
151 /// <summary> 225 /// <summary>
@@ -191,7 +265,6 @@ namespace OpenSim.Region.ClientStack.Linden
191 { 265 {
192 try 266 try
193 { 267 {
194 // I don't think this one works...
195 m_HostCapsObj.RegisterHandler( 268 m_HostCapsObj.RegisterHandler(
196 "NewFileAgentInventory", 269 "NewFileAgentInventory",
197 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>( 270 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>(
@@ -213,9 +286,7 @@ namespace OpenSim.Region.ClientStack.Linden
213 IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost); 286 IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost);
214 m_HostCapsObj.RegisterHandler("GetObjectCost", getObjectCostHandler); 287 m_HostCapsObj.RegisterHandler("GetObjectCost", getObjectCostHandler);
215 IRequestHandler ResourceCostSelectedHandler = new RestStreamHandler("POST", capsBase + m_ResourceCostSelectedPath, ResourceCostSelected); 288 IRequestHandler ResourceCostSelectedHandler = new RestStreamHandler("POST", capsBase + m_ResourceCostSelectedPath, ResourceCostSelected);
216 m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler); 289 m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler);
217
218
219 290
220 m_HostCapsObj.RegisterHandler( 291 m_HostCapsObj.RegisterHandler(
221 "CopyInventoryFromNotecard", 292 "CopyInventoryFromNotecard",
@@ -387,37 +458,6 @@ namespace OpenSim.Region.ClientStack.Linden
387 return UUID.Zero; 458 return UUID.Zero;
388 } 459 }
389 460
390 private delegate void UploadWithCostCompleteDelegate(string assetName,
391 string assetDescription, UUID assetID, UUID inventoryItem,
392 UUID parentFolder, byte[] data, string inventoryType,
393 string assetType, uint cost);
394
395 private class AssetUploaderWithCost : AssetUploader
396 {
397 private uint m_cost;
398
399 public event UploadWithCostCompleteDelegate OnUpLoad;
400
401 public AssetUploaderWithCost(string assetName, string description, UUID assetID,
402 UUID inventoryItem, UUID parentFolderID, string invType, string assetType,
403 string path, IHttpServer httpServer, bool dumpAssetsToFile, uint cost) :
404 base(assetName, description, assetID, inventoryItem, parentFolderID,
405 invType, assetType, path, httpServer, dumpAssetsToFile)
406 {
407 m_cost = cost;
408
409 base.OnUpLoad += UploadCompleteHandler;
410 }
411
412 private void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
413 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
414 string assetType)
415 {
416 OnUpLoad(assetName, assetDescription, assetID, inventoryItem, parentFolder,
417 data, inventoryType, assetType, m_cost);
418 }
419 }
420
421 /// <summary> 461 /// <summary>
422 /// 462 ///
423 /// </summary> 463 /// </summary>
@@ -428,7 +468,47 @@ namespace OpenSim.Region.ClientStack.Linden
428 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString()); 468 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString());
429 //m_log.Debug("asset upload request via CAPS" + llsdRequest.inventory_type + " , " + llsdRequest.asset_type); 469 //m_log.Debug("asset upload request via CAPS" + llsdRequest.inventory_type + " , " + llsdRequest.asset_type);
430 470
431 uint cost = 0; 471 // start by getting the client
472 IClientAPI client = null;
473 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
474
475 // check current state so we only have one service at a time
476 lock (m_ModelCost)
477 {
478 switch (m_FileAgentInventoryState)
479 {
480 case FileAgentInventoryState.processRequest:
481 case FileAgentInventoryState.processUpload:
482 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
483 resperror.message = "Uploader busy processing previus request";
484 resperror.identifier = UUID.Zero;
485
486 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
487 errorResponse.uploader = "";
488 errorResponse.state = "error";
489 errorResponse.error = resperror;
490 return errorResponse;
491 break;
492 case FileAgentInventoryState.waitUpload:
493 // todo stop current uploader server
494 break;
495 case FileAgentInventoryState.idle:
496 default:
497 break;
498 }
499
500 m_FileAgentInventoryState = FileAgentInventoryState.processRequest;
501 }
502
503 int cost = 0;
504 int nreqtextures = 0;
505 int nreqmeshs= 0;
506 int nreqinstances = 0;
507 bool IsAtestUpload = false;
508
509 string assetName = llsdRequest.name;
510
511 LLSDAssetUploadResponseData meshcostdata = new LLSDAssetUploadResponseData();
432 512
433 if (llsdRequest.asset_type == "texture" || 513 if (llsdRequest.asset_type == "texture" ||
434 llsdRequest.asset_type == "animation" || 514 llsdRequest.asset_type == "animation" ||
@@ -436,83 +516,128 @@ namespace OpenSim.Region.ClientStack.Linden
436 llsdRequest.asset_type == "sound") 516 llsdRequest.asset_type == "sound")
437 { 517 {
438 ScenePresence avatar = null; 518 ScenePresence avatar = null;
439 IClientAPI client = null;
440 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar); 519 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar);
441 520
442 // check user level 521 // check user level
443 if (avatar != null) 522 if (avatar != null)
444 { 523 {
445 client = avatar.ControllingClient;
446
447 if (avatar.UserLevel < m_levelUpload) 524 if (avatar.UserLevel < m_levelUpload)
448 { 525 {
449 if (client != null) 526 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
450 client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); 527 resperror.message = "Insufficient permissions to upload";
528 resperror.identifier = UUID.Zero;
451 529
452 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 530 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
453 errorResponse.uploader = ""; 531 errorResponse.uploader = "";
454 errorResponse.state = "error"; 532 errorResponse.state = "error";
533 errorResponse.error = resperror;
534 lock (m_ModelCost)
535 m_FileAgentInventoryState = FileAgentInventoryState.idle;
455 return errorResponse; 536 return errorResponse;
456 } 537 }
457 } 538 }
458 539
459 // check funds 540 // check test upload and funds
460 if (client != null) 541 if (client != null)
461 { 542 {
462 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>(); 543 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
463 544
545 int baseCost = 0;
464 if (mm != null) 546 if (mm != null)
465 { 547 baseCost = mm.UploadCharge;
466 // XPTO: The cost should be calculated about here
467 548
468 if (llsdRequest.asset_type == "mesh") 549 string warning = String.Empty;
550
551 if (llsdRequest.asset_type == "mesh")
552 {
553 string error;
554 int modelcost;
555
556 if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost,
557 meshcostdata, out error, ref warning))
469 { 558 {
470 cost += 20; // Constant for now to test showing a price 559 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
560 resperror.message = error;
561 resperror.identifier = UUID.Zero;
471 562
472 if (llsdRequest.asset_resources == null) 563 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
473 { 564 errorResponse.uploader = "";
474 client.SendAgentAlertMessage("Unable to upload asset. missing information.", false); 565 errorResponse.state = "error";
566 errorResponse.error = resperror;
475 567
476 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 568 lock (m_ModelCost)
477 errorResponse.uploader = ""; 569 m_FileAgentInventoryState = FileAgentInventoryState.idle;
478 errorResponse.state = "error"; 570 return errorResponse;
479 return errorResponse; 571 }
480 } 572 cost = modelcost;
573 }
574 else
575 {
576 cost = baseCost;
577 }
481 578
482 uint textures_cost = (uint)llsdRequest.asset_resources.texture_list.Array.Count; 579 if (cost > 0 && mm != null)
483 textures_cost *= (uint)mm.UploadCharge; 580 {
581 // check for test upload
582
583 if (m_ForceFreeTestUpload) // all are test
584 {
585 if (!(assetName.Length > 5 && assetName.StartsWith("TEST-"))) // has normal name lets change it
586 assetName = "TEST-" + assetName;
484 587
485 cost += textures_cost; 588 IsAtestUpload = true;
486 } 589 }
487 else 590
591 else if (m_enableFreeTestUpload) // only if prefixed with "TEST-"
488 { 592 {
489 cost = (uint)mm.UploadCharge; 593
594 IsAtestUpload = (assetName.Length > 5 && assetName.StartsWith("TEST-"));
490 } 595 }
491 596
492 if (!mm.UploadCovered(client.AgentId, (int)cost)) 597
598 if(IsAtestUpload) // let user know, still showing cost estimation
599 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";
600
601 // check funds
602 else
493 { 603 {
494 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); 604 if (!mm.UploadCovered(client.AgentId, (int)cost))
605 {
606 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
607 resperror.message = "Insuficient funds";
608 resperror.identifier = UUID.Zero;
495 609
496 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 610 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
497 errorResponse.uploader = ""; 611 errorResponse.uploader = "";
498 errorResponse.state = "error"; 612 errorResponse.state = "error";
499 return errorResponse; 613 errorResponse.error = resperror;
614 lock (m_ModelCost)
615 m_FileAgentInventoryState = FileAgentInventoryState.idle;
616 return errorResponse;
617 }
500 } 618 }
501 } 619 }
620
621 if (client != null && warning != String.Empty)
622 client.SendAgentAlertMessage(warning, true);
502 } 623 }
503 } 624 }
504 625
505 string assetName = llsdRequest.name;
506 string assetDes = llsdRequest.description; 626 string assetDes = llsdRequest.description;
507 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath; 627 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath;
508 UUID newAsset = UUID.Random(); 628 UUID newAsset = UUID.Random();
509 UUID newInvItem = UUID.Random(); 629 UUID newInvItem = UUID.Random();
510 UUID parentFolder = llsdRequest.folder_id; 630 UUID parentFolder = llsdRequest.folder_id;
511 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); 631 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
632 UUID texturesFolder = UUID.Zero;
633
634 if(!IsAtestUpload && m_enableModelUploadTextureToInventory)
635 texturesFolder = llsdRequest.texture_folder_id;
512 636
513 AssetUploaderWithCost uploader = 637 AssetUploader uploader =
514 new AssetUploaderWithCost(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, 638 new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
515 llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost); 639 llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost,
640 texturesFolder, nreqtextures, nreqmeshs, nreqinstances, IsAtestUpload);
516 641
517 m_HostCapsObj.HttpListener.AddStreamHandler( 642 m_HostCapsObj.HttpListener.AddStreamHandler(
518 new BinaryStreamHandler( 643 new BinaryStreamHandler(
@@ -536,25 +661,17 @@ namespace OpenSim.Region.ClientStack.Linden
536 uploadResponse.state = "upload"; 661 uploadResponse.state = "upload";
537 uploadResponse.upload_price = (int)cost; 662 uploadResponse.upload_price = (int)cost;
538 663
539 // use fake values for now
540 if (llsdRequest.asset_type == "mesh") 664 if (llsdRequest.asset_type == "mesh")
541 { 665 {
542 uploadResponse.data = new LLSDAssetUploadResponseData(); 666 uploadResponse.data = meshcostdata;
543 uploadResponse.data.model_streaming_cost = 1.0;
544 uploadResponse.data.simulation_cost = 1.5;
545
546 uploadResponse.data.physics_cost = 2.0;
547 uploadResponse.data.resource_cost = 3.0;
548 uploadResponse.data.upload_price_breakdown.mesh_instance = 1;
549 uploadResponse.data.upload_price_breakdown.mesh_physics = 2;
550 uploadResponse.data.upload_price_breakdown.mesh_streaming = 3;
551 uploadResponse.data.upload_price_breakdown.texture = 5;
552 uploadResponse.data.upload_price_breakdown.model = 4;
553 } 667 }
554 668
555 uploader.OnUpLoad += UploadCompleteHandler; 669 uploader.OnUpLoad += UploadCompleteHandler;
556 return uploadResponse;
557 670
671 lock (m_ModelCost)
672 m_FileAgentInventoryState = FileAgentInventoryState.waitUpload;
673
674 return uploadResponse;
558 } 675 }
559 676
560 /// <summary> 677 /// <summary>
@@ -565,8 +682,14 @@ namespace OpenSim.Region.ClientStack.Linden
565 /// <param name="data"></param> 682 /// <param name="data"></param>
566 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID, 683 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
567 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, 684 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
568 string assetType, uint cost) 685 string assetType, int cost,
686 UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
687 bool IsAtestUpload, ref string error)
569 { 688 {
689
690 lock (m_ModelCost)
691 m_FileAgentInventoryState = FileAgentInventoryState.processUpload;
692
570 m_log.DebugFormat( 693 m_log.DebugFormat(
571 "[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}", 694 "[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
572 assetID, inventoryItem, inventoryType, assetType); 695 assetID, inventoryItem, inventoryType, assetType);
@@ -574,117 +697,247 @@ namespace OpenSim.Region.ClientStack.Linden
574 sbyte assType = 0; 697 sbyte assType = 0;
575 sbyte inType = 0; 698 sbyte inType = 0;
576 699
700 IClientAPI client = null;
701
702 UUID owner_id = m_HostCapsObj.AgentID;
703 UUID creatorID;
704
705 bool istest = IsAtestUpload && m_enableFreeTestUpload && (cost > 0);
706
707 bool restrictPerms = m_RestrictFreeTestUploadPerms && istest;
708
709 if (istest && m_testAssetsCreatorID != UUID.Zero)
710 creatorID = m_testAssetsCreatorID;
711 else
712 creatorID = owner_id;
713
714 string creatorIDstr = creatorID.ToString();
715
716 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
717 if (mm != null)
718 {
719 // make sure client still has enougth credit
720 if (!mm.UploadCovered(m_HostCapsObj.AgentID, (int)cost))
721 {
722 error = "Insufficient funds.";
723 return;
724 }
725 }
726
727 // strings to types
577 if (inventoryType == "sound") 728 if (inventoryType == "sound")
578 { 729 {
579 inType = 1; 730 inType = (sbyte)InventoryType.Sound;
580 assType = 1; 731 assType = (sbyte)AssetType.Sound;
581 } 732 }
582 else if (inventoryType == "animation") 733 else if (inventoryType == "animation")
583 { 734 {
584 inType = 19; 735 inType = (sbyte)InventoryType.Animation;
585 assType = 20; 736 assType = (sbyte)AssetType.Animation;
586 } 737 }
587 else if (inventoryType == "wearable") 738 else if (inventoryType == "wearable")
588 { 739 {
589 inType = 18; 740 inType = (sbyte)InventoryType.Wearable;
590 switch (assetType) 741 switch (assetType)
591 { 742 {
592 case "bodypart": 743 case "bodypart":
593 assType = 13; 744 assType = (sbyte)AssetType.Bodypart;
594 break; 745 break;
595 case "clothing": 746 case "clothing":
596 assType = 5; 747 assType = (sbyte)AssetType.Clothing;
597 break; 748 break;
598 } 749 }
599 } 750 }
600 else if (inventoryType == "object") 751 else if (inventoryType == "object")
601 { 752 {
602 inType = (sbyte)InventoryType.Object; 753 if (assetType == "mesh") // this code for now is for mesh models uploads only
603 assType = (sbyte)AssetType.Object;
604
605 List<Vector3> positions = new List<Vector3>();
606 List<Quaternion> rotations = new List<Quaternion>();
607 OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
608 OSDArray instance_list = (OSDArray)request["instance_list"];
609 OSDArray mesh_list = (OSDArray)request["mesh_list"];
610 OSDArray texture_list = (OSDArray)request["texture_list"];
611 SceneObjectGroup grp = null;
612
613 List<UUID> textures = new List<UUID>();
614 for (int i = 0; i < texture_list.Count; i++)
615 { 754 {
616 AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, ""); 755 inType = (sbyte)InventoryType.Object;
617 textureAsset.Data = texture_list[i].AsBinary(); 756 assType = (sbyte)AssetType.Object;
618 m_assetService.Store(textureAsset);
619 textures.Add(textureAsset.FullID);
620 }
621 757
622 for (int i = 0; i < mesh_list.Count; i++) 758 List<Vector3> positions = new List<Vector3>();
623 { 759 List<Quaternion> rotations = new List<Quaternion>();
624 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox(); 760 OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
625 761
626 Primitive.TextureEntry textureEntry 762 // compare and get updated information
627 = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
628 OSDMap inner_instance_list = (OSDMap)instance_list[i];
629 763
630 OSDArray face_list = (OSDArray)inner_instance_list["face_list"]; 764 bool mismatchError = true;
631 for (uint face = 0; face < face_list.Count; face++) 765
766 while (mismatchError)
632 { 767 {
633 OSDMap faceMap = (OSDMap)face_list[(int)face]; 768 mismatchError = false;
634 Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face); 769 }
635 if(faceMap.ContainsKey("fullbright"))
636 f.Fullbright = faceMap["fullbright"].AsBoolean();
637 if (faceMap.ContainsKey ("diffuse_color"))
638 f.RGBA = faceMap["diffuse_color"].AsColor4();
639 770
640 int textureNum = faceMap["image"].AsInteger(); 771 if (mismatchError)
641 float imagerot = faceMap["imagerot"].AsInteger(); 772 {
642 float offsets = (float)faceMap["offsets"].AsReal(); 773 error = "Upload and fee estimation information don't match";
643 float offsett = (float)faceMap["offsett"].AsReal(); 774 lock (m_ModelCost)
644 float scales = (float)faceMap["scales"].AsReal(); 775 m_FileAgentInventoryState = FileAgentInventoryState.idle;
645 float scalet = (float)faceMap["scalet"].AsReal();
646 776
647 if(imagerot != 0) 777 return;
648 f.Rotation = imagerot; 778 }
649 779
650 if(offsets != 0) 780 OSDArray instance_list = (OSDArray)request["instance_list"];
651 f.OffsetU = offsets; 781 OSDArray mesh_list = (OSDArray)request["mesh_list"];
782 OSDArray texture_list = (OSDArray)request["texture_list"];
783 SceneObjectGroup grp = null;
652 784
653 if (offsett != 0) 785 // create and store texture assets
654 f.OffsetV = offsett; 786 bool doTextInv = (!istest && m_enableModelUploadTextureToInventory &&
787 texturesFolder != UUID.Zero);
655 788
656 if (scales != 0)
657 f.RepeatU = scales;
658 789
659 if (scalet != 0) 790 List<UUID> textures = new List<UUID>();
660 f.RepeatV = scalet;
661 791
662 if (textures.Count > textureNum) 792
663 f.TextureID = textures[textureNum]; 793 if (doTextInv)
664 else 794 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
665 f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE;
666 795
667 textureEntry.FaceTextures[face] = f; 796 if(client == null) // don't put textures in inventory if there is no client
797 doTextInv = false;
798
799 for (int i = 0; i < texture_list.Count; i++)
800 {
801 AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, creatorIDstr);
802 textureAsset.Data = texture_list[i].AsBinary();
803 if (istest)
804 textureAsset.Local = true;
805 m_assetService.Store(textureAsset);
806 textures.Add(textureAsset.FullID);
807
808 if (doTextInv)
809 {
810 string name = assetName;
811 if (name.Length > 25)
812 name = name.Substring(0, 24);
813 name += "_Texture#" + i.ToString();
814 InventoryItemBase texitem = new InventoryItemBase();
815 texitem.Owner = m_HostCapsObj.AgentID;
816 texitem.CreatorId = creatorIDstr;
817 texitem.CreatorData = String.Empty;
818 texitem.ID = UUID.Random();
819 texitem.AssetID = textureAsset.FullID;
820 texitem.Description = "mesh model texture";
821 texitem.Name = name;
822 texitem.AssetType = (int)AssetType.Texture;
823 texitem.InvType = (int)InventoryType.Texture;
824 texitem.Folder = texturesFolder;
825
826 texitem.CurrentPermissions
827 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
828
829 texitem.BasePermissions = (uint)PermissionMask.All;
830 texitem.EveryOnePermissions = 0;
831 texitem.NextPermissions = (uint)PermissionMask.All;
832 texitem.CreationDate = Util.UnixTimeSinceEpoch();
833
834 m_Scene.AddInventoryItem(client, texitem);
835 texitem = null;
836 }
837 }
838
839 // create and store meshs assets
840 List<UUID> meshAssets = new List<UUID>();
841 for (int i = 0; i < mesh_list.Count; i++)
842 {
843 AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, creatorIDstr);
844 meshAsset.Data = mesh_list[i].AsBinary();
845 if (istest)
846 meshAsset.Local = true;
847 m_assetService.Store(meshAsset);
848 meshAssets.Add(meshAsset.FullID);
668 } 849 }
669 850
670 pbs.TextureEntry = textureEntry.GetBytes(); 851 int skipedMeshs = 0;
852 // build prims from instances
853 for (int i = 0; i < instance_list.Count; i++)
854 {
855 OSDMap inner_instance_list = (OSDMap)instance_list[i];
856
857 // skip prims that are 2 small
858 Vector3 scale = inner_instance_list["scale"].AsVector3();
859
860 if (scale.X < m_PrimScaleMin || scale.Y < m_PrimScaleMin || scale.Z < m_PrimScaleMin)
861 {
862 skipedMeshs++;
863 continue;
864 }
865
866 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
867
868 Primitive.TextureEntry textureEntry
869 = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
870
871
872 OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
873 for (uint face = 0; face < face_list.Count; face++)
874 {
875 OSDMap faceMap = (OSDMap)face_list[(int)face];
876 Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face);
877 if (faceMap.ContainsKey("fullbright"))
878 f.Fullbright = faceMap["fullbright"].AsBoolean();
879 if (faceMap.ContainsKey("diffuse_color"))
880 f.RGBA = faceMap["diffuse_color"].AsColor4();
881
882 int textureNum = faceMap["image"].AsInteger();
883 float imagerot = faceMap["imagerot"].AsInteger();
884 float offsets = (float)faceMap["offsets"].AsReal();
885 float offsett = (float)faceMap["offsett"].AsReal();
886 float scales = (float)faceMap["scales"].AsReal();
887 float scalet = (float)faceMap["scalet"].AsReal();
888
889 if (imagerot != 0)
890 f.Rotation = imagerot;
891
892 if (offsets != 0)
893 f.OffsetU = offsets;
671 894
672 AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, ""); 895 if (offsett != 0)
673 meshAsset.Data = mesh_list[i].AsBinary(); 896 f.OffsetV = offsett;
674 m_assetService.Store(meshAsset);
675 897
676 pbs.SculptEntry = true; 898 if (scales != 0)
677 pbs.SculptTexture = meshAsset.FullID; 899 f.RepeatU = scales;
678 pbs.SculptType = (byte)SculptType.Mesh;
679 pbs.SculptData = meshAsset.Data;
680 900
681 Vector3 position = inner_instance_list["position"].AsVector3(); 901 if (scalet != 0)
682 Vector3 scale = inner_instance_list["scale"].AsVector3(); 902 f.RepeatV = scalet;
683 Quaternion rotation = inner_instance_list["rotation"].AsQuaternion(); 903
904 if (textures.Count > textureNum)
905 f.TextureID = textures[textureNum];
906 else
907 f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE;
908
909 textureEntry.FaceTextures[face] = f;
910 }
911
912 pbs.TextureEntry = textureEntry.GetBytes();
913
914 bool hasmesh = false;
915 if (inner_instance_list.ContainsKey("mesh")) // seems to happen always but ...
916 {
917 int meshindx = inner_instance_list["mesh"].AsInteger();
918 if (meshAssets.Count > meshindx)
919 {
920 pbs.SculptEntry = true;
921 pbs.SculptType = (byte)SculptType.Mesh;
922 pbs.SculptTexture = meshAssets[meshindx]; // actual asset UUID after meshs suport introduction
923 // data will be requested from asset on rez (i hope)
924 hasmesh = true;
925 }
926 }
927
928 Vector3 position = inner_instance_list["position"].AsVector3();
929 Quaternion rotation = inner_instance_list["rotation"].AsQuaternion();
930
931 // for now viwers do send fixed defaults
932 // but this may change
933// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
934 byte physicsShapeType = (byte)PhysShapeType.prim; // default for mesh is simple convex
935 if(hasmesh)
936 physicsShapeType = (byte) PhysShapeType.convex; // default for mesh is simple convex
937// int material = inner_instance_list["material"].AsInteger();
938 byte material = (byte)Material.Wood;
684 939
685// no longer used - begin ------------------------ 940// no longer used - begin ------------------------
686// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
687// int material = inner_instance_list["material"].AsInteger();
688// int mesh = inner_instance_list["mesh"].AsInteger(); 941// int mesh = inner_instance_list["mesh"].AsInteger();
689 942
690// OSDMap permissions = (OSDMap)inner_instance_list["permissions"]; 943// OSDMap permissions = (OSDMap)inner_instance_list["permissions"];
@@ -699,24 +952,42 @@ namespace OpenSim.Region.ClientStack.Linden
699// UUID owner_id = permissions["owner_id"].AsUUID(); 952// UUID owner_id = permissions["owner_id"].AsUUID();
700// int owner_mask = permissions["owner_mask"].AsInteger(); 953// int owner_mask = permissions["owner_mask"].AsInteger();
701// no longer used - end ------------------------ 954// no longer used - end ------------------------
955
956
957 SceneObjectPart prim
958 = new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero);
959
960 prim.Scale = scale;
961 rotations.Add(rotation);
962 positions.Add(position);
963 prim.UUID = UUID.Random();
964 prim.CreatorID = creatorID;
965 prim.OwnerID = owner_id;
966 prim.GroupID = UUID.Zero;
967 prim.LastOwnerID = creatorID;
968 prim.CreationDate = Util.UnixTimeSinceEpoch();
969
970 if (grp == null)
971 prim.Name = assetName;
972 else
973 prim.Name = assetName + "#" + i.ToString();
702 974
703 UUID owner_id = m_HostCapsObj.AgentID; 975 if (restrictPerms)
976 {
977 prim.BaseMask = (uint)(PermissionMask.Move | PermissionMask.Modify);
978 prim.EveryoneMask = 0;
979 prim.GroupMask = 0;
980 prim.NextOwnerMask = 0;
981 prim.OwnerMask = (uint)(PermissionMask.Move | PermissionMask.Modify);
982 }
704 983
705 SceneObjectPart prim 984 if(istest)
706 = new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero); 985 prim.Description = "For testing only. Other uses are prohibited";
986 else
987 prim.Description = "";
707 988
708 prim.Scale = scale; 989 prim.Material = material;
709 prim.OffsetPosition = position; 990 prim.PhysicsShapeType = physicsShapeType;
710 rotations.Add(rotation);
711 positions.Add(position);
712 prim.UUID = UUID.Random();
713 prim.CreatorID = owner_id;
714 prim.OwnerID = owner_id;
715 prim.GroupID = UUID.Zero;
716 prim.LastOwnerID = prim.OwnerID;
717 prim.CreationDate = Util.UnixTimeSinceEpoch();
718 prim.Name = assetName;
719 prim.Description = "";
720 991
721// prim.BaseMask = (uint)base_mask; 992// prim.BaseMask = (uint)base_mask;
722// prim.EveryoneMask = (uint)everyone_mask; 993// prim.EveryoneMask = (uint)everyone_mask;
@@ -724,37 +995,64 @@ namespace OpenSim.Region.ClientStack.Linden
724// prim.NextOwnerMask = (uint)next_owner_mask; 995// prim.NextOwnerMask = (uint)next_owner_mask;
725// prim.OwnerMask = (uint)owner_mask; 996// prim.OwnerMask = (uint)owner_mask;
726 997
727 if (grp == null) 998 if (grp == null)
728 grp = new SceneObjectGroup(prim); 999 {
729 else 1000 grp = new SceneObjectGroup(prim);
730 grp.AddPart(prim); 1001 grp.LastOwnerID = creatorID;
731 } 1002 }
1003 else
1004 grp.AddPart(prim);
1005 }
732 1006
733 // Fix first link number 1007 Vector3 rootPos = positions[0];
734 if (grp.Parts.Length > 1)
735 grp.RootPart.LinkNum++;
736 1008
737 Vector3 rootPos = positions[0]; 1009 if (grp.Parts.Length > 1)
738 grp.AbsolutePosition = rootPos; 1010 {
739 for (int i = 0; i < positions.Count; i++) 1011 // Fix first link number
740 { 1012 grp.RootPart.LinkNum++;
741 Vector3 offset = positions[i] - rootPos; 1013
742 grp.Parts[i].OffsetPosition = offset; 1014 Quaternion rootRotConj = Quaternion.Conjugate(rotations[0]);
1015 Quaternion tmprot;
1016 Vector3 offset;
1017
1018 // fix children rotations and positions
1019 for (int i = 1; i < rotations.Count; i++)
1020 {
1021 tmprot = rotations[i];
1022 tmprot = rootRotConj * tmprot;
1023
1024 grp.Parts[i].RotationOffset = tmprot;
1025
1026 offset = positions[i] - rootPos;
1027
1028 offset *= rootRotConj;
1029 grp.Parts[i].OffsetPosition = offset;
1030 }
1031
1032 grp.AbsolutePosition = rootPos;
1033 grp.UpdateGroupRotationR(rotations[0]);
1034 }
1035 else
1036 {
1037 grp.AbsolutePosition = rootPos;
1038 grp.UpdateGroupRotationR(rotations[0]);
1039 }
1040
1041 data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
743 } 1042 }
744 1043
745 for (int i = 0; i < rotations.Count; i++) 1044 else // not a mesh model
746 { 1045 {
747 if (i != 0) 1046 m_log.ErrorFormat("[CAPS Asset Upload] got unsuported assetType for object upload");
748 grp.Parts[i].RotationOffset = rotations[i]; 1047 return;
749 } 1048 }
750
751 grp.UpdateGroupRotationR(rotations[0]);
752 data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
753 } 1049 }
754 1050
755 AssetBase asset; 1051 AssetBase asset;
756 asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString()); 1052 asset = new AssetBase(assetID, assetName, assType, creatorIDstr);
757 asset.Data = data; 1053 asset.Data = data;
1054 if (istest)
1055 asset.Local = true;
758 if (AddNewAsset != null) 1056 if (AddNewAsset != null)
759 AddNewAsset(asset); 1057 AddNewAsset(asset);
760 else if (m_assetService != null) 1058 else if (m_assetService != null)
@@ -762,11 +1060,17 @@ namespace OpenSim.Region.ClientStack.Linden
762 1060
763 InventoryItemBase item = new InventoryItemBase(); 1061 InventoryItemBase item = new InventoryItemBase();
764 item.Owner = m_HostCapsObj.AgentID; 1062 item.Owner = m_HostCapsObj.AgentID;
765 item.CreatorId = m_HostCapsObj.AgentID.ToString(); 1063 item.CreatorId = creatorIDstr;
766 item.CreatorData = String.Empty; 1064 item.CreatorData = String.Empty;
767 item.ID = inventoryItem; 1065 item.ID = inventoryItem;
768 item.AssetID = asset.FullID; 1066 item.AssetID = asset.FullID;
769 item.Description = assetDescription; 1067 if (istest)
1068 {
1069 item.Description = "For testing only. Other uses are prohibited";
1070 item.Flags = (uint) (InventoryItemFlags.SharedSingleReference);
1071 }
1072 else
1073 item.Description = assetDescription;
770 item.Name = assetName; 1074 item.Name = assetName;
771 item.AssetType = assType; 1075 item.AssetType = assType;
772 item.InvType = inType; 1076 item.InvType = inType;
@@ -774,18 +1078,60 @@ namespace OpenSim.Region.ClientStack.Linden
774 1078
775 // If we set PermissionMask.All then when we rez the item the next permissions will replace the current 1079 // If we set PermissionMask.All then when we rez the item the next permissions will replace the current
776 // (owner) permissions. This becomes a problem if next permissions are changed. 1080 // (owner) permissions. This becomes a problem if next permissions are changed.
777 item.CurrentPermissions
778 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
779 1081
780 item.BasePermissions = (uint)PermissionMask.All; 1082 if (restrictPerms)
781 item.EveryOnePermissions = 0; 1083 {
782 item.NextPermissions = (uint)PermissionMask.All; 1084 item.CurrentPermissions
1085 = (uint)(PermissionMask.Move | PermissionMask.Modify);
1086
1087 item.BasePermissions = (uint)(PermissionMask.Move | PermissionMask.Modify);
1088 item.EveryOnePermissions = 0;
1089 item.NextPermissions = 0;
1090 }
1091 else
1092 {
1093 item.CurrentPermissions
1094 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
1095
1096 item.BasePermissions = (uint)PermissionMask.All;
1097 item.EveryOnePermissions = 0;
1098 item.NextPermissions = (uint)PermissionMask.All;
1099 }
1100
783 item.CreationDate = Util.UnixTimeSinceEpoch(); 1101 item.CreationDate = Util.UnixTimeSinceEpoch();
784 1102
1103 m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
1104
785 if (AddNewInventoryItem != null) 1105 if (AddNewInventoryItem != null)
786 { 1106 {
787 AddNewInventoryItem(m_HostCapsObj.AgentID, item, cost); 1107 if (istest)
1108 {
1109 m_Scene.AddInventoryItem(client, item);
1110/*
1111 AddNewInventoryItem(m_HostCapsObj.AgentID, item, 0);
1112 if (client != null)
1113 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);
1114 */
1115 }
1116 else
1117 {
1118 AddNewInventoryItem(m_HostCapsObj.AgentID, item, (uint)cost);
1119 if (client != null)
1120 {
1121 // let users see anything.. i don't so far
1122 string str;
1123 if (cost > 0)
1124 // dont remember where is money unit name to put here
1125 str = "Upload complete. charged " + cost.ToString() + "$";
1126 else
1127 str = "Upload complete";
1128 client.SendAgentAlertMessage(str, true);
1129 }
1130 }
788 } 1131 }
1132
1133 lock (m_ModelCost)
1134 m_FileAgentInventoryState = FileAgentInventoryState.idle;
789 } 1135 }
790 1136
791 /// <summary> 1137 /// <summary>
@@ -1098,6 +1444,7 @@ namespace OpenSim.Region.ClientStack.Linden
1098 private static readonly ILog m_log = 1444 private static readonly ILog m_log =
1099 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 1445 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
1100 1446
1447
1101 public event UpLoadedAsset OnUpLoad; 1448 public event UpLoadedAsset OnUpLoad;
1102 private UpLoadedAsset handlerUpLoad = null; 1449 private UpLoadedAsset handlerUpLoad = null;
1103 1450
@@ -1112,11 +1459,21 @@ namespace OpenSim.Region.ClientStack.Linden
1112 1459
1113 private string m_invType = String.Empty; 1460 private string m_invType = String.Empty;
1114 private string m_assetType = String.Empty; 1461 private string m_assetType = String.Empty;
1462 private int m_cost;
1463 private string m_error = String.Empty;
1464
1115 private Timer m_timeoutTimer = new Timer(); 1465 private Timer m_timeoutTimer = new Timer();
1466 private UUID m_texturesFolder;
1467 private int m_nreqtextures;
1468 private int m_nreqmeshs;
1469 private int m_nreqinstances;
1470 private bool m_IsAtestUpload;
1116 1471
1117 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem, 1472 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
1118 UUID parentFolderID, string invType, string assetType, string path, 1473 UUID parentFolderID, string invType, string assetType, string path,
1119 IHttpServer httpServer, bool dumpAssetsToFile) 1474 IHttpServer httpServer, bool dumpAssetsToFile,
1475 int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
1476 bool IsAtestUpload)
1120 { 1477 {
1121 m_assetName = assetName; 1478 m_assetName = assetName;
1122 m_assetDes = description; 1479 m_assetDes = description;
@@ -1128,6 +1485,13 @@ namespace OpenSim.Region.ClientStack.Linden
1128 m_assetType = assetType; 1485 m_assetType = assetType;
1129 m_invType = invType; 1486 m_invType = invType;
1130 m_dumpAssetsToFile = dumpAssetsToFile; 1487 m_dumpAssetsToFile = dumpAssetsToFile;
1488 m_cost = totalCost;
1489
1490 m_texturesFolder = texturesFolder;
1491 m_nreqtextures = nreqtextures;
1492 m_nreqmeshs = nreqmeshs;
1493 m_nreqinstances = nreqinstances;
1494 m_IsAtestUpload = IsAtestUpload;
1131 1495
1132 m_timeoutTimer.Elapsed += TimedOut; 1496 m_timeoutTimer.Elapsed += TimedOut;
1133 m_timeoutTimer.Interval = 120000; 1497 m_timeoutTimer.Interval = 120000;
@@ -1147,14 +1511,15 @@ namespace OpenSim.Region.ClientStack.Linden
1147 UUID inv = inventoryItemID; 1511 UUID inv = inventoryItemID;
1148 string res = String.Empty; 1512 string res = String.Empty;
1149 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); 1513 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
1514/*
1150 uploadComplete.new_asset = newAssetID.ToString(); 1515 uploadComplete.new_asset = newAssetID.ToString();
1151 uploadComplete.new_inventory_item = inv; 1516 uploadComplete.new_inventory_item = inv;
1152 uploadComplete.state = "complete"; 1517 uploadComplete.state = "complete";
1153 1518
1154 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); 1519 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
1155 1520*/
1156 httpListener.RemoveStreamHandler("POST", uploaderPath);
1157 m_timeoutTimer.Stop(); 1521 m_timeoutTimer.Stop();
1522 httpListener.RemoveStreamHandler("POST", uploaderPath);
1158 1523
1159 // TODO: probably make this a better set of extensions here 1524 // TODO: probably make this a better set of extensions here
1160 string extension = ".jp2"; 1525 string extension = ".jp2";
@@ -1170,9 +1535,40 @@ namespace OpenSim.Region.ClientStack.Linden
1170 handlerUpLoad = OnUpLoad; 1535 handlerUpLoad = OnUpLoad;
1171 if (handlerUpLoad != null) 1536 if (handlerUpLoad != null)
1172 { 1537 {
1173 handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType); 1538 handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,
1539 m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload, ref m_error);
1174 } 1540 }
1541 if (m_IsAtestUpload)
1542 {
1543 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
1544 resperror.message = "Upload SUCESSEFULL for testing purposes only. Other uses are prohibited. Item will not work after 48 hours or on other regions";
1545 resperror.identifier = inv;
1175 1546
1547 uploadComplete.error = resperror;
1548 uploadComplete.state = "Upload4Testing";
1549 }
1550 else
1551 {
1552 if (m_error == String.Empty)
1553 {
1554 uploadComplete.new_asset = newAssetID.ToString();
1555 uploadComplete.new_inventory_item = inv;
1556 // if (m_texturesFolder != UUID.Zero)
1557 // uploadComplete.new_texture_folder_id = m_texturesFolder;
1558 uploadComplete.state = "complete";
1559 }
1560 else
1561 {
1562 LLSDAssetUploadError resperror = new LLSDAssetUploadError();
1563 resperror.message = m_error;
1564 resperror.identifier = inv;
1565
1566 uploadComplete.error = resperror;
1567 uploadComplete.state = "failed";
1568 }
1569 }
1570
1571 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
1176 return res; 1572 return res;
1177 } 1573 }
1178 1574