aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/HypergridService
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/HypergridService')
-rw-r--r--OpenSim/Services/HypergridService/HGAssetService.cs181
-rw-r--r--OpenSim/Services/HypergridService/HGInventoryService.cs333
2 files changed, 514 insertions, 0 deletions
diff --git a/OpenSim/Services/HypergridService/HGAssetService.cs b/OpenSim/Services/HypergridService/HGAssetService.cs
new file mode 100644
index 0000000..6e0d4cd
--- /dev/null
+++ b/OpenSim/Services/HypergridService/HGAssetService.cs
@@ -0,0 +1,181 @@
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 */
27using System;
28using System.Collections.Generic;
29using System.IO;
30using System.Reflection;
31using System.Xml;
32
33using Nini.Config;
34using log4net;
35using OpenMetaverse;
36
37using OpenSim.Framework;
38using OpenSim.Server.Base;
39using OpenSim.Services.Interfaces;
40using OpenSim.Services.AssetService;
41
42namespace OpenSim.Services.HypergridService
43{
44 public class HGAssetService : OpenSim.Services.AssetService.AssetService, IAssetService
45 {
46 private static readonly ILog m_log =
47 LogManager.GetLogger(
48 MethodBase.GetCurrentMethod().DeclaringType);
49
50 private string m_ProfileServiceURL;
51 private IUserAccountService m_UserAccountService;
52
53 private UserAccountCache m_Cache;
54
55 public HGAssetService(IConfigSource config) : base(config)
56 {
57 m_log.Debug("[HGAsset Service]: Starting");
58 IConfig assetConfig = config.Configs["HGAssetService"];
59 if (assetConfig == null)
60 throw new Exception("No HGAssetService configuration");
61
62 string userAccountsDll = assetConfig.GetString("UserAccountsService", string.Empty);
63 if (userAccountsDll == string.Empty)
64 throw new Exception("Please specify UserAccountsService in HGAssetService configuration");
65
66 Object[] args = new Object[] { config };
67 m_UserAccountService = ServerUtils.LoadPlugin<IUserAccountService>(userAccountsDll, args);
68 if (m_UserAccountService == null)
69 throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll));
70
71 m_ProfileServiceURL = assetConfig.GetString("ProfileServerURI", string.Empty);
72
73 m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
74 }
75
76 #region IAssetService overrides
77 public override AssetBase Get(string id)
78 {
79 AssetBase asset = base.Get(id);
80
81 if (asset == null)
82 return null;
83
84 if (asset.Metadata.Type == (sbyte)AssetType.Object)
85 asset.Data = AdjustIdentifiers(asset.Data); ;
86
87 AdjustIdentifiers(asset.Metadata);
88
89 return asset;
90 }
91
92 public override AssetMetadata GetMetadata(string id)
93 {
94 AssetMetadata meta = base.GetMetadata(id);
95
96 if (meta == null)
97 return null;
98
99 AdjustIdentifiers(meta);
100
101 return meta;
102 }
103
104 public override byte[] GetData(string id)
105 {
106 byte[] data = base.GetData(id);
107
108 if (data == null)
109 return null;
110
111 return AdjustIdentifiers(data);
112 }
113
114 //public virtual bool Get(string id, Object sender, AssetRetrieved handler)
115
116 public override bool Delete(string id)
117 {
118 // NOGO
119 return false;
120 }
121
122 #endregion
123
124 protected void AdjustIdentifiers(AssetMetadata meta)
125 {
126 UserAccount creator = m_Cache.GetUser(meta.CreatorID);
127 if (creator != null)
128 meta.CreatorID = m_ProfileServiceURL + "/" + meta.CreatorID + ";" + creator.FirstName + " " + creator.LastName;
129
130 }
131
132 protected byte[] AdjustIdentifiers(byte[] data)
133 {
134 string xml = Utils.BytesToString(data);
135 return Utils.StringToBytes(RewriteSOP(xml));
136 }
137
138 protected string RewriteSOP(string xml)
139 {
140 XmlDocument doc = new XmlDocument();
141 doc.LoadXml(xml);
142 XmlNodeList sops = doc.GetElementsByTagName("SceneObjectPart");
143
144 foreach (XmlNode sop in sops)
145 {
146 UserAccount creator = null;
147 bool hasCreatorData = false;
148 XmlNodeList nodes = sop.ChildNodes;
149 foreach (XmlNode node in nodes)
150 {
151 if (node.Name == "CreatorID")
152 creator = m_Cache.GetUser(node.InnerText);
153 if (node.Name == "CreatorData" && node.InnerText != null && node.InnerText != string.Empty)
154 hasCreatorData = true;
155
156 //if (node.Name == "OwnerID")
157 //{
158 // UserAccount owner = GetUser(node.InnerText);
159 // if (owner != null)
160 // node.InnerText = m_ProfileServiceURL + "/" + node.InnerText + "/" + owner.FirstName + " " + owner.LastName;
161 //}
162 }
163 if (!hasCreatorData && creator != null)
164 {
165 XmlElement creatorData = doc.CreateElement("CreatorData");
166 creatorData.InnerText = m_ProfileServiceURL + "/" + creator.PrincipalID + ";" + creator.FirstName + " " + creator.LastName;
167 sop.AppendChild(creatorData);
168 }
169 }
170
171 using (StringWriter wr = new StringWriter())
172 {
173 doc.Save(wr);
174 return wr.ToString();
175 }
176
177 }
178
179 }
180
181}
diff --git a/OpenSim/Services/HypergridService/HGInventoryService.cs b/OpenSim/Services/HypergridService/HGInventoryService.cs
new file mode 100644
index 0000000..a04f0c4
--- /dev/null
+++ b/OpenSim/Services/HypergridService/HGInventoryService.cs
@@ -0,0 +1,333 @@
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 System;
29using System.Collections.Generic;
30using OpenMetaverse;
31using log4net;
32using Nini.Config;
33using System.Reflection;
34using OpenSim.Services.Base;
35using OpenSim.Services.Interfaces;
36using OpenSim.Services.InventoryService;
37using OpenSim.Data;
38using OpenSim.Framework;
39using OpenSim.Server.Base;
40
41namespace OpenSim.Services.HypergridService
42{
43 public class HGInventoryService : XInventoryService, IInventoryService
44 {
45 private static readonly ILog m_log =
46 LogManager.GetLogger(
47 MethodBase.GetCurrentMethod().DeclaringType);
48
49 protected new IXInventoryData m_Database;
50
51 private string m_ProfileServiceURL;
52 private IUserAccountService m_UserAccountService;
53
54 private UserAccountCache m_Cache;
55
56 public HGInventoryService(IConfigSource config)
57 : base(config)
58 {
59 m_log.Debug("[HGInventory Service]: Starting");
60
61 string dllName = String.Empty;
62 string connString = String.Empty;
63 //string realm = "Inventory"; // OSG version doesn't use this
64
65 //
66 // Try reading the [DatabaseService] section, if it exists
67 //
68 IConfig dbConfig = config.Configs["DatabaseService"];
69 if (dbConfig != null)
70 {
71 if (dllName == String.Empty)
72 dllName = dbConfig.GetString("StorageProvider", String.Empty);
73 if (connString == String.Empty)
74 connString = dbConfig.GetString("ConnectionString", String.Empty);
75 }
76
77 //
78 // Try reading the [InventoryService] section, if it exists
79 //
80 IConfig invConfig = config.Configs["HGInventoryService"];
81 if (invConfig != null)
82 {
83 dllName = invConfig.GetString("StorageProvider", dllName);
84 connString = invConfig.GetString("ConnectionString", connString);
85
86 // realm = authConfig.GetString("Realm", realm);
87 string userAccountsDll = invConfig.GetString("UserAccountsService", string.Empty);
88 if (userAccountsDll == string.Empty)
89 throw new Exception("Please specify UserAccountsService in HGInventoryService configuration");
90
91 Object[] args = new Object[] { config };
92 m_UserAccountService = ServerUtils.LoadPlugin<IUserAccountService>(userAccountsDll, args);
93 if (m_UserAccountService == null)
94 throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll));
95
96 m_ProfileServiceURL = invConfig.GetString("ProfileServerURI", string.Empty);
97
98 m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
99 }
100
101 //
102 // We tried, but this doesn't exist. We can't proceed.
103 //
104 if (dllName == String.Empty)
105 throw new Exception("No StorageProvider configured");
106
107 m_Database = LoadPlugin<IXInventoryData>(dllName,
108 new Object[] {connString, String.Empty});
109 if (m_Database == null)
110 throw new Exception("Could not find a storage interface in the given module");
111
112 m_log.Debug("[HG INVENTORY SERVICE]: Starting...");
113 }
114
115 public override bool CreateUserInventory(UUID principalID)
116 {
117 // NOGO
118 return false;
119 }
120
121
122 public override List<InventoryFolderBase> GetInventorySkeleton(UUID principalID)
123 {
124 // NOGO for this inventory service
125 return new List<InventoryFolderBase>();
126 }
127
128 public override InventoryFolderBase GetRootFolder(UUID principalID)
129 {
130 // Warp! Root folder for travelers
131 XInventoryFolder[] folders = m_Database.GetFolders(
132 new string[] { "agentID", "folderName"},
133 new string[] { principalID.ToString(), "My Suitcase" });
134
135 if (folders.Length > 0)
136 return ConvertToOpenSim(folders[0]);
137
138 // make one
139 XInventoryFolder suitcase = CreateFolder(principalID, UUID.Zero, (int)AssetType.Folder, "My Suitcase");
140 return ConvertToOpenSim(suitcase);
141 }
142
143 //private bool CreateSystemFolders(UUID principalID, XInventoryFolder suitcase)
144 //{
145
146 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Animation, "Animations");
147 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Bodypart, "Body Parts");
148 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.CallingCard, "Calling Cards");
149 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Clothing, "Clothing");
150 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Gesture, "Gestures");
151 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Landmark, "Landmarks");
152 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.LostAndFoundFolder, "Lost And Found");
153 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Notecard, "Notecards");
154 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Object, "Objects");
155 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.SnapshotFolder, "Photo Album");
156 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.LSLText, "Scripts");
157 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Sound, "Sounds");
158 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.Texture, "Textures");
159 // CreateFolder(principalID, suitcase.folderID, (int)AssetType.TrashFolder, "Trash");
160
161 // return true;
162 //}
163
164
165 public override InventoryFolderBase GetFolderForType(UUID principalID, AssetType type)
166 {
167 return GetRootFolder(principalID);
168 }
169
170 //
171 // Use the inherited methods
172 //
173 //public InventoryCollection GetFolderContent(UUID principalID, UUID folderID)
174 //{
175 //}
176
177 //public List<InventoryItemBase> GetFolderItems(UUID principalID, UUID folderID)
178 //{
179 //}
180
181 //public override bool AddFolder(InventoryFolderBase folder)
182 //{
183 // // Check if it's under the Suitcase folder
184 // List<InventoryFolderBase> skel = base.GetInventorySkeleton(folder.Owner);
185 // InventoryFolderBase suitcase = GetRootFolder(folder.Owner);
186 // List<InventoryFolderBase> suitDescendents = GetDescendents(skel, suitcase.ID);
187
188 // foreach (InventoryFolderBase f in suitDescendents)
189 // if (folder.ParentID == f.ID)
190 // {
191 // XInventoryFolder xFolder = ConvertFromOpenSim(folder);
192 // return m_Database.StoreFolder(xFolder);
193 // }
194 // return false;
195 //}
196
197 private List<InventoryFolderBase> GetDescendents(List<InventoryFolderBase> lst, UUID root)
198 {
199 List<InventoryFolderBase> direct = lst.FindAll(delegate(InventoryFolderBase f) { return f.ParentID == root; });
200 if (direct == null)
201 return new List<InventoryFolderBase>();
202
203 List<InventoryFolderBase> indirect = new List<InventoryFolderBase>();
204 foreach (InventoryFolderBase f in direct)
205 indirect.AddRange(GetDescendents(lst, f.ID));
206
207 direct.AddRange(indirect);
208 return direct;
209 }
210
211 // Use inherited method
212 //public bool UpdateFolder(InventoryFolderBase folder)
213 //{
214 //}
215
216 //public override bool MoveFolder(InventoryFolderBase folder)
217 //{
218 // XInventoryFolder[] x = m_Database.GetFolders(
219 // new string[] { "folderID" },
220 // new string[] { folder.ID.ToString() });
221
222 // if (x.Length == 0)
223 // return false;
224
225 // // Check if it's under the Suitcase folder
226 // List<InventoryFolderBase> skel = base.GetInventorySkeleton(folder.Owner);
227 // InventoryFolderBase suitcase = GetRootFolder(folder.Owner);
228 // List<InventoryFolderBase> suitDescendents = GetDescendents(skel, suitcase.ID);
229
230 // foreach (InventoryFolderBase f in suitDescendents)
231 // if (folder.ParentID == f.ID)
232 // {
233 // x[0].parentFolderID = folder.ParentID;
234 // return m_Database.StoreFolder(x[0]);
235 // }
236
237 // return false;
238 //}
239
240 public override bool DeleteFolders(UUID principalID, List<UUID> folderIDs)
241 {
242 // NOGO
243 return false;
244 }
245
246 public override bool PurgeFolder(InventoryFolderBase folder)
247 {
248 // NOGO
249 return false;
250 }
251
252 // Unfortunately we need to use the inherited method because of how DeRez works.
253 // The viewer sends the folderID hard-wired in the derez message
254 //public override bool AddItem(InventoryItemBase item)
255 //{
256 // // Check if it's under the Suitcase folder
257 // List<InventoryFolderBase> skel = base.GetInventorySkeleton(item.Owner);
258 // InventoryFolderBase suitcase = GetRootFolder(item.Owner);
259 // List<InventoryFolderBase> suitDescendents = GetDescendents(skel, suitcase.ID);
260
261 // foreach (InventoryFolderBase f in suitDescendents)
262 // if (item.Folder == f.ID)
263 // return m_Database.StoreItem(ConvertFromOpenSim(item));
264
265 // return false;
266 //}
267
268 //public override bool UpdateItem(InventoryItemBase item)
269 //{
270 // // Check if it's under the Suitcase folder
271 // List<InventoryFolderBase> skel = base.GetInventorySkeleton(item.Owner);
272 // InventoryFolderBase suitcase = GetRootFolder(item.Owner);
273 // List<InventoryFolderBase> suitDescendents = GetDescendents(skel, suitcase.ID);
274
275 // foreach (InventoryFolderBase f in suitDescendents)
276 // if (item.Folder == f.ID)
277 // return m_Database.StoreItem(ConvertFromOpenSim(item));
278
279 // return false;
280 //}
281
282 //public override bool MoveItems(UUID principalID, List<InventoryItemBase> items)
283 //{
284 // // Principal is b0rked. *sigh*
285 // //
286 // // Let's assume they all have the same principal
287 // // Check if it's under the Suitcase folder
288 // List<InventoryFolderBase> skel = base.GetInventorySkeleton(items[0].Owner);
289 // InventoryFolderBase suitcase = GetRootFolder(items[0].Owner);
290 // List<InventoryFolderBase> suitDescendents = GetDescendents(skel, suitcase.ID);
291
292 // foreach (InventoryItemBase i in items)
293 // {
294 // foreach (InventoryFolderBase f in suitDescendents)
295 // if (i.Folder == f.ID)
296 // m_Database.MoveItem(i.ID.ToString(), i.Folder.ToString());
297 // }
298
299 // return true;
300 //}
301
302 // Let these pass. Use inherited methods.
303 //public bool DeleteItems(UUID principalID, List<UUID> itemIDs)
304 //{
305 //}
306
307 public override InventoryItemBase GetItem(InventoryItemBase item)
308 {
309 InventoryItemBase it = base.GetItem(item);
310
311 UserAccount user = m_Cache.GetUser(it.CreatorId);
312
313 // Adjust the creator data
314 if (user != null && it != null && (it.CreatorData == null || it.CreatorData == string.Empty))
315 it.CreatorData = m_ProfileServiceURL + "/" + it.CreatorId + ";" + user.FirstName + " " + user.LastName;
316
317 return it;
318 }
319
320 //public InventoryFolderBase GetFolder(InventoryFolderBase folder)
321 //{
322 //}
323
324 //public List<InventoryItemBase> GetActiveGestures(UUID principalID)
325 //{
326 //}
327
328 //public int GetAssetPermissions(UUID principalID, UUID assetID)
329 //{
330 //}
331
332 }
333}