* Several new CableBeach messages and fixes

* Adding OpenMetaverse.Messages.CableBeach.CableBeachUtils static class to help convert back and forth between content-type strings, file extensions, and SL asset types
* Split CableBeach service URIs out from AvatarAttributes into AvatarServices

git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2636 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2009-04-20 23:40:28 +00:00
parent 8fed742abc
commit c5b8ccf211
3 changed files with 409 additions and 38 deletions

View File

@@ -28,6 +28,11 @@ using System;
namespace OpenMetaverse.Messages.CableBeach
{
public static class AvatarServices
{
public static readonly Uri INVENTORY_SERVER = new Uri("http://openmetaverse.org/services/inventoryServer");
}
public static class AvatarAttributes
{
public static readonly Uri EMAIL = new Uri("http://axschema.org/contact/email");
@@ -41,9 +46,6 @@ namespace OpenMetaverse.Messages.CableBeach
public static readonly Uri IMAGE = new Uri("http://axschema.org/media/image/default");
public static readonly Uri BIOGRAPHY = new Uri("http://axschema.org/media/biography");
// Service attributes
public static readonly Uri INVENTORY_SERVER = new Uri("http://openmetaverse.org/attributes/inventoryServer");
// OpenSim attributes
public static readonly Uri DEFAULT_INVENTORY = new Uri("http://opensimulator.org/attributes/defaultInventory");
public static readonly Uri IMAGE_ID = new Uri("http://opensimulator.org/attributes/imageID");

View File

@@ -32,12 +32,75 @@ using OpenMetaverse.Interfaces;
namespace OpenMetaverse.Messages.CableBeach
{
/// <summary>
/// Holds information about a grid region
/// </summary>
public struct RegionInfo
{
public string Name;
public UUID ID;
public ulong Handle;
public bool Online;
public IPEndPoint IPAndPort;
public Uri HttpServer;
public UUID MapTextureID;
public Uri Owner;
public RegionFlags Flags;
public int AgentCount;
public Dictionary<string, Uri> Capabilities;
public float WaterHeight;
public Vector3 DefaultPosition;
public Vector3 DefaultLookAt;
public uint X
{
get
{
uint x, y;
OpenMetaverse.Utils.LongToUInts(Handle, out x, out y);
return x / 256;
}
set
{
uint x, y;
OpenMetaverse.Utils.LongToUInts(Handle, out x, out y);
Handle = OpenMetaverse.Utils.UIntsToLong(value, y);
}
}
public uint Y
{
get
{
uint x, y;
OpenMetaverse.Utils.LongToUInts(Handle, out x, out y);
return y / 256;
}
set
{
uint x, y;
OpenMetaverse.Utils.LongToUInts(Handle, out x, out y);
Handle = OpenMetaverse.Utils.UIntsToLong(x, value);
}
}
public override string ToString()
{
if (Online)
return Name + " [Online]";
else
return "[Offline]";
}
}
#region Identity Messages
public class RequestCapabilitiesMessage : IMessage
{
public Uri Identity;
public Uri[] Capabilities;
public string[] Capabilities;
public OSDMap Serialize()
{
@@ -46,7 +109,7 @@ namespace OpenMetaverse.Messages.CableBeach
OSDArray array = new OSDArray(Capabilities.Length);
for (int i = 0; i < Capabilities.Length; i++)
array.Add(OSD.FromUri(Capabilities[i]));
array.Add(OSD.FromString(Capabilities[i]));
map["capabilities"] = array;
return map;
@@ -57,22 +120,22 @@ namespace OpenMetaverse.Messages.CableBeach
Identity = map["identity"].AsUri();
OSDArray array = (OSDArray)map["capabilities"];
Capabilities = new Uri[array.Count];
Capabilities = new string[array.Count];
for (int i = 0; i < array.Count; i++)
Capabilities[i] = array[i].AsUri();
Capabilities[i] = array[i].AsString();
}
}
public class RequestCapabilitiesReplyMessage : IMessage
{
public Dictionary<Uri, Uri> Capabilities;
public Dictionary<string, Uri> Capabilities;
public OSDMap Serialize()
{
OSDMap map = new OSDMap(1);
OSDMap caps = new OSDMap(Capabilities.Count);
foreach (KeyValuePair<Uri, Uri> entry in Capabilities)
caps.Add(entry.Key.ToString(), OSD.FromUri(entry.Value));
foreach (KeyValuePair<string, Uri> entry in Capabilities)
caps.Add(entry.Key, OSD.FromUri(entry.Value));
map["capabilities"] = caps;
return map;
}
@@ -80,9 +143,9 @@ namespace OpenMetaverse.Messages.CableBeach
public void Deserialize(OSDMap map)
{
OSDMap caps = (OSDMap)map["capabilities"];
Capabilities = new Dictionary<Uri, Uri>(caps.Count);
Capabilities = new Dictionary<string, Uri>(caps.Count);
foreach (KeyValuePair<string, OSD> entry in caps)
Capabilities.Add(new Uri(entry.Key), entry.Value.AsUri());
Capabilities.Add(entry.Key, entry.Value.AsUri());
}
}
@@ -93,14 +156,12 @@ namespace OpenMetaverse.Messages.CableBeach
public class CreateInventoryMessage : IMessage
{
public Uri Identity;
public UUID AccessToken;
public string Name;
public OSDMap Serialize()
{
OSDMap map = new OSDMap(3);
OSDMap map = new OSDMap();
map["identity"] = OSD.FromUri(Identity);
map["access_token"] = OSD.FromUUID(AccessToken);
map["name"] = OSD.FromString(Name);
return map;
}
@@ -108,7 +169,6 @@ namespace OpenMetaverse.Messages.CableBeach
public void Deserialize(OSDMap map)
{
Identity = map["identity"].AsUri();
AccessToken = map["access_token"].AsUUID();
Name = map["name"].AsString();
}
}
@@ -130,19 +190,145 @@ namespace OpenMetaverse.Messages.CableBeach
}
}
public class GetInventorySkeletonMessage : IMessage
{
public Uri Identity;
public OSDMap Serialize()
{
OSDMap map = new OSDMap();
map["identity"] = OSD.FromUri(Identity);
return map;
}
public void Deserialize(OSDMap map)
{
Identity = map["identity"].AsUri();
}
}
public class GetInventorySkeletonReplyMessage : IMessage
{
public class Folder
{
public string Name;
public UUID ParentID;
public int Version;
public string PreferredContentType;
public UUID FolderID;
}
public Folder[] Folders;
public OSDMap Serialize()
{
OSDMap map = new OSDMap();
OSDArray folders = new OSDArray(Folders.Length);
for (int i = 0; i < Folders.Length; i++)
{
Folder folder = Folders[i];
OSDMap folderMap = new OSDMap();
folderMap["name"] = OSD.FromString(folder.Name);
folderMap["parent_id"] = OSD.FromUUID(folder.ParentID);
folderMap["version"] = OSD.FromInteger(folder.Version);
folderMap["preferred_content_type"] = OSD.FromString(folder.PreferredContentType);
folderMap["folder_id"] = OSD.FromUUID(folder.FolderID);
folders.Add(folderMap);
}
map["folders"] = folders;
return map;
}
public void Deserialize(OSDMap map)
{
OSDArray folders = (OSDArray)map["folders"];
Folders = new Folder[folders.Count];
for (int i = 0; i < folders.Count; i++)
{
OSDMap folderMap = (OSDMap)folders[i];
Folder folder = new Folder();
folder.Name = folderMap["name"].AsString();
folder.ParentID = folderMap["parent_id"].AsUUID();
folder.Version = folderMap["version"].AsInteger();
folder.PreferredContentType = folderMap["preferred_content_type"].AsString();
folder.FolderID = folderMap["folder_id"].AsUUID();
Folders[i] = folder;
}
}
}
public class GetActiveGesturesMessage : IMessage
{
public Uri Identity;
public OSDMap Serialize()
{
OSDMap map = new OSDMap();
map["identity"] = OSD.FromUri(Identity);
return map;
}
public void Deserialize(OSDMap map)
{
Identity = map["identity"].AsUri();
}
}
public class GetActiveGesturesReplyMessage : IMessage
{
public class Gesture
{
public UUID ItemID;
public UUID AssetID;
}
public Gesture[] Gestures;
public OSDMap Serialize()
{
OSDMap map = new OSDMap();
OSDArray gestures = new OSDArray();
for (int i = 0; i < Gestures.Length; i++)
{
Gesture gesture = Gestures[i];
OSDMap gestureMap = new OSDMap();
gestureMap["item_id"] = OSD.FromUUID(gesture.ItemID);
gestureMap["asset_id"] = OSD.FromUUID(gesture.AssetID);
gestures.Add(gestureMap);
}
map["gestures"] = gestures;
return map;
}
public void Deserialize(OSDMap map)
{
OSDArray gestures = (OSDArray)map["gestures"];
Gestures = new Gesture[gestures.Count];
for (int i = 0; i < gestures.Count; i++)
{
OSDMap gestureMap = (OSDMap)gestures[i];
Gesture gesture = new Gesture();
gesture.ItemID = gestureMap["item_id"].AsUUID();
gesture.AssetID = gestureMap["asset_id"].AsUUID();
Gestures[i] = gesture;
}
}
}
#endregion Inventory Messages
#region Region Messages
public class EnableClientMessage : IMessage
{
public class Service
{
public Uri Type;
public Uri Uri;
public UUID AccessToken;
}
public UUID AgentID;
public UUID SessionID;
public UUID SecureSessionID;
@@ -152,7 +338,7 @@ namespace OpenMetaverse.Messages.CableBeach
public IPAddress IP;
public string ClientVersion;
public Dictionary<Uri, OSD> Attributes;
public Dictionary<Uri, Service> Services;
public Dictionary<Uri, Dictionary<string, Uri>> Services;
public Uri CallbackUri;
public OSDMap Serialize()
@@ -173,13 +359,12 @@ namespace OpenMetaverse.Messages.CableBeach
map["attributes"] = attributes;
OSDMap services = new OSDMap(Services.Count);
foreach (KeyValuePair<Uri, Service> entry in Services)
foreach (KeyValuePair<Uri, Dictionary<string, Uri>> serviceEntry in Services)
{
OSDMap service = new OSDMap(3);
service["type"] = OSD.FromUri(entry.Value.Type);
service["uri"] = OSD.FromUri(entry.Value.Uri);
service["access_token"] = OSD.FromUUID(entry.Value.AccessToken);
services.Add(entry.Key.ToString(), service);
OSDMap service = new OSDMap();
foreach (KeyValuePair<string, Uri> entry in serviceEntry.Value)
service.Add(entry.Key, OSD.FromUri(entry.Value));
services.Add(serviceEntry.Key.ToString(), service);
}
map["services"] = services;
@@ -204,15 +389,14 @@ namespace OpenMetaverse.Messages.CableBeach
Attributes.Add(new Uri(entry.Key), entry.Value);
OSDMap servicesMap = (OSDMap)map["services"];
Services = new Dictionary<Uri, Service>(servicesMap.Count);
foreach (KeyValuePair<string, OSD> entry in servicesMap)
Services = new Dictionary<Uri, Dictionary<string, Uri>>(servicesMap.Count);
foreach (KeyValuePair<string, OSD> serviceEntry in servicesMap)
{
OSDMap serviceMap = (OSDMap)entry.Value;
Service service = new Service();
service.Type = serviceMap["type"].AsUri();
service.Uri = serviceMap["uri"].AsUri();
service.AccessToken = serviceMap["access_token"].AsUUID();
Services.Add(new Uri(entry.Key), service);
OSDMap serviceMap = (OSDMap)serviceEntry.Value;
Dictionary<string, Uri> service = new Dictionary<string, Uri>(serviceMap.Count);
foreach (KeyValuePair<string, OSD> entry in serviceMap)
service.Add(entry.Key, entry.Value.AsUri());
Services.Add(new Uri(serviceEntry.Key), service);
}
CallbackUri = map["callback_uri"].AsUri();

View File

@@ -0,0 +1,185 @@
using System;
namespace OpenMetaverse.Messages.CableBeach
{
public static class CableBeachUtils
{
#region SL / file extension / content-type conversions
public static string SLAssetTypeToContentType(int assetType)
{
switch (assetType)
{
case 0:
return "image/jp2";
case 1:
return "application/ogg";
case 2:
return "application/x-metaverse-callingcard";
case 3:
return "application/x-metaverse-landmark";
case 5:
return "application/x-metaverse-clothing";
case 6:
return "application/x-metaverse-primitive";
case 7:
return "application/x-metaverse-notecard";
case 8:
return "application/x-metaverse-folder";
case 10:
return "application/x-metaverse-lsl";
case 11:
return "application/x-metaverse-lso";
case 12:
return "image/tga";
case 13:
return "application/x-metaverse-bodypart";
case 17:
return "audio/x-wav";
case 19:
return "image/jpeg";
case 20:
return "application/x-metaverse-animation";
case 21:
return "application/x-metaverse-gesture";
case 22:
return "application/x-metaverse-simstate";
default:
return "application/octet-stream";
}
}
public static int ContentTypeToSLAssetType(string contentType)
{
switch (contentType)
{
case "image/jp2":
return 0;
case "application/ogg":
return 1;
case "application/x-metaverse-callingcard":
return 2;
case "application/x-metaverse-landmark":
return 3;
case "application/x-metaverse-clothing":
return 5;
case "application/x-metaverse-primitive":
return 6;
case "application/x-metaverse-notecard":
return 7;
case "application/x-metaverse-lsl":
return 10;
case "application/x-metaverse-lso":
return 11;
case "image/tga":
return 12;
case "application/x-metaverse-bodypart":
return 13;
case "audio/x-wav":
return 17;
case "image/jpeg":
return 19;
case "application/x-metaverse-animation":
return 20;
case "application/x-metaverse-gesture":
return 21;
case "application/x-metaverse-simstate":
return 22;
default:
return -1;
}
}
public static string ContentTypeToExtension(string contentType)
{
switch (contentType)
{
case "image/jp2":
return "texture";
case "application/ogg":
return "ogg";
case "application/x-metaverse-callingcard":
return "callingcard";
case "application/x-metaverse-landmark":
return "landmark";
case "application/x-metaverse-clothing":
return "clothing";
case "application/x-metaverse-primitive":
return "primitive";
case "application/x-metaverse-notecard":
return "notecard";
case "application/x-metaverse-lsl":
return "lsl";
case "application/x-metaverse-lso":
return "lso";
case "image/tga":
return "tga";
case "application/x-metaverse-bodypart":
return "bodypart";
case "audio/x-wav":
return "wav";
case "image/jpeg":
return "jpg";
case "application/x-metaverse-animation":
return "animation";
case "application/x-metaverse-gesture":
return "gesture";
case "application/x-metaverse-simstate":
return "simstate";
default:
return "bin";
}
}
public static string ExtensionToContentType(string extension)
{
switch (extension)
{
case "texture":
case "jp2":
case "j2c":
return "image/jp2";
case "sound":
case "ogg":
return "application/ogg";
case "callingcard":
return "application/x-metaverse-callingcard";
case "landmark":
return "application/x-metaverse-landmark";
case "clothing":
return "application/x-metaverse-clothing";
case "primitive":
return "application/x-metaverse-primitive";
case "notecard":
return "application/x-metaverse-notecard";
case "lsl":
return "application/x-metaverse-lsl";
case "lso":
return "application/x-metaverse-lso";
case "tga":
return "image/tga";
case "bodypart":
return "application/x-metaverse-bodypart";
case "wav":
return "audio/x-wav";
case "jpg":
case "jpeg":
return "image/jpeg";
case "animation":
return "application/x-metaverse-animation";
case "gesture":
return "application/x-metaverse-gesture";
case "simstate":
return "application/x-metaverse-simstate";
case "txt":
return "text/plain";
case "xml":
return "application/xml";
default:
return "application/octet-stream";
}
}
#endregion SL / file extension / content-type conversions
}
}