/* * Copyright (c) 2008 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * -- Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * -- Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * -- Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Collections.Generic; using System.Net; using System.IO; using System.Xml; using System.Text; using System.Reflection; using ExtensionLoader; using ExtensionLoader.Config; using OpenMetaverse; using OpenMetaverse.Capabilities; using OpenMetaverse.StructuredData; namespace AssetServer { public class AssetServer { public const string CONFIG_FILE = "AssetServer.ini"; public int HttpPort = 9001; public HttpServer HttpServer; public IniConfigSource ConfigFile; public IStorageProvider StorageProvider; public IAuthenticationProvider AuthenticationProvider; public IAuthorizationProvider AuthorizationProvider; public AssetServer() { } public bool Start(int port, bool ssl) { HttpPort = port; List extensionList = null; try { // Load the extension list (and ordering) from our config file ConfigFile = new IniConfigSource(CONFIG_FILE); IConfig extensionConfig = ConfigFile.Configs["Extensions"]; extensionList = new List(extensionConfig.GetKeys()); } catch (Exception) { Logger.Log("Failed to load [Extensions] section from " + CONFIG_FILE, Helpers.LogLevel.Error); return false; } try { // Load all of the extensions List references = new List(); references.Add("OpenMetaverseTypes.dll"); references.Add("OpenMetaverse.dll"); references.Add("ExtensionLoader.dll"); references.Add("AssetServer.exe"); List assignables = ExtensionLoader.GetInterfaces(this); ExtensionLoader.LoadAllExtensions(Assembly.GetExecutingAssembly(), AppDomain.CurrentDomain.BaseDirectory, this, extensionList, references, "AssetServer.*.dll", "AssetServer.*.cs", this, assignables); } catch (ExtensionException ex) { Logger.Log("Interface loading failed, shutting down: " + ex.Message, Helpers.LogLevel.Error); Stop(); return false; } InitHttpServer(HttpPort, ssl); for (int i = 0; i < extensionList.Count; i++) { ExtensionLoader.Extensions.ForEach( delegate(IExtension extension) { if (extension.GetType().Name == extensionList[i]) { Logger.DebugLog("Starting extension " + extensionList[i]); extension.Start(this); } } ); } return true; } public void Stop() { foreach (IExtension extension in ExtensionLoader.Extensions) { Logger.DebugLog("Stopping extension " + extension.GetType().Name); extension.Stop(); } if (HttpServer != null) HttpServer.Stop(); } void InitHttpServer(int port, bool ssl) { HttpServer = new HttpServer(HttpPort, ssl); HttpServer.Start(); Logger.Log("Asset server is listening on port " + port, Helpers.LogLevel.Info); } } }