/// <summary> /// Ask server for details of cost and impact of the mesh upload /// </summary> /// <param name="callback">Callback that will be invoke upon completion of the upload. Null is sent on request failure</param> public void PrepareUpload(ModelUploadCallback callback) { CapsClient request = null; if (Client.Network.CurrentSim == null || Client.Network.CurrentSim.Caps == null || (request = Client.Network.CurrentSim.Caps.CreateCapsClient("NewFileAgentInventory")) == null) { Logger.Log("Cannot upload mesh, no connection or NewFileAgentInventory not available", Helpers.LogLevel.Warning); callback?.Invoke(null); return; } Images = new List <byte[]>(); ImgIndex = new Dictionary <string, int>(); OSDMap req = new OSDMap { ["name"] = InvName, ["description"] = InvDescription, ["asset_resources"] = AssetResources(false), ["asset_type"] = "mesh", ["inventory_type"] = "object", ["folder_id"] = Client.Inventory.FindFolderForType(AssetType.Object), ["texture_folder_id"] = Client.Inventory.FindFolderForType(AssetType.Texture), ["everyone_mask"] = (int)PermissionMask.All, ["group_mask"] = (int)PermissionMask.All, ["next_owner_mask"] = (int)PermissionMask.All }; request.OnComplete += (client, result, error) => { if (error != null || result == null || result.Type != OSDType.Map) { Logger.Log("Mesh upload request failure", Helpers.LogLevel.Error); callback?.Invoke(null); return; } OSDMap res = (OSDMap)result; if (res["state"] != "upload") { Logger.Log("Mesh upload failure: " + res["message"], Helpers.LogLevel.Error); callback?.Invoke(null); return; } Logger.Log("Response from mesh upload prepare:" + Environment.NewLine + OSDParser.SerializeLLSDNotationFormatted(result), Helpers.LogLevel.Debug); callback?.Invoke(result); }; request.PostRequestAsync(req, OSDFormat.Xml, 3 * 60 * 1000); }
/// <summary> /// Performas actual mesh and image upload /// </summary> /// <param name="uploader">Uri recieved in the upload prepare stage</param> /// <param name="callback">Callback that will be invoke upon completion of the upload. Null is sent on request failure</param> public void PerformUpload(Uri uploader, ModelUploadCallback callback) { CapsClient request = new CapsClient(uploader, "MeshUploader"); request.OnComplete += (client, result, error) => { if (error != null || result == null || result.Type != OSDType.Map) { Logger.Log("Mesh upload request failure", Helpers.LogLevel.Error); callback?.Invoke(null); return; } OSDMap res = (OSDMap)result; Logger.Log("Response from mesh upload perform:\n" + OSDParser.SerializeLLSDNotationFormatted(result), Helpers.LogLevel.Debug); callback?.Invoke(res); }; request.BeginGetResponse(AssetResources(true), OSDFormat.Xml, 60 * 1000); }