diff --git a/ExtensionLoader/ExtensionLoader.cs b/ExtensionLoader/ExtensionLoader.cs index 7bc2be05..b00502e2 100644 --- a/ExtensionLoader/ExtensionLoader.cs +++ b/ExtensionLoader/ExtensionLoader.cs @@ -25,15 +25,16 @@ namespace ExtensionLoader public static class ExtensionLoader { /// Currently loaded extensions - public static List Extensions; + public static List> Extensions; + /// - public static CodeDomProvider CSCompiler; + static CodeDomProvider CSCompiler; /// - public static CompilerParameters CSCompilerParams; + static CompilerParameters CSCompilerParams; static ExtensionLoader() { - Extensions = new List(); + Extensions = new List>(); CSCompiler = CodeDomProvider.CreateProvider("C#"); @@ -63,11 +64,11 @@ namespace ExtensionLoader /// source code files, for example MyApp.Extension.*.cs /// The object containing the /// assignable interfaces - /// A list of interface types and - /// interface references to assign extensions to + /// A list of interface references + /// to assign extensions to public static void LoadAllExtensions(Assembly assembly, string path, TOwner owner, List referencedAssemblies, string assemblySearchPattern, string sourceSearchPattern, - object assignablesParent, Dictionary assignableInterfaces) + object assignablesParent, List assignableInterfaces) { // Add referenced assemblies to the C# compiler CSCompilerParams.ReferencedAssemblies.Clear(); @@ -78,12 +79,12 @@ namespace ExtensionLoader } // Load internal extensions - LoadAssemblyExtensions(assembly, owner); + LoadAssemblyExtensions(assembly); // Load extensions from external assemblies List extensionNames = ListExtensionAssemblies(path, assemblySearchPattern); foreach (string name in extensionNames) - LoadAssemblyExtensions(Assembly.LoadFile(name), owner); + LoadAssemblyExtensions(Assembly.LoadFile(name)); // Load extensions from external code files extensionNames = ListExtensionSourceFiles(path, sourceSearchPattern); @@ -91,7 +92,7 @@ namespace ExtensionLoader { CompilerResults results = CSCompiler.CompileAssemblyFromFile(CSCompilerParams, name); if (results.Errors.Count == 0) - LoadAssemblyExtensions(results.CompiledAssembly, owner); + LoadAssemblyExtensions(results.CompiledAssembly); else throw new ExtensionException("Error(s) compiling " + name); } @@ -99,14 +100,13 @@ namespace ExtensionLoader if (assignableInterfaces != null) { // Assign extensions to interfaces - foreach (KeyValuePair kvp in assignableInterfaces) + foreach (FieldInfo assignable in assignableInterfaces) { - Type type = kvp.Key; - FieldInfo assignable = kvp.Value; + Type type = assignable.FieldType; for (int i = 0; i < Extensions.Count; i++) { - IExtension extension = Extensions[i]; + IExtension extension = Extensions[i]; if (extension.GetType().GetInterface(type.Name) != null) assignable.SetValue(assignablesParent, extension); @@ -114,10 +114,10 @@ namespace ExtensionLoader } // Check for unassigned interfaces - foreach (KeyValuePair kvp in assignableInterfaces) + foreach (FieldInfo assignable in assignableInterfaces) { - if (kvp.Value.GetValue(assignablesParent) == null) - throw new ExtensionException("Unassigned interface " + kvp.Key.Name); + if (assignable.GetValue(assignablesParent) == null) + throw new ExtensionException("Unassigned interface " + assignable.FieldType.Name); } } } @@ -165,18 +165,19 @@ namespace ExtensionLoader return plugins; } - public static void LoadAssemblyExtensions(Assembly assembly, TOwner owner) + public static void LoadAssemblyExtensions(Assembly assembly) { - Type[] constructorParams = new Type[] { typeof(TOwner) }; + Type[] constructorParams = new Type[] { }; + object[] parameters = new object[] { }; foreach (Type t in assembly.GetTypes()) { try { - if (t.GetInterface("IExtension") != null) + if (t.GetInterface(typeof(IExtension).Name) != null) { ConstructorInfo info = t.GetConstructor(constructorParams); - IExtension extension = (IExtension)info.Invoke(new object[] { owner }); + IExtension extension = (IExtension)info.Invoke(parameters); Extensions.Add(extension); } } @@ -187,5 +188,27 @@ namespace ExtensionLoader } } } + + public static FieldInfo GetInterface(Type ownerType, string memberName) + { + FieldInfo fieldInfo = ownerType.GetField(memberName); + if (fieldInfo.FieldType.IsInterface) + return fieldInfo; + else + return null; + } + + public static List GetInterfaces(object ownerObject) + { + List interfaces = new List(); + + foreach (FieldInfo field in ownerObject.GetType().GetFields()) + { + if (field.FieldType.IsInterface) + interfaces.Add(field); + } + + return interfaces; + } } } diff --git a/ExtensionLoader/IExtension.cs b/ExtensionLoader/IExtension.cs index fa509e61..3ed105b4 100644 --- a/ExtensionLoader/IExtension.cs +++ b/ExtensionLoader/IExtension.cs @@ -5,12 +5,12 @@ namespace ExtensionLoader /// /// Abstract base for extensions /// - public interface IExtension + public interface IExtension { /// /// Called when the extension is starting /// - void Start(); + void Start(TOwner owner); /// /// Called when the extension is stopping diff --git a/OpenMetaverse/Capabilities/HttpRequestSignature.cs b/OpenMetaverse/Capabilities/HttpRequestSignature.cs index 3214a60a..f96a44b6 100644 --- a/OpenMetaverse/Capabilities/HttpRequestSignature.cs +++ b/OpenMetaverse/Capabilities/HttpRequestSignature.cs @@ -40,7 +40,6 @@ namespace OpenMetaverse.Capabilities private string method; private string contentType; private string path; - private bool pathIsWildcard; public string Method { @@ -65,68 +64,55 @@ namespace OpenMetaverse.Capabilities get { return path; } set { - pathIsWildcard = false; - - if (!String.IsNullOrEmpty(value)) - { - // Regex to tear apart URLs, used to extract just a URL - // path from any data we're given - string regexPattern = - @"^(?(?[^:/\?#]+):)?(?" - + @"//(?[^/\?#]*))?(?[^\?#]*)" - + @"(?\?(?[^#]*))?" - + @"(?#(?.*))?"; - Regex re = new Regex(regexPattern, RegexOptions.ExplicitCapture); - Match m = re.Match(value); - string newPath = m.Groups["p0"].Value.ToLower(); - - // Remove any trailing forward-slashes - if (newPath.EndsWith("/")) - newPath = newPath.Substring(0, newPath.Length - 1); - - // Check if this path contains a wildcard. If so, convert it to a regular expression - if (newPath.Contains("*")) - { - pathIsWildcard = true; - newPath = String.Format("^{0}$", newPath.Replace("\\*", ".*")); - } - - path = newPath; - } - else - { - path = String.Empty; - } + if (!String.IsNullOrEmpty(value)) path = value.ToLower(); + else path = String.Empty; } } - public bool PathIsWildcard - { - get { return pathIsWildcard; } - } public HttpRequestSignature(HttpListenerContext context) { method = contentType = path = String.Empty; - pathIsWildcard = false; Method = context.Request.HttpMethod; ContentType = context.Request.ContentType; Path = context.Request.RawUrl; } + /// + /// Test if two HTTP request signatures contain exactly the same data + /// + /// Signature to test against + /// True if the contents of both signatures are identical, + /// otherwise false public bool ExactlyEquals(HttpRequestSignature signature) { return (method.Equals(signature.Method) && contentType.Equals(signature.ContentType) && path.Equals(signature.Path)); } + /// + /// Does pattern matching to determine if an incoming HTTP request + /// matches a given pattern. Equals can only be called on an incoming + /// request; the pattern to match against is the parameter + /// + /// The pattern to test against this request + /// True if the request matches the given pattern, otherwise + /// false public override bool Equals(object obj) { return (obj is HttpRequestSignature) ? this == (HttpRequestSignature)obj : false; } - public bool Equals(HttpRequestSignature signature) + /// + /// Does pattern matching to determine if an incoming HTTP request + /// matches a given pattern. Equals can only be called on an incoming + /// request; the pattern to match against is the parameter + /// + /// The pattern to test against this request + /// True if the request matches the given pattern, otherwise + /// false + public bool Equals(HttpRequestSignature pattern) { - return (this == signature); + return (this == pattern); } public override int GetHashCode() @@ -137,36 +123,41 @@ namespace OpenMetaverse.Capabilities return hash; } - public static bool operator ==(HttpRequestSignature lhs, HttpRequestSignature rhs) + /// + /// Does pattern matching to determine if an incoming HTTP request + /// matches a given pattern. The incoming request must be on the + /// left-hand side, and the pattern to match against must be on the + /// right-hand side + /// + /// The incoming HTTP request signature + /// The pattern to test against the incoming request + /// True if the request matches the given pattern, otherwise + /// false + public static bool operator ==(HttpRequestSignature request, HttpRequestSignature pattern) { - bool methodMatch = (String.IsNullOrEmpty(lhs.Method) || String.IsNullOrEmpty(rhs.Method) || lhs.Method.Equals(rhs.Method)); - bool contentTypeMatch = (String.IsNullOrEmpty(lhs.ContentType) || String.IsNullOrEmpty(rhs.ContentType) || lhs.ContentType.Equals(rhs.ContentType)); - bool pathMatch = false; + bool methodMatch = (String.IsNullOrEmpty(pattern.Method) || request.Method.Equals(pattern.Method)); + bool contentTypeMatch = (String.IsNullOrEmpty(pattern.ContentType) || request.ContentType.Equals(pattern.ContentType)); + bool pathMatch = true; - if (methodMatch && contentTypeMatch) - { - if (!String.IsNullOrEmpty(lhs.Path) && !String.IsNullOrEmpty(rhs.Path)) - { - // Do wildcard matching if there is any to be done - if (lhs.PathIsWildcard) - pathMatch = Regex.IsMatch(rhs.Path, lhs.Path); - else if (rhs.PathIsWildcard) - pathMatch = Regex.IsMatch(lhs.Path, rhs.Path); - else - pathMatch = lhs.Path.Equals(rhs.Path); - } - else - { - pathMatch = true; - } - } + if (methodMatch && contentTypeMatch && !String.IsNullOrEmpty(pattern.Path)) + pathMatch = Regex.IsMatch(request.Path, pattern.Path, RegexOptions.IgnoreCase); return (methodMatch && contentTypeMatch && pathMatch); } - public static bool operator !=(HttpRequestSignature lhs, HttpRequestSignature rhs) + /// + /// Does pattern matching to determine if an incoming HTTP request + /// matches a given pattern. The incoming request must be on the + /// left-hand side, and the pattern to match against must be on the + /// right-hand side + /// + /// The incoming HTTP request signature + /// The pattern to test against the incoming request + /// True if the request does not match the given pattern, otherwise + /// false + public static bool operator !=(HttpRequestSignature request, HttpRequestSignature pattern) { - return !(lhs == rhs); + return !(request == pattern); } } } diff --git a/OpenMetaverse/Capabilities/HttpServer.cs b/OpenMetaverse/Capabilities/HttpServer.cs index a630c4c2..910c9c71 100644 --- a/OpenMetaverse/Capabilities/HttpServer.cs +++ b/OpenMetaverse/Capabilities/HttpServer.cs @@ -86,6 +86,14 @@ namespace OpenMetaverse.Capabilities isRunning = false; } + public void AddHandler(string method, string path, HttpRequestCallback callback) + { + HttpRequestSignature signature = new HttpRequestSignature(); + signature.Method = method; + signature.Path = path; + AddHandler(new HttpRequestHandler(signature, callback)); + } + public void AddHandler(HttpRequestHandler handler) { if (!isRunning) @@ -148,7 +156,7 @@ namespace OpenMetaverse.Capabilities { HttpRequestHandler handler = requestHandlers[i]; - if (handler.Signature == signature) + if (signature == handler.Signature) { // Request signature matched, handle it try diff --git a/Programs/Simian/Extensions/AccountManager.cs b/Programs/Simian/Extensions/AccountManager.cs index f79e9577..a8b238d9 100644 --- a/Programs/Simian/Extensions/AccountManager.cs +++ b/Programs/Simian/Extensions/AccountManager.cs @@ -6,18 +6,18 @@ using OpenMetaverse.StructuredData; namespace Simian.Extensions { - public class AccountManager : IExtension, IAccountProvider, IPersistable + public class AccountManager : IExtension, IAccountProvider, IPersistable { Simian server; DoubleDictionary accounts = new DoubleDictionary(); - public AccountManager(Simian server) + public AccountManager() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; } public void Stop() diff --git a/Programs/Simian/Extensions/AssetManager.cs b/Programs/Simian/Extensions/AssetManager.cs index 5fdeb25e..cd23eb5e 100644 --- a/Programs/Simian/Extensions/AssetManager.cs +++ b/Programs/Simian/Extensions/AssetManager.cs @@ -8,28 +8,29 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class AssetManager : IExtension, IAssetProvider + public class AssetManager : IExtension, IAssetProvider { public const string UPLOAD_DIR = "uploadedAssets"; - Simian Server; + Simian server; Dictionary AssetStore = new Dictionary(); Dictionary CurrentUploads = new Dictionary(); string UploadDir; - public AssetManager(Simian server) + public AssetManager() { - Server = server; } - public void Start() + public void Start(Simian server) { - UploadDir = Path.Combine(Server.DataDir, UPLOAD_DIR); + this.server = server; + + UploadDir = Path.Combine(server.DataDir, UPLOAD_DIR); // Try to create the data directories if they don't already exist - if (!Directory.Exists(Server.DataDir)) + if (!Directory.Exists(server.DataDir)) { - try { Directory.CreateDirectory(Server.DataDir); } + try { Directory.CreateDirectory(server.DataDir); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Warning, ex); } } if (!Directory.Exists(UploadDir)) @@ -38,13 +39,13 @@ namespace Simian.Extensions catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Warning, ex); } } - LoadAssets(Server.DataDir); + LoadAssets(server.DataDir); LoadAssets(UploadDir); - Server.UDP.RegisterPacketCallback(PacketType.AssetUploadRequest, new PacketCallback(AssetUploadRequestHandler)); - Server.UDP.RegisterPacketCallback(PacketType.SendXferPacket, new PacketCallback(SendXferPacketHandler)); - Server.UDP.RegisterPacketCallback(PacketType.AbortXfer, new PacketCallback(AbortXferHandler)); - Server.UDP.RegisterPacketCallback(PacketType.TransferRequest, new PacketCallback(TransferRequestHandler)); + server.UDP.RegisterPacketCallback(PacketType.AssetUploadRequest, new PacketCallback(AssetUploadRequestHandler)); + server.UDP.RegisterPacketCallback(PacketType.SendXferPacket, new PacketCallback(SendXferPacketHandler)); + server.UDP.RegisterPacketCallback(PacketType.AbortXfer, new PacketCallback(AbortXferHandler)); + server.UDP.RegisterPacketCallback(PacketType.TransferRequest, new PacketCallback(TransferRequestHandler)); } public void Stop() @@ -122,7 +123,7 @@ namespace Simian.Extensions complete.AssetBlock.Success = true; complete.AssetBlock.Type = request.AssetBlock.Type; complete.AssetBlock.UUID = assetID; - Server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Inventory); } else { @@ -151,7 +152,7 @@ namespace Simian.Extensions lock (CurrentUploads) CurrentUploads[xfer.XferID.ID] = asset; - Server.UDP.SendPacket(agent.AgentID, xfer, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, xfer, PacketCategory.Inventory); } } @@ -180,7 +181,7 @@ namespace Simian.Extensions ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket(); confirm.XferID.ID = xfer.XferID.ID; confirm.XferID.Packet = xfer.XferID.Packet; - Server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); } else { @@ -191,7 +192,7 @@ namespace Simian.Extensions ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket(); confirm.XferID.ID = xfer.XferID.ID; confirm.XferID.Packet = xfer.XferID.Packet; - Server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); if ((xfer.XferID.Packet & (uint)0x80000000) != 0) { @@ -207,7 +208,7 @@ namespace Simian.Extensions complete.AssetBlock.Success = true; complete.AssetBlock.Type = (sbyte)asset.AssetType; complete.AssetBlock.UUID = asset.AssetID; - Server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Asset); } } } @@ -283,7 +284,7 @@ namespace Simian.Extensions response.TransferInfo.Status = (int)StatusCode.OK; response.TransferInfo.TargetType = (int)TargetType.Unknown; // Doesn't seem to be used by the client - Server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); // Transfer system does not wait for ACKs, just sends all of the // packets for this transfer out @@ -307,7 +308,7 @@ namespace Simian.Extensions else transfer.TransferData.Status = (int)StatusCode.OK; - Server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Asset); } } else @@ -327,7 +328,7 @@ namespace Simian.Extensions response.TransferInfo.Status = (int)StatusCode.UnknownSource; response.TransferInfo.TargetType = (int)TargetType.Unknown; - Server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); } } else if (source == SourceType.SimEstate) diff --git a/Programs/Simian/Extensions/AuthFreeForAll.cs b/Programs/Simian/Extensions/AuthFreeForAll.cs index 6ee414cf..8fd9d20b 100644 --- a/Programs/Simian/Extensions/AuthFreeForAll.cs +++ b/Programs/Simian/Extensions/AuthFreeForAll.cs @@ -4,17 +4,17 @@ using OpenMetaverse; namespace Simian.Extensions { - public class AuthFreeForAll : IExtension, IAuthenticationProvider + public class AuthFreeForAll : IExtension, IAuthenticationProvider { Simian server; - public AuthFreeForAll(Simian server) + public AuthFreeForAll() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; } public void Stop() diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index 5be11bb3..74a9340a 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -8,28 +8,29 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - class AvatarManager : IExtension, IAvatarProvider + class AvatarManager : IExtension, IAvatarProvider { - Simian Server; + Simian server; int currentWearablesSerialNum = -1; int currentAnimSequenceNum = 0; - public AvatarManager(Simian server) + public AvatarManager() { - Server = server; } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.AvatarPropertiesRequest, new PacketCallback(AvatarPropertiesRequestHandler)); - Server.UDP.RegisterPacketCallback(PacketType.AgentWearablesRequest, new PacketCallback(AgentWearablesRequestHandler)); - Server.UDP.RegisterPacketCallback(PacketType.AgentIsNowWearing, new PacketCallback(AgentIsNowWearingHandler)); - Server.UDP.RegisterPacketCallback(PacketType.AgentSetAppearance, new PacketCallback(AgentSetAppearanceHandler)); - Server.UDP.RegisterPacketCallback(PacketType.AgentCachedTexture, new PacketCallback(AgentCachedTextureHandler)); - Server.UDP.RegisterPacketCallback(PacketType.AgentAnimation, new PacketCallback(AgentAnimationHandler)); - Server.UDP.RegisterPacketCallback(PacketType.SoundTrigger, new PacketCallback(SoundTriggerHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ViewerEffect, new PacketCallback(ViewerEffectHandler)); - Server.UDP.RegisterPacketCallback(PacketType.UUIDNameRequest, new PacketCallback(UUIDNameRequestHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.AvatarPropertiesRequest, new PacketCallback(AvatarPropertiesRequestHandler)); + server.UDP.RegisterPacketCallback(PacketType.AgentWearablesRequest, new PacketCallback(AgentWearablesRequestHandler)); + server.UDP.RegisterPacketCallback(PacketType.AgentIsNowWearing, new PacketCallback(AgentIsNowWearingHandler)); + server.UDP.RegisterPacketCallback(PacketType.AgentSetAppearance, new PacketCallback(AgentSetAppearanceHandler)); + server.UDP.RegisterPacketCallback(PacketType.AgentCachedTexture, new PacketCallback(AgentCachedTextureHandler)); + server.UDP.RegisterPacketCallback(PacketType.AgentAnimation, new PacketCallback(AgentAnimationHandler)); + server.UDP.RegisterPacketCallback(PacketType.SoundTrigger, new PacketCallback(SoundTriggerHandler)); + server.UDP.RegisterPacketCallback(PacketType.ViewerEffect, new PacketCallback(ViewerEffectHandler)); + server.UDP.RegisterPacketCallback(PacketType.UUIDNameRequest, new PacketCallback(UUIDNameRequestHandler)); } public void Stop() @@ -71,13 +72,13 @@ namespace Simian.Extensions sendAnim.AnimationList[i].AnimSequenceID = sequenceNums[i]; } - Server.UDP.BroadcastPacket(sendAnim, PacketCategory.State); + server.UDP.BroadcastPacket(sendAnim, PacketCategory.State); } public void TriggerSound(Agent agent, UUID soundID, float gain) { SoundTriggerPacket sound = new SoundTriggerPacket(); - sound.SoundData.Handle = Server.RegionHandle; + sound.SoundData.Handle = server.RegionHandle; sound.SoundData.ObjectID = agent.AgentID; sound.SoundData.ParentID = agent.AgentID; sound.SoundData.OwnerID = agent.AgentID; @@ -85,7 +86,7 @@ namespace Simian.Extensions sound.SoundData.SoundID = soundID; sound.SoundData.Gain = gain; - Server.UDP.BroadcastPacket(sound, PacketCategory.State); + server.UDP.BroadcastPacket(sound, PacketCategory.State); } void AgentAnimationHandler(Packet packet, Agent agent) @@ -120,7 +121,7 @@ namespace Simian.Extensions effect.AgentData.AgentID = UUID.Zero; effect.AgentData.SessionID = UUID.Zero; - Server.UDP.BroadcastPacket(effect, PacketCategory.State); + server.UDP.BroadcastPacket(effect, PacketCategory.State); } void AvatarPropertiesRequestHandler(Packet packet, Agent agent) @@ -128,7 +129,7 @@ namespace Simian.Extensions AvatarPropertiesRequestPacket request = (AvatarPropertiesRequestPacket)packet; Agent foundAgent; - if (Server.Agents.TryGetValue(request.AgentData.AvatarID, out foundAgent)) + if (server.Agents.TryGetValue(request.AgentData.AvatarID, out foundAgent)) { AvatarPropertiesReplyPacket reply = new AvatarPropertiesReplyPacket(); reply.AgentData.AgentID = agent.AgentID; @@ -143,7 +144,7 @@ namespace Simian.Extensions reply.PropertiesData.PartnerID = foundAgent.PartnerID; reply.PropertiesData.ProfileURL = Utils.StringToBytes(foundAgent.ProfileURL); - Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); } else { @@ -155,7 +156,7 @@ namespace Simian.Extensions bool TryAddWearable(UUID agentID, Dictionary wearables, WearableType type, UUID itemID) { InventoryObject obj; - if (itemID != UUID.Zero && Server.Inventory.TryGetInventory(agentID, itemID, out obj) && + if (itemID != UUID.Zero && server.Inventory.TryGetInventory(agentID, itemID, out obj) && obj is InventoryItem) { wearables.Add(type, (InventoryItem)obj); @@ -212,7 +213,7 @@ namespace Simian.Extensions Logger.DebugLog(String.Format("Sending info about {0} wearables", wearables.Count)); - Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Asset); + server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Asset); } void AgentWearablesRequestHandler(Packet packet, Agent agent) @@ -304,7 +305,7 @@ namespace Simian.Extensions for (int i = 0; i < set.VisualParam.Length; i++) visualParams[i] = set.VisualParam[i].ParamValue; - Server.Scene.AvatarAppearance(this, agent, textureEntry, visualParams); + server.Scene.AvatarAppearance(this, agent, textureEntry, visualParams); } void AgentCachedTextureHandler(Packet packet, Agent agent) @@ -328,7 +329,7 @@ namespace Simian.Extensions response.Header.Zerocoded = true; - Server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Transaction); + server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Transaction); } void SoundTriggerHandler(Packet packet, Agent agent) @@ -352,7 +353,7 @@ namespace Simian.Extensions reply.UUIDNameBlock[i].ID = id; Agent foundAgent; - if (Server.Agents.TryGetValue(id, out foundAgent)) + if (server.Agents.TryGetValue(id, out foundAgent)) { reply.UUIDNameBlock[i].FirstName = Utils.StringToBytes(foundAgent.FirstName); reply.UUIDNameBlock[i].LastName = Utils.StringToBytes(foundAgent.LastName); @@ -364,7 +365,7 @@ namespace Simian.Extensions } } - Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); } } } diff --git a/Programs/Simian/Extensions/CoarseLocationUpdates.cs b/Programs/Simian/Extensions/CoarseLocationUpdates.cs index 300e8578..90a60748 100644 --- a/Programs/Simian/Extensions/CoarseLocationUpdates.cs +++ b/Programs/Simian/Extensions/CoarseLocationUpdates.cs @@ -8,18 +8,19 @@ using System.Threading; namespace Simian.Extensions { - public class CoarseLocationUpdates : IExtension + public class CoarseLocationUpdates : IExtension { - Simian Server; + Simian server; Timer CoarseLocationTimer; - public CoarseLocationUpdates(Simian server) + public CoarseLocationUpdates() { - Server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + if (CoarseLocationTimer != null) CoarseLocationTimer = null; CoarseLocationTimer = new Timer(new TimerCallback(CoarseLocationTimer_Elapsed)); CoarseLocationTimer.Change(1000, 1000); @@ -32,9 +33,9 @@ namespace Simian.Extensions void CoarseLocationTimer_Elapsed(object sender) { - lock (Server.Agents) + lock (server.Agents) { - foreach (Agent recipient in Server.Agents.Values) + foreach (Agent recipient in server.Agents.Values) { int i = 0; @@ -42,8 +43,8 @@ namespace Simian.Extensions update.Index.Prey = -1; update.Index.You = 0; - update.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[Server.Agents.Count]; - update.Location = new CoarseLocationUpdatePacket.LocationBlock[Server.Agents.Count]; + update.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[server.Agents.Count]; + update.Location = new CoarseLocationUpdatePacket.LocationBlock[server.Agents.Count]; // Fill in this avatar update.AgentData[0] = new CoarseLocationUpdatePacket.AgentDataBlock(); @@ -54,7 +55,7 @@ namespace Simian.Extensions update.Location[0].Z = (byte)((int)recipient.Avatar.Position.Z / 4); ++i; - foreach (Agent agent in Server.Agents.Values) + foreach (Agent agent in server.Agents.Values) { if (agent != recipient) { @@ -68,7 +69,7 @@ namespace Simian.Extensions } } - Server.UDP.SendPacket(recipient.AgentID, update, PacketCategory.State); + server.UDP.SendPacket(recipient.AgentID, update, PacketCategory.State); } } } diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs index d538ab72..4a732558 100644 --- a/Programs/Simian/Extensions/ConnectionManagement.cs +++ b/Programs/Simian/Extensions/ConnectionManagement.cs @@ -5,17 +5,18 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class ConnectionManagement : IExtension + public class ConnectionManagement : IExtension { Simian server; - public ConnectionManagement(Simian server) + public ConnectionManagement() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + server.UDP.RegisterPacketCallback(PacketType.UseCircuitCode, new PacketCallback(UseCircuitCodeHandler)); server.UDP.RegisterPacketCallback(PacketType.StartPingCheck, new PacketCallback(StartPingCheckHandler)); server.UDP.RegisterPacketCallback(PacketType.LogoutRequest, new PacketCallback(LogoutRequestHandler)); diff --git a/Programs/Simian/Extensions/FriendManager.cs b/Programs/Simian/Extensions/FriendManager.cs index 3c1c4119..bb01cfb6 100644 --- a/Programs/Simian/Extensions/FriendManager.cs +++ b/Programs/Simian/Extensions/FriendManager.cs @@ -6,18 +6,20 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class FriendManager : IExtension + public class FriendManager : IExtension { - Simian Server; + Simian server; - public FriendManager(Simian server) + public FriendManager() { - Server = server; + } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler)); } public void Stop() @@ -31,9 +33,9 @@ namespace Simian.Extensions if (dialog == InstantMessageDialog.FriendshipOffered || dialog == InstantMessageDialog.FriendshipAccepted || dialog == InstantMessageDialog.FriendshipDeclined) { - lock (Server.Agents) + lock (server.Agents) { - foreach (Agent recipient in Server.Agents.Values) + foreach (Agent recipient in server.Agents.Values) { if (recipient.AgentID == im.MessageBlock.ToAgentID) { @@ -53,12 +55,12 @@ namespace Simian.Extensions sendIM.AgentData.AgentID = agent.AgentID; - Server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); + server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); if (dialog == InstantMessageDialog.FriendshipAccepted) { - bool receiverOnline = Server.Agents.ContainsKey(agent.AgentID); - bool senderOnline = Server.Agents.ContainsKey(recipient.AgentID); + bool receiverOnline = server.Agents.ContainsKey(agent.AgentID); + bool senderOnline = server.Agents.ContainsKey(recipient.AgentID); if (receiverOnline) { @@ -68,7 +70,7 @@ namespace Simian.Extensions notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = agent.AgentID; - Server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); + server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); } else { @@ -76,7 +78,7 @@ namespace Simian.Extensions notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = agent.AgentID; - Server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); + server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); } } @@ -88,7 +90,7 @@ namespace Simian.Extensions notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = recipient.AgentID; - Server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); + server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); } else { @@ -96,7 +98,7 @@ namespace Simian.Extensions notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = recipient.AgentID; - Server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); + server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); } } diff --git a/Programs/Simian/Extensions/ImageDelivery.cs b/Programs/Simian/Extensions/ImageDelivery.cs index 9e1b3d08..65dc7a81 100644 --- a/Programs/Simian/Extensions/ImageDelivery.cs +++ b/Programs/Simian/Extensions/ImageDelivery.cs @@ -81,20 +81,21 @@ namespace Simian.Extensions } } - public class ImageDelivery : IExtension + public class ImageDelivery : IExtension { - Simian Server; + Simian server; Dictionary CurrentDownloads = new Dictionary(); BlockingQueue CurrentDownloadQueue = new BlockingQueue(); - public ImageDelivery(Simian server) + public ImageDelivery() { - Server = server; } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.RequestImage, new PacketCallback(RequestImageHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.RequestImage, new PacketCallback(RequestImageHandler)); } public void Stop() @@ -150,7 +151,7 @@ namespace Simian.Extensions // New download, check if we have this image Asset asset; - if (Server.Assets.TryGetAsset(block.Image, out asset) && asset is AssetTexture) + if (server.Assets.TryGetAsset(block.Image, out asset) && asset is AssetTexture) { download = new ImageDownload((AssetTexture)asset, block.DiscardLevel, block.DownloadPriority, (int)block.Packet); @@ -174,7 +175,7 @@ namespace Simian.Extensions data.ImageData.Data = new byte[imageDataSize]; Buffer.BlockCopy(download.Texture.AssetData, 0, data.ImageData.Data, 0, imageDataSize); - Server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture); + server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture); // Check if ImagePacket packets need to be sent to complete this transfer if (download.CurrentPacket <= download.StopPacket) @@ -204,7 +205,7 @@ namespace Simian.Extensions Buffer.BlockCopy(download.Texture.AssetData, download.CurrentBytePosition(), transfer.ImageData.Data, 0, imagePacketSize); - Server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture); + server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture); ++download.CurrentPacket; } @@ -225,7 +226,7 @@ namespace Simian.Extensions ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket(); notfound.ImageID.ID = block.Image; - Server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture); + server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture); } } } diff --git a/Programs/Simian/Extensions/InventoryManager.cs b/Programs/Simian/Extensions/InventoryManager.cs index d5af4314..4abad50c 100644 --- a/Programs/Simian/Extensions/InventoryManager.cs +++ b/Programs/Simian/Extensions/InventoryManager.cs @@ -7,9 +7,9 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class InventoryManager : IExtension, IInventoryProvider, IPersistable + public class InventoryManager : IExtension, IInventoryProvider, IPersistable { - Simian Server; + Simian server; /// Dictionary of inventories for each agent. Each inventory /// is also a dictionary itself Dictionary> Inventory = @@ -17,22 +17,23 @@ namespace Simian.Extensions /// Global shared inventory for all agent Dictionary Library = new Dictionary(); - public InventoryManager(Simian server) + public InventoryManager() { - Server = server; } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.CreateInventoryItem, new PacketCallback(CreateInventoryItemHandler)); - Server.UDP.RegisterPacketCallback(PacketType.CreateInventoryFolder, new PacketCallback(CreateInventoryFolderHandler)); - Server.UDP.RegisterPacketCallback(PacketType.UpdateInventoryItem, new PacketCallback(UpdateInventoryItemHandler)); - Server.UDP.RegisterPacketCallback(PacketType.FetchInventoryDescendents, new PacketCallback(FetchInventoryDescendentsHandler)); - Server.UDP.RegisterPacketCallback(PacketType.FetchInventory, new PacketCallback(FetchInventoryHandler)); - Server.UDP.RegisterPacketCallback(PacketType.CopyInventoryItem, new PacketCallback(CopyInventoryItemHandler)); - Server.UDP.RegisterPacketCallback(PacketType.MoveInventoryItem, new PacketCallback(MoveInventoryItemHandler)); - Server.UDP.RegisterPacketCallback(PacketType.MoveInventoryFolder, new PacketCallback(MoveInventoryFolderHandler)); - Server.UDP.RegisterPacketCallback(PacketType.PurgeInventoryDescendents, new PacketCallback(PurgeInventoryDescendentsHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.CreateInventoryItem, new PacketCallback(CreateInventoryItemHandler)); + server.UDP.RegisterPacketCallback(PacketType.CreateInventoryFolder, new PacketCallback(CreateInventoryFolderHandler)); + server.UDP.RegisterPacketCallback(PacketType.UpdateInventoryItem, new PacketCallback(UpdateInventoryItemHandler)); + server.UDP.RegisterPacketCallback(PacketType.FetchInventoryDescendents, new PacketCallback(FetchInventoryDescendentsHandler)); + server.UDP.RegisterPacketCallback(PacketType.FetchInventory, new PacketCallback(FetchInventoryHandler)); + server.UDP.RegisterPacketCallback(PacketType.CopyInventoryItem, new PacketCallback(CopyInventoryItemHandler)); + server.UDP.RegisterPacketCallback(PacketType.MoveInventoryItem, new PacketCallback(MoveInventoryItemHandler)); + server.UDP.RegisterPacketCallback(PacketType.MoveInventoryFolder, new PacketCallback(MoveInventoryFolderHandler)); + server.UDP.RegisterPacketCallback(PacketType.PurgeInventoryDescendents, new PacketCallback(PurgeInventoryDescendentsHandler)); } public void Stop() @@ -281,7 +282,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) descendents.FolderData[j] = folderBlocks[splitPoints[i] + j]; - Server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); } } else @@ -297,7 +298,7 @@ namespace Simian.Extensions descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[0]; descendents.ItemData = new InventoryDescendentsPacket.ItemDataBlock[0]; - Server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); } if (itemBlocks.Length > 0) @@ -323,7 +324,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) descendents.ItemData[j] = itemBlocks[splitPoints[i] + j]; - Server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); } } } @@ -403,7 +404,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) reply.InventoryData[j] = blocks[splitPoints[i] + j]; - Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory); } } @@ -540,7 +541,7 @@ namespace Simian.Extensions Logger.DebugLog("Sending bulk update for inventory object " + obj.ID); - Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Inventory); + server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Inventory); } void MoveInventory(Agent agent, Dictionary agentInventory, UUID objectID, @@ -784,7 +785,7 @@ namespace Simian.Extensions update.InventoryData[0].Type = (sbyte)item.AssetType; if (sendPacket) - Server.UDP.SendPacket(agentID, update, PacketCategory.Inventory); + server.UDP.SendPacket(agentID, update, PacketCategory.Inventory); return item.ID; } diff --git a/Programs/Simian/Extensions/Messaging.cs b/Programs/Simian/Extensions/Messaging.cs index cc804af6..d9d715aa 100644 --- a/Programs/Simian/Extensions/Messaging.cs +++ b/Programs/Simian/Extensions/Messaging.cs @@ -6,19 +6,20 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class Messaging : IExtension + public class Messaging : IExtension { - Simian Server; + Simian server; - public Messaging(Simian server) + public Messaging() { - Server = server; } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.ChatFromViewer, new PacketCallback(ChatFromViewerHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.ChatFromViewer, new PacketCallback(ChatFromViewerHandler)); + server.UDP.RegisterPacketCallback(PacketType.ImprovedInstantMessage, new PacketCallback(ImprovedInstantMessageHandler)); } public void Stop() @@ -45,7 +46,7 @@ namespace Simian.Extensions chat.ChatData.FromName = Utils.StringToBytes(agent.Avatar.Name); chat.ChatData.Message = viewerChat.ChatData.Message; - Server.UDP.BroadcastPacket(chat, PacketCategory.Transaction); + server.UDP.BroadcastPacket(chat, PacketCategory.Transaction); } void ImprovedInstantMessageHandler(Packet packet, Agent agent) @@ -55,9 +56,9 @@ namespace Simian.Extensions if (dialog == InstantMessageDialog.MessageFromAgent) { - lock (Server.Agents) + lock (server.Agents) { - foreach (Agent recipient in Server.Agents.Values) + foreach (Agent recipient in server.Agents.Values) { if (recipient.AgentID == im.MessageBlock.ToAgentID) { @@ -77,7 +78,7 @@ namespace Simian.Extensions sendIM.AgentData.AgentID = agent.AgentID; - Server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); + server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); break; } diff --git a/Programs/Simian/Extensions/Money.cs b/Programs/Simian/Extensions/Money.cs index f1a46141..6c5b9bd0 100644 --- a/Programs/Simian/Extensions/Money.cs +++ b/Programs/Simian/Extensions/Money.cs @@ -6,19 +6,21 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - class Money : IExtension + class Money : IExtension { - Simian Server; + Simian server; - public Money(Simian server) + public Money() { - Server = server; + } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.MoneyBalanceRequest, new PacketCallback(MoneyBalanceRequestHandler)); - Server.UDP.RegisterPacketCallback(PacketType.MoneyTransferRequest, new PacketCallback(MoneyTransferRequestHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.MoneyBalanceRequest, new PacketCallback(MoneyBalanceRequestHandler)); + server.UDP.RegisterPacketCallback(PacketType.MoneyTransferRequest, new PacketCallback(MoneyTransferRequestHandler)); } public void Stop() @@ -33,7 +35,7 @@ namespace Simian.Extensions reply.MoneyData.TransactionID = transactionID; reply.MoneyData.Description = Utils.StringToBytes(message); - Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); } void MoneyBalanceRequestHandler(Packet packet, Agent agent) @@ -50,9 +52,9 @@ namespace Simian.Extensions if (request.MoneyData.Amount < 0 || request.MoneyData.Amount > agent.Balance) return; - lock (Server.Agents) + lock (server.Agents) { - foreach (Agent recipient in Server.Agents.Values) + foreach (Agent recipient in server.Agents.Values) { if (recipient.AgentID == request.MoneyData.DestID) { diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index c4d543fb..8aa7a955 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -7,7 +7,7 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class Movement : IExtension + public class Movement : IExtension { const int UPDATE_ITERATION = 100; //rate in milliseconds to send ObjectUpdate const bool ENVIRONMENT_SOUNDS = true; //collision sounds, splashing, etc @@ -23,7 +23,7 @@ namespace Simian.Extensions const float PREJUMP_DELAY = 0.25f; //seconds before actually jumping const float AVATAR_TERMINAL_VELOCITY = 54f; //~120mph - UUID BIG_SPLASH_SOUND = new UUID("486475b9-1460-4969-871e-fad973b38015"); + static readonly UUID BIG_SPLASH_SOUND = new UUID("486475b9-1460-4969-871e-fad973b38015"); const float SQRT_TWO = 1.41421356f; @@ -37,13 +37,14 @@ namespace Simian.Extensions set { Interlocked.Exchange(ref lastTick, value); } } - public Movement(Simian server) + public Movement() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + server.UDP.RegisterPacketCallback(PacketType.AgentUpdate, new PacketCallback(AgentUpdateHandler)); server.UDP.RegisterPacketCallback(PacketType.AgentHeightWidth, new PacketCallback(AgentHeightWidthHandler)); server.UDP.RegisterPacketCallback(PacketType.SetAlwaysRun, new PacketCallback(SetAlwaysRunHandler)); diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index b0289fe3..ae969041 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -8,31 +8,32 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class ObjectManager : IExtension + public class ObjectManager : IExtension { - Simian Server; + Simian server; - public ObjectManager(Simian server) + public ObjectManager() { - Server = server; } - public void Start() + public void Start(Simian server) { - Server.UDP.RegisterPacketCallback(PacketType.ObjectAdd, new PacketCallback(ObjectAddHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectDuplicate, new PacketCallback(ObjectDuplicateHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectSelect, new PacketCallback(ObjectSelectHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectDeselect, new PacketCallback(ObjectDeselectHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectLink, new PacketCallback(ObjectLinkHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectDelink, new PacketCallback(ObjectDelinkHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectShape, new PacketCallback(ObjectShapeHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectFlagUpdate, new PacketCallback(ObjectFlagUpdateHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectExtraParams, new PacketCallback(ObjectExtraParamsHandler)); - Server.UDP.RegisterPacketCallback(PacketType.ObjectImage, new PacketCallback(ObjectImageHandler)); - Server.UDP.RegisterPacketCallback(PacketType.DeRezObject, new PacketCallback(DeRezObjectHandler)); - Server.UDP.RegisterPacketCallback(PacketType.MultipleObjectUpdate, new PacketCallback(MultipleObjectUpdateHandler)); - Server.UDP.RegisterPacketCallback(PacketType.RequestObjectPropertiesFamily, new PacketCallback(RequestObjectPropertiesFamilyHandler)); + this.server = server; + + server.UDP.RegisterPacketCallback(PacketType.ObjectAdd, new PacketCallback(ObjectAddHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectDuplicate, new PacketCallback(ObjectDuplicateHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectSelect, new PacketCallback(ObjectSelectHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectDeselect, new PacketCallback(ObjectDeselectHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectLink, new PacketCallback(ObjectLinkHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectDelink, new PacketCallback(ObjectDelinkHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectShape, new PacketCallback(ObjectShapeHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectFlagUpdate, new PacketCallback(ObjectFlagUpdateHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectExtraParams, new PacketCallback(ObjectExtraParamsHandler)); + server.UDP.RegisterPacketCallback(PacketType.ObjectImage, new PacketCallback(ObjectImageHandler)); + server.UDP.RegisterPacketCallback(PacketType.DeRezObject, new PacketCallback(DeRezObjectHandler)); + server.UDP.RegisterPacketCallback(PacketType.MultipleObjectUpdate, new PacketCallback(MultipleObjectUpdateHandler)); + server.UDP.RegisterPacketCallback(PacketType.RequestObjectPropertiesFamily, new PacketCallback(RequestObjectPropertiesFamilyHandler)); } public void Stop() @@ -62,7 +63,7 @@ namespace Simian.Extensions if (add.ObjectData.RayTargetID != UUID.Zero) { SimulationObject obj; - if (Server.Scene.TryGetObject(add.ObjectData.RayTargetID, out obj)) + if (server.Scene.TryGetObject(add.ObjectData.RayTargetID, out obj)) { // Test for a collision with the specified object position = ObjectCollisionTest(add.ObjectData.RayStart, add.ObjectData.RayEnd, obj); @@ -159,15 +160,15 @@ namespace Simian.Extensions prim.Properties.Permissions = Permissions.FullPermissions; prim.Properties.SalePrice = 10; - prim.RegionHandle = Server.RegionHandle; + prim.RegionHandle = server.RegionHandle; prim.Rotation = add.ObjectData.Rotation; prim.Scale = scale; prim.Textures = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE); prim.TextColor = Color4.Black; // Add this prim to the object database - SimulationObject simObj = new SimulationObject(prim, Server); - Server.Scene.ObjectAdd(this, agent, simObj, flags); + SimulationObject simObj = new SimulationObject(prim, server); + server.Scene.ObjectAdd(this, agent, simObj, flags); } void ObjectDuplicateHandler(Packet packet, Agent agent) @@ -182,13 +183,13 @@ namespace Simian.Extensions uint dupeID = duplicate.ObjectData[i].ObjectLocalID; SimulationObject obj; - if (Server.Scene.TryGetObject(dupeID, out obj)) + if (server.Scene.TryGetObject(dupeID, out obj)) { SimulationObject newObj = new SimulationObject(obj); newObj.Prim.Position += offset; newObj.Prim.ID = UUID.Random(); - Server.Scene.ObjectAdd(this, agent, newObj, flags); + server.Scene.ObjectAdd(this, agent, newObj, flags); } else { @@ -199,7 +200,7 @@ namespace Simian.Extensions kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = dupeID; - Server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); } } } @@ -215,7 +216,7 @@ namespace Simian.Extensions properties.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock(); SimulationObject obj; - if (Server.Scene.TryGetObject(select.ObjectData[i].ObjectLocalID, out obj)) + if (server.Scene.TryGetObject(select.ObjectData[i].ObjectLocalID, out obj)) { //Logger.DebugLog("Selecting object " + obj.Prim.LocalID); @@ -239,7 +240,7 @@ namespace Simian.Extensions properties.ObjectData[0].TextureID = new byte[0]; properties.ObjectData[0].TouchName = new byte[0]; - Server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction); + server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction); } else { @@ -256,7 +257,7 @@ namespace Simian.Extensions kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = select.ObjectData[i].ObjectLocalID; - Server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); } } @@ -271,7 +272,7 @@ namespace Simian.Extensions uint localID = deselect.ObjectData[i].ObjectLocalID; SimulationObject obj; - if (Server.Scene.TryGetObject(localID, out obj)) + if (server.Scene.TryGetObject(localID, out obj)) { //Logger.DebugLog("Deselecting object " + obj.Prim.LocalID); } @@ -287,7 +288,7 @@ namespace Simian.Extensions for (int i = 0; i < link.ObjectData.Length; i++) { SimulationObject obj; - if (!Server.Scene.TryGetObject(link.ObjectData[i].ObjectLocalID, out obj)) + if (!server.Scene.TryGetObject(link.ObjectData[i].ObjectLocalID, out obj)) { //TODO: send an error message return; @@ -309,19 +310,19 @@ namespace Simian.Extensions ObjectUpdatePacket update = new ObjectUpdatePacket(); - update.RegionData.RegionHandle = Server.RegionHandle; + update.RegionData.RegionHandle = server.RegionHandle; update.RegionData.TimeDilation = UInt16.MaxValue; update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; - update.ObjectData[0] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim, Server.RegionHandle, + update.ObjectData[0] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim, server.RegionHandle, linkSet[i].Prim.PrimData.State, linkSet[i].Prim.Flags); if (linkSet[i].Prim.ParentID > 0) { //previously linked children SimulationObject parent; - if (Server.Scene.TryGetObject(linkSet[i].Prim.ParentID, out parent)) + if (server.Scene.TryGetObject(linkSet[i].Prim.ParentID, out parent)) { //re-add old root orientation linkSet[i].Prim.Position = parent.Prim.Position + Vector3.Transform(linkSet[i].Prim.Position, Matrix4.CreateFromQuaternion(parent.Prim.Rotation)); @@ -348,7 +349,7 @@ namespace Simian.Extensions linkSet[i].Prim.Position, linkSet[i].Prim.Rotation, Vector3.Zero, Vector3.Zero, Vector3.Zero); - Server.UDP.BroadcastPacket(update, PacketCategory.State); + server.UDP.BroadcastPacket(update, PacketCategory.State); } } @@ -361,7 +362,7 @@ namespace Simian.Extensions for (int i = 0; i < delink.ObjectData.Length; i++) { SimulationObject obj; - if (!Server.Scene.TryGetObject(delink.ObjectData[i].ObjectLocalID, out obj)) + if (!server.Scene.TryGetObject(delink.ObjectData[i].ObjectLocalID, out obj)) { //TODO: send an error message return; @@ -379,7 +380,7 @@ namespace Simian.Extensions ObjectUpdatePacket update = new ObjectUpdatePacket(); - update.RegionData.RegionHandle = Server.RegionHandle; + update.RegionData.RegionHandle = server.RegionHandle; update.RegionData.TimeDilation = UInt16.MaxValue; update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[linkSet.Count]; @@ -387,7 +388,7 @@ namespace Simian.Extensions for (int i = 0; i < linkSet.Count; i++) { update.ObjectData[i] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim, - Server.RegionHandle, 0, linkSet[i].Prim.Flags); + server.RegionHandle, 0, linkSet[i].Prim.Flags); update.ObjectData[i].ParentID = 0; linkSet[i].LinkNumber = 0; @@ -404,7 +405,7 @@ namespace Simian.Extensions Vector3.Zero, Vector3.Zero, Vector3.Zero); } - Server.UDP.BroadcastPacket(update, PacketCategory.State); + server.UDP.BroadcastPacket(update, PacketCategory.State); } void ObjectShapeHandler(Packet packet, Agent agent) @@ -416,7 +417,7 @@ namespace Simian.Extensions ObjectShapePacket.ObjectDataBlock block = shape.ObjectData[i]; SimulationObject obj; - if (Server.Scene.TryGetObject(block.ObjectLocalID, out obj)) + if (server.Scene.TryGetObject(block.ObjectLocalID, out obj)) { Primitive.ConstructionData data = obj.Prim.PrimData; @@ -439,7 +440,7 @@ namespace Simian.Extensions data.ProfileEnd = Primitive.UnpackEndCut(block.ProfileEnd); data.ProfileHollow = Primitive.UnpackProfileHollow(block.ProfileHollow); - Server.Scene.ObjectModify(this, obj, data); + server.Scene.ObjectModify(this, obj, data); } else { @@ -454,7 +455,7 @@ namespace Simian.Extensions ObjectFlagUpdatePacket update = (ObjectFlagUpdatePacket)packet; SimulationObject obj; - if (Server.Scene.TryGetObject(update.AgentData.ObjectLocalID, out obj)) + if (server.Scene.TryGetObject(update.AgentData.ObjectLocalID, out obj)) { PrimFlags flags = obj.Prim.Flags; @@ -478,7 +479,7 @@ namespace Simian.Extensions else flags &= ~PrimFlags.Physics; - Server.Scene.ObjectFlags(this, obj, flags); + server.Scene.ObjectFlags(this, obj, flags); } else { @@ -496,7 +497,7 @@ namespace Simian.Extensions ObjectExtraParamsPacket.ObjectDataBlock block = extra.ObjectData[i]; SimulationObject obj; - if (Server.Scene.TryGetObject(block.ObjectLocalID, out obj)) + if (server.Scene.TryGetObject(block.ObjectLocalID, out obj)) { ExtraParamType type = (ExtraParamType)block.ParamType; } @@ -511,8 +512,8 @@ namespace Simian.Extensions for (int i = 0; i < image.ObjectData.Length; i++) { SimulationObject obj; - if (Server.Scene.TryGetObject(image.ObjectData[i].ObjectLocalID, out obj)) - Server.Scene.ObjectImage(this, obj, + if (server.Scene.TryGetObject(image.ObjectData[i].ObjectLocalID, out obj)) + server.Scene.ObjectImage(this, obj, Utils.BytesToString(image.ObjectData[i].MediaURL), new Primitive.TextureEntry(image.ObjectData[i].TextureEntry, 0, image.ObjectData[i].TextureEntry.Length)); } @@ -530,7 +531,7 @@ namespace Simian.Extensions uint localID = derez.ObjectData[i].ObjectLocalID; SimulationObject obj; - if (Server.Scene.TryGetObject(localID, out obj)) + if (server.Scene.TryGetObject(localID, out obj)) { switch (destination) { @@ -560,15 +561,15 @@ namespace Simian.Extensions break; case DeRezDestination.TrashFolder: InventoryObject invObj; - if (Server.Inventory.TryGetInventory(agent.AgentID, derez.AgentBlock.DestinationID, out invObj) && + if (server.Inventory.TryGetInventory(agent.AgentID, derez.AgentBlock.DestinationID, out invObj) && invObj is InventoryFolder) { // FIXME: Handle children InventoryFolder trash = (InventoryFolder)invObj; - Server.Inventory.CreateItem(agent.AgentID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object, + server.Inventory.CreateItem(agent.AgentID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object, AssetType.Object, obj.Prim.ID, trash.ID, PermissionMask.All, PermissionMask.All, agent.AgentID, obj.Prim.Properties.CreatorID, derez.AgentBlock.TransactionID, 0, true); - Server.Scene.ObjectRemove(this, obj); + server.Scene.ObjectRemove(this, obj); Logger.DebugLog(String.Format("Derezzed prim {0} to agent inventory trash", obj.Prim.LocalID)); } @@ -608,7 +609,7 @@ namespace Simian.Extensions MultipleObjectUpdatePacket.ObjectDataBlock block = update.ObjectData[i]; SimulationObject obj; - if (Server.Scene.TryGetObject(block.ObjectLocalID, out obj)) + if (server.Scene.TryGetObject(block.ObjectLocalID, out obj)) { UpdateType type = (UpdateType)block.Type; bool linked = ((type & UpdateType.Linked) != 0); @@ -639,7 +640,7 @@ namespace Simian.Extensions // Although the object has already been modified, we need // to inform the scene manager of the changes so they are // sent to clients and propagated to other extensions - Server.Scene.ObjectTransform(this, obj, position, rotation, + server.Scene.ObjectTransform(this, obj, position, rotation, obj.Prim.Velocity, obj.Prim.Acceleration, obj.Prim.AngularVelocity, scale); } @@ -651,7 +652,7 @@ namespace Simian.Extensions kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = block.ObjectLocalID; - Server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); } } } @@ -662,7 +663,7 @@ namespace Simian.Extensions ReportType type = (ReportType)request.ObjectData.RequestFlags; SimulationObject obj; - if (Server.Scene.TryGetObject(request.ObjectData.ObjectID, out obj)) + if (server.Scene.TryGetObject(request.ObjectData.ObjectID, out obj)) { ObjectPropertiesFamilyPacket props = new ObjectPropertiesFamilyPacket(); props.ObjectData.BaseMask = (uint)obj.Prim.Properties.Permissions.BaseMask; @@ -682,7 +683,7 @@ namespace Simian.Extensions props.ObjectData.SalePrice = obj.Prim.Properties.SalePrice; props.ObjectData.SaleType = (byte)obj.Prim.Properties.SaleType; - Server.UDP.SendPacket(agent.AgentID, props, PacketCategory.Transaction); + server.UDP.SendPacket(agent.AgentID, props, PacketCategory.Transaction); } else { @@ -718,7 +719,7 @@ namespace Simian.Extensions if (obj.Prim.ParentID != 0) { SimulationObject parent; - if (Server.Scene.TryGetObject(obj.Prim.ParentID, out parent)) + if (server.Scene.TryGetObject(obj.Prim.ParentID, out parent)) mesh = obj.GetWorldMesh(DetailLevel.Low, parent); } else diff --git a/Programs/Simian/Extensions/ParcelManager.cs b/Programs/Simian/Extensions/ParcelManager.cs index e31dcc82..e6235132 100644 --- a/Programs/Simian/Extensions/ParcelManager.cs +++ b/Programs/Simian/Extensions/ParcelManager.cs @@ -6,20 +6,21 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class ParcelManager : IExtension, IParcelProvider + public class ParcelManager : IExtension, IParcelProvider { Simian server; Dictionary parcels = new Dictionary(); /// X,Y ordered 2D array of the parcelIDs for each sq. meter of a simulator int[] parcelOverlay = new int[64 * 64]; - public ParcelManager(Simian server) + public ParcelManager() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + lock (parcels) parcels.Clear(); diff --git a/Programs/Simian/Extensions/RenderingPluginMesher.cs b/Programs/Simian/Extensions/RenderingPluginMesher.cs index 356e8131..7becb561 100644 --- a/Programs/Simian/Extensions/RenderingPluginMesher.cs +++ b/Programs/Simian/Extensions/RenderingPluginMesher.cs @@ -6,18 +6,19 @@ using OpenMetaverse.Rendering; namespace Simian.Extensions { - public class RenderingPluginMesher : IExtension, IMeshingProvider + public class RenderingPluginMesher : IExtension, IMeshingProvider { - Simian Server; + Simian server; IRendering Renderer; - public RenderingPluginMesher(Simian server) + public RenderingPluginMesher() { - Server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + // Search for a the best available OpenMetaverse.Rendering plugin List renderers = RenderingLoader.ListRenderers(AppDomain.CurrentDomain.BaseDirectory); diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 616ef07c..45f457da 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -12,7 +12,7 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class SceneManager : IExtension, ISceneProvider + public class SceneManager : IExtension, ISceneProvider { Simian server; DoubleDictionary sceneObjects = new DoubleDictionary(); @@ -41,13 +41,14 @@ namespace Simian.Extensions public float WaterHeight { get { return 35f; } } - public SceneManager(Simian server) + public SceneManager() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + server.UDP.RegisterPacketCallback(PacketType.CompleteAgentMovement, new PacketCallback(CompleteAgentMovementHandler)); LoadTerrain(server.DataDir + "heightmap.tga"); } diff --git a/Programs/Simian/Extensions/UDPServer.cs b/Programs/Simian/Extensions/UDPServer.cs index 6d53846d..10d51626 100644 --- a/Programs/Simian/Extensions/UDPServer.cs +++ b/Programs/Simian/Extensions/UDPServer.cs @@ -68,21 +68,20 @@ namespace Simian } } - public class UDPManager : IExtension, IUDPProvider + public class UDPManager : IExtension, IUDPProvider { - Simian Server; + Simian server; UDPServer udpServer; - public UDPManager(Simian server) + public UDPManager() { - Server = server; - // Have to do this in the constructor, because we don't know that the - // UDP extension will be started before other extensions - udpServer = new UDPServer(Server.UDPPort, Server); } - public void Start() + public void Start(Simian server) { + this.server = server; + + udpServer = new UDPServer(server.UDPPort, server); } public void Stop() diff --git a/Programs/Simian/Extensions/XMLPersistence.cs b/Programs/Simian/Extensions/XMLPersistence.cs index 996b92d7..ad151240 100644 --- a/Programs/Simian/Extensions/XMLPersistence.cs +++ b/Programs/Simian/Extensions/XMLPersistence.cs @@ -8,17 +8,18 @@ using OpenMetaverse.StructuredData; namespace Simian.Extensions { - public class XMLPersistence : IExtension, IPersistenceProvider + public class XMLPersistence : IExtension, IPersistenceProvider { Simian server; - public XMLPersistence(Simian server) + public XMLPersistence() { - this.server = server; } - public void Start() + public void Start(Simian server) { + this.server = server; + LLSD llsd; try diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 664682ff..67e60150 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -7,6 +7,7 @@ using System.Xml; using System.Threading; using System.Reflection; using ExtensionLoader; +using ExtensionLoader.Config; using OpenMetaverse; using OpenMetaverse.Capabilities; using OpenMetaverse.Packets; @@ -64,7 +65,7 @@ namespace Simian references.Add("OpenMetaverse.dll"); references.Add("Simian.exe"); - Dictionary assignables = GetInterfaces(); + List assignables = ExtensionLoader.GetInterfaces(this); ExtensionLoader.LoadAllExtensions(Assembly.GetExecutingAssembly(), AppDomain.CurrentDomain.BaseDirectory, this, references, @@ -77,30 +78,30 @@ namespace Simian return false; } - foreach (IExtension extension in ExtensionLoader.Extensions) + foreach (IExtension extension in ExtensionLoader.Extensions) { // Track all of the extensions with persistence if (extension is IPersistable) PersistentExtensions.Add((IPersistable)extension); } - foreach (IExtension extension in ExtensionLoader.Extensions) + foreach (IExtension extension in ExtensionLoader.Extensions) { // Start all extensions except for persistence providers if (!(extension is IPersistenceProvider)) { Logger.DebugLog("Loading extension " + extension.GetType().Name); - extension.Start(); + extension.Start(this); } } - foreach (IExtension extension in ExtensionLoader.Extensions) + foreach (IExtension extension in ExtensionLoader.Extensions) { - // Start the persistance provider(s) after all other extensions are loaded + // Start the persistence provider(s) after all other extensions are loaded if (extension is IPersistenceProvider) { Logger.DebugLog("Loading persistance provider " + extension.GetType().Name); - extension.Start(); + extension.Start(this); } } @@ -109,14 +110,14 @@ namespace Simian public void Stop() { - foreach (IExtension extension in ExtensionLoader.Extensions) + foreach (IExtension extension in ExtensionLoader.Extensions) { - // Stop persistance providers first + // Stop persistence providers first if (extension is IPersistenceProvider) extension.Stop(); } - foreach (IExtension extension in ExtensionLoader.Extensions) + foreach (IExtension extension in ExtensionLoader.Extensions) { // Stop all other extensions if (!(extension is IPersistenceProvider)) @@ -146,19 +147,6 @@ namespace Simian UDP.BroadcastPacket(offline, PacketCategory.State); } - Dictionary GetInterfaces() - { - Dictionary interfaces = new Dictionary(); - - foreach (FieldInfo field in this.GetType().GetFields()) - { - if (field.FieldType.IsInterface) - interfaces.Add(field.FieldType, field); - } - - return interfaces; - } - void InitHttpServer(int port, bool ssl) { HttpServer = new HttpServer(HttpPort, ssl);