diff options
Diffstat (limited to 'OpenSim/Framework/EstateSettings.cs')
-rw-r--r-- | OpenSim/Framework/EstateSettings.cs | 101 |
1 files changed, 95 insertions, 6 deletions
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index dd3e195..328fca4 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs | |||
@@ -418,17 +418,106 @@ namespace OpenSim.Framework | |||
418 | Dictionary<string, object> map = new Dictionary<string, object>(); | 418 | Dictionary<string, object> map = new Dictionary<string, object>(); |
419 | PropertyInfo[] properties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); | 419 | PropertyInfo[] properties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); |
420 | foreach (PropertyInfo p in properties) | 420 | foreach (PropertyInfo p in properties) |
421 | map[p.Name] = p.GetValue(this, null); | 421 | { |
422 | 422 | // EstateBans is a complex type, let's treat it as special | |
423 | if (p.Name == "EstateBans") | ||
424 | continue; | ||
425 | |||
426 | object value = p.GetValue(this, null); | ||
427 | if (value != null) | ||
428 | { | ||
429 | if (p.PropertyType.IsArray) // of UUIDs | ||
430 | { | ||
431 | if (((Array)value).Length > 0) | ||
432 | { | ||
433 | string[] args = new string[((Array)value).Length]; | ||
434 | int index = 0; | ||
435 | foreach (object o in (Array)value) | ||
436 | args[index++] = o.ToString(); | ||
437 | map[p.Name] = String.Join(",", args); | ||
438 | } | ||
439 | } | ||
440 | else // simple types | ||
441 | map[p.Name] = value; | ||
442 | } | ||
443 | } | ||
444 | |||
445 | // EstateBans are special | ||
446 | Dictionary<string, object> bans = new Dictionary<string, object>(); | ||
447 | int i = 0; | ||
448 | foreach (EstateBan ban in EstateBans) | ||
449 | bans["ban" + i++] = ban.ToMap(); | ||
450 | map["EstateBans"] = bans; | ||
423 | return map; | 451 | return map; |
424 | } | 452 | } |
425 | 453 | ||
426 | public EstateSettings(Dictionary<string, object> map) | 454 | /// <summary> |
455 | /// For debugging | ||
456 | /// </summary> | ||
457 | /// <returns></returns> | ||
458 | public override string ToString() | ||
427 | { | 459 | { |
428 | PropertyInfo[] properties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); | 460 | Dictionary<string, object> map = ToMap(); |
429 | foreach (PropertyInfo p in properties) | 461 | String result = String.Empty; |
430 | p.SetValue(this, map[p.Name], null); | 462 | |
463 | foreach (KeyValuePair<string, object> kvp in map) | ||
464 | { | ||
465 | if (kvp.Key == "EstateBans") | ||
466 | { | ||
467 | result += "EstateBans:" + Environment.NewLine; | ||
468 | foreach (KeyValuePair<string, object> ban in (Dictionary<string, object>)kvp.Value) | ||
469 | result += ban.Value.ToString(); | ||
470 | } | ||
471 | else | ||
472 | result += string.Format("{0}: {1} {2}", kvp.Key, kvp.Value.ToString(), Environment.NewLine); | ||
473 | } | ||
431 | 474 | ||
475 | return result; | ||
476 | } | ||
477 | |||
478 | public EstateSettings(Dictionary<string, object> map) | ||
479 | { | ||
480 | foreach (KeyValuePair<string, object> kvp in map) | ||
481 | { | ||
482 | PropertyInfo p = this.GetType().GetProperty(kvp.Key, BindingFlags.Public | BindingFlags.Instance); | ||
483 | if (p == null) | ||
484 | continue; | ||
485 | |||
486 | // EstateBans is a complex type, let's treat it as special | ||
487 | if (p.Name == "EstateBans") | ||
488 | continue; | ||
489 | |||
490 | if (p.PropertyType.IsArray) | ||
491 | { | ||
492 | string[] elements = ((string)map[p.Name]).Split(new char[] { ',' }); | ||
493 | UUID[] uuids = new UUID[elements.Length]; | ||
494 | int i = 0; | ||
495 | foreach (string e in elements) | ||
496 | uuids[i++] = new UUID(e); | ||
497 | p.SetValue(this, uuids, null); | ||
498 | } | ||
499 | else | ||
500 | { | ||
501 | object value = p.GetValue(this, null); | ||
502 | if (value is String) | ||
503 | p.SetValue(this, map[p.Name], null); | ||
504 | else if (value is UInt32) | ||
505 | p.SetValue(this, UInt32.Parse((string)map[p.Name]), null); | ||
506 | else if (value is Boolean) | ||
507 | p.SetValue(this, Boolean.Parse((string)map[p.Name]), null); | ||
508 | else if (value is UUID) | ||
509 | p.SetValue(this, UUID.Parse((string)map[p.Name]), null); | ||
510 | } | ||
511 | } | ||
512 | |||
513 | // EstateBans are special | ||
514 | var banData = ((Dictionary<string, object>)map["EstateBans"]).Values; | ||
515 | EstateBan[] bans = new EstateBan[banData.Count]; | ||
516 | int b = 0; | ||
517 | foreach (Dictionary<string, object> ban in banData) | ||
518 | bans[b++] = new EstateBan(ban); | ||
519 | PropertyInfo bansProperty = this.GetType().GetProperty("EstateBans", BindingFlags.Public | BindingFlags.Instance); | ||
520 | bansProperty.SetValue(this, bans, null); | ||
432 | } | 521 | } |
433 | } | 522 | } |
434 | } | 523 | } |