OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
AgentCircuitData.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.Reflection;
30 using System.Collections.Generic;
31 using log4net;
32 using OpenMetaverse;
33 using OpenMetaverse.StructuredData;
34 
35 namespace OpenSim.Framework
36 {
41  public class AgentCircuitData
42  {
43 // DEBUG ON
44  private static readonly ILog m_log =
45  LogManager.GetLogger(
46  MethodBase.GetCurrentMethod().DeclaringType);
47 // DEBUG OFF
48 
52  public UUID AgentID;
53 
58 
62  public UUID BaseFolder;
63 
67  public string CapsPath = String.Empty;
68 
72  public Dictionary<ulong, string> ChildrenCapSeeds;
73 
77  public bool child;
78 
83  public uint circuitcode;
84 
88  public uint teleportFlags;
89 
93  public string firstname;
94  public UUID InventoryFolder;
95 
99  public string lastname;
100 
104  public string Name { get { return string.Format("{0} {1}", firstname, lastname); } }
105 
110  public UUID SecureSessionID;
111 
115  public UUID SessionID;
116 
121  public string ServiceSessionID = string.Empty;
122 
126  public string IPAddress;
127 
131  private string m_viewerInternal;
132 
136  public string Viewer
137  {
138  set { m_viewerInternal = value; }
139 
140  // Try to return consistent viewer string taking into account
141  // that viewers have chaagned how version is reported
142  // See http://opensimulator.org/mantis/view.php?id=6851
143  get
144  {
145  // Old style version string contains viewer name followed by a space followed by a version number
146  if (m_viewerInternal == null || m_viewerInternal.Contains(" "))
147  {
148  return m_viewerInternal;
149  }
150  else // New style version contains no spaces, just version number
151  {
152  return Channel + " " + m_viewerInternal;
153  }
154  }
155  }
156 
160  public string Channel;
161 
165  public string Mac;
166 
170  public string Id0;
171 
175  public Vector3 startpos;
176 
177  public Dictionary<string, object> ServiceURLs;
178 
180  {
181  }
182 
188  {
189  OSDMap args = new OSDMap();
190  args["agent_id"] = OSD.FromUUID(AgentID);
191  args["base_folder"] = OSD.FromUUID(BaseFolder);
192  args["caps_path"] = OSD.FromString(CapsPath);
193 
194  if (ChildrenCapSeeds != null)
195  {
196  OSDArray childrenSeeds = new OSDArray(ChildrenCapSeeds.Count);
197  foreach (KeyValuePair<ulong, string> kvp in ChildrenCapSeeds)
198  {
199  OSDMap pair = new OSDMap();
200  pair["handle"] = OSD.FromString(kvp.Key.ToString());
201  pair["seed"] = OSD.FromString(kvp.Value);
202  childrenSeeds.Add(pair);
203  }
204  if (ChildrenCapSeeds.Count > 0)
205  args["children_seeds"] = childrenSeeds;
206  }
207  args["child"] = OSD.FromBoolean(child);
208  args["circuit_code"] = OSD.FromString(circuitcode.ToString());
209  args["first_name"] = OSD.FromString(firstname);
210  args["last_name"] = OSD.FromString(lastname);
211  args["inventory_folder"] = OSD.FromUUID(InventoryFolder);
212  args["secure_session_id"] = OSD.FromUUID(SecureSessionID);
213  args["session_id"] = OSD.FromUUID(SessionID);
214 
215  args["service_session_id"] = OSD.FromString(ServiceSessionID);
216  args["start_pos"] = OSD.FromString(startpos.ToString());
217  args["client_ip"] = OSD.FromString(IPAddress);
218  args["viewer"] = OSD.FromString(Viewer);
219  args["channel"] = OSD.FromString(Channel);
220  args["mac"] = OSD.FromString(Mac);
221  args["id0"] = OSD.FromString(Id0);
222 
223  if (Appearance != null)
224  {
225  args["appearance_serial"] = OSD.FromInteger(Appearance.Serial);
226 
227  OSDMap appmap = Appearance.Pack(ctx);
228  args["packed_appearance"] = appmap;
229  }
230 
231  // Old, bad way. Keeping it fow now for backwards compatibility
232  // OBSOLETE -- soon to be deleted
233  if (ServiceURLs != null && ServiceURLs.Count > 0)
234  {
235  OSDArray urls = new OSDArray(ServiceURLs.Count * 2);
236  foreach (KeyValuePair<string, object> kvp in ServiceURLs)
237  {
238  //System.Console.WriteLine("XXX " + kvp.Key + "=" + kvp.Value);
239  urls.Add(OSD.FromString(kvp.Key));
240  urls.Add(OSD.FromString((kvp.Value == null) ? string.Empty : kvp.Value.ToString()));
241  }
242  args["service_urls"] = urls;
243  }
244 
245  // again, this time the right way
246  if (ServiceURLs != null && ServiceURLs.Count > 0)
247  {
248  OSDMap urls = new OSDMap();
249  foreach (KeyValuePair<string, object> kvp in ServiceURLs)
250  {
251  //System.Console.WriteLine("XXX " + kvp.Key + "=" + kvp.Value);
252  urls[kvp.Key] = OSD.FromString((kvp.Value == null) ? string.Empty : kvp.Value.ToString());
253  }
254  args["serviceurls"] = urls;
255  }
256 
257 
258  return args;
259  }
260 
265  public void UnpackAgentCircuitData(OSDMap args)
266  {
267  if (args["agent_id"] != null)
268  AgentID = args["agent_id"].AsUUID();
269  if (args["base_folder"] != null)
270  BaseFolder = args["base_folder"].AsUUID();
271  if (args["caps_path"] != null)
272  CapsPath = args["caps_path"].AsString();
273 
274  if ((args["children_seeds"] != null) && (args["children_seeds"].Type == OSDType.Array))
275  {
276  OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]);
277  ChildrenCapSeeds = new Dictionary<ulong, string>();
278  foreach (OSD o in childrenSeeds)
279  {
280  if (o.Type == OSDType.Map)
281  {
282  ulong handle = 0;
283  string seed = "";
284  OSDMap pair = (OSDMap)o;
285  if (pair["handle"] != null)
286  if (!UInt64.TryParse(pair["handle"].AsString(), out handle))
287  continue;
288  if (pair["seed"] != null)
289  seed = pair["seed"].AsString();
290  if (!ChildrenCapSeeds.ContainsKey(handle))
291  ChildrenCapSeeds.Add(handle, seed);
292  }
293  }
294  }
295  else
296  ChildrenCapSeeds = new Dictionary<ulong, string>();
297 
298  if (args["child"] != null)
299  child = args["child"].AsBoolean();
300  if (args["circuit_code"] != null)
301  UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode);
302  if (args["first_name"] != null)
303  firstname = args["first_name"].AsString();
304  if (args["last_name"] != null)
305  lastname = args["last_name"].AsString();
306  if (args["inventory_folder"] != null)
307  InventoryFolder = args["inventory_folder"].AsUUID();
308  if (args["secure_session_id"] != null)
309  SecureSessionID = args["secure_session_id"].AsUUID();
310  if (args["session_id"] != null)
311  SessionID = args["session_id"].AsUUID();
312  if (args["service_session_id"] != null)
313  ServiceSessionID = args["service_session_id"].AsString();
314  if (args["client_ip"] != null)
315  IPAddress = args["client_ip"].AsString();
316  if (args["viewer"] != null)
317  Viewer = args["viewer"].AsString();
318  if (args["channel"] != null)
319  Channel = args["channel"].AsString();
320  if (args["mac"] != null)
321  Mac = args["mac"].AsString();
322  if (args["id0"] != null)
323  Id0 = args["id0"].AsString();
324  if (args["teleport_flags"] != null)
325  teleportFlags = args["teleport_flags"].AsUInteger();
326 
327  if (args["start_pos"] != null)
328  Vector3.TryParse(args["start_pos"].AsString(), out startpos);
329 
330  //m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos);
331 
332  try
333  {
334  // Unpack various appearance elements
335  Appearance = new AvatarAppearance();
336 
337  // Eventually this code should be deprecated, use full appearance
338  // packing in packed_appearance
339  if (args["appearance_serial"] != null)
340  Appearance.Serial = args["appearance_serial"].AsInteger();
341 
342  if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map))
343  {
344  Appearance.Unpack((OSDMap)args["packed_appearance"]);
345 // m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
346  }
347  else
348  {
349  m_log.Warn("[AGENTCIRCUITDATA]: failed to find a valid packed_appearance");
350  }
351  }
352  catch (Exception e)
353  {
354  m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message);
355  }
356 
357  ServiceURLs = new Dictionary<string, object>();
358  // Try parse the new way, OSDMap
359  if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map)
360  {
361  OSDMap urls = (OSDMap)(args["serviceurls"]);
362  foreach (KeyValuePair<String, OSD> kvp in urls)
363  {
364  ServiceURLs[kvp.Key] = kvp.Value.AsString();
365  //System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]);
366 
367  }
368  }
369  // else try the old way, OSDArray
370  // OBSOLETE -- soon to be deleted
371  else if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array)
372  {
373  OSDArray urls = (OSDArray)(args["service_urls"]);
374  for (int i = 0; i < urls.Count / 2; i++)
375  {
376  ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString();
377  //System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString());
378 
379  }
380  }
381  }
382 
383  }
384 
385 
386 }
string lastname
Agent's account last name
uint circuitcode
Number given to the client when they log-in that they provide as credentials to the UDP server ...
OpenMetaverse.StructuredData.OSDArray OSDArray
AvatarAppearance Appearance
Avatar's Appearance
string Id0
The id0 as reported by the viewer at login
Contains the Avatar's Appearance and methods to manipulate the appearance.
OpenMetaverse.StructuredData.OSDMap OSDMap
string Channel
The channel strinf sent by the viewer at login
Vector3 startpos
Position the Agent's Avatar starts in the region
bool child
Root agent, or Child agent
Dictionary< string, object > ServiceURLs
OSDMap PackAgentCircuitData(EntityTransferContext ctx)
Pack AgentCircuitData into an OSDMap for transmission over LLSD XML or LLSD json
string IPAddress
The client's IP address, as captured by the login service
string Mac
The Mac address as reported by the viewer at login
UUID SessionID
Non secure Session ID
string firstname
Agent's account first name
UUID SecureSessionID
Random Unique GUID for this session. Client gets this at login and it's only supposed to be disclosed...
Dictionary< ulong, string > ChildrenCapSeeds
Seed caps for neighbor regions that the user can see into
Circuit data for an agent. Connection information shared between regions that accept UDP connections ...
OpenMetaverse.StructuredData.OSD OSD
UUID AgentID
Avatar Unique Agent Identifier
uint teleportFlags
How this agent got here
UUID BaseFolder
Agent's root inventory folder
void UnpackAgentCircuitData(OSDMap args)
Unpack agent circuit data map into an AgentCiruitData object