aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/ApplicationPlugins/Rest/Inventory
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/ApplicationPlugins/Rest/Inventory')
-rw-r--r--OpenSim/ApplicationPlugins/Rest/Inventory/RestAssetServices.cs118
1 files changed, 109 insertions, 9 deletions
diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RestAssetServices.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RestAssetServices.cs
index 7a6d4af..dcd209f 100644
--- a/OpenSim/ApplicationPlugins/Rest/Inventory/RestAssetServices.cs
+++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RestAssetServices.cs
@@ -170,6 +170,8 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
170 DoPut(rdata); 170 DoPut(rdata);
171 break; 171 break;
172 case "post" : 172 case "post" :
173 DoPost(rdata);
174 break;
173 case "delete" : 175 case "delete" :
174 default : 176 default :
175 Rest.Log.WarnFormat("{0} Asset: Method not supported: {1}", 177 Rest.Log.WarnFormat("{0} Asset: Method not supported: {1}",
@@ -238,6 +240,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
238 } 240 }
239 241
240 /// <summary> 242 /// <summary>
243 /// UPDATE existing item, if it exists. URI identifies the item in question.
241 /// The only parameter we recognize is a UUID. The enclosed asset data (base-64 encoded) 244 /// The only parameter we recognize is a UUID. The enclosed asset data (base-64 encoded)
242 /// is decoded and stored in the database, identified by the supplied UUID. 245 /// is decoded and stored in the database, identified by the supplied UUID.
243 /// </summary> 246 /// </summary>
@@ -245,10 +248,14 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
245 private void DoPut(AssetRequestData rdata) 248 private void DoPut(AssetRequestData rdata)
246 { 249 {
247 250
251 bool modified = false;
252 bool created = false;
253
248 Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method); 254 Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);
249 255
250 if (rdata.Parameters.Length == 1) 256 if (rdata.Parameters.Length == 1)
251 { 257 {
258
252 rdata.initXmlReader(); 259 rdata.initXmlReader();
253 XmlReader xml = rdata.reader; 260 XmlReader xml = rdata.reader;
254 261
@@ -258,16 +265,29 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
258 rdata.Fail(Rest.HttpStatusCodeBadRequest,"invalid request data"); 265 rdata.Fail(Rest.HttpStatusCodeBadRequest,"invalid request data");
259 } 266 }
260 267
261 AssetBase asset = new AssetBase(); 268 UUID uuid = new UUID(rdata.Parameters[0]);
262 asset.ID = rdata.Parameters[0]; 269 AssetBase asset = Rest.AssetServices.GetAsset(uuid, false);
263 asset.Name = xml.GetAttribute("name"); 270
271 modified = (asset != null);
272 created = !modified;
273
274 asset = new AssetBase();
275 asset.FullID = uuid;
276 asset.Name = xml.GetAttribute("name");
264 asset.Description = xml.GetAttribute("desc"); 277 asset.Description = xml.GetAttribute("desc");
265 asset.Type = SByte.Parse(xml.GetAttribute("type")); 278 asset.Type = SByte.Parse(xml.GetAttribute("type"));
266 asset.Local = Int32.Parse(xml.GetAttribute("local")) != 0; 279 asset.Local = Int32.Parse(xml.GetAttribute("local")) != 0;
267 asset.Temporary = Int32.Parse(xml.GetAttribute("temporary")) != 0; 280 asset.Temporary = Int32.Parse(xml.GetAttribute("temporary")) != 0;
268 asset.Data = Convert.FromBase64String(xml.ReadElementContentAsString("Asset", "")); 281 asset.Data = Convert.FromBase64String(xml.ReadElementContentAsString("Asset", ""));
282
283 if (asset.ID != rdata.Parameters[0])
284 {
285 Rest.Log.WarnFormat("{0} URI and payload disagree on UUID U:{1} vs P:{2}",
286 MsgId, rdata.Parameters[0], asset.ID);
287 }
269 288
270 Rest.AssetServices.AddAsset(asset); 289 Rest.AssetServices.AddAsset(asset);
290
271 } 291 }
272 else 292 else
273 { 293 {
@@ -275,8 +295,88 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
275 rdata.Fail(Rest.HttpStatusCodeNotFound, "invalid parameters"); 295 rdata.Fail(Rest.HttpStatusCodeNotFound, "invalid parameters");
276 } 296 }
277 297
278 rdata.Complete(); 298 if (created)
279 rdata.Respond(String.Format("Asset <{0}>: Normal completion", rdata.method)); 299 {
300 rdata.Complete(Rest.HttpStatusCodeCreated);
301 }
302 else
303 {
304 if (modified)
305 {
306 rdata.Complete(Rest.HttpStatusCodeOK);
307 }
308 else
309 {
310 rdata.Complete(Rest.HttpStatusCodeNoContent);
311 }
312 }
313
314 rdata.Respond(String.Format("Asset {0} : Normal completion", rdata.method));
315
316 }
317
318 /// <summary>
319 /// CREATE new item, replace if it exists. URI identifies the context for the item in question.
320 /// No parameters are required for POST, just thepayload.
321 /// </summary>
322
323 private void DoPost(AssetRequestData rdata)
324 {
325
326 bool modified = false;
327 bool created = false;
328
329 Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);
330
331 if (rdata.Parameters.Length != 0)
332 {
333 Rest.Log.WarnFormat("{0} Parameters ignored <{1}>", MsgId, rdata.path);
334 Rest.Log.InfoFormat("{0} POST of an asset has no parameters", MsgId, rdata.path);
335 }
336
337 rdata.initXmlReader();
338 XmlReader xml = rdata.reader;
339
340 if (!xml.ReadToFollowing("Asset"))
341 {
342 Rest.Log.DebugFormat("{0} Invalid request data: <{1}>", MsgId, rdata.path);
343 rdata.Fail(Rest.HttpStatusCodeBadRequest,"invalid request data");
344 }
345
346 UUID uuid = new UUID(xml.GetAttribute("id"));
347 AssetBase asset = Rest.AssetServices.GetAsset(uuid, false);
348
349 modified = (asset != null);
350 created = !modified;
351
352 asset = new AssetBase();
353 asset.FullID = uuid;
354 asset.Name = xml.GetAttribute("name");
355 asset.Description = xml.GetAttribute("desc");
356 asset.Type = SByte.Parse(xml.GetAttribute("type"));
357 asset.Local = Int32.Parse(xml.GetAttribute("local")) != 0;
358 asset.Temporary = Int32.Parse(xml.GetAttribute("temporary")) != 0;
359 asset.Data = Convert.FromBase64String(xml.ReadElementContentAsString("Asset", ""));
360
361 Rest.AssetServices.AddAsset(asset);
362
363 if (created)
364 {
365 rdata.Complete(Rest.HttpStatusCodeCreated);
366 }
367 else
368 {
369 if (modified)
370 {
371 rdata.Complete(Rest.HttpStatusCodeOK);
372 }
373 else
374 {
375 rdata.Complete(Rest.HttpStatusCodeNoContent);
376 }
377 }
378
379 rdata.Respond(String.Format("Asset {0} : Normal completion", rdata.method));
280 380
281 } 381 }
282 382