try to allow free uploads for testing, if users prefix names with "TEST-". Let

textures get into inventory again. Both features under config control.
Have direct warnings to client, including a final one on upload complete
since i see nothing. problems: textures don't showup in inventory til
relog, also issues with permitions. A few more changes
avinationmerge
UbitUmarov 2012-09-23 15:04:10 +01:00
parent 11e05217df
commit 64db9e4114
3 changed files with 211 additions and 41 deletions

View File

@ -36,6 +36,7 @@ namespace OpenSim.Framework.Capabilities
{
public string new_asset = String.Empty;
public UUID new_inventory_item = UUID.Zero;
// public UUID new_texture_folder_id = UUID.Zero;
public string state = String.Empty;
public LLSDAssetUploadError error = null;
//public bool success = false;

View File

@ -55,7 +55,9 @@ namespace OpenSim.Region.ClientStack.Linden
{
public delegate void UpLoadedAsset(
string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder,
byte[] data, string inventoryType, string assetType, int cost, ref string error);
byte[] data, string inventoryType, string assetType,
int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
bool IsAtestUpload, ref string error);
public delegate UUID UpdateItem(UUID itemID, byte[] data);
@ -118,8 +120,9 @@ namespace OpenSim.Region.ClientStack.Linden
private string m_regionName;
private int m_levelUpload = 0;
private float m_PrimScaleMin = 0.001f;
private bool m_enableFreeTestModelUpload = false;
private bool m_enableFreeTestUpload = false;
private bool m_enableModelUploadTextureToInventory = false;
private UUID m_testAssetsCreatorID = UUID.Zero;
private enum FileAgentInventoryState : int
{
@ -148,6 +151,9 @@ namespace OpenSim.Region.ClientStack.Linden
float modelUploadFactor = m_ModelCost.ModelMeshCostFactor;
float modelMinUploadCostFactor = m_ModelCost.ModelMinCostFactor;
// can be UUID.zero. This is me at OSG, should be a valid grid ID, is case a bad config
UUID.TryParse("58e06f33-ea8c-4ff6-9af5-420606926118", out m_testAssetsCreatorID);
IConfigSource config = m_Scene.Config;
if (config != null)
{
@ -169,9 +175,18 @@ namespace OpenSim.Region.ClientStack.Linden
modelUploadFactor = EconomyConfig.GetFloat("MeshModelUploadCostFactor", modelUploadFactor);
modelTextureUploadFactor = EconomyConfig.GetFloat("MeshModelUploadTextureCostFactor", modelTextureUploadFactor);
modelMinUploadCostFactor = EconomyConfig.GetFloat("MeshModelMinCostFactor", modelMinUploadCostFactor);
m_enableFreeTestModelUpload = EconomyConfig.GetBoolean("MeshModelUploadAllowFreeTest", false);
m_enableModelUploadTextureToInventory = EconomyConfig.GetBoolean("MeshModelAllowTextureToInventory", false);
m_enableFreeTestUpload = EconomyConfig.GetBoolean("AllowFreeTestUpload", false);
string testcreator = EconomyConfig.GetString("TestAssetsCreatorID", m_testAssetsCreatorID.ToString());
if (testcreator != "")
{
UUID id;
UUID.TryParse(testcreator, out id);
if (id != null)
m_testAssetsCreatorID = id;
}
m_ModelCost.ModelMeshCostFactor = modelUploadFactor;
m_ModelCost.ModelTextureCostFactor = modelTextureUploadFactor;
m_ModelCost.ModelMinCostFactor = modelMinUploadCostFactor;
@ -426,13 +441,6 @@ namespace OpenSim.Region.ClientStack.Linden
return UUID.Zero;
}
/*
private class AssetUploaderExtraParameters
{
public int total_cost;
public UUID textureFolder = UUID.Zero;
*/
/// <summary>
///
@ -477,6 +485,11 @@ namespace OpenSim.Region.ClientStack.Linden
}
int cost = 0;
int nreqtextures = 0;
int nreqmeshs= 0;
int nreqinstances = 0;
bool IsAtestUpload = false;
LLSDAssetUploadResponseData meshcostdata = new LLSDAssetUploadResponseData();
if (llsdRequest.asset_type == "texture" ||
@ -496,7 +509,6 @@ namespace OpenSim.Region.ClientStack.Linden
resperror.message = "Insufficient permissions to upload";
resperror.identifier = UUID.Zero;
LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
errorResponse.uploader = "";
errorResponse.state = "error";
@ -516,13 +528,15 @@ namespace OpenSim.Region.ClientStack.Linden
if (mm != null)
baseCost = mm.UploadCharge;
string warning = String.Empty;
if (llsdRequest.asset_type == "mesh")
{
string error;
int modelcost;
if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost,
meshcostdata, out error))
meshcostdata, out error, ref warning))
{
LLSDAssetUploadError resperror = new LLSDAssetUploadError();
resperror.message = error;
@ -544,8 +558,21 @@ namespace OpenSim.Region.ClientStack.Linden
cost = baseCost;
}
if (m_enableFreeTestUpload && cost > 0 && mm != null)
{
string str = llsdRequest.name;
if (str.Length > 5 && str.StartsWith("TEST-"))
{
warning += "Upload will have no cost, but for personal test purposes only. Other uses are forbiden";
IsAtestUpload = true;
}
}
if (client != null && warning != String.Empty)
client.SendAgentAlertMessage(warning, true);
// check funds
if (mm != null)
if (!IsAtestUpload && mm != null && cost >0)
{
if (!mm.UploadCovered(client.AgentId, (int)cost))
{
@ -572,10 +599,15 @@ namespace OpenSim.Region.ClientStack.Linden
UUID newInvItem = UUID.Random();
UUID parentFolder = llsdRequest.folder_id;
string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
UUID texturesFolder = UUID.Zero;
if(!IsAtestUpload && m_enableModelUploadTextureToInventory)
texturesFolder = llsdRequest.texture_folder_id;
AssetUploader uploader =
new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost);
llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost,
texturesFolder, nreqtextures, nreqmeshs, nreqinstances,IsAtestUpload);
m_HostCapsObj.HttpListener.AddStreamHandler(
new BinaryStreamHandler(
@ -620,7 +652,9 @@ namespace OpenSim.Region.ClientStack.Linden
/// <param name="data"></param>
public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
string assetType, int cost, ref string error)
string assetType, int cost,
UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
bool IsAtestUpload, ref string error)
{
lock (m_ModelCost)
@ -633,6 +667,18 @@ namespace OpenSim.Region.ClientStack.Linden
sbyte assType = 0;
sbyte inType = 0;
UUID owner_id = m_HostCapsObj.AgentID;
UUID creatorID;
bool istest = IsAtestUpload && m_enableFreeTestUpload && (cost > 0);
if (istest)
creatorID = m_testAssetsCreatorID;
else
creatorID = owner_id;
string creatorIDstr = creatorID.ToString();
IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
if (mm != null)
{
@ -703,20 +749,56 @@ namespace OpenSim.Region.ClientStack.Linden
SceneObjectGroup grp = null;
// create and store texture assets
bool doTextInv = (!istest && m_enableModelUploadTextureToInventory &&
texturesFolder != UUID.Zero);
List<UUID> textures = new List<UUID>();
for (int i = 0; i < texture_list.Count; i++)
{
AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, "");
AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, creatorIDstr);
textureAsset.Data = texture_list[i].AsBinary();
m_assetService.Store(textureAsset);
textures.Add(textureAsset.FullID);
if (doTextInv)
{
string name = assetName;
if (name.Length > 25)
name = name.Substring(0, 24);
name += "_Texture#" + i.ToString();
InventoryItemBase texitem = new InventoryItemBase();
texitem.Owner = m_HostCapsObj.AgentID;
texitem.CreatorId = creatorIDstr;
texitem.CreatorData = String.Empty;
texitem.ID = UUID.Random();
texitem.AssetID = textureAsset.FullID;
texitem.Description = "mesh model texture";
texitem.Name = name;
texitem.AssetType = (int)AssetType.Texture;
texitem.InvType = (int)InventoryType.Texture;
texitem.Folder = texturesFolder;
texitem.CurrentPermissions
= (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
texitem.BasePermissions = (uint)PermissionMask.All;
texitem.EveryOnePermissions = 0;
texitem.NextPermissions = (uint)PermissionMask.All;
texitem.CreationDate = Util.UnixTimeSinceEpoch();
AddNewInventoryItem(m_HostCapsObj.AgentID, texitem, 0);
texitem = null;
// this aren't showing up in viewer until relog :(
}
}
// create and store meshs assets
List<UUID> meshAssets = new List<UUID>();
for (int i = 0; i < mesh_list.Count; i++)
{
AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, "");
AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, creatorIDstr);
meshAsset.Data = mesh_list[i].AsBinary();
m_assetService.Store(meshAsset);
meshAssets.Add(meshAsset.FullID);
@ -827,7 +909,7 @@ namespace OpenSim.Region.ClientStack.Linden
// int owner_mask = permissions["owner_mask"].AsInteger();
// no longer used - end ------------------------
UUID owner_id = m_HostCapsObj.AgentID;
SceneObjectPart prim
= new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero);
@ -837,13 +919,29 @@ namespace OpenSim.Region.ClientStack.Linden
rotations.Add(rotation);
positions.Add(position);
prim.UUID = UUID.Random();
prim.CreatorID = owner_id;
prim.CreatorID = creatorID;
prim.OwnerID = owner_id;
prim.GroupID = UUID.Zero;
prim.LastOwnerID = prim.OwnerID;
prim.LastOwnerID = creatorID;
prim.CreationDate = Util.UnixTimeSinceEpoch();
prim.Name = assetName;
prim.Description = "";
if (grp == null)
prim.Name = assetName;
else
prim.Name = assetName + "#" + i.ToString();
if (istest)
{
prim.BaseMask = (uint)(PermissionMask.Move | PermissionMask.Modify);
prim.EveryoneMask = 0;
prim.GroupMask = 0;
prim.NextOwnerMask = 0;
prim.OwnerMask = (uint)(PermissionMask.Move | PermissionMask.Modify);
prim.Description = "For personal testing only. Other uses are forbiden";
}
else
prim.Description = "";
prim.Material = material;
prim.PhysicsShapeType = physicsShapeType;
@ -854,7 +952,10 @@ namespace OpenSim.Region.ClientStack.Linden
// prim.OwnerMask = (uint)owner_mask;
if (grp == null)
{
grp = new SceneObjectGroup(prim);
grp.LastOwnerID = creatorID;
}
else
grp.AddPart(prim);
}
@ -904,7 +1005,7 @@ namespace OpenSim.Region.ClientStack.Linden
}
AssetBase asset;
asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString());
asset = new AssetBase(assetID, assetName, assType, creatorIDstr);
asset.Data = data;
if (AddNewAsset != null)
AddNewAsset(asset);
@ -913,11 +1014,14 @@ namespace OpenSim.Region.ClientStack.Linden
InventoryItemBase item = new InventoryItemBase();
item.Owner = m_HostCapsObj.AgentID;
item.CreatorId = m_HostCapsObj.AgentID.ToString();
item.CreatorId = creatorIDstr;
item.CreatorData = String.Empty;
item.ID = inventoryItem;
item.AssetID = asset.FullID;
item.Description = assetDescription;
if (istest)
item.Description = "For personal testing only. Other uses are forbiden";
else
item.Description = assetDescription;
item.Name = assetName;
item.AssetType = assType;
item.InvType = inType;
@ -926,17 +1030,53 @@ namespace OpenSim.Region.ClientStack.Linden
// If we set PermissionMask.All then when we rez the item the next permissions will replace the current
// (owner) permissions. This becomes a problem if next permissions are changed.
item.CurrentPermissions
= (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
if (istest)
{
item.CurrentPermissions
= (uint)(PermissionMask.Move | PermissionMask.Modify);
item.BasePermissions = (uint)(PermissionMask.Move | PermissionMask.Modify);
item.EveryOnePermissions = 0;
item.NextPermissions = 0;
}
else
{
item.CurrentPermissions
= (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
item.BasePermissions = (uint)PermissionMask.All;
item.EveryOnePermissions = 0;
item.NextPermissions = (uint)PermissionMask.All;
}
item.BasePermissions = (uint)PermissionMask.All;
item.EveryOnePermissions = 0;
item.NextPermissions = (uint)PermissionMask.All;
item.CreationDate = Util.UnixTimeSinceEpoch();
IClientAPI client = null;
m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
if (AddNewInventoryItem != null)
{
AddNewInventoryItem(m_HostCapsObj.AgentID, item,(uint) cost);
if (istest)
{
AddNewInventoryItem(m_HostCapsObj.AgentID, item, 0);
if (client != null)
client.SendAgentAlertMessage("Upload complete with no cost for personal testing purposes only. Other uses are forbiden", true);
}
else
{
AddNewInventoryItem(m_HostCapsObj.AgentID, item, (uint)cost);
if (client != null)
{
// let users see anything.. i don't so far
string str;
if (cost > 0)
// dont remember where is money unit name to put here
str = "Upload complete. charged " + cost.ToString() + "$";
else
str = "Upload complete";
client.SendAgentAlertMessage(str, true);
}
}
}
lock (m_ModelCost)
@ -1272,11 +1412,17 @@ namespace OpenSim.Region.ClientStack.Linden
private string m_error = String.Empty;
private Timer m_timeoutTimer = new Timer();
private UUID m_texturesFolder;
private int m_nreqtextures;
private int m_nreqmeshs;
private int m_nreqinstances;
private bool m_IsAtestUpload;
public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
UUID parentFolderID, string invType, string assetType, string path,
IHttpServer httpServer, bool dumpAssetsToFile, int totalCost)
IHttpServer httpServer, bool dumpAssetsToFile,
int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
bool IsAtestUpload)
{
m_assetName = assetName;
m_assetDes = description;
@ -1290,6 +1436,12 @@ namespace OpenSim.Region.ClientStack.Linden
m_dumpAssetsToFile = dumpAssetsToFile;
m_cost = totalCost;
m_texturesFolder = texturesFolder;
m_nreqtextures = nreqtextures;
m_nreqmeshs = nreqmeshs;
m_nreqinstances = nreqinstances;
m_IsAtestUpload = IsAtestUpload;
m_timeoutTimer.Elapsed += TimedOut;
m_timeoutTimer.Interval = 120000;
m_timeoutTimer.AutoReset = false;
@ -1332,12 +1484,15 @@ namespace OpenSim.Region.ClientStack.Linden
handlerUpLoad = OnUpLoad;
if (handlerUpLoad != null)
{
handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,m_cost, ref m_error);
handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,
m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload, ref m_error);
}
if(m_error == String.Empty)
{
uploadComplete.new_asset = newAssetID.ToString();
uploadComplete.new_inventory_item = inv;
// if (m_texturesFolder != UUID.Zero)
// uploadComplete.new_texture_folder_id = m_texturesFolder;
uploadComplete.state = "complete";
}
else

View File

@ -96,7 +96,8 @@ namespace OpenSim.Region.ClientStack.Linden
// basicCost input region assets upload cost
// totalcost returns model total upload fee
// meshcostdata returns detailed costs for viewer
public bool MeshModelCost(LLSDAssetResource resources, int basicCost, out int totalcost, LLSDAssetUploadResponseData meshcostdata, out string error)
public bool MeshModelCost(LLSDAssetResource resources, int basicCost, out int totalcost,
LLSDAssetUploadResponseData meshcostdata, out string error, ref string warning)
{
totalcost = 0;
error = string.Empty;
@ -229,10 +230,18 @@ namespace OpenSim.Region.ClientStack.Linden
meshsfee += primCreationCost;
}
if (skipedSmall >0 && skipedSmall > numberInstances / 2)
if (skipedSmall > 0)
{
error = "Model contains too many prims smaller than " + PrimScaleMin.ToString() + "m";
return false;
if (skipedSmall > numberInstances / 2)
{
error = "Model contains too many prims smaller than " + PrimScaleMin.ToString() +
"m minimum allowed size. Please check scalling";
return false;
}
else
warning += skipedSmall.ToString() + " of the requested " +numberInstances.ToString() +
" model prims will not upload because they are smaller than " + PrimScaleMin.ToString() +
"m minimum allowed size. Please check scalling ";
}
if (meshcostdata.physics_cost <= meshcostdata.model_streaming_cost)
@ -403,9 +412,14 @@ namespace OpenSim.Region.ClientStack.Linden
submesh_offset = -1;
if (map.ContainsKey("physics_mesh"))
{
tmpmap = null;
if(map.ContainsKey("physics_mesh"))
tmpmap = (OSDMap)map["physics_mesh"];
else if (map.ContainsKey("physics_shape")) // old naming
tmpmap = (OSDMap)map["physics_shape"];
if(tmpmap != null)
{
if (tmpmap.ContainsKey("offset"))
submesh_offset = tmpmap["offset"].AsInteger() + start;
if (tmpmap.ContainsKey("size"))