clockwerk-opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 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.Text;
31 using System.Xml;
32 using System.Collections.Generic;
33 using System.IO;
34 using Nini.Config;
35 using OpenSim.Framework;
36 using OpenSim.Framework.ServiceAuth;
37 using OpenSim.Server.Base;
38 using OpenSim.Services.Interfaces;
39 using OpenSim.Framework.Servers.HttpServer;
40 using OpenSim.Server.Handlers.Base;
41 using log4net;
42 using OpenMetaverse;
43  
44 namespace OpenSim.Server.Handlers.Asset
45 {
46 public class XInventoryInConnector : ServiceConnector
47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49  
50 private IInventoryService m_InventoryService;
51 private string m_ConfigName = "InventoryService";
52  
53 public XInventoryInConnector(IConfigSource config, IHttpServer server, string configName) :
54 base(config, server, configName)
55 {
56 if (configName != String.Empty)
57 m_ConfigName = configName;
58  
59 m_log.DebugFormat("[XInventoryInConnector]: Starting with config name {0}", m_ConfigName);
60  
61 IConfig serverConfig = config.Configs[m_ConfigName];
62 if (serverConfig == null)
63 throw new Exception(String.Format("No section '{0}' in config file", m_ConfigName));
64  
65 string inventoryService = serverConfig.GetString("LocalServiceModule",
66 String.Empty);
67  
68 if (inventoryService == String.Empty)
69 throw new Exception("No InventoryService in config file");
70  
71 Object[] args = new Object[] { config, m_ConfigName };
72 m_InventoryService =
73 ServerUtils.LoadPlugin<IInventoryService>(inventoryService, args);
74  
75 IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName);
76  
77 server.AddStreamHandler(new XInventoryConnectorPostHandler(m_InventoryService, auth));
78 }
79 }
80  
81 public class XInventoryConnectorPostHandler : BaseStreamHandler
82 {
83 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
84  
85 private IInventoryService m_InventoryService;
86  
87 public XInventoryConnectorPostHandler(IInventoryService service, IServiceAuth auth) :
88 base("POST", "/xinventory", auth)
89 {
90 m_InventoryService = service;
91 }
92  
93 protected override byte[] ProcessRequest(string path, Stream requestData,
94 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
95 {
96 StreamReader sr = new StreamReader(requestData);
97 string body = sr.ReadToEnd();
98 sr.Close();
99 body = body.Trim();
100  
101 //m_log.DebugFormat("[XXX]: query String: {0}", body);
102  
103 try
104 {
105 Dictionary<string, object> request =
106 ServerUtils.ParseQueryString(body);
107  
108 if (!request.ContainsKey("METHOD"))
109 return FailureResult();
110  
111 string method = request["METHOD"].ToString();
112 request.Remove("METHOD");
113  
114 switch (method)
115 {
116 case "CREATEUSERINVENTORY":
117 return HandleCreateUserInventory(request);
118 case "GETINVENTORYSKELETON":
119 return HandleGetInventorySkeleton(request);
120 case "GETROOTFOLDER":
121 return HandleGetRootFolder(request);
122 case "GETFOLDERFORTYPE":
123 return HandleGetFolderForType(request);
124 case "GETFOLDERCONTENT":
125 return HandleGetFolderContent(request);
126 case "GETFOLDERITEMS":
127 return HandleGetFolderItems(request);
128 case "ADDFOLDER":
129 return HandleAddFolder(request);
130 case "UPDATEFOLDER":
131 return HandleUpdateFolder(request);
132 case "MOVEFOLDER":
133 return HandleMoveFolder(request);
134 case "DELETEFOLDERS":
135 return HandleDeleteFolders(request);
136 case "PURGEFOLDER":
137 return HandlePurgeFolder(request);
138 case "ADDITEM":
139 return HandleAddItem(request);
140 case "UPDATEITEM":
141 return HandleUpdateItem(request);
142 case "MOVEITEMS":
143 return HandleMoveItems(request);
144 case "DELETEITEMS":
145 return HandleDeleteItems(request);
146 case "GETITEM":
147 return HandleGetItem(request);
148 case "GETFOLDER":
149 return HandleGetFolder(request);
150 case "GETACTIVEGESTURES":
151 return HandleGetActiveGestures(request);
152 case "GETASSETPERMISSIONS":
153 return HandleGetAssetPermissions(request);
154 }
155 m_log.DebugFormat("[XINVENTORY HANDLER]: unknown method request: {0}", method);
156 }
157 catch (Exception e)
158 {
159 m_log.Error(string.Format("[XINVENTORY HANDLER]: Exception {0} ", e.Message), e);
160 }
161  
162 return FailureResult();
163 }
164  
165 private byte[] FailureResult()
166 {
167 return BoolResult(false);
168 }
169  
170 private byte[] SuccessResult()
171 {
172 return BoolResult(true);
173 }
174  
175 private byte[] BoolResult(bool value)
176 {
177 XmlDocument doc = new XmlDocument();
178  
179 XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
180 "", "");
181  
182 doc.AppendChild(xmlnode);
183  
184 XmlElement rootElement = doc.CreateElement("", "ServerResponse",
185 "");
186  
187 doc.AppendChild(rootElement);
188  
189 XmlElement result = doc.CreateElement("", "RESULT", "");
190 result.AppendChild(doc.CreateTextNode(value.ToString()));
191  
192 rootElement.AppendChild(result);
193  
194 return Util.DocToBytes(doc);
195 }
196  
197 byte[] HandleCreateUserInventory(Dictionary<string,object> request)
198 {
199 Dictionary<string,object> result = new Dictionary<string,object>();
200  
201 if (!request.ContainsKey("PRINCIPAL"))
202 return FailureResult();
203  
204 if (m_InventoryService.CreateUserInventory(new UUID(request["PRINCIPAL"].ToString())))
205 result["RESULT"] = "True";
206 else
207 result["RESULT"] = "False";
208  
209 string xmlString = ServerUtils.BuildXmlResponse(result);
210  
211 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
212 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
213 }
214  
215 byte[] HandleGetInventorySkeleton(Dictionary<string,object> request)
216 {
217 Dictionary<string,object> result = new Dictionary<string,object>();
218  
219 if (!request.ContainsKey("PRINCIPAL"))
220 return FailureResult();
221  
222  
223 List<InventoryFolderBase> folders = m_InventoryService.GetInventorySkeleton(new UUID(request["PRINCIPAL"].ToString()));
224  
225 Dictionary<string, object> sfolders = new Dictionary<string, object>();
226 if (folders != null)
227 {
228 int i = 0;
229 foreach (InventoryFolderBase f in folders)
230 {
231 sfolders["folder_" + i.ToString()] = EncodeFolder(f);
232 i++;
233 }
234 }
235 result["FOLDERS"] = sfolders;
236  
237 string xmlString = ServerUtils.BuildXmlResponse(result);
238  
239 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
240 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
241 }
242  
243 byte[] HandleGetRootFolder(Dictionary<string,object> request)
244 {
245 Dictionary<string,object> result = new Dictionary<string,object>();
246  
247 UUID principal = UUID.Zero;
248 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
249 InventoryFolderBase rfolder = m_InventoryService.GetRootFolder(principal);
250 if (rfolder != null)
251 result["folder"] = EncodeFolder(rfolder);
252  
253 string xmlString = ServerUtils.BuildXmlResponse(result);
254  
255 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
256 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
257 }
258  
259 byte[] HandleGetFolderForType(Dictionary<string,object> request)
260 {
261 Dictionary<string,object> result = new Dictionary<string,object>();
262 UUID principal = UUID.Zero;
263 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
264 int type = 0;
265 Int32.TryParse(request["TYPE"].ToString(), out type);
266 InventoryFolderBase folder = m_InventoryService.GetFolderForType(principal, (AssetType)type);
267 if (folder != null)
268 result["folder"] = EncodeFolder(folder);
269  
270 string xmlString = ServerUtils.BuildXmlResponse(result);
271  
272 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
273 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
274 }
275  
276 byte[] HandleGetFolderContent(Dictionary<string,object> request)
277 {
278 Dictionary<string,object> result = new Dictionary<string,object>();
279 UUID principal = UUID.Zero;
280 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
281 UUID folderID = UUID.Zero;
282 UUID.TryParse(request["FOLDER"].ToString(), out folderID);
283  
284 InventoryCollection icoll = m_InventoryService.GetFolderContent(principal, folderID);
285 if (icoll != null)
286 {
287 Dictionary<string, object> folders = new Dictionary<string, object>();
288 int i = 0;
289 if (icoll.Folders != null)
290 {
291 foreach (InventoryFolderBase f in icoll.Folders)
292 {
293 folders["folder_" + i.ToString()] = EncodeFolder(f);
294 i++;
295 }
296 result["FOLDERS"] = folders;
297 }
298 if (icoll.Items != null)
299 {
300 i = 0;
301 Dictionary<string, object> items = new Dictionary<string, object>();
302 foreach (InventoryItemBase it in icoll.Items)
303 {
304 items["item_" + i.ToString()] = EncodeItem(it);
305 i++;
306 }
307 result["ITEMS"] = items;
308 }
309 }
310  
311 string xmlString = ServerUtils.BuildXmlResponse(result);
312  
313 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
314 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
315 }
316  
317 byte[] HandleGetFolderItems(Dictionary<string,object> request)
318 {
319 Dictionary<string,object> result = new Dictionary<string,object>();
320 UUID principal = UUID.Zero;
321 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
322 UUID folderID = UUID.Zero;
323 UUID.TryParse(request["FOLDER"].ToString(), out folderID);
324  
325 List<InventoryItemBase> items = m_InventoryService.GetFolderItems(principal, folderID);
326 Dictionary<string, object> sitems = new Dictionary<string, object>();
327  
328 if (items != null)
329 {
330 int i = 0;
331 foreach (InventoryItemBase item in items)
332 {
333 sitems["item_" + i.ToString()] = EncodeItem(item);
334 i++;
335 }
336 }
337 result["ITEMS"] = sitems;
338  
339 string xmlString = ServerUtils.BuildXmlResponse(result);
340  
341 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
342 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
343 }
344  
345 byte[] HandleAddFolder(Dictionary<string,object> request)
346 {
347 InventoryFolderBase folder = BuildFolder(request);
348  
349 if (m_InventoryService.AddFolder(folder))
350 return SuccessResult();
351 else
352 return FailureResult();
353 }
354  
355 byte[] HandleUpdateFolder(Dictionary<string,object> request)
356 {
357 InventoryFolderBase folder = BuildFolder(request);
358  
359 if (m_InventoryService.UpdateFolder(folder))
360 return SuccessResult();
361 else
362 return FailureResult();
363 }
364  
365 byte[] HandleMoveFolder(Dictionary<string,object> request)
366 {
367 UUID parentID = UUID.Zero;
368 UUID.TryParse(request["ParentID"].ToString(), out parentID);
369 UUID folderID = UUID.Zero;
370 UUID.TryParse(request["ID"].ToString(), out folderID);
371 UUID principal = UUID.Zero;
372 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
373  
374 InventoryFolderBase folder = new InventoryFolderBase(folderID, "", principal, parentID);
375 if (m_InventoryService.MoveFolder(folder))
376 return SuccessResult();
377 else
378 return FailureResult();
379  
380 }
381  
382 byte[] HandleDeleteFolders(Dictionary<string,object> request)
383 {
384 UUID principal = UUID.Zero;
385 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
386 List<string> slist = (List<string>)request["FOLDERS"];
387 List<UUID> uuids = new List<UUID>();
388 foreach (string s in slist)
389 {
390 UUID u = UUID.Zero;
391 if (UUID.TryParse(s, out u))
392 uuids.Add(u);
393 }
394  
395 if (m_InventoryService.DeleteFolders(principal, uuids))
396 return SuccessResult();
397 else
398 return
399 FailureResult();
400 }
401  
402 byte[] HandlePurgeFolder(Dictionary<string,object> request)
403 {
404 UUID folderID = UUID.Zero;
405 UUID.TryParse(request["ID"].ToString(), out folderID);
406  
407 InventoryFolderBase folder = new InventoryFolderBase(folderID);
408 if (m_InventoryService.PurgeFolder(folder))
409 return SuccessResult();
410 else
411 return FailureResult();
412 }
413  
414 byte[] HandleAddItem(Dictionary<string,object> request)
415 {
416 InventoryItemBase item = BuildItem(request);
417  
418 if (m_InventoryService.AddItem(item))
419 return SuccessResult();
420 else
421 return FailureResult();
422 }
423  
424 byte[] HandleUpdateItem(Dictionary<string,object> request)
425 {
426 InventoryItemBase item = BuildItem(request);
427  
428 if (m_InventoryService.UpdateItem(item))
429 return SuccessResult();
430 else
431 return FailureResult();
432 }
433  
434 byte[] HandleMoveItems(Dictionary<string,object> request)
435 {
436 List<string> idlist = (List<string>)request["IDLIST"];
437 List<string> destlist = (List<string>)request["DESTLIST"];
438 UUID principal = UUID.Zero;
439 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
440  
441 List<InventoryItemBase> items = new List<InventoryItemBase>();
442 int n = 0;
443 try
444 {
445 foreach (string s in idlist)
446 {
447 UUID u = UUID.Zero;
448 if (UUID.TryParse(s, out u))
449 {
450 UUID fid = UUID.Zero;
451 if (UUID.TryParse(destlist[n++], out fid))
452 {
453 InventoryItemBase item = new InventoryItemBase(u, principal);
454 item.Folder = fid;
455 items.Add(item);
456 }
457 }
458 }
459 }
460 catch (Exception e)
461 {
462 m_log.DebugFormat("[XINVENTORY IN CONNECTOR]: Exception in HandleMoveItems: {0}", e.Message);
463 return FailureResult();
464 }
465  
466 if (m_InventoryService.MoveItems(principal, items))
467 return SuccessResult();
468 else
469 return FailureResult();
470 }
471  
472 byte[] HandleDeleteItems(Dictionary<string,object> request)
473 {
474 UUID principal = UUID.Zero;
475 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
476 List<string> slist = (List<string>)request["ITEMS"];
477 List<UUID> uuids = new List<UUID>();
478 foreach (string s in slist)
479 {
480 UUID u = UUID.Zero;
481 if (UUID.TryParse(s, out u))
482 uuids.Add(u);
483 }
484  
485 if (m_InventoryService.DeleteItems(principal, uuids))
486 return SuccessResult();
487 else
488 return
489 FailureResult();
490 }
491  
492 byte[] HandleGetItem(Dictionary<string,object> request)
493 {
494 Dictionary<string,object> result = new Dictionary<string,object>();
495 UUID id = UUID.Zero;
496 UUID.TryParse(request["ID"].ToString(), out id);
497  
498 InventoryItemBase item = new InventoryItemBase(id);
499 item = m_InventoryService.GetItem(item);
500 if (item != null)
501 result["item"] = EncodeItem(item);
502  
503 string xmlString = ServerUtils.BuildXmlResponse(result);
504  
505 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
506 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
507 }
508  
509 byte[] HandleGetFolder(Dictionary<string,object> request)
510 {
511 Dictionary<string, object> result = new Dictionary<string, object>();
512 UUID id = UUID.Zero;
513 UUID.TryParse(request["ID"].ToString(), out id);
514  
515 InventoryFolderBase folder = new InventoryFolderBase(id);
516 folder = m_InventoryService.GetFolder(folder);
517 if (folder != null)
518 result["folder"] = EncodeFolder(folder);
519  
520 string xmlString = ServerUtils.BuildXmlResponse(result);
521  
522 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
523 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
524 }
525  
526 byte[] HandleGetActiveGestures(Dictionary<string,object> request)
527 {
528 Dictionary<string,object> result = new Dictionary<string,object>();
529 UUID principal = UUID.Zero;
530 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
531  
532 List<InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(principal);
533 Dictionary<string, object> items = new Dictionary<string, object>();
534 if (gestures != null)
535 {
536 int i = 0;
537 foreach (InventoryItemBase item in gestures)
538 {
539 items["item_" + i.ToString()] = EncodeItem(item);
540 i++;
541 }
542 }
543 result["ITEMS"] = items;
544  
545 string xmlString = ServerUtils.BuildXmlResponse(result);
546  
547 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
548 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
549 }
550  
551 byte[] HandleGetAssetPermissions(Dictionary<string,object> request)
552 {
553 Dictionary<string,object> result = new Dictionary<string,object>();
554 UUID principal = UUID.Zero;
555 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
556 UUID assetID = UUID.Zero;
557 UUID.TryParse(request["ASSET"].ToString(), out assetID);
558  
559 int perms = m_InventoryService.GetAssetPermissions(principal, assetID);
560  
561 result["RESULT"] = perms.ToString();
562 string xmlString = ServerUtils.BuildXmlResponse(result);
563  
564 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
565 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
566 }
567  
568 private Dictionary<string, object> EncodeFolder(InventoryFolderBase f)
569 {
570 Dictionary<string, object> ret = new Dictionary<string, object>();
571  
572 ret["ParentID"] = f.ParentID.ToString();
573 ret["Type"] = f.Type.ToString();
574 ret["Version"] = f.Version.ToString();
575 ret["Name"] = f.Name;
576 ret["Owner"] = f.Owner.ToString();
577 ret["ID"] = f.ID.ToString();
578  
579 return ret;
580 }
581  
582 private Dictionary<string, object> EncodeItem(InventoryItemBase item)
583 {
584 Dictionary<string, object> ret = new Dictionary<string, object>();
585  
586 ret["AssetID"] = item.AssetID.ToString();
587 ret["AssetType"] = item.AssetType.ToString();
588 ret["BasePermissions"] = item.BasePermissions.ToString();
589 ret["CreationDate"] = item.CreationDate.ToString();
590 if (item.CreatorId != null)
591 ret["CreatorId"] = item.CreatorId.ToString();
592 else
593 ret["CreatorId"] = String.Empty;
594 if (item.CreatorData != null)
595 ret["CreatorData"] = item.CreatorData;
596 else
597 ret["CreatorData"] = String.Empty;
598 ret["CurrentPermissions"] = item.CurrentPermissions.ToString();
599 ret["Description"] = item.Description.ToString();
600 ret["EveryOnePermissions"] = item.EveryOnePermissions.ToString();
601 ret["Flags"] = item.Flags.ToString();
602 ret["Folder"] = item.Folder.ToString();
603 ret["GroupID"] = item.GroupID.ToString();
604 ret["GroupOwned"] = item.GroupOwned.ToString();
605 ret["GroupPermissions"] = item.GroupPermissions.ToString();
606 ret["ID"] = item.ID.ToString();
607 ret["InvType"] = item.InvType.ToString();
608 ret["Name"] = item.Name.ToString();
609 ret["NextPermissions"] = item.NextPermissions.ToString();
610 ret["Owner"] = item.Owner.ToString();
611 ret["SalePrice"] = item.SalePrice.ToString();
612 ret["SaleType"] = item.SaleType.ToString();
613  
614 return ret;
615 }
616  
617 private InventoryFolderBase BuildFolder(Dictionary<string,object> data)
618 {
619 InventoryFolderBase folder = new InventoryFolderBase();
620  
621 folder.ParentID = new UUID(data["ParentID"].ToString());
622 folder.Type = short.Parse(data["Type"].ToString());
623 folder.Version = ushort.Parse(data["Version"].ToString());
624 folder.Name = data["Name"].ToString();
625 folder.Owner = new UUID(data["Owner"].ToString());
626 folder.ID = new UUID(data["ID"].ToString());
627  
628 return folder;
629 }
630  
631 private InventoryItemBase BuildItem(Dictionary<string,object> data)
632 {
633 InventoryItemBase item = new InventoryItemBase();
634  
635 item.AssetID = new UUID(data["AssetID"].ToString());
636 item.AssetType = int.Parse(data["AssetType"].ToString());
637 item.Name = data["Name"].ToString();
638 item.Owner = new UUID(data["Owner"].ToString());
639 item.ID = new UUID(data["ID"].ToString());
640 item.InvType = int.Parse(data["InvType"].ToString());
641 item.Folder = new UUID(data["Folder"].ToString());
642 item.CreatorId = data["CreatorId"].ToString();
643 item.CreatorData = data["CreatorData"].ToString();
644 item.Description = data["Description"].ToString();
645 item.NextPermissions = uint.Parse(data["NextPermissions"].ToString());
646 item.CurrentPermissions = uint.Parse(data["CurrentPermissions"].ToString());
647 item.BasePermissions = uint.Parse(data["BasePermissions"].ToString());
648 item.EveryOnePermissions = uint.Parse(data["EveryOnePermissions"].ToString());
649 item.GroupPermissions = uint.Parse(data["GroupPermissions"].ToString());
650 item.GroupID = new UUID(data["GroupID"].ToString());
651 item.GroupOwned = bool.Parse(data["GroupOwned"].ToString());
652 item.SalePrice = int.Parse(data["SalePrice"].ToString());
653 item.SaleType = byte.Parse(data["SaleType"].ToString());
654 item.Flags = uint.Parse(data["Flags"].ToString());
655 item.CreationDate = int.Parse(data["CreationDate"].ToString());
656  
657 return item;
658 }
659  
660 }
661 }