OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
SimianExternalCapsModule.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Collections;
30 using System.Collections.Generic;
31 using System.Reflection;
32 using System.IO;
33 using System.Web;
34 
35 using log4net;
36 using Nini.Config;
37 using Mono.Addins;
38 
39 using OpenMetaverse;
40 using OpenMetaverse.StructuredData;
41 
42 using OpenSim.Framework;
43 using OpenSim.Region.Framework.Interfaces;
44 using OpenSim.Region.Framework.Scenes;
45 using OpenSim.Services.Interfaces;
47 
48 namespace OpenSim.Services.Connectors.SimianGrid
49 {
50  [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SimianExternalCapsModule")]
52  {
53  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54 
55  private bool m_enabled = true;
56  private Scene m_scene;
57  private String m_simianURL;
58 
59 #region IRegionModule Members
60 
61  public string Name
62  {
63  get { return this.GetType().Name; }
64  }
65 
66  public void Initialise(IConfigSource config)
67  {
68  try
69  {
70  IConfig m_config;
71 
72  if ((m_config = config.Configs["SimianExternalCaps"]) != null)
73  {
74  m_enabled = m_config.GetBoolean("Enabled", m_enabled);
75  if ((m_config = config.Configs["SimianGrid"]) != null)
76  {
77  m_simianURL = m_config.GetString("SimianServiceURL");
78  if (String.IsNullOrEmpty(m_simianURL))
79  {
80  //m_log.DebugFormat("[SimianGrid] service URL is not defined");
81  m_enabled = false;
82  return;
83  }
84  }
85  }
86  else
87  m_enabled = false;
88  }
89  catch (Exception e)
90  {
91  m_log.ErrorFormat("[SimianExternalCaps] initialization error: {0}",e.Message);
92  return;
93  }
94  }
95 
96  public void PostInitialise() { }
97  public void Close() { }
98 
99  public void AddRegion(Scene scene)
100  {
101  if (! m_enabled)
102  return;
103 
104  m_scene = scene;
105  m_scene.RegisterModuleInterface<IExternalCapsModule>(this);
106  }
107 
108  public void RemoveRegion(Scene scene)
109  {
110  if (! m_enabled)
111  return;
112 
113  m_scene.EventManager.OnRegisterCaps -= RegisterCapsEventHandler;
114  m_scene.EventManager.OnDeregisterCaps -= DeregisterCapsEventHandler;
115  }
116 
117  public void RegionLoaded(Scene scene)
118  {
119  if (! m_enabled)
120  return;
121 
122  m_scene.EventManager.OnRegisterCaps += RegisterCapsEventHandler;
123  m_scene.EventManager.OnDeregisterCaps += DeregisterCapsEventHandler;
124  }
125 
126  public Type ReplaceableInterface
127  {
128  get { return null; }
129  }
130 
131 #endregion
132 
133 #region IExternalCapsModule
134  // Eg http://grid.sciencesim.com/GridPublic/%CAP%/%OP%/"
135  public bool RegisterExternalUserCapsHandler(UUID agentID, Caps caps, String capName, String urlSkel)
136  {
137  UUID cap = UUID.Random();
138 
139  // Call to simian to register the cap we generated
140  // NameValueCollection requestArgs = new NameValueCollection
141  // {
142  // { "RequestMethod", "AddCapability" },
143  // { "Resource", "user" },
144  // { "Expiration", 0 },
145  // { "OwnerID", agentID.ToString() },
146  // { "CapabilityID", cap.ToString() }
147  // };
148 
149  // OSDMap response = SimianGrid.PostToService(m_simianURL, requestArgs);
150 
151  Dictionary<String,String> subs = new Dictionary<String,String>();
152  subs["%OP%"] = capName;
153  subs["%USR%"] = agentID.ToString();
154  subs["%CAP%"] = cap.ToString();
155  subs["%SIM%"] = m_scene.RegionInfo.RegionID.ToString();
156 
157  caps.RegisterHandler(capName,ExpandSkeletonURL(urlSkel,subs));
158  return true;
159  }
160 
161 #endregion
162 
163 #region EventHandlers
164  public void RegisterCapsEventHandler(UUID agentID, Caps caps) { }
165  public void DeregisterCapsEventHandler(UUID agentID, Caps caps) { }
166 #endregion
167 
168  private String ExpandSkeletonURL(String urlSkel, Dictionary<String,String> subs)
169  {
170  String result = urlSkel;
171 
172  foreach (KeyValuePair<String,String> kvp in subs)
173  {
174  result = result.Replace(kvp.Key,kvp.Value);
175  }
176 
177  return result;
178  }
179  }
180 }
void Close()
This is the inverse to Initialise. After a Close(), this instance won't be usable anymore...
void RegionLoaded(Scene scene)
This will be called once for every scene loaded. In a shared module this will be multiple times in on...
OpenSim.Framework.Capabilities.Caps Caps
OpenSim.Framework.Capabilities.Caps Caps
void Initialise(IConfigSource config)
This is called to initialize the region module. For shared modules, this is called exactly once...
bool RegisterExternalUserCapsHandler(UUID agentID, Caps caps, String capName, String urlSkel)
This function extends the simple URL configuration in the caps handlers to facilitate more interestin...
void AddRegion(Scene scene)
This is called whenever a Scene is added. For shared modules, this can happen several times...
void RemoveRegion(Scene scene)
This is called whenever a Scene is removed. For shared modules, this can happen several times...