diff options
author | Diva Canto | 2010-12-08 18:53:15 -0800 |
---|---|---|
committer | Diva Canto | 2010-12-08 18:53:15 -0800 |
commit | 1070cffcf905f77d694e140d0c9e978f5d0052c0 (patch) | |
tree | 76ae656390dd231d8c221ebff0891fe04782a400 /OpenSim/Framework | |
parent | Added an exception handler on CreateObject handler, just in case there's an e... (diff) | |
download | opensim-SC-1070cffcf905f77d694e140d0c9e978f5d0052c0.zip opensim-SC-1070cffcf905f77d694e140d0c9e978f5d0052c0.tar.gz opensim-SC-1070cffcf905f77d694e140d0c9e978f5d0052c0.tar.bz2 opensim-SC-1070cffcf905f77d694e140d0c9e978f5d0052c0.tar.xz |
Added ability for GetTexture to serve multiple formats. The format may come as an extra query parameter in the URL format=<format> (this was tested and working) or it may come in the Accept header (code added, but not tested). The result of the conversion is placed in the asset cache, under the name <uuid>-<format>.
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r-- | OpenSim/Framework/WebUtil.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index d16f9bf..1c856af 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | ||
29 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
30 | using System.Collections.Specialized; | 31 | using System.Collections.Specialized; |
31 | using System.IO; | 32 | using System.IO; |
@@ -363,5 +364,85 @@ namespace OpenSim.Framework | |||
363 | } | 364 | } |
364 | 365 | ||
365 | #endregion Stream | 366 | #endregion Stream |
367 | |||
368 | public class QBasedComparer : IComparer | ||
369 | { | ||
370 | public int Compare(Object x, Object y) | ||
371 | { | ||
372 | float qx = GetQ(x); | ||
373 | float qy = GetQ(y); | ||
374 | if (qx < qy) | ||
375 | return -1; | ||
376 | if (qx == qy) | ||
377 | return 0; | ||
378 | return 1; | ||
379 | } | ||
380 | |||
381 | private float GetQ(Object o) | ||
382 | { | ||
383 | // Example: image/png;q=0.9 | ||
384 | |||
385 | if (o is String) | ||
386 | { | ||
387 | string mime = (string)o; | ||
388 | string[] parts = mime.Split(new char[] { ';' }); | ||
389 | if (parts.Length > 1) | ||
390 | { | ||
391 | string[] kvp = parts[1].Split(new char[] { '=' }); | ||
392 | if (kvp.Length == 2 && kvp[0] == "q") | ||
393 | { | ||
394 | float qvalue = 1F; | ||
395 | float.TryParse(kvp[1], out qvalue); | ||
396 | return qvalue; | ||
397 | } | ||
398 | } | ||
399 | } | ||
400 | |||
401 | return 1F; | ||
402 | } | ||
403 | } | ||
404 | |||
405 | /// <summary> | ||
406 | /// Takes the value of an Accept header and returns the preferred types | ||
407 | /// ordered by q value (if it exists). | ||
408 | /// Example input: image/jpg;q=0.7, image/png;q=0.8, image/jp2 | ||
409 | /// Exmaple output: ["jp2", "png", "jpg"] | ||
410 | /// NOTE: This doesn't handle the semantics of *'s... | ||
411 | /// </summary> | ||
412 | /// <param name="accept"></param> | ||
413 | /// <returns></returns> | ||
414 | public static string[] GetPreferredImageTypes(string accept) | ||
415 | { | ||
416 | |||
417 | if (accept == null || accept == string.Empty) | ||
418 | return new string[0]; | ||
419 | |||
420 | string[] types = accept.Split(new char[] { ',' }); | ||
421 | if (types.Length > 0) | ||
422 | { | ||
423 | List<string> list = new List<string>(types); | ||
424 | list.RemoveAll(delegate(string s) { return !s.ToLower().StartsWith("image"); }); | ||
425 | ArrayList tlist = new ArrayList(list); | ||
426 | tlist.Sort(new QBasedComparer()); | ||
427 | |||
428 | string[] result = new string[tlist.Count]; | ||
429 | for (int i = 0; i < tlist.Count; i++) | ||
430 | { | ||
431 | string mime = (string)tlist[i]; | ||
432 | string[] parts = mime.Split(new char[] { ';' }); | ||
433 | string[] pair = parts[0].Split(new char[] { '/' }); | ||
434 | if (pair.Length == 2) | ||
435 | result[i] = pair[1].ToLower(); | ||
436 | else // oops, we don't know what this is... | ||
437 | result[i] = pair[0]; | ||
438 | } | ||
439 | |||
440 | return result; | ||
441 | } | ||
442 | |||
443 | return new string[0]; | ||
444 | } | ||
445 | |||
446 | |||
366 | } | 447 | } |
367 | } | 448 | } |