aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs')
-rw-r--r--OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs535
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
28using log4net;
29using System;
30using System.Collections.Generic;
31using System.IO;
32using System.Reflection;
33using Nini.Config;
34using OpenSim.Framework;
35using OpenSim.Framework.Console;
36using OpenSim.Framework.Communications;
37using OpenSim.Framework.Servers.HttpServer;
38using OpenSim.Services.Interfaces;
39using OpenSim.Server.Base;
40using OpenMetaverse;
41
42namespace 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}