diff options
Merge branch 'master' into presence-refactor
This merge was very conflicted. I think I got them all, but I can't be sure.
I had to merge to master or risk divergence to the point of unmergeability.
Diffstat (limited to 'OpenSim/Services/Connectors/Inventory')
-rw-r--r-- | OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs new file mode 100644 index 0000000..b9ccd7e --- /dev/null +++ b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs | |||
@@ -0,0 +1,535 @@ | |||
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 log4net; | ||
29 | using System; | ||
30 | using System.Collections.Generic; | ||
31 | using System.IO; | ||
32 | using System.Reflection; | ||
33 | using Nini.Config; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Console; | ||
36 | using OpenSim.Framework.Communications; | ||
37 | using OpenSim.Framework.Servers.HttpServer; | ||
38 | using OpenSim.Services.Interfaces; | ||
39 | using OpenSim.Server.Base; | ||
40 | using OpenMetaverse; | ||
41 | |||
42 | namespace OpenSim.Services.Connectors | ||
43 | { | ||
44 | public class XInventoryServicesConnector : IInventoryService | ||
45 | { | ||
46 | private static readonly ILog m_log = | ||
47 | LogManager.GetLogger( | ||
48 | MethodBase.GetCurrentMethod().DeclaringType); | ||
49 | |||
50 | private string m_ServerURI = String.Empty; | ||
51 | |||
52 | public XInventoryServicesConnector() | ||
53 | { | ||
54 | } | ||
55 | |||
56 | public XInventoryServicesConnector(string serverURI) | ||
57 | { | ||
58 | m_ServerURI = serverURI.TrimEnd('/'); | ||
59 | } | ||
60 | |||
61 | public XInventoryServicesConnector(IConfigSource source) | ||
62 | { | ||
63 | Initialise(source); | ||
64 | } | ||
65 | |||
66 | public virtual void Initialise(IConfigSource source) | ||
67 | { | ||
68 | IConfig assetConfig = source.Configs["InventoryService"]; | ||
69 | if (assetConfig == null) | ||
70 | { | ||
71 | m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpanSim.ini"); | ||
72 | throw new Exception("Inventory connector init error"); | ||
73 | } | ||
74 | |||
75 | string serviceURI = assetConfig.GetString("InventoryServerURI", | ||
76 | String.Empty); | ||
77 | |||
78 | if (serviceURI == String.Empty) | ||
79 | { | ||
80 | m_log.Error("[INVENTORY CONNECTOR]: No Server URI named in section InventoryService"); | ||
81 | throw new Exception("Inventory connector init error"); | ||
82 | } | ||
83 | m_ServerURI = serviceURI; | ||
84 | } | ||
85 | |||
86 | public bool CreateUserInventory(UUID principalID) | ||
87 | { | ||
88 | Dictionary<string,object> ret = MakeRequest("CREATEUSERINVENTORY", | ||
89 | new Dictionary<string,object> { | ||
90 | { "PRINCIPAL", principalID.ToString() } | ||
91 | }); | ||
92 | |||
93 | if (ret == null) | ||
94 | return false; | ||
95 | |||
96 | return bool.Parse(ret["RESULT"].ToString()); | ||
97 | } | ||
98 | |||
99 | public List<InventoryFolderBase> GetInventorySkeleton(UUID principalID) | ||
100 | { | ||
101 | Dictionary<string,object> ret = MakeRequest("GETINVENTORYSKELETON", | ||
102 | new Dictionary<string,object> { | ||
103 | { "PRINCIPAL", principalID.ToString() } | ||
104 | }); | ||
105 | |||
106 | if (ret == null) | ||
107 | return null; | ||
108 | |||
109 | List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); | ||
110 | |||
111 | foreach (Object o in ret.Values) | ||
112 | folders.Add(BuildFolder((Dictionary<string,object>)o)); | ||
113 | |||
114 | return folders; | ||
115 | } | ||
116 | |||
117 | public InventoryFolderBase GetRootFolder(UUID principalID) | ||
118 | { | ||
119 | Dictionary<string,object> ret = MakeRequest("GETROOTFOLDER", | ||
120 | new Dictionary<string,object> { | ||
121 | { "PRINCIPAL", principalID.ToString() } | ||
122 | }); | ||
123 | |||
124 | if (ret == null) | ||
125 | return null; | ||
126 | |||
127 | if (ret.Count == 0) | ||
128 | return null; | ||
129 | |||
130 | return BuildFolder(ret); | ||
131 | } | ||
132 | |||
133 | public InventoryFolderBase GetFolderForType(UUID principalID, AssetType type) | ||
134 | { | ||
135 | Dictionary<string,object> ret = MakeRequest("GETFOLDERFORTYPE", | ||
136 | new Dictionary<string,object> { | ||
137 | { "PRINCIPAL", principalID.ToString() }, | ||
138 | { "TYPE", ((int)type).ToString() } | ||
139 | }); | ||
140 | |||
141 | if (ret == null) | ||
142 | return null; | ||
143 | |||
144 | if (ret.Count == 0) | ||
145 | return null; | ||
146 | |||
147 | return BuildFolder(ret); | ||
148 | } | ||
149 | |||
150 | public InventoryCollection GetFolderContent(UUID principalID, UUID folderID) | ||
151 | { | ||
152 | Dictionary<string,object> ret = MakeRequest("GETFOLDERCONTENT", | ||
153 | new Dictionary<string,object> { | ||
154 | { "PRINCIPAL", principalID.ToString() }, | ||
155 | { "FOLDER", folderID.ToString() } | ||
156 | }); | ||
157 | |||
158 | if (ret == null) | ||
159 | return null; | ||
160 | |||
161 | if (ret.Count == 0) | ||
162 | return null; | ||
163 | |||
164 | |||
165 | InventoryCollection inventory = new InventoryCollection(); | ||
166 | inventory.Folders = new List<InventoryFolderBase>(); | ||
167 | inventory.Items = new List<InventoryItemBase>(); | ||
168 | inventory.UserID = principalID; | ||
169 | |||
170 | Dictionary<string,object> folders = | ||
171 | (Dictionary<string,object>)ret["FOLDERS"]; | ||
172 | Dictionary<string,object> items = | ||
173 | (Dictionary<string,object>)ret["ITEMS"]; | ||
174 | |||
175 | foreach (Object o in folders.Values) | ||
176 | inventory.Folders.Add(BuildFolder((Dictionary<string,object>)o)); | ||
177 | foreach (Object o in items.Values) | ||
178 | inventory.Items.Add(BuildItem((Dictionary<string,object>)o)); | ||
179 | |||
180 | return inventory; | ||
181 | } | ||
182 | |||
183 | public List<InventoryItemBase> GetFolderItems(UUID principalID, UUID folderID) | ||
184 | { | ||
185 | Dictionary<string,object> ret = MakeRequest("GETFOLDERCONTENT", | ||
186 | new Dictionary<string,object> { | ||
187 | { "PRINCIPAL", principalID.ToString() }, | ||
188 | { "FOLDER", folderID.ToString() } | ||
189 | }); | ||
190 | |||
191 | if (ret == null) | ||
192 | return null; | ||
193 | |||
194 | if (ret.Count == 0) | ||
195 | return null; | ||
196 | |||
197 | |||
198 | List<InventoryItemBase> items = new List<InventoryItemBase>(); | ||
199 | |||
200 | foreach (Object o in ret.Values) | ||
201 | items.Add(BuildItem((Dictionary<string,object>)o)); | ||
202 | |||
203 | return items; | ||
204 | } | ||
205 | |||
206 | public bool AddFolder(InventoryFolderBase folder) | ||
207 | { | ||
208 | Dictionary<string,object> ret = MakeRequest("ADDFOLDER", | ||
209 | new Dictionary<string,object> { | ||
210 | { "ParentID", folder.ParentID.ToString() }, | ||
211 | { "Type", folder.Type.ToString() }, | ||
212 | { "Version", folder.Version.ToString() }, | ||
213 | { "Name", folder.Name.ToString() }, | ||
214 | { "Owner", folder.Owner.ToString() }, | ||
215 | { "ID", folder.ID.ToString() } | ||
216 | }); | ||
217 | |||
218 | if (ret == null) | ||
219 | return false; | ||
220 | |||
221 | return bool.Parse(ret["RESULT"].ToString()); | ||
222 | } | ||
223 | |||
224 | public bool UpdateFolder(InventoryFolderBase folder) | ||
225 | { | ||
226 | Dictionary<string,object> ret = MakeRequest("UPDATEFOLDER", | ||
227 | new Dictionary<string,object> { | ||
228 | { "ParentID", folder.ParentID.ToString() }, | ||
229 | { "Type", folder.Type.ToString() }, | ||
230 | { "Version", folder.Version.ToString() }, | ||
231 | { "Name", folder.Name.ToString() }, | ||
232 | { "Owner", folder.Owner.ToString() }, | ||
233 | { "ID", folder.ID.ToString() } | ||
234 | }); | ||
235 | |||
236 | if (ret == null) | ||
237 | return false; | ||
238 | |||
239 | return bool.Parse(ret["RESULT"].ToString()); | ||
240 | } | ||
241 | |||
242 | public bool MoveFolder(InventoryFolderBase folder) | ||
243 | { | ||
244 | Dictionary<string,object> ret = MakeRequest("MOVEFOLDER", | ||
245 | new Dictionary<string,object> { | ||
246 | { "ParentID", folder.ParentID.ToString() }, | ||
247 | { "ID", folder.ID.ToString() } | ||
248 | }); | ||
249 | |||
250 | if (ret == null) | ||
251 | return false; | ||
252 | |||
253 | return bool.Parse(ret["RESULT"].ToString()); | ||
254 | } | ||
255 | |||
256 | public bool DeleteFolders(UUID principalID, List<UUID> folderIDs) | ||
257 | { | ||
258 | List<string> slist = new List<string>(); | ||
259 | |||
260 | foreach (UUID f in folderIDs) | ||
261 | slist.Add(f.ToString()); | ||
262 | |||
263 | Dictionary<string,object> ret = MakeRequest("DELETEFOLDERS", | ||
264 | new Dictionary<string,object> { | ||
265 | { "PRINCIPAL", principalID.ToString() }, | ||
266 | { "FOLDERS", slist } | ||
267 | }); | ||
268 | |||
269 | if (ret == null) | ||
270 | return false; | ||
271 | |||
272 | return bool.Parse(ret["RESULT"].ToString()); | ||
273 | } | ||
274 | |||
275 | public bool PurgeFolder(InventoryFolderBase folder) | ||
276 | { | ||
277 | Dictionary<string,object> ret = MakeRequest("PURGEFOLDER", | ||
278 | new Dictionary<string,object> { | ||
279 | { "ID", folder.ID.ToString() } | ||
280 | }); | ||
281 | |||
282 | if (ret == null) | ||
283 | return false; | ||
284 | |||
285 | return bool.Parse(ret["RESULT"].ToString()); | ||
286 | } | ||
287 | |||
288 | public bool AddItem(InventoryItemBase item) | ||
289 | { | ||
290 | Dictionary<string,object> ret = MakeRequest("ADDITEM", | ||
291 | new Dictionary<string,object> { | ||
292 | { "AssetID", item.AssetID.ToString() }, | ||
293 | { "AssetType", item.AssetType.ToString() }, | ||
294 | { "Name", item.Name.ToString() }, | ||
295 | { "Owner", item.Owner.ToString() }, | ||
296 | { "ID", item.ID.ToString() }, | ||
297 | { "InvType", item.InvType.ToString() }, | ||
298 | { "Folder", item.Folder.ToString() }, | ||
299 | { "CreatorId", item.CreatorId.ToString() }, | ||
300 | { "Description", item.Description.ToString() }, | ||
301 | { "NextPermissions", item.NextPermissions.ToString() }, | ||
302 | { "CurrentPermissions", item.CurrentPermissions.ToString() }, | ||
303 | { "BasePermissions", item.BasePermissions.ToString() }, | ||
304 | { "EveryOnePermissions", item.EveryOnePermissions.ToString() }, | ||
305 | { "GroupPermissions", item.GroupPermissions.ToString() }, | ||
306 | { "GroupID", item.GroupID.ToString() }, | ||
307 | { "GroupOwned", item.GroupOwned.ToString() }, | ||
308 | { "SalePrice", item.SalePrice.ToString() }, | ||
309 | { "SaleType", item.SaleType.ToString() }, | ||
310 | { "Flags", item.Flags.ToString() }, | ||
311 | { "CreationDate", item.CreationDate.ToString() } | ||
312 | }); | ||
313 | |||
314 | if (ret == null) | ||
315 | return false; | ||
316 | |||
317 | return bool.Parse(ret["RESULT"].ToString()); | ||
318 | } | ||
319 | |||
320 | public bool UpdateItem(InventoryItemBase item) | ||
321 | { | ||
322 | Dictionary<string,object> ret = MakeRequest("UPDATEITEM", | ||
323 | new Dictionary<string,object> { | ||
324 | { "AssetID", item.AssetID.ToString() }, | ||
325 | { "AssetType", item.AssetType.ToString() }, | ||
326 | { "Name", item.Name.ToString() }, | ||
327 | { "Owner", item.Owner.ToString() }, | ||
328 | { "ID", item.ID.ToString() }, | ||
329 | { "InvType", item.InvType.ToString() }, | ||
330 | { "Folder", item.Folder.ToString() }, | ||
331 | { "CreatorId", item.CreatorId.ToString() }, | ||
332 | { "Description", item.Description.ToString() }, | ||
333 | { "NextPermissions", item.NextPermissions.ToString() }, | ||
334 | { "CurrentPermissions", item.CurrentPermissions.ToString() }, | ||
335 | { "BasePermissions", item.BasePermissions.ToString() }, | ||
336 | { "EveryOnePermissions", item.EveryOnePermissions.ToString() }, | ||
337 | { "GroupPermissions", item.GroupPermissions.ToString() }, | ||
338 | { "GroupID", item.GroupID.ToString() }, | ||
339 | { "GroupOwned", item.GroupOwned.ToString() }, | ||
340 | { "SalePrice", item.SalePrice.ToString() }, | ||
341 | { "SaleType", item.SaleType.ToString() }, | ||
342 | { "Flags", item.Flags.ToString() }, | ||
343 | { "CreationDate", item.CreationDate.ToString() } | ||
344 | }); | ||
345 | |||
346 | if (ret == null) | ||
347 | return false; | ||
348 | |||
349 | return bool.Parse(ret["RESULT"].ToString()); | ||
350 | } | ||
351 | |||
352 | public bool MoveItems(UUID principalID, List<InventoryItemBase> items) | ||
353 | { | ||
354 | List<string> idlist = new List<string>(); | ||
355 | List<string> destlist = new List<string>(); | ||
356 | |||
357 | foreach (InventoryItemBase item in items) | ||
358 | { | ||
359 | idlist.Add(item.ID.ToString()); | ||
360 | destlist.Add(item.Folder.ToString()); | ||
361 | } | ||
362 | |||
363 | Dictionary<string,object> ret = MakeRequest("MOVEITEMS", | ||
364 | new Dictionary<string,object> { | ||
365 | { "PrincipalID", principalID.ToString() }, | ||
366 | { "IDLIST", idlist }, | ||
367 | { "DESTLIST", destlist } | ||
368 | }); | ||
369 | |||
370 | if (ret == null) | ||
371 | return false; | ||
372 | |||
373 | return bool.Parse(ret["RESULT"].ToString()); | ||
374 | } | ||
375 | |||
376 | public bool DeleteItems(UUID principalID, List<UUID> itemIDs) | ||
377 | { | ||
378 | List<string> slist = new List<string>(); | ||
379 | |||
380 | foreach (UUID f in itemIDs) | ||
381 | slist.Add(f.ToString()); | ||
382 | |||
383 | Dictionary<string,object> ret = MakeRequest("DELETEITEMS", | ||
384 | new Dictionary<string,object> { | ||
385 | { "PRINCIPAL", principalID.ToString() }, | ||
386 | { "ITEMS", slist } | ||
387 | }); | ||
388 | |||
389 | if (ret == null) | ||
390 | return false; | ||
391 | |||
392 | return bool.Parse(ret["RESULT"].ToString()); | ||
393 | } | ||
394 | |||
395 | public InventoryItemBase GetItem(InventoryItemBase item) | ||
396 | { | ||
397 | Dictionary<string,object> ret = MakeRequest("GETITEM", | ||
398 | new Dictionary<string,object> { | ||
399 | { "ID", item.ID.ToString() } | ||
400 | }); | ||
401 | |||
402 | if (ret == null) | ||
403 | return null; | ||
404 | |||
405 | if (ret.Count == 0) | ||
406 | return null; | ||
407 | |||
408 | return BuildItem(ret); | ||
409 | } | ||
410 | |||
411 | public InventoryFolderBase GetFolder(InventoryFolderBase folder) | ||
412 | { | ||
413 | Dictionary<string,object> ret = MakeRequest("GETFOLDER", | ||
414 | new Dictionary<string,object> { | ||
415 | { "ID", folder.ID.ToString() } | ||
416 | }); | ||
417 | |||
418 | if (ret == null) | ||
419 | return null; | ||
420 | |||
421 | if (ret.Count == 0) | ||
422 | return null; | ||
423 | |||
424 | return BuildFolder(ret); | ||
425 | } | ||
426 | |||
427 | public List<InventoryItemBase> GetActiveGestures(UUID principalID) | ||
428 | { | ||
429 | Dictionary<string,object> ret = MakeRequest("GETACTIVEGESTURES", | ||
430 | new Dictionary<string,object> { | ||
431 | { "PRINCIPAL", principalID.ToString() } | ||
432 | }); | ||
433 | |||
434 | if (ret == null) | ||
435 | return null; | ||
436 | |||
437 | List<InventoryItemBase> items = new List<InventoryItemBase>(); | ||
438 | |||
439 | foreach (Object o in ret.Values) | ||
440 | items.Add(BuildItem((Dictionary<string,object>)o)); | ||
441 | |||
442 | return items; | ||
443 | } | ||
444 | |||
445 | public int GetAssetPermissions(UUID principalID, UUID assetID) | ||
446 | { | ||
447 | Dictionary<string,object> ret = MakeRequest("GETASSETPERMISSIONS", | ||
448 | new Dictionary<string,object> { | ||
449 | { "PRINCIPAL", principalID.ToString() }, | ||
450 | { "ASSET", assetID.ToString() } | ||
451 | }); | ||
452 | |||
453 | if (ret == null) | ||
454 | return 0; | ||
455 | |||
456 | return int.Parse(ret["RESULT"].ToString()); | ||
457 | } | ||
458 | |||
459 | |||
460 | // These are either obsolete or unused | ||
461 | // | ||
462 | public InventoryCollection GetUserInventory(UUID principalID) | ||
463 | { | ||
464 | return null; | ||
465 | } | ||
466 | |||
467 | public void GetUserInventory(UUID principalID, InventoryReceiptCallback callback) | ||
468 | { | ||
469 | } | ||
470 | |||
471 | public bool HasInventoryForUser(UUID principalID) | ||
472 | { | ||
473 | return false; | ||
474 | } | ||
475 | |||
476 | // Helpers | ||
477 | // | ||
478 | private Dictionary<string,object> MakeRequest(string method, | ||
479 | Dictionary<string,object> sendData) | ||
480 | { | ||
481 | sendData["METHOD"] = method; | ||
482 | |||
483 | string reply = SynchronousRestFormsRequester.MakeRequest("POST", | ||
484 | m_ServerURI + "/xinventory", | ||
485 | ServerUtils.BuildQueryString(sendData)); | ||
486 | |||
487 | Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse( | ||
488 | reply); | ||
489 | |||
490 | return replyData; | ||
491 | } | ||
492 | |||
493 | private InventoryFolderBase BuildFolder(Dictionary<string,object> data) | ||
494 | { | ||
495 | InventoryFolderBase folder = new InventoryFolderBase(); | ||
496 | |||
497 | folder.ParentID = new UUID(data["ParentID"].ToString()); | ||
498 | folder.Type = short.Parse(data["Type"].ToString()); | ||
499 | folder.Version = ushort.Parse(data["Version"].ToString()); | ||
500 | folder.Name = data["Name"].ToString(); | ||
501 | folder.Owner = new UUID(data["Owner"].ToString()); | ||
502 | folder.ID = new UUID(data["ID"].ToString()); | ||
503 | |||
504 | return folder; | ||
505 | } | ||
506 | |||
507 | private InventoryItemBase BuildItem(Dictionary<string,object> data) | ||
508 | { | ||
509 | InventoryItemBase item = new InventoryItemBase(); | ||
510 | |||
511 | item.AssetID = new UUID(data["AssetID"].ToString()); | ||
512 | item.AssetType = int.Parse(data["AssetType"].ToString()); | ||
513 | item.Name = data["Name"].ToString(); | ||
514 | item.Owner = new UUID(data["Owner"].ToString()); | ||
515 | item.ID = new UUID(data["ID"].ToString()); | ||
516 | item.InvType = int.Parse(data["InvType"].ToString()); | ||
517 | item.Folder = new UUID(data["Folder"].ToString()); | ||
518 | item.CreatorId = data["CreatorId"].ToString(); | ||
519 | item.Description = data["Description"].ToString(); | ||
520 | item.NextPermissions = uint.Parse(data["NextPermissions"].ToString()); | ||
521 | item.CurrentPermissions = uint.Parse(data["CurrentPermissions"].ToString()); | ||
522 | item.BasePermissions = uint.Parse(data["BasePermissions"].ToString()); | ||
523 | item.EveryOnePermissions = uint.Parse(data["EveryOnePermissions"].ToString()); | ||
524 | item.GroupPermissions = uint.Parse(data["GroupPermissions"].ToString()); | ||
525 | item.GroupID = new UUID(data["GroupID"].ToString()); | ||
526 | item.GroupOwned = bool.Parse(data["GroupOwned"].ToString()); | ||
527 | item.SalePrice = int.Parse(data["SalePrice"].ToString()); | ||
528 | item.SaleType = byte.Parse(data["SaleType"].ToString()); | ||
529 | item.Flags = uint.Parse(data["Flags"].ToString()); | ||
530 | item.CreationDate = int.Parse(data["CreationDate"].ToString()); | ||
531 | |||
532 | return item; | ||
533 | } | ||
534 | } | ||
535 | } | ||