diff options
author | Melanie | 2009-08-20 21:45:49 +0100 |
---|---|---|
committer | Melanie | 2009-08-20 21:45:49 +0100 |
commit | b23160a871fe6a28105d39c9602c35cda75efe4a (patch) | |
tree | 43c8d839a3bf6016a1d621d814cfd9d670b068b2 /OpenSim/Grid/AssetInventoryServer/Plugins | |
parent | Remove a load-order dependency in inventory transfer that was biting (diff) | |
download | opensim-SC_OLD-b23160a871fe6a28105d39c9602c35cda75efe4a.zip opensim-SC_OLD-b23160a871fe6a28105d39c9602c35cda75efe4a.tar.gz opensim-SC_OLD-b23160a871fe6a28105d39c9602c35cda75efe4a.tar.bz2 opensim-SC_OLD-b23160a871fe6a28105d39c9602c35cda75efe4a.tar.xz |
Remove the AssetInventory server from core. It has fallen behind both
upstream and the reference implementation to the point where it is no
longer usable. It has no known users, and sinnce it doesn't work anymore,
it is safe to assume that no one has used it in a long time.
Diffstat (limited to 'OpenSim/Grid/AssetInventoryServer/Plugins')
17 files changed, 0 insertions, 4018 deletions
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs deleted file mode 100644 index 3d0a283..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs +++ /dev/null | |||
@@ -1,105 +0,0 @@ | |||
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 OpenMetaverse; | ||
31 | using OpenSim.Framework; | ||
32 | using log4net; | ||
33 | |||
34 | namespace OpenSim.Grid.AssetInventoryServer.Plugins | ||
35 | { | ||
36 | public class AuthorizeAllPlugin : IAuthorizationProvider | ||
37 | { | ||
38 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
39 | //private AssetInventoryServer m_server; | ||
40 | |||
41 | public AuthorizeAllPlugin() | ||
42 | { | ||
43 | } | ||
44 | |||
45 | #region IPlugin implementation | ||
46 | |||
47 | public void Initialise(AssetInventoryServer server) | ||
48 | { | ||
49 | //m_server = server; | ||
50 | |||
51 | m_log.Info("[AUTHORIZEALL]: Authorize All loaded."); | ||
52 | } | ||
53 | |||
54 | /// <summary> | ||
55 | /// <para>Initialises asset interface</para> | ||
56 | /// </summary> | ||
57 | public void Initialise() | ||
58 | { | ||
59 | m_log.InfoFormat("[AUTHORIZEALL]: {0} cannot be default-initialized!", Name); | ||
60 | throw new PluginNotInitialisedException(Name); | ||
61 | } | ||
62 | |||
63 | public void Dispose() | ||
64 | { | ||
65 | } | ||
66 | |||
67 | public string Version | ||
68 | { | ||
69 | // TODO: this should be something meaningful and not hardcoded? | ||
70 | get { return "0.1"; } | ||
71 | } | ||
72 | |||
73 | public string Name | ||
74 | { | ||
75 | get { return "AuthorizeAll"; } | ||
76 | } | ||
77 | |||
78 | #endregion IPlugin implementation | ||
79 | |||
80 | public bool IsMetadataAuthorized(UUID authToken, UUID assetID) | ||
81 | { | ||
82 | return true; | ||
83 | } | ||
84 | |||
85 | public bool IsDataAuthorized(UUID authToken, UUID assetID) | ||
86 | { | ||
87 | return true; | ||
88 | } | ||
89 | |||
90 | public bool IsCreateAuthorized(UUID authToken) | ||
91 | { | ||
92 | return true; | ||
93 | } | ||
94 | |||
95 | public bool IsInventoryReadAuthorized(UUID authToken, Uri owner) | ||
96 | { | ||
97 | return true; | ||
98 | } | ||
99 | |||
100 | public bool IsInventoryWriteAuthorized(UUID authToken, Uri owner) | ||
101 | { | ||
102 | return true; | ||
103 | } | ||
104 | } | ||
105 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs deleted file mode 100644 index 90ea2e0..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs +++ /dev/null | |||
@@ -1,173 +0,0 @@ | |||
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.IO; | ||
30 | using System.Reflection; | ||
31 | using System.Collections.Specialized; | ||
32 | using System.Net; | ||
33 | using System.Text; | ||
34 | using System.Web; | ||
35 | using OpenMetaverse; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Framework.Servers; | ||
38 | using OpenSim.Framework.Servers.HttpServer; | ||
39 | using log4net; | ||
40 | |||
41 | namespace OpenSim.Grid.AssetInventoryServer.Plugins | ||
42 | { | ||
43 | public class BrowseFrontendPlugin : IAssetInventoryServerPlugin | ||
44 | { | ||
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | private AssetInventoryServer m_server; | ||
47 | |||
48 | public BrowseFrontendPlugin() | ||
49 | { | ||
50 | } | ||
51 | |||
52 | #region IPlugin implementation | ||
53 | |||
54 | public void Initialise(AssetInventoryServer server) | ||
55 | { | ||
56 | m_server = server; | ||
57 | |||
58 | // Request for / or /?... | ||
59 | m_server.HttpServer.AddStreamHandler(new BrowseRequestHandler(server)); | ||
60 | |||
61 | m_log.Info("[BROWSEFRONTEND]: Browser Frontend loaded."); | ||
62 | } | ||
63 | |||
64 | /// <summary> | ||
65 | /// <para>Initialises asset interface</para> | ||
66 | /// </summary> | ||
67 | public void Initialise() | ||
68 | { | ||
69 | m_log.InfoFormat("[BROWSEFRONTEND]: {0} cannot be default-initialized!", Name); | ||
70 | throw new PluginNotInitialisedException(Name); | ||
71 | } | ||
72 | |||
73 | public void Dispose() | ||
74 | { | ||
75 | } | ||
76 | |||
77 | public string Version | ||
78 | { | ||
79 | // TODO: this should be something meaningful and not hardcoded? | ||
80 | get { return "0.1"; } | ||
81 | } | ||
82 | |||
83 | public string Name | ||
84 | { | ||
85 | get { return "BrowseFrontend"; } | ||
86 | } | ||
87 | |||
88 | #endregion IPlugin implementation | ||
89 | |||
90 | public class BrowseRequestHandler : BaseStreamHandler | ||
91 | { | ||
92 | AssetInventoryServer m_server; | ||
93 | |||
94 | //public BrowseRequestHandler(AssetInventoryServer server) : base("GET", "(^/$|(^/\?.*)") | ||
95 | public BrowseRequestHandler(AssetInventoryServer server) : base("GET", "/") | ||
96 | { | ||
97 | m_server = server; | ||
98 | } | ||
99 | |||
100 | public override string ContentType | ||
101 | { | ||
102 | get { return "text/html"; } | ||
103 | } | ||
104 | |||
105 | #region IStreamedRequestHandler implementation | ||
106 | |||
107 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
108 | { | ||
109 | const int ASSETS_PER_PAGE = 25; | ||
110 | const string HEADER = "<html><head><title>Asset Server</title></head><body>"; | ||
111 | const string TABLE_HEADER = | ||
112 | "<table><tr><th>Name</th><th>Description</th><th>Type</th><th>ID</th><th>Temporary</th><th>SHA-1</th></tr>"; | ||
113 | const string TABLE_FOOTER = "</table>"; | ||
114 | const string FOOTER = "</body></html>"; | ||
115 | |||
116 | UUID authToken = Utils.GetAuthToken(httpRequest); | ||
117 | |||
118 | StringBuilder html = new StringBuilder(); | ||
119 | int start = 0; | ||
120 | uint page = 0; | ||
121 | |||
122 | if (!String.IsNullOrEmpty(httpRequest.Url.Query)) | ||
123 | { | ||
124 | NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query); | ||
125 | if (!String.IsNullOrEmpty(query["page"]) && UInt32.TryParse(query["page"], out page)) | ||
126 | start = (int)page * ASSETS_PER_PAGE; | ||
127 | } | ||
128 | |||
129 | html.AppendLine(HEADER); | ||
130 | |||
131 | html.AppendLine("<p>"); | ||
132 | if (page > 0) | ||
133 | html.AppendFormat("<a href=\"{0}?page={1}\">< Previous Page</a> | ", httpRequest.RawUrl, page - 1); | ||
134 | html.AppendFormat("<a href=\"{0}?page={1}\">Next Page ></a>", httpRequest.RawUrl, page + 1); | ||
135 | html.AppendLine("</p>"); | ||
136 | |||
137 | html.AppendLine(TABLE_HEADER); | ||
138 | |||
139 | m_server.StorageProvider.ForEach( | ||
140 | delegate(AssetMetadata data) | ||
141 | { | ||
142 | if (m_server.AuthorizationProvider.IsMetadataAuthorized(authToken, data.FullID)) | ||
143 | { | ||
144 | html.AppendLine(String.Format( | ||
145 | "<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td></tr>", | ||
146 | data.Name, data.Description, data.ContentType, data.ID, data.Temporary, | ||
147 | BitConverter.ToString(data.SHA1).Replace("-", String.Empty))); | ||
148 | } | ||
149 | else | ||
150 | { | ||
151 | html.AppendLine(String.Format( | ||
152 | "<tr><td>[Protected Asset]</td><td> </td><td> </td><td>{0}</td><td>{1}</td><td> </td></tr>", | ||
153 | data.ID, data.Temporary)); | ||
154 | } | ||
155 | }, start, ASSETS_PER_PAGE | ||
156 | ); | ||
157 | |||
158 | html.AppendLine(TABLE_FOOTER); | ||
159 | |||
160 | html.AppendLine(FOOTER); | ||
161 | |||
162 | byte[] responseData = System.Text.Encoding.UTF8.GetBytes(html.ToString()); | ||
163 | |||
164 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
165 | //httpResponse.Body.Write(responseData, 0, responseData.Length); | ||
166 | //httpResponse.Body.Flush(); | ||
167 | return responseData; | ||
168 | } | ||
169 | |||
170 | #endregion IStreamedRequestHandler implementation | ||
171 | } | ||
172 | } | ||
173 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs deleted file mode 100644 index 8323450..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs +++ /dev/null | |||
@@ -1,211 +0,0 @@ | |||
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.Net; | ||
30 | using System.IO; | ||
31 | using System.IO.Compression; | ||
32 | using System.Xml; | ||
33 | using System.Reflection; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.Serialization; | ||
37 | using OpenSim.Framework.Serialization.External; | ||
38 | using OpenSim.Framework.Servers; | ||
39 | using OpenSim.Framework.Servers.HttpServer; | ||
40 | using log4net; | ||
41 | |||
42 | namespace OpenSim.Grid.AssetInventoryServer.Plugins | ||
43 | { | ||
44 | public class InventoryArchivePlugin : IAssetInventoryServerPlugin | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | private AssetInventoryServer m_server; | ||
48 | |||
49 | public InventoryArchivePlugin() | ||
50 | { | ||
51 | } | ||
52 | |||
53 | #region IPlugin implementation | ||
54 | |||
55 | public void Initialise(AssetInventoryServer server) | ||
56 | { | ||
57 | m_server = server; | ||
58 | |||
59 | m_server.HttpServer.AddStreamHandler(new GetInventoryArchive(server)); | ||
60 | |||
61 | m_log.Info("[INVENTORYARCHIVE]: Inventory Archive loaded."); | ||
62 | } | ||
63 | |||
64 | /// <summary> | ||
65 | /// <para>Initialises asset interface</para> | ||
66 | /// </summary> | ||
67 | public void Initialise() | ||
68 | { | ||
69 | m_log.InfoFormat("[INVENTORYARCHIVE]: {0} cannot be default-initialized!", Name); | ||
70 | throw new PluginNotInitialisedException(Name); | ||
71 | } | ||
72 | |||
73 | public void Dispose() | ||
74 | { | ||
75 | } | ||
76 | |||
77 | public string Version | ||
78 | { | ||
79 | // TODO: this should be something meaningful and not hardcoded? | ||
80 | get { return "0.1"; } | ||
81 | } | ||
82 | |||
83 | public string Name | ||
84 | { | ||
85 | get { return "InventoryArchive"; } | ||
86 | } | ||
87 | |||
88 | #endregion IPlugin implementation | ||
89 | |||
90 | public class GetInventoryArchive : BaseStreamHandler | ||
91 | { | ||
92 | AssetInventoryServer m_server; | ||
93 | |||
94 | //public GetInventoryArchive(AssetInventoryServer server) : base("GET", @"^/inventoryarchive/") | ||
95 | public GetInventoryArchive(AssetInventoryServer server) : base("GET", "/inventoryarchive") | ||
96 | { | ||
97 | m_server = server; | ||
98 | } | ||
99 | |||
100 | public override string ContentType | ||
101 | { | ||
102 | get { return "application/x-compressed"; } | ||
103 | } | ||
104 | |||
105 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
106 | { | ||
107 | byte[] buffer = new byte[] {}; | ||
108 | UUID ownerID; | ||
109 | // Split the URL up to get the asset ID out | ||
110 | string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); | ||
111 | |||
112 | if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out ownerID)) | ||
113 | { | ||
114 | Uri owner = Utils.GetOpenSimUri(ownerID); | ||
115 | InventoryCollection inventory; | ||
116 | BackendResponse storageResponse = m_server.InventoryProvider.TryFetchInventory(owner, out inventory); | ||
117 | |||
118 | if (storageResponse == BackendResponse.Success) | ||
119 | { | ||
120 | m_log.DebugFormat("[INVENTORYARCHIVE]: Archiving inventory for user UUID {0}", ownerID); | ||
121 | buffer = ArchiveInventoryCollection(inventory); | ||
122 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
123 | } | ||
124 | else | ||
125 | { | ||
126 | httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
127 | } | ||
128 | } | ||
129 | else | ||
130 | { | ||
131 | m_log.Warn("[INVENTORYARCHIVE]: Unrecognized inventory archive request: " + httpRequest.Url.PathAndQuery); | ||
132 | } | ||
133 | |||
134 | return buffer; | ||
135 | } | ||
136 | } | ||
137 | |||
138 | private static byte[] ArchiveInventoryCollection(InventoryCollection inventory) | ||
139 | { | ||
140 | byte[] buffer = new byte[] {}; | ||
141 | |||
142 | // Fill in each folder's Children dictionary. | ||
143 | InventoryFolderWithChildren rootFolder = BuildInventoryHierarchy(ref inventory); | ||
144 | |||
145 | // TODO: It's probably a bad idea to tar to memory for large | ||
146 | // inventories. | ||
147 | MemoryStream ms = new MemoryStream(); | ||
148 | GZipStream gzs = new GZipStream(ms, CompressionMode.Compress, true); | ||
149 | TarArchiveWriter archive = new TarArchiveWriter(gzs); | ||
150 | WriteInventoryFolderToArchive(archive, rootFolder, ArchiveConstants.INVENTORY_PATH); | ||
151 | |||
152 | archive.Close(); | ||
153 | |||
154 | ms.Seek(0, SeekOrigin.Begin); | ||
155 | buffer = ms.GetBuffer(); | ||
156 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
157 | ms.Close(); | ||
158 | return buffer; | ||
159 | } | ||
160 | |||
161 | private static InventoryFolderWithChildren BuildInventoryHierarchy(ref InventoryCollection inventory) | ||
162 | { | ||
163 | m_log.DebugFormat("[INVENTORYARCHIVE]: Building inventory hierarchy"); | ||
164 | InventoryFolderWithChildren rootFolder = null; | ||
165 | |||
166 | foreach (InventoryFolderWithChildren parentFolder in inventory.Folders.Values) | ||
167 | { | ||
168 | // Grab the root folder, it has no parents. | ||
169 | if (UUID.Zero == parentFolder.ParentID) rootFolder = parentFolder; | ||
170 | |||
171 | foreach (InventoryFolderWithChildren folder in inventory.Folders.Values) | ||
172 | if (parentFolder.ID == folder.ParentID) | ||
173 | parentFolder.Children.Add(folder.ID, folder); | ||
174 | |||
175 | foreach (InventoryItemBase item in inventory.Items.Values) | ||
176 | if (parentFolder.ID == item.Folder) | ||
177 | parentFolder.Children.Add(item.ID, item); | ||
178 | } | ||
179 | |||
180 | return rootFolder; | ||
181 | } | ||
182 | |||
183 | private static void WriteInventoryFolderToArchive( | ||
184 | TarArchiveWriter archive, InventoryFolderWithChildren folder, string path) | ||
185 | { | ||
186 | path += string.Format("{0}{1}{2}/", folder.Name, ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, folder.ID); | ||
187 | archive.WriteDir(path); | ||
188 | |||
189 | foreach (InventoryNodeBase inventoryNode in folder.Children.Values) | ||
190 | { | ||
191 | if (inventoryNode is InventoryFolderWithChildren) | ||
192 | { | ||
193 | WriteInventoryFolderToArchive(archive, (InventoryFolderWithChildren) inventoryNode, path); | ||
194 | } | ||
195 | else if (inventoryNode is InventoryItemBase) | ||
196 | { | ||
197 | WriteInventoryItemToArchive(archive, (InventoryItemBase) inventoryNode, path); | ||
198 | } | ||
199 | } | ||
200 | } | ||
201 | |||
202 | private static void WriteInventoryItemToArchive(TarArchiveWriter archive, InventoryItemBase item, string path) | ||
203 | { | ||
204 | string filename = string.Format("{0}{1}_{2}.xml", path, item.Name, item.ID); | ||
205 | string serialization = UserInventoryItemSerializer.Serialize(item); | ||
206 | archive.WriteFile(filename, serialization); | ||
207 | |||
208 | //m_assetGatherer.GatherAssetUuids(item.AssetID, (AssetType) item.AssetType, assetUuids); | ||
209 | } | ||
210 | } | ||
211 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs deleted file mode 100644 index 026b3c8..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs +++ /dev/null | |||
@@ -1,95 +0,0 @@ | |||
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 OpenMetaverse; | ||
31 | using OpenSim.Framework; | ||
32 | using log4net; | ||
33 | |||
34 | namespace OpenSim.Grid.AssetInventoryServer.Plugins | ||
35 | { | ||
36 | public class NullAuthenticationPlugin : IAuthenticationProvider | ||
37 | { | ||
38 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
39 | //private AssetInventoryServer m_server; | ||
40 | |||
41 | public NullAuthenticationPlugin() | ||
42 | { | ||
43 | } | ||
44 | |||
45 | #region IPlugin implementation | ||
46 | |||
47 | public void Initialise(AssetInventoryServer server) | ||
48 | { | ||
49 | //m_server = server; | ||
50 | |||
51 | m_log.Info("[NULLAUTHENTICATION]: Null Authentication loaded."); | ||
52 | } | ||
53 | |||
54 | /// <summary> | ||
55 | /// <para>Initialises asset interface</para> | ||
56 | /// </summary> | ||
57 | public void Initialise() | ||
58 | { | ||
59 | m_log.InfoFormat("[NULLAUTHENTICATION]: {0} cannot be default-initialized!", Name); | ||
60 | throw new PluginNotInitialisedException(Name); | ||
61 | } | ||
62 | |||
63 | public void Dispose() | ||
64 | { | ||
65 | } | ||
66 | |||
67 | public string Version | ||
68 | { | ||
69 | // TODO: this should be something meaningful and not hardcoded? | ||
70 | get { return "0.1"; } | ||
71 | } | ||
72 | |||
73 | public string Name | ||
74 | { | ||
75 | get { return "NullAuthentication"; } | ||
76 | } | ||
77 | |||
78 | #endregion IPlugin implementation | ||
79 | |||
80 | public void AddIdentifier(UUID authToken, Uri identifier) | ||
81 | { | ||
82 | } | ||
83 | |||
84 | public bool RemoveIdentifier(UUID authToken) | ||
85 | { | ||
86 | return true; | ||
87 | } | ||
88 | |||
89 | public bool TryGetIdentifier(UUID authToken, out Uri identifier) | ||
90 | { | ||
91 | identifier = null; | ||
92 | return true; | ||
93 | } | ||
94 | } | ||
95 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs deleted file mode 100644 index 8cde8f4..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs +++ /dev/null | |||
@@ -1,151 +0,0 @@ | |||
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 OpenMetaverse; | ||
31 | using log4net; | ||
32 | |||
33 | namespace OpenSim.Grid.AssetInventoryServer.Plugins | ||
34 | { | ||
35 | public class NullMetricsPlugin : IMetricsProvider | ||
36 | { | ||
37 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
38 | //private AssetInventoryServer m_server; | ||
39 | |||
40 | public NullMetricsPlugin() | ||
41 | { | ||
42 | } | ||
43 | |||
44 | #region IMetricsProvider implementation | ||
45 | |||
46 | public void LogAssetMetadataFetch(string extension, BackendResponse response, UUID assetID, DateTime time) | ||
47 | { | ||
48 | m_log.DebugFormat("[{0}]: AssetMetadataFetch(): AssetID: {1}, Response: {2}", extension, assetID, response); | ||
49 | } | ||
50 | |||
51 | public void LogAssetDataFetch(string extension, BackendResponse response, UUID assetID, int dataSize, DateTime time) | ||
52 | { | ||
53 | m_log.DebugFormat("[{0}]: AssetDataFetch(): AssetID: {1}, DataSize: {2}, Response: {3}", extension, assetID, | ||
54 | dataSize, response); | ||
55 | } | ||
56 | |||
57 | public void LogAssetCreate(string extension, BackendResponse response, UUID assetID, int dataSize, DateTime time) | ||
58 | { | ||
59 | m_log.DebugFormat("[{0}]: AssetCreate(): AssetID: {1}, DataSize: {2}, Response: {3}", extension, assetID, | ||
60 | dataSize, response); | ||
61 | } | ||
62 | |||
63 | public void LogInventoryFetch(string extension, BackendResponse response, Uri owner, UUID objID, bool folder, DateTime time) | ||
64 | { | ||
65 | m_log.DebugFormat("[{0}]: InventoryFetch(): ObjID: {1}, Folder: {2}, OwnerID: {3}, Response: {4}", extension, | ||
66 | objID, folder, owner, response); | ||
67 | } | ||
68 | |||
69 | public void LogInventoryFetchFolderContents(string extension, BackendResponse response, Uri owner, UUID folderID, DateTime time) | ||
70 | { | ||
71 | m_log.DebugFormat("[{0}]: InventoryFetchFolderContents(): FolderID: {1}, OwnerID: {2}, Response: {3}", extension, | ||
72 | folderID, owner, response); | ||
73 | } | ||
74 | |||
75 | public void LogInventoryFetchFolderList(string extension, BackendResponse response, Uri owner, DateTime time) | ||
76 | { | ||
77 | m_log.DebugFormat("[{0}]: InventoryFetchFolderList(): OwnerID: {1}, Response: {2}", extension, | ||
78 | owner, response); | ||
79 | } | ||
80 | |||
81 | public void LogInventoryFetchInventory(string extension, BackendResponse response, Uri owner, DateTime time) | ||
82 | { | ||
83 | m_log.DebugFormat("[{0}]: InventoryFetchInventory(): OwnerID: {1}, Response: {2}", extension, | ||
84 | owner, response); | ||
85 | } | ||
86 | |||
87 | public void LogInventoryFetchActiveGestures(string extension, BackendResponse response, Uri owner, DateTime time) | ||
88 | { | ||
89 | m_log.DebugFormat("[{0}]: InventoryFetchActiveGestures(): OwnerID: {1}, Response: {2}", extension, | ||
90 | owner, response); | ||
91 | } | ||
92 | |||
93 | public void LogInventoryCreate(string extension, BackendResponse response, Uri owner, bool folder, DateTime time) | ||
94 | { | ||
95 | m_log.DebugFormat("[{0}]: InventoryCreate(): OwnerID: {1}, Response: {2}", extension, | ||
96 | owner, response); | ||
97 | } | ||
98 | |||
99 | public void LogInventoryCreateInventory(string extension, BackendResponse response, DateTime time) | ||
100 | { | ||
101 | m_log.DebugFormat("[{0}]: InventoryCreateInventory(): Response: {1}", extension, | ||
102 | response); | ||
103 | } | ||
104 | |||
105 | public void LogInventoryDelete(string extension, BackendResponse response, Uri owner, UUID objID, bool folder, DateTime time) | ||
106 | { | ||
107 | m_log.DebugFormat("[{0}]: InventoryDelete(): OwnerID: {1}, Folder: {2}, Response: {3}", extension, | ||
108 | owner, folder, response); | ||
109 | } | ||
110 | |||
111 | public void LogInventoryPurgeFolder(string extension, BackendResponse response, Uri owner, UUID folderID, DateTime time) | ||
112 | { | ||
113 | m_log.DebugFormat("[{0}]: InventoryPurgeFolder(): OwnerID: {1}, FolderID: {2}, Response: {3}", extension, | ||
114 | owner, folderID, response); | ||
115 | } | ||
116 | |||
117 | #endregion IMetricsProvider implementation | ||
118 | |||
119 | #region IPlugin implementation | ||
120 | |||
121 | public void Initialise(AssetInventoryServer server) | ||
122 | { | ||
123 | //m_server = server; | ||
124 | } | ||
125 | |||
126 | /// <summary> | ||
127 | /// <para>Initialises metrics interface</para> | ||
128 | /// </summary> | ||
129 | public void Initialise() | ||
130 | { | ||
131 | m_log.Info("[NULLMETRICS]: Null metrics loaded."); | ||
132 | } | ||
133 | |||
134 | public void Dispose() | ||
135 | { | ||
136 | } | ||
137 | |||
138 | public string Version | ||
139 | { | ||
140 | // TODO: this should be something meaningful and not hardcoded? | ||
141 | get { return "0.1"; } | ||
142 | } | ||
143 | |||
144 | public string Name | ||
145 | { | ||
146 | get { return "NullMetrics"; } | ||
147 | } | ||
148 | |||
149 | #endregion IPlugin implementation | ||
150 | } | ||
151 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs deleted file mode 100644 index e4be55e..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs +++ /dev/null | |||
@@ -1,198 +0,0 @@ | |||
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.Net; | ||
31 | using System.IO; | ||
32 | using System.Text; | ||
33 | using System.Xml; | ||
34 | using System.Xml.Serialization; | ||
35 | using OpenMetaverse; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Framework.Servers; | ||
38 | using OpenSim.Framework.Servers.HttpServer; | ||
39 | using log4net; | ||
40 | |||
41 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim | ||
42 | { | ||
43 | public class OpenSimAssetFrontendPlugin : IAssetInventoryServerPlugin | ||
44 | { | ||
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | private AssetInventoryServer m_server; | ||
47 | |||
48 | public OpenSimAssetFrontendPlugin() | ||
49 | { | ||
50 | } | ||
51 | |||
52 | #region IPlugin implementation | ||
53 | |||
54 | public void Initialise(AssetInventoryServer server) | ||
55 | { | ||
56 | m_server = server; | ||
57 | |||
58 | // Asset request | ||
59 | m_server.HttpServer.AddStreamHandler(new AssetRequestHandler(server)); | ||
60 | |||
61 | // Asset creation | ||
62 | m_server.HttpServer.AddStreamHandler(new AssetPostHandler(server)); | ||
63 | |||
64 | m_log.Info("[OPENSIMASSETFRONTEND]: OpenSim Asset Frontend loaded."); | ||
65 | } | ||
66 | |||
67 | /// <summary> | ||
68 | /// <para>Initialises asset interface</para> | ||
69 | /// </summary> | ||
70 | public void Initialise() | ||
71 | { | ||
72 | m_log.InfoFormat("[OPENSIMASSETFRONTEND]: {0} cannot be default-initialized!", Name); | ||
73 | throw new PluginNotInitialisedException(Name); | ||
74 | } | ||
75 | |||
76 | public void Dispose() | ||
77 | { | ||
78 | } | ||
79 | |||
80 | public string Version | ||
81 | { | ||
82 | // TODO: this should be something meaningful and not hardcoded? | ||
83 | get { return "0.1"; } | ||
84 | } | ||
85 | |||
86 | public string Name | ||
87 | { | ||
88 | get { return "OpenSimAssetFrontend"; } | ||
89 | } | ||
90 | |||
91 | #endregion IPlugin implementation | ||
92 | |||
93 | public class AssetRequestHandler : BaseStreamHandler | ||
94 | { | ||
95 | AssetInventoryServer m_server; | ||
96 | |||
97 | //public AssetRequestHandler(AssetInventoryServer server) : base("GET", "^/assets") | ||
98 | public AssetRequestHandler(AssetInventoryServer server) : base("GET", "/assets") | ||
99 | { | ||
100 | m_server = server; | ||
101 | } | ||
102 | |||
103 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
104 | { | ||
105 | byte[] buffer = new byte[] {}; | ||
106 | UUID assetID; | ||
107 | // Split the URL up to get the asset ID out | ||
108 | string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); | ||
109 | |||
110 | if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out assetID)) | ||
111 | { | ||
112 | BackendResponse dataResponse; | ||
113 | |||
114 | AssetBase asset = new AssetBase(); | ||
115 | if ((dataResponse = m_server.StorageProvider.TryFetchDataMetadata(assetID, out asset)) == BackendResponse.Success) | ||
116 | { | ||
117 | if (rawUrl.Length >= 4 && rawUrl[3] == "data") | ||
118 | { | ||
119 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | ||
120 | httpResponse.ContentType = Utils.SLAssetTypeToContentType(asset.Type); | ||
121 | buffer=asset.Data; | ||
122 | } | ||
123 | else | ||
124 | { | ||
125 | XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); | ||
126 | MemoryStream ms = new MemoryStream(); | ||
127 | XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); | ||
128 | xs.Serialize(xw, asset); | ||
129 | xw.Flush(); | ||
130 | |||
131 | ms.Seek(0, SeekOrigin.Begin); | ||
132 | buffer = ms.GetBuffer(); | ||
133 | Array.Resize<byte>(ref buffer, (int)ms.Length); | ||
134 | ms.Close(); | ||
135 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | ||
136 | } | ||
137 | } | ||
138 | else | ||
139 | { | ||
140 | m_log.WarnFormat("[OPENSIMASSETFRONTEND]: Failed to fetch asset data or metadata for {0}: {1}", assetID, dataResponse); | ||
141 | httpResponse.StatusCode = (int) HttpStatusCode.NotFound; | ||
142 | } | ||
143 | } | ||
144 | else | ||
145 | { | ||
146 | m_log.Warn("[OPENSIMASSETFRONTEND]: Unrecognized OpenSim asset request: " + httpRequest.Url.PathAndQuery); | ||
147 | } | ||
148 | |||
149 | return buffer; | ||
150 | } | ||
151 | } | ||
152 | |||
153 | public class AssetPostHandler : BaseStreamHandler | ||
154 | { | ||
155 | AssetInventoryServer m_server; | ||
156 | |||
157 | //public AssetPostHandler(AssetInventoryServer server) : base("POST", "/^assets") | ||
158 | public AssetPostHandler(AssetInventoryServer server) : base("POST", "/assets") | ||
159 | { | ||
160 | m_server = server; | ||
161 | } | ||
162 | |||
163 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
164 | { | ||
165 | AssetBase asset = null; | ||
166 | |||
167 | try | ||
168 | { | ||
169 | asset = (AssetBase) new XmlSerializer(typeof (AssetBase)).Deserialize(httpRequest.InputStream); | ||
170 | } | ||
171 | catch (Exception ex) | ||
172 | { | ||
173 | m_log.Warn("[OPENSIMASSETFRONTEND]: Failed to parse POST data (expecting AssetBase): " + ex.Message); | ||
174 | httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
175 | } | ||
176 | |||
177 | if (asset != null && asset.Data != null && asset.Data.Length > 0) | ||
178 | { | ||
179 | BackendResponse storageResponse = m_server.StorageProvider.TryCreateAsset(asset); | ||
180 | |||
181 | if (storageResponse == BackendResponse.Success) | ||
182 | httpResponse.StatusCode = (int) HttpStatusCode.Created; | ||
183 | else if (storageResponse == BackendResponse.NotFound) | ||
184 | httpResponse.StatusCode = (int) HttpStatusCode.NotFound; | ||
185 | else | ||
186 | httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
187 | } | ||
188 | else | ||
189 | { | ||
190 | m_log.Warn("[OPENSIMASSETFRONTEND]: AssetPostHandler called with no asset data"); | ||
191 | httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
192 | } | ||
193 | |||
194 | return new byte[] {}; | ||
195 | } | ||
196 | } | ||
197 | } | ||
198 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs deleted file mode 100644 index 92ac84f..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs +++ /dev/null | |||
@@ -1,189 +0,0 @@ | |||
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.Data; | ||
31 | using System.Collections.Generic; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Data; | ||
35 | using Nini.Config; | ||
36 | using log4net; | ||
37 | |||
38 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim | ||
39 | { | ||
40 | public class OpenSimAssetStoragePlugin : IAssetStorageProvider | ||
41 | { | ||
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | const string EXTENSION_NAME = "OpenSimAssetStorage"; // Used in metrics reporting | ||
44 | |||
45 | private AssetInventoryServer m_server; | ||
46 | private IAssetDataPlugin m_assetProvider; | ||
47 | private IConfig m_openSimConfig; | ||
48 | |||
49 | public OpenSimAssetStoragePlugin() | ||
50 | { | ||
51 | } | ||
52 | |||
53 | #region IAssetStorageProvider implementation | ||
54 | |||
55 | public BackendResponse TryFetchMetadata(UUID assetID, out AssetMetadata metadata) | ||
56 | { | ||
57 | metadata = null; | ||
58 | BackendResponse ret; | ||
59 | |||
60 | AssetBase asset = m_assetProvider.GetAsset(assetID); | ||
61 | |||
62 | if (asset == null) ret = BackendResponse.NotFound; | ||
63 | else | ||
64 | { | ||
65 | metadata = asset.Metadata; | ||
66 | ret = BackendResponse.Success; | ||
67 | } | ||
68 | |||
69 | m_server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now); | ||
70 | return ret; | ||
71 | } | ||
72 | |||
73 | public BackendResponse TryFetchData(UUID assetID, out byte[] assetData) | ||
74 | { | ||
75 | assetData = null; | ||
76 | BackendResponse ret; | ||
77 | |||
78 | AssetBase asset = m_assetProvider.GetAsset(assetID); | ||
79 | |||
80 | if (asset == null) ret = BackendResponse.NotFound; | ||
81 | else | ||
82 | { | ||
83 | assetData = asset.Data; | ||
84 | ret = BackendResponse.Success; | ||
85 | } | ||
86 | |||
87 | m_server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now); | ||
88 | return ret; | ||
89 | } | ||
90 | |||
91 | public BackendResponse TryFetchDataMetadata(UUID assetID, out AssetBase asset) | ||
92 | { | ||
93 | asset = m_assetProvider.GetAsset(assetID); | ||
94 | |||
95 | if (asset == null) return BackendResponse.NotFound; | ||
96 | |||
97 | return BackendResponse.Success; | ||
98 | } | ||
99 | |||
100 | public BackendResponse TryCreateAsset(AssetBase asset, out UUID assetID) | ||
101 | { | ||
102 | assetID = asset.FullID = UUID.Random(); | ||
103 | return TryCreateAsset(asset); | ||
104 | } | ||
105 | |||
106 | public BackendResponse TryCreateAsset(AssetBase asset) | ||
107 | { | ||
108 | BackendResponse ret; | ||
109 | |||
110 | m_assetProvider.StoreAsset(asset); | ||
111 | ret = BackendResponse.Success; | ||
112 | |||
113 | m_server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, asset.FullID, asset.Data.Length, DateTime.Now); | ||
114 | return ret; | ||
115 | } | ||
116 | |||
117 | public int ForEach(Action<AssetMetadata> action, int start, int count) | ||
118 | { | ||
119 | int rowCount = 0; | ||
120 | |||
121 | foreach (AssetMetadata metadata in m_assetProvider.FetchAssetMetadataSet(start, count)) | ||
122 | { | ||
123 | // We set the ContentType here because Utils is only in | ||
124 | // AssetInventoryServer. This should be moved to the DB | ||
125 | // backends when the equivalent of SLAssetTypeToContentType is | ||
126 | // in OpenSim.Framework or similar. | ||
127 | metadata.ContentType = Utils.SLAssetTypeToContentType(metadata.Type); | ||
128 | |||
129 | action(metadata); | ||
130 | ++rowCount; | ||
131 | } | ||
132 | |||
133 | return rowCount; | ||
134 | } | ||
135 | |||
136 | #endregion IAssetStorageProvider implementation | ||
137 | |||
138 | #region IPlugin implementation | ||
139 | |||
140 | public void Initialise(AssetInventoryServer server) | ||
141 | { | ||
142 | m_server = server; | ||
143 | m_openSimConfig = server.ConfigFile.Configs["OpenSim"]; | ||
144 | |||
145 | try | ||
146 | { | ||
147 | m_assetProvider = DataPluginFactory.LoadDataPlugin<IAssetDataPlugin>(m_openSimConfig.GetString("asset_database_provider"), | ||
148 | m_openSimConfig.GetString("asset_database_connect")); | ||
149 | if (m_assetProvider == null) | ||
150 | { | ||
151 | m_log.Error("[OPENSIMASSETSTORAGE]: Failed to load a database plugin, server halting."); | ||
152 | Environment.Exit(-1); | ||
153 | } | ||
154 | else | ||
155 | m_log.InfoFormat("[OPENSIMASSETSTORAGE]: Loaded storage backend: {0}", Version); | ||
156 | } | ||
157 | catch (Exception e) | ||
158 | { | ||
159 | m_log.WarnFormat("[OPENSIMASSETSTORAGE]: Failure loading data plugin: {0}", e.ToString()); | ||
160 | throw new PluginNotInitialisedException(Name); | ||
161 | } | ||
162 | } | ||
163 | |||
164 | /// <summary> | ||
165 | /// <para>Initialises asset interface</para> | ||
166 | /// </summary> | ||
167 | public void Initialise() | ||
168 | { | ||
169 | m_log.InfoFormat("[OPENSIMASSETSTORAGE]: {0} cannot be default-initialized!", Name); | ||
170 | throw new PluginNotInitialisedException(Name); | ||
171 | } | ||
172 | |||
173 | public void Dispose() | ||
174 | { | ||
175 | } | ||
176 | |||
177 | public string Version | ||
178 | { | ||
179 | get { return m_assetProvider.Version; } | ||
180 | } | ||
181 | |||
182 | public string Name | ||
183 | { | ||
184 | get { return "OpenSimAssetStorage"; } | ||
185 | } | ||
186 | |||
187 | #endregion IPlugin implementation | ||
188 | } | ||
189 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs deleted file mode 100644 index c83e911..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs +++ /dev/null | |||
@@ -1,867 +0,0 @@ | |||
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.Net; | ||
30 | using System.Reflection; | ||
31 | using System.Collections.Generic; | ||
32 | using System.IO; | ||
33 | using System.Xml; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.Servers; | ||
37 | using OpenSim.Framework.Servers.HttpServer; | ||
38 | using log4net; | ||
39 | |||
40 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim | ||
41 | { | ||
42 | public class OpenSimInventoryFrontendPlugin : IAssetInventoryServerPlugin | ||
43 | { | ||
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
45 | private AssetInventoryServer m_server; | ||
46 | private Utils.InventoryCollectionSerializer collectionSerializer = new Utils.InventoryCollectionSerializer(); | ||
47 | |||
48 | public OpenSimInventoryFrontendPlugin() | ||
49 | { | ||
50 | } | ||
51 | |||
52 | #region IPlugin implementation | ||
53 | |||
54 | public void Initialise(AssetInventoryServer server) | ||
55 | { | ||
56 | m_server = server; | ||
57 | |||
58 | m_server.HttpServer.AddStreamHandler(new GetInventoryHandler(server, collectionSerializer)); | ||
59 | m_server.HttpServer.AddStreamHandler(new CreateInventoryHandler(server)); | ||
60 | m_server.HttpServer.AddStreamHandler(new NewFolderHandler(server)); | ||
61 | m_server.HttpServer.AddStreamHandler(new UpdateFolderHandler(server)); | ||
62 | m_server.HttpServer.AddStreamHandler(new MoveFolderHandler(server)); | ||
63 | m_server.HttpServer.AddStreamHandler(new PurgeFolderHandler(server)); | ||
64 | m_server.HttpServer.AddStreamHandler(new NewItemHandler(server)); | ||
65 | m_server.HttpServer.AddStreamHandler(new DeleteItemHandler(server)); | ||
66 | m_server.HttpServer.AddStreamHandler(new RootFoldersHandler(server)); | ||
67 | m_server.HttpServer.AddStreamHandler(new ActiveGesturesHandler(server)); | ||
68 | |||
69 | m_log.Info("[OPENSIMINVENTORYFRONTEND]: OpenSim Inventory Frontend loaded."); | ||
70 | } | ||
71 | |||
72 | /// <summary> | ||
73 | /// <para>Initialises asset interface</para> | ||
74 | /// </summary> | ||
75 | public void Initialise() | ||
76 | { | ||
77 | m_log.InfoFormat("[OPENSIMINVENTORYFRONTEND]: {0} cannot be default-initialized!", Name); | ||
78 | throw new PluginNotInitialisedException(Name); | ||
79 | } | ||
80 | |||
81 | public void Dispose() | ||
82 | { | ||
83 | } | ||
84 | |||
85 | public string Version | ||
86 | { | ||
87 | // TODO: this should be something meaningful and not hardcoded? | ||
88 | get { return "0.1"; } | ||
89 | } | ||
90 | |||
91 | public string Name | ||
92 | { | ||
93 | get { return "OpenSimInventoryFrontend"; } | ||
94 | } | ||
95 | |||
96 | #endregion IPlugin implementation | ||
97 | |||
98 | public class GetInventoryHandler : BaseStreamHandler | ||
99 | { | ||
100 | AssetInventoryServer m_server; | ||
101 | Utils.InventoryCollectionSerializer m_collectionSerializer; | ||
102 | |||
103 | //public GetInventoryHandler(AssetInventoryServer server, Utils.InventoryCollectionSerializer collectionSerializer) : base("POST", @"^/GetInventory/") | ||
104 | public GetInventoryHandler(AssetInventoryServer server, Utils.InventoryCollectionSerializer collectionSerializer) : base("POST", "/GetInventory") | ||
105 | { | ||
106 | m_server = server; | ||
107 | m_collectionSerializer = collectionSerializer; | ||
108 | } | ||
109 | |||
110 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
111 | { | ||
112 | byte[] buffer = new byte[] {}; | ||
113 | UUID sessionID, agentID; | ||
114 | UUID ownerID = DeserializeUUID(httpRequest.InputStream, out agentID, out sessionID); | ||
115 | |||
116 | if (ownerID != UUID.Zero) | ||
117 | { | ||
118 | m_log.Warn("[OPENSIMINVENTORYFRONTEND]: GetInventory is not scalable on some inventory backends, avoid calling it wherever possible"); | ||
119 | |||
120 | Uri owner = Utils.GetOpenSimUri(ownerID); | ||
121 | InventoryCollection inventory; | ||
122 | BackendResponse storageResponse = m_server.InventoryProvider.TryFetchInventory(owner, out inventory); | ||
123 | |||
124 | if (storageResponse == BackendResponse.Success) | ||
125 | { | ||
126 | //collectionSerializer.Serialize(httpResponse.Body, inventory); | ||
127 | //httpResponse.Body.Flush(); | ||
128 | MemoryStream ms = new MemoryStream(); | ||
129 | m_collectionSerializer.Serialize(ms, inventory); | ||
130 | ms.Seek(0, SeekOrigin.Begin); | ||
131 | buffer = ms.GetBuffer(); | ||
132 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
133 | ms.Close(); | ||
134 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
135 | } | ||
136 | else if (storageResponse == BackendResponse.NotFound) | ||
137 | { | ||
138 | // Return an empty inventory set to mimic OpenSim.Grid.InventoryServer.exe | ||
139 | inventory = new InventoryCollection(); | ||
140 | inventory.UserID = ownerID; | ||
141 | inventory.Folders = new Dictionary<UUID, InventoryFolderWithChildren>(); | ||
142 | inventory.Items = new Dictionary<UUID, InventoryItemBase>(); | ||
143 | //collectionSerializer.Serialize(httpResponse.Body, inventory); | ||
144 | //httpResponse.Body.Flush(); | ||
145 | MemoryStream ms = new MemoryStream(); | ||
146 | m_collectionSerializer.Serialize(ms, inventory); | ||
147 | ms.Seek(0, SeekOrigin.Begin); | ||
148 | buffer = ms.GetBuffer(); | ||
149 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
150 | ms.Close(); | ||
151 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
152 | } | ||
153 | else | ||
154 | { | ||
155 | httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
156 | } | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
161 | } | ||
162 | |||
163 | return buffer; | ||
164 | } | ||
165 | } | ||
166 | |||
167 | public class CreateInventoryHandler : BaseStreamHandler | ||
168 | { | ||
169 | AssetInventoryServer m_server; | ||
170 | |||
171 | //public CreateInventoryHandler(AssetInventoryServer server) : base("POST", @"^/CreateInventory/") | ||
172 | public CreateInventoryHandler(AssetInventoryServer server) : base("POST", "/CreateInventory") | ||
173 | { | ||
174 | m_server = server; | ||
175 | } | ||
176 | |||
177 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
178 | { | ||
179 | UUID ownerID = DeserializeUUID(httpRequest.InputStream); | ||
180 | |||
181 | if (ownerID != UUID.Zero) | ||
182 | { | ||
183 | Uri owner = Utils.GetOpenSimUri(ownerID); | ||
184 | m_log.DebugFormat("[OPENSIMINVENTORYFRONTEND]: Created URI {0} for inventory creation", owner); | ||
185 | |||
186 | InventoryFolderWithChildren rootFolder = new InventoryFolderWithChildren("My Inventory", ownerID, UUID.Zero, (short)AssetType.Folder); | ||
187 | BackendResponse storageResponse = m_server.InventoryProvider.TryCreateInventory(owner, rootFolder); | ||
188 | if (storageResponse == BackendResponse.Success) | ||
189 | { | ||
190 | // TODO: The CreateFolder calls need to be executed in SimpleStorage. | ||
191 | //CreateFolder("Animations", ownerID, rootFolder.ID, AssetType.Animation); | ||
192 | //CreateFolder("Body Parts", ownerID, rootFolder.ID, AssetType.Bodypart); | ||
193 | //CreateFolder("Calling Cards", ownerID, rootFolder.ID, AssetType.CallingCard); | ||
194 | //CreateFolder("Clothing", ownerID, rootFolder.ID, AssetType.Clothing); | ||
195 | //CreateFolder("Gestures", ownerID, rootFolder.ID, AssetType.Gesture); | ||
196 | //CreateFolder("Landmarks", ownerID, rootFolder.ID, AssetType.Landmark); | ||
197 | //CreateFolder("Lost and Found", ownerID, rootFolder.ID, AssetType.LostAndFoundFolder); | ||
198 | //CreateFolder("Notecards", ownerID, rootFolder.ID, AssetType.Notecard); | ||
199 | //CreateFolder("Objects", ownerID, rootFolder.ID, AssetType.Object); | ||
200 | //CreateFolder("Photo Album", ownerID, rootFolder.ID, AssetType.SnapshotFolder); | ||
201 | //CreateFolder("Scripts", ownerID, rootFolder.ID, AssetType.LSLText); | ||
202 | //CreateFolder("Sounds", ownerID, rootFolder.ID, AssetType.Sound); | ||
203 | //CreateFolder("Textures", ownerID, rootFolder.ID, AssetType.Texture); | ||
204 | //CreateFolder("Trash", ownerID, rootFolder.ID, AssetType.TrashFolder); | ||
205 | |||
206 | return SerializeBool(true); | ||
207 | } | ||
208 | } | ||
209 | |||
210 | return SerializeBool(false); | ||
211 | } | ||
212 | } | ||
213 | |||
214 | public class NewFolderHandler : BaseStreamHandler | ||
215 | { | ||
216 | AssetInventoryServer m_server; | ||
217 | |||
218 | //public NewFolderHandler(AssetInventoryServer server) : base("POST", @"^/NewFolder/") | ||
219 | public NewFolderHandler(AssetInventoryServer server) : base("POST", "/NewFolder") | ||
220 | { | ||
221 | m_server = server; | ||
222 | } | ||
223 | |||
224 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
225 | { | ||
226 | UUID agentID, sessionID; | ||
227 | InventoryFolderWithChildren folder = DeserializeFolder(httpRequest.InputStream, out agentID, out sessionID); | ||
228 | |||
229 | if (folder != null) | ||
230 | { | ||
231 | Uri owner = Utils.GetOpenSimUri(folder.Owner); | ||
232 | |||
233 | // Some calls that are moving or updating a folder instead | ||
234 | // of creating a new one will pass in an InventoryFolder | ||
235 | // without the name set and type set to 0. If this is the | ||
236 | // case we need to look up the name first and preserver | ||
237 | // it's type. | ||
238 | if (String.IsNullOrEmpty(folder.Name)) | ||
239 | { | ||
240 | InventoryFolderWithChildren oldFolder; | ||
241 | if (m_server.InventoryProvider.TryFetchFolder(owner, folder.ID, out oldFolder) == BackendResponse.Success) | ||
242 | { | ||
243 | folder.Name = oldFolder.Name; | ||
244 | folder.Type = oldFolder.Type; | ||
245 | } | ||
246 | } | ||
247 | |||
248 | BackendResponse storageResponse = m_server.InventoryProvider.TryCreateFolder(owner, folder); | ||
249 | |||
250 | if (storageResponse == BackendResponse.Success) | ||
251 | { | ||
252 | return SerializeBool(true); | ||
253 | } | ||
254 | } | ||
255 | |||
256 | return SerializeBool(false); | ||
257 | } | ||
258 | } | ||
259 | |||
260 | public class UpdateFolderHandler : BaseStreamHandler | ||
261 | { | ||
262 | AssetInventoryServer m_server; | ||
263 | |||
264 | //public UpdateFolderHandler(AssetInventoryServer server) : base("POST", @"^/UpdateFolder/") | ||
265 | public UpdateFolderHandler(AssetInventoryServer server) : base("POST", "/UpdateFolder") | ||
266 | { | ||
267 | m_server = server; | ||
268 | } | ||
269 | |||
270 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
271 | { | ||
272 | return new NewFolderHandler(m_server).Handle(path, request, httpRequest, httpResponse); | ||
273 | } | ||
274 | } | ||
275 | |||
276 | public class MoveFolderHandler : BaseStreamHandler | ||
277 | { | ||
278 | AssetInventoryServer m_server; | ||
279 | |||
280 | //public MoveFolderHandler(AssetInventoryServer server) : base("POST", @"^/MoveFolder/") | ||
281 | public MoveFolderHandler(AssetInventoryServer server) : base("POST", "/MoveFolder") | ||
282 | { | ||
283 | m_server = server; | ||
284 | } | ||
285 | |||
286 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
287 | { | ||
288 | return new NewFolderHandler(m_server).Handle(path, request, httpRequest, httpResponse); | ||
289 | } | ||
290 | } | ||
291 | |||
292 | public class PurgeFolderHandler : BaseStreamHandler | ||
293 | { | ||
294 | AssetInventoryServer m_server; | ||
295 | |||
296 | //public PurgeFolderHandler(AssetInventoryServer server) : base("POST", @"^/PurgeFolder/") | ||
297 | public PurgeFolderHandler(AssetInventoryServer server) : base("POST", "/PurgeFolder") | ||
298 | { | ||
299 | m_server = server; | ||
300 | } | ||
301 | |||
302 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
303 | { | ||
304 | UUID agentID, sessionID; | ||
305 | InventoryFolderWithChildren folder = DeserializeFolder(httpRequest.InputStream, out agentID, out sessionID); | ||
306 | |||
307 | if (folder != null) | ||
308 | { | ||
309 | Uri owner = Utils.GetOpenSimUri(folder.Owner); | ||
310 | BackendResponse storageResponse = m_server.InventoryProvider.TryPurgeFolder(owner, folder.ID); | ||
311 | |||
312 | if (storageResponse == BackendResponse.Success) | ||
313 | { | ||
314 | return SerializeBool(true); | ||
315 | } | ||
316 | } | ||
317 | |||
318 | return SerializeBool(false); | ||
319 | } | ||
320 | } | ||
321 | |||
322 | public class NewItemHandler : BaseStreamHandler | ||
323 | { | ||
324 | AssetInventoryServer m_server; | ||
325 | |||
326 | //public NewItemHandler(AssetInventoryServer server) : base("POST", @"^/NewItem/") | ||
327 | public NewItemHandler(AssetInventoryServer server) : base("POST", "/NewItem") | ||
328 | { | ||
329 | m_server = server; | ||
330 | } | ||
331 | |||
332 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
333 | { | ||
334 | UUID agentID, sessionID; | ||
335 | InventoryItemBase item = DeserializeItem(httpRequest.InputStream, out agentID, out sessionID); | ||
336 | |||
337 | if (item != null) | ||
338 | { | ||
339 | Uri owner = Utils.GetOpenSimUri(agentID); | ||
340 | BackendResponse storageResponse = m_server.InventoryProvider.TryCreateItem(owner, item); | ||
341 | |||
342 | if (storageResponse == BackendResponse.Success) | ||
343 | { | ||
344 | return SerializeBool(true); | ||
345 | } | ||
346 | } | ||
347 | |||
348 | return SerializeBool(false); | ||
349 | } | ||
350 | } | ||
351 | |||
352 | public class DeleteItemHandler : BaseStreamHandler | ||
353 | { | ||
354 | AssetInventoryServer m_server; | ||
355 | |||
356 | //public DeleteItemHandler(AssetInventoryServer server) : base("POST", @"^/DeleteItem/") | ||
357 | public DeleteItemHandler(AssetInventoryServer server) : base("POST", "/DeleteItem") | ||
358 | { | ||
359 | m_server = server; | ||
360 | } | ||
361 | |||
362 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
363 | { | ||
364 | UUID agentID, sessionID; | ||
365 | InventoryItemBase item = DeserializeItem(httpRequest.InputStream, out agentID, out sessionID); | ||
366 | |||
367 | if (item != null) | ||
368 | { | ||
369 | Uri owner = Utils.GetOpenSimUri(item.Owner); | ||
370 | BackendResponse storageResponse = m_server.InventoryProvider.TryDeleteItem(owner, item.ID); | ||
371 | |||
372 | if (storageResponse == BackendResponse.Success) | ||
373 | { | ||
374 | return SerializeBool(true); | ||
375 | } | ||
376 | } | ||
377 | |||
378 | return SerializeBool(false); | ||
379 | } | ||
380 | } | ||
381 | |||
382 | public class RootFoldersHandler : BaseStreamHandler | ||
383 | { | ||
384 | AssetInventoryServer m_server; | ||
385 | |||
386 | //public RootFoldersHandler(AssetInventoryServer server) : base("POST", @"^/RootFolders/") | ||
387 | public RootFoldersHandler(AssetInventoryServer server) : base("POST", "/RootFolders") | ||
388 | { | ||
389 | m_server = server; | ||
390 | } | ||
391 | |||
392 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
393 | { | ||
394 | byte[] buffer = new byte[] {}; | ||
395 | UUID ownerID = DeserializeUUID(httpRequest.InputStream); | ||
396 | |||
397 | if (ownerID != UUID.Zero) | ||
398 | { | ||
399 | Uri owner = Utils.GetOpenSimUri(ownerID); | ||
400 | List<InventoryFolderWithChildren> skeleton; | ||
401 | BackendResponse storageResponse = m_server.InventoryProvider.TryFetchFolderList(owner, out skeleton); | ||
402 | |||
403 | if (storageResponse == BackendResponse.Success) | ||
404 | { | ||
405 | MemoryStream ms = new MemoryStream(); | ||
406 | SerializeFolderList(ms, skeleton); | ||
407 | ms.Seek(0, SeekOrigin.Begin); | ||
408 | buffer = ms.GetBuffer(); | ||
409 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
410 | ms.Close(); | ||
411 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
412 | } | ||
413 | else if (storageResponse == BackendResponse.NotFound) | ||
414 | { | ||
415 | // Return an empty set of inventory so the requester knows that | ||
416 | // an inventory needs to be created for this agent | ||
417 | MemoryStream ms = new MemoryStream(); | ||
418 | SerializeFolderList(ms, new List<InventoryFolderWithChildren>(0)); | ||
419 | ms.Seek(0, SeekOrigin.Begin); | ||
420 | buffer = ms.GetBuffer(); | ||
421 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
422 | ms.Close(); | ||
423 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
424 | } | ||
425 | else | ||
426 | { | ||
427 | httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
428 | } | ||
429 | } | ||
430 | else | ||
431 | { | ||
432 | httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
433 | } | ||
434 | |||
435 | return buffer; | ||
436 | } | ||
437 | } | ||
438 | |||
439 | public class ActiveGesturesHandler : BaseStreamHandler | ||
440 | { | ||
441 | AssetInventoryServer m_server; | ||
442 | |||
443 | //public ActiveGesturesHandler(AssetInventoryServer server) : base("POST", @"^/ActiveGestures/") | ||
444 | public ActiveGesturesHandler(AssetInventoryServer server) : base("POST", "/ActiveGestures") | ||
445 | { | ||
446 | m_server = server; | ||
447 | } | ||
448 | |||
449 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
450 | { | ||
451 | byte[] buffer = new byte[] {}; | ||
452 | UUID ownerID = DeserializeUUID(httpRequest.InputStream); | ||
453 | |||
454 | if (ownerID != UUID.Zero) | ||
455 | { | ||
456 | Uri owner = Utils.GetOpenSimUri(ownerID); | ||
457 | List<InventoryItemBase> gestures; | ||
458 | BackendResponse storageResponse = m_server.InventoryProvider.TryFetchActiveGestures(owner, out gestures); | ||
459 | |||
460 | if (storageResponse == BackendResponse.Success) | ||
461 | { | ||
462 | MemoryStream ms = new MemoryStream(); | ||
463 | SerializeItemList(ms, gestures); | ||
464 | ms.Seek(0, SeekOrigin.Begin); | ||
465 | buffer = ms.GetBuffer(); | ||
466 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
467 | ms.Close(); | ||
468 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
469 | } | ||
470 | else if (storageResponse == BackendResponse.NotFound) | ||
471 | { | ||
472 | // Return an empty set of gestures to match OpenSim.Grid.InventoryServer.exe behavior | ||
473 | MemoryStream ms = new MemoryStream(); | ||
474 | SerializeItemList(ms, new List<InventoryItemBase>(0)); | ||
475 | ms.Seek(0, SeekOrigin.Begin); | ||
476 | buffer = ms.GetBuffer(); | ||
477 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
478 | ms.Close(); | ||
479 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
480 | } | ||
481 | else | ||
482 | { | ||
483 | httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
484 | } | ||
485 | } | ||
486 | else | ||
487 | { | ||
488 | httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
489 | } | ||
490 | |||
491 | return buffer; | ||
492 | } | ||
493 | } | ||
494 | |||
495 | //BackendResponse CreateFolder(string name, UUID ownerID, UUID parentID, AssetType assetType) | ||
496 | //{ | ||
497 | // InventoryFolder folder = new InventoryFolder(name, ownerID, parentID, (short)assetType); | ||
498 | // Uri owner = Utils.GetOpenSimUri(ownerID); | ||
499 | // return m_server.InventoryProvider.TryCreateFolder(owner, folder); | ||
500 | //} | ||
501 | |||
502 | private static UUID DeserializeUUID(Stream stream) | ||
503 | { | ||
504 | UUID id = UUID.Zero; | ||
505 | |||
506 | try | ||
507 | { | ||
508 | using (XmlReader reader = XmlReader.Create(stream)) | ||
509 | { | ||
510 | reader.MoveToContent(); | ||
511 | UUID.TryParse(reader.ReadElementContentAsString("guid", String.Empty), out id); | ||
512 | } | ||
513 | } | ||
514 | catch (Exception ex) | ||
515 | { | ||
516 | m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting guid): " + ex.Message); | ||
517 | } | ||
518 | |||
519 | return id; | ||
520 | } | ||
521 | |||
522 | private static UUID DeserializeUUID(Stream stream, out UUID agentID, out UUID sessionID) | ||
523 | { | ||
524 | UUID id; | ||
525 | |||
526 | try | ||
527 | { | ||
528 | using (XmlReader reader = XmlReader.Create(stream)) | ||
529 | { | ||
530 | reader.MoveToContent(); | ||
531 | reader.ReadStartElement("RestSessionObjectOfGuid"); | ||
532 | UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); | ||
533 | UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); | ||
534 | UUID.TryParse(reader.ReadElementContentAsString("Body", String.Empty), out id); | ||
535 | reader.ReadEndElement(); | ||
536 | } | ||
537 | } | ||
538 | catch (Exception ex) | ||
539 | { | ||
540 | m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse GetInventory POST data: " + ex.Message); | ||
541 | agentID = UUID.Zero; | ||
542 | sessionID = UUID.Zero; | ||
543 | return UUID.Zero; | ||
544 | } | ||
545 | |||
546 | return id; | ||
547 | } | ||
548 | |||
549 | private static InventoryFolderWithChildren DeserializeFolder(Stream stream, out UUID agentID, out UUID sessionID) | ||
550 | { | ||
551 | InventoryFolderWithChildren folder = new InventoryFolderWithChildren(); | ||
552 | |||
553 | try | ||
554 | { | ||
555 | using (XmlReader reader = XmlReader.Create(stream)) | ||
556 | { | ||
557 | reader.MoveToContent(); | ||
558 | reader.ReadStartElement("RestSessionObjectOfInventoryFolderBase"); | ||
559 | UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); | ||
560 | UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); | ||
561 | reader.ReadStartElement("Body"); | ||
562 | if (reader.Name == "Name") | ||
563 | folder.Name = reader.ReadElementContentAsString("Name", String.Empty); | ||
564 | else | ||
565 | folder.Name = String.Empty; | ||
566 | |||
567 | UUID dummyUUID; | ||
568 | ReadUUID(reader, "ID", out dummyUUID); | ||
569 | folder.ID = dummyUUID; | ||
570 | ReadUUID(reader, "Owner", out dummyUUID); | ||
571 | folder.Owner = dummyUUID; | ||
572 | ReadUUID(reader, "ParentID", out dummyUUID); | ||
573 | folder.ParentID = dummyUUID; | ||
574 | |||
575 | short dummyType; | ||
576 | Int16.TryParse(reader.ReadElementContentAsString("Type", String.Empty), out dummyType); | ||
577 | folder.Type = dummyType; | ||
578 | |||
579 | ushort dummyVersion; | ||
580 | UInt16.TryParse(reader.ReadElementContentAsString("Version", String.Empty), out dummyVersion); | ||
581 | folder.Version = dummyVersion; | ||
582 | |||
583 | reader.ReadEndElement(); | ||
584 | reader.ReadEndElement(); | ||
585 | } | ||
586 | } | ||
587 | catch (Exception ex) | ||
588 | { | ||
589 | m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting InventoryFolderBase): " + ex.Message); | ||
590 | agentID = UUID.Zero; | ||
591 | sessionID = UUID.Zero; | ||
592 | return null; | ||
593 | } | ||
594 | |||
595 | return folder; | ||
596 | } | ||
597 | |||
598 | private static InventoryItemBase DeserializeItem(Stream stream, out UUID agentID, out UUID sessionID) | ||
599 | { | ||
600 | InventoryItemBase item = new InventoryItemBase(); | ||
601 | |||
602 | try | ||
603 | { | ||
604 | using (XmlReader reader = XmlReader.Create(stream)) | ||
605 | { | ||
606 | reader.MoveToContent(); | ||
607 | reader.ReadStartElement("RestSessionObjectOfInventoryItemBase"); | ||
608 | UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); | ||
609 | UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); | ||
610 | reader.ReadStartElement("Body"); | ||
611 | |||
612 | item.Name = reader.ReadElementContentAsString("Name", String.Empty); | ||
613 | |||
614 | UUID dummyUUID; | ||
615 | ReadUUID(reader, "ID", out dummyUUID); | ||
616 | item.ID = dummyUUID; | ||
617 | |||
618 | ReadUUID(reader, "Owner", out dummyUUID); | ||
619 | item.Owner = dummyUUID; | ||
620 | |||
621 | int dummyInt; | ||
622 | Int32.TryParse(reader.ReadElementContentAsString("InvType", String.Empty), out dummyInt); | ||
623 | item.InvType = dummyInt; | ||
624 | |||
625 | ReadUUID(reader, "Folder", out dummyUUID); | ||
626 | item.Folder = dummyUUID; | ||
627 | |||
628 | item.CreatorId = reader.ReadElementContentAsString("CreatorId", String.Empty); | ||
629 | item.Description = reader.ReadElementContentAsString("Description", String.Empty); | ||
630 | |||
631 | uint dummyUInt; | ||
632 | UInt32.TryParse(reader.ReadElementContentAsString("NextPermissions", String.Empty), out dummyUInt); | ||
633 | item.NextPermissions = dummyUInt; | ||
634 | UInt32.TryParse(reader.ReadElementContentAsString("CurrentPermissions", String.Empty), out dummyUInt); | ||
635 | item.CurrentPermissions = dummyUInt; | ||
636 | UInt32.TryParse(reader.ReadElementContentAsString("BasePermissions", String.Empty), out dummyUInt); | ||
637 | item.BasePermissions = dummyUInt; | ||
638 | UInt32.TryParse(reader.ReadElementContentAsString("EveryOnePermissions", String.Empty), out dummyUInt); | ||
639 | item.EveryOnePermissions = dummyUInt; | ||
640 | UInt32.TryParse(reader.ReadElementContentAsString("GroupPermissions", String.Empty), out dummyUInt); | ||
641 | item.GroupPermissions = dummyUInt; | ||
642 | |||
643 | Int32.TryParse(reader.ReadElementContentAsString("AssetType", String.Empty), out dummyInt); | ||
644 | item.AssetType = dummyInt; | ||
645 | |||
646 | ReadUUID(reader, "AssetID", out dummyUUID); | ||
647 | item.AssetID = dummyUUID; | ||
648 | ReadUUID(reader, "GroupID", out dummyUUID); | ||
649 | item.GroupID = dummyUUID; | ||
650 | |||
651 | bool dummyBool; | ||
652 | Boolean.TryParse(reader.ReadElementContentAsString("GroupOwned", String.Empty), out dummyBool); | ||
653 | item.GroupOwned = dummyBool; | ||
654 | |||
655 | Int32.TryParse(reader.ReadElementContentAsString("SalePrice", String.Empty), out dummyInt); | ||
656 | item.SalePrice = dummyInt; | ||
657 | |||
658 | byte dummyByte; | ||
659 | Byte.TryParse(reader.ReadElementContentAsString("SaleType", String.Empty), out dummyByte); | ||
660 | item.SaleType = dummyByte; | ||
661 | |||
662 | UInt32.TryParse(reader.ReadElementContentAsString("Flags", String.Empty), out dummyUInt); | ||
663 | item.Flags = dummyUInt; | ||
664 | |||
665 | Int32.TryParse(reader.ReadElementContentAsString("CreationDate", String.Empty), out dummyInt); | ||
666 | item.CreationDate = dummyInt; | ||
667 | |||
668 | reader.ReadEndElement(); | ||
669 | reader.ReadEndElement(); | ||
670 | } | ||
671 | } | ||
672 | catch (Exception ex) | ||
673 | { | ||
674 | m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting InventoryItemBase): " + ex.Message); | ||
675 | agentID = UUID.Zero; | ||
676 | sessionID = UUID.Zero; | ||
677 | return null; | ||
678 | } | ||
679 | |||
680 | return item; | ||
681 | } | ||
682 | |||
683 | private static byte[] SerializeBool(bool value) | ||
684 | { | ||
685 | byte[] buffer; | ||
686 | MemoryStream ms = new MemoryStream(); | ||
687 | |||
688 | using (XmlWriter writer = XmlWriter.Create(ms)) | ||
689 | { | ||
690 | writer.WriteStartDocument(); | ||
691 | writer.WriteStartElement("boolean"); | ||
692 | writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); | ||
693 | writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); | ||
694 | writer.WriteString(value.ToString().ToLower()); | ||
695 | writer.WriteEndElement(); | ||
696 | writer.WriteEndDocument(); | ||
697 | writer.Flush(); | ||
698 | } | ||
699 | |||
700 | ms.Seek(0, SeekOrigin.Begin); | ||
701 | buffer = ms.GetBuffer(); | ||
702 | Array.Resize<byte>(ref buffer, (int) ms.Length); | ||
703 | ms.Close(); | ||
704 | |||
705 | return buffer; | ||
706 | } | ||
707 | |||
708 | private static void SerializeFolderList(Stream stream, List<InventoryFolderWithChildren> folders) | ||
709 | { | ||
710 | using (XmlWriter writer = XmlWriter.Create(stream)) | ||
711 | { | ||
712 | writer.WriteStartDocument(); | ||
713 | writer.WriteStartElement("ArrayOfInventoryFolderBase"); | ||
714 | writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); | ||
715 | writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); | ||
716 | |||
717 | if (folders != null) | ||
718 | { | ||
719 | foreach (InventoryFolderWithChildren folder in folders) | ||
720 | { | ||
721 | writer.WriteStartElement("InventoryFolderBase"); | ||
722 | writer.WriteElementString("Name", folder.Name); | ||
723 | WriteUUID(writer, "Owner", folder.Owner); | ||
724 | WriteUUID(writer, "ParentID", folder.ParentID); | ||
725 | WriteUUID(writer, "ID", folder.ID); | ||
726 | writer.WriteElementString("Type", XmlConvert.ToString(folder.Type)); | ||
727 | writer.WriteElementString("Version", XmlConvert.ToString(folder.Version)); | ||
728 | writer.WriteEndElement(); | ||
729 | } | ||
730 | } | ||
731 | |||
732 | writer.WriteEndElement(); | ||
733 | writer.WriteEndDocument(); | ||
734 | |||
735 | writer.Flush(); | ||
736 | } | ||
737 | |||
738 | stream.Flush(); | ||
739 | } | ||
740 | |||
741 | private static void SerializeItemList(Stream stream, List<InventoryItemBase> items) | ||
742 | { | ||
743 | using (XmlWriter writer = XmlWriter.Create(stream)) | ||
744 | { | ||
745 | writer.WriteStartDocument(); | ||
746 | writer.WriteStartElement("ArrayOfInventoryItemBase"); | ||
747 | writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); | ||
748 | writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); | ||
749 | |||
750 | if (items != null) | ||
751 | { | ||
752 | foreach (InventoryItemBase item in items) | ||
753 | { | ||
754 | writer.WriteStartElement("InventoryItemBase"); | ||
755 | WriteUUID(writer, "ID", item.ID); | ||
756 | writer.WriteElementString("InvType", XmlConvert.ToString(item.InvType)); | ||
757 | WriteUUID(writer, "Folder", item.Folder); | ||
758 | WriteUUID(writer, "Owner", item.Owner); | ||
759 | writer.WriteElementString("Creator", item.CreatorId); | ||
760 | writer.WriteElementString("Name", item.Name); | ||
761 | writer.WriteElementString("Description", item.Description); | ||
762 | writer.WriteElementString("NextPermissions", XmlConvert.ToString(item.NextPermissions)); | ||
763 | writer.WriteElementString("CurrentPermissions", XmlConvert.ToString(item.CurrentPermissions)); | ||
764 | writer.WriteElementString("BasePermissions", XmlConvert.ToString(item.BasePermissions)); | ||
765 | writer.WriteElementString("EveryOnePermissions", XmlConvert.ToString(item.EveryOnePermissions)); | ||
766 | writer.WriteElementString("GroupPermissions", XmlConvert.ToString(item.GroupPermissions)); | ||
767 | writer.WriteElementString("AssetType", XmlConvert.ToString(item.AssetType)); | ||
768 | WriteUUID(writer, "AssetID", item.AssetID); | ||
769 | WriteUUID(writer, "GroupID", item.GroupID); | ||
770 | writer.WriteElementString("GroupOwned", XmlConvert.ToString(item.GroupOwned)); | ||
771 | writer.WriteElementString("SalePrice", XmlConvert.ToString(item.SalePrice)); | ||
772 | writer.WriteElementString("SaleType", XmlConvert.ToString(item.SaleType)); | ||
773 | writer.WriteElementString("Flags", XmlConvert.ToString(item.Flags)); | ||
774 | writer.WriteElementString("CreationDate", XmlConvert.ToString(item.CreationDate)); | ||
775 | writer.WriteEndElement(); | ||
776 | } | ||
777 | } | ||
778 | |||
779 | writer.WriteEndElement(); | ||
780 | writer.WriteEndDocument(); | ||
781 | |||
782 | writer.Flush(); | ||
783 | } | ||
784 | |||
785 | stream.Flush(); | ||
786 | } | ||
787 | |||
788 | private static void WriteUUID(XmlWriter writer, string name, UUID id) | ||
789 | { | ||
790 | writer.WriteStartElement(name); | ||
791 | writer.WriteElementString("Guid", XmlConvert.ToString(id.Guid)); | ||
792 | writer.WriteEndElement(); | ||
793 | } | ||
794 | |||
795 | private static void ReadUUID(XmlReader reader, string name, out UUID id) | ||
796 | { | ||
797 | reader.ReadStartElement(name); | ||
798 | UUID.TryParse(reader.ReadElementContentAsString("Guid", String.Empty), out id); | ||
799 | reader.ReadEndElement(); | ||
800 | } | ||
801 | } | ||
802 | |||
803 | #region OpenSim AssetType | ||
804 | |||
805 | /// <summary> | ||
806 | /// The different types of grid assets | ||
807 | /// </summary> | ||
808 | public enum AssetType : sbyte | ||
809 | { | ||
810 | /// <summary>Unknown asset type</summary> | ||
811 | Unknown = -1, | ||
812 | /// <summary>Texture asset, stores in JPEG2000 J2C stream format</summary> | ||
813 | Texture = 0, | ||
814 | /// <summary>Sound asset</summary> | ||
815 | Sound = 1, | ||
816 | /// <summary>Calling card for another avatar</summary> | ||
817 | CallingCard = 2, | ||
818 | /// <summary>Link to a location in world</summary> | ||
819 | Landmark = 3, | ||
820 | // <summary>Legacy script asset, you should never see one of these</summary> | ||
821 | //[Obsolete] | ||
822 | //Script = 4, | ||
823 | /// <summary>Collection of textures and parameters that can be | ||
824 | /// worn by an avatar</summary> | ||
825 | Clothing = 5, | ||
826 | /// <summary>Primitive that can contain textures, sounds, | ||
827 | /// scripts and more</summary> | ||
828 | Object = 6, | ||
829 | /// <summary>Notecard asset</summary> | ||
830 | Notecard = 7, | ||
831 | /// <summary>Holds a collection of inventory items</summary> | ||
832 | Folder = 8, | ||
833 | /// <summary>Root inventory folder</summary> | ||
834 | RootFolder = 9, | ||
835 | /// <summary>Linden scripting language script</summary> | ||
836 | LSLText = 10, | ||
837 | /// <summary>LSO bytecode for a script</summary> | ||
838 | LSLBytecode = 11, | ||
839 | /// <summary>Uncompressed TGA texture</summary> | ||
840 | TextureTGA = 12, | ||
841 | /// <summary>Collection of textures and shape parameters that can | ||
842 | /// be worn</summary> | ||
843 | Bodypart = 13, | ||
844 | /// <summary>Trash folder</summary> | ||
845 | TrashFolder = 14, | ||
846 | /// <summary>Snapshot folder</summary> | ||
847 | SnapshotFolder = 15, | ||
848 | /// <summary>Lost and found folder</summary> | ||
849 | LostAndFoundFolder = 16, | ||
850 | /// <summary>Uncompressed sound</summary> | ||
851 | SoundWAV = 17, | ||
852 | /// <summary>Uncompressed TGA non-square image, not to be used as a | ||
853 | /// texture</summary> | ||
854 | ImageTGA = 18, | ||
855 | /// <summary>Compressed JPEG non-square image, not to be used as a | ||
856 | /// texture</summary> | ||
857 | ImageJPEG = 19, | ||
858 | /// <summary>Animation</summary> | ||
859 | Animation = 20, | ||
860 | /// <summary>Sequence of animations, sounds, chat, and pauses</summary> | ||
861 | Gesture = 21, | ||
862 | /// <summary>Simstate file</summary> | ||
863 | Simstate = 22, | ||
864 | } | ||
865 | |||
866 | #endregion OpenSim AssetType | ||
867 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs deleted file mode 100644 index 0effa9f..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
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 OpenMetaverse; | ||
29 | using OpenSim.Framework; | ||
30 | using OpenSim.Framework.Communications; | ||
31 | using OpenSim.Data; | ||
32 | |||
33 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim | ||
34 | { | ||
35 | public class OpenSimInventoryService : InventoryServiceBase | ||
36 | { | ||
37 | public InventoryFolderWithChildren GetInventoryFolder(UUID folderID) | ||
38 | { | ||
39 | InventoryFolderBase baseFolder = null; | ||
40 | InventoryFolderWithChildren folder = null; | ||
41 | |||
42 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
43 | { | ||
44 | baseFolder = plugin.getInventoryFolder(folderID); | ||
45 | } | ||
46 | |||
47 | if (null != baseFolder) | ||
48 | { | ||
49 | folder = new InventoryFolderWithChildren(baseFolder); | ||
50 | folder.Children = null; // This call only returns data for the folder itself, no children data | ||
51 | } | ||
52 | |||
53 | return folder; | ||
54 | } | ||
55 | } | ||
56 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs deleted file mode 100644 index 2239b87..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs +++ /dev/null | |||
@@ -1,547 +0,0 @@ | |||
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 System.Data; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Data; | ||
35 | using Nini.Config; | ||
36 | using log4net; | ||
37 | |||
38 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim | ||
39 | { | ||
40 | public class OpenSimInventoryStoragePlugin : IInventoryStorageProvider | ||
41 | { | ||
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | const string EXTENSION_NAME = "OpenSimInventoryStorage"; // Used in metrics reporting | ||
44 | |||
45 | private AssetInventoryServer m_server; | ||
46 | private IConfig m_openSimConfig; | ||
47 | private OpenSimInventoryService m_inventoryService; | ||
48 | |||
49 | public OpenSimInventoryStoragePlugin() | ||
50 | { | ||
51 | } | ||
52 | |||
53 | #region IInventoryStorageProvider implementation | ||
54 | |||
55 | public BackendResponse TryFetchItem(Uri owner, UUID itemID, out InventoryItemBase item) | ||
56 | { | ||
57 | item = null; | ||
58 | //BackendResponse ret; | ||
59 | |||
60 | //using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) | ||
61 | //{ | ||
62 | // IDataReader reader; | ||
63 | |||
64 | // try | ||
65 | // { | ||
66 | // dbConnection.Open(); | ||
67 | |||
68 | // IDbCommand command = dbConnection.CreateCommand(); | ||
69 | // command.CommandText = String.Format("SELECT assetID,assetType,inventoryName,inventoryDescription,inventoryNextPermissions," + | ||
70 | // "inventoryCurrentPermissions,invType,creatorID,inventoryBasePermissions,inventoryEveryOnePermissions,salePrice,saleType," + | ||
71 | // "creationDate,groupID,groupOwned,flags,avatarID,parentFolderID,inventoryGroupPermissions FROM inventoryitems WHERE inventoryID='{0}'", | ||
72 | // itemID.ToString()); | ||
73 | // reader = command.ExecuteReader(); | ||
74 | |||
75 | // if (reader.Read()) | ||
76 | // { | ||
77 | // item = new InventoryItemBase(); | ||
78 | // item.ID = itemID; | ||
79 | // item.AssetID = UUID.Parse(reader.GetString(0)); | ||
80 | // item.AssetType = reader.GetInt32(1); | ||
81 | // item.Name = reader.GetString(2); | ||
82 | // item.Description = reader.GetString(3); | ||
83 | // item.NextPermissions = (uint)reader.GetInt32(4); | ||
84 | // item.CurrentPermissions = (uint)reader.GetInt32(5); | ||
85 | // item.InvType = reader.GetInt32(6); | ||
86 | // item.Creator = UUID.Parse(reader.GetString(7)); | ||
87 | // item.BasePermissions = (uint)reader.GetInt32(8); | ||
88 | // item.EveryOnePermissions = (uint)reader.GetInt32(9); | ||
89 | // item.SalePrice = reader.GetInt32(10); | ||
90 | // item.SaleType = reader.GetByte(11); | ||
91 | // item.CreationDate = reader.GetInt32(12); | ||
92 | // item.GroupID = UUID.Parse(reader.GetString(13)); | ||
93 | // item.GroupOwned = reader.GetBoolean(14); | ||
94 | // item.Flags = (uint)reader.GetInt32(15); | ||
95 | // item.Owner = UUID.Parse(reader.GetString(16)); | ||
96 | // item.Folder = UUID.Parse(reader.GetString(17)); | ||
97 | // item.GroupPermissions = (uint)reader.GetInt32(18); | ||
98 | |||
99 | // ret = BackendResponse.Success; | ||
100 | // } | ||
101 | // else | ||
102 | // { | ||
103 | // ret = BackendResponse.NotFound; | ||
104 | // } | ||
105 | // } | ||
106 | // catch (MySqlException ex) | ||
107 | // { | ||
108 | // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); | ||
109 | // ret = BackendResponse.Failure; | ||
110 | // } | ||
111 | //} | ||
112 | |||
113 | //m_server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); | ||
114 | //return ret; | ||
115 | m_log.Warn("[OPENSIMINVENTORYSTORAGE]: Called TryFetchItem which is not implemented."); | ||
116 | return BackendResponse.Success; | ||
117 | } | ||
118 | |||
119 | public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) | ||
120 | { | ||
121 | BackendResponse ret; | ||
122 | |||
123 | // TODO: implement some logic for "folder not found" | ||
124 | folder = m_inventoryService.GetInventoryFolder(folderID); | ||
125 | ret = BackendResponse.Success; | ||
126 | |||
127 | m_server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); | ||
128 | return ret; | ||
129 | } | ||
130 | |||
131 | public BackendResponse TryFetchFolderContents(Uri owner, UUID folderID, out InventoryCollection contents) | ||
132 | { | ||
133 | contents = null; | ||
134 | //BackendResponse ret; | ||
135 | |||
136 | //using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) | ||
137 | //{ | ||
138 | // IDataReader reader; | ||
139 | |||
140 | // try | ||
141 | // { | ||
142 | // dbConnection.Open(); | ||
143 | |||
144 | // contents = new InventoryCollection(); | ||
145 | |||
146 | // #region Folder retrieval | ||
147 | |||
148 | // IDbCommand command = dbConnection.CreateCommand(); | ||
149 | // command.CommandText = String.Format("SELECT folderName,type,version,agentID,folderID FROM inventoryfolders WHERE parentFolderID='{0}'", | ||
150 | // folderID.ToString()); | ||
151 | // reader = command.ExecuteReader(); | ||
152 | |||
153 | // contents.Folders = new Dictionary<UUID, InventoryFolderWithChildren>(); | ||
154 | |||
155 | // while (reader.Read()) | ||
156 | // { | ||
157 | // InventoryFolderWithChildren folder = new InventoryFolderWithChildren(); | ||
158 | // folder.ParentID = folderID; | ||
159 | // folder.Children = null; // This call doesn't do recursion | ||
160 | // folder.Name = reader.GetString(0); | ||
161 | // folder.Type = reader.GetInt16(1); | ||
162 | // folder.Version = (ushort)reader.GetInt16(2); | ||
163 | // folder.Owner = UUID.Parse(reader.GetString(3)); | ||
164 | // folder.ID = UUID.Parse(reader.GetString(4)); | ||
165 | |||
166 | // contents.Folders.Add(folder.ID, folder); | ||
167 | // contents.UserID = folder.Owner; | ||
168 | // } | ||
169 | |||
170 | // reader.Close(); | ||
171 | |||
172 | // #endregion Folder retrieval | ||
173 | |||
174 | // #region Item retrieval | ||
175 | |||
176 | // command = dbConnection.CreateCommand(); | ||
177 | // command.CommandText = String.Format("SELECT assetID,assetType,inventoryName,inventoryDescription,inventoryNextPermissions," + | ||
178 | // "inventoryCurrentPermissions,invType,creatorID,inventoryBasePermissions,inventoryEveryOnePermissions,salePrice,saleType," + | ||
179 | // "creationDate,groupID,groupOwned,flags,avatarID,inventoryID,inventoryGroupPermissions FROM inventoryitems WHERE parentFolderID='{0}'", | ||
180 | // folderID.ToString()); | ||
181 | // reader = command.ExecuteReader(); | ||
182 | |||
183 | // contents.Items = new Dictionary<UUID, InventoryItemBase>(); | ||
184 | |||
185 | // while (reader.Read()) | ||
186 | // { | ||
187 | // InventoryItemBase item = new InventoryItemBase(); | ||
188 | // item.Folder = folderID; | ||
189 | // item.AssetID = UUID.Parse(reader.GetString(0)); | ||
190 | // item.AssetType = reader.GetInt32(1); | ||
191 | // item.Name = reader.GetString(2); | ||
192 | // item.Description = reader.GetString(3); | ||
193 | // item.NextPermissions = (uint)reader.GetInt32(4); | ||
194 | // item.CurrentPermissions = (uint)reader.GetInt32(5); | ||
195 | // item.InvType = reader.GetInt32(6); | ||
196 | // item.Creator = UUID.Parse(reader.GetString(7)); | ||
197 | // item.BasePermissions = (uint)reader.GetInt32(8); | ||
198 | // item.EveryOnePermissions = (uint)reader.GetInt32(9); | ||
199 | // item.SalePrice = reader.GetInt32(10); | ||
200 | // item.SaleType = reader.GetByte(11); | ||
201 | // item.CreationDate = reader.GetInt32(12); | ||
202 | // item.GroupID = UUID.Parse(reader.GetString(13)); | ||
203 | // item.GroupOwned = reader.GetBoolean(14); | ||
204 | // item.Flags = (uint)reader.GetInt32(15); | ||
205 | // item.Owner = UUID.Parse(reader.GetString(16)); | ||
206 | // item.ID = UUID.Parse(reader.GetString(17)); | ||
207 | // item.GroupPermissions = (uint)reader.GetInt32(18); | ||
208 | |||
209 | // contents.Items.Add(item.ID, item); | ||
210 | // contents.UserID = item.Owner; | ||
211 | // } | ||
212 | |||
213 | // #endregion Item retrieval | ||
214 | |||
215 | // ret = BackendResponse.Success; | ||
216 | // } | ||
217 | // catch (MySqlException ex) | ||
218 | // { | ||
219 | // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); | ||
220 | // ret = BackendResponse.Failure; | ||
221 | // } | ||
222 | //} | ||
223 | |||
224 | //m_server.MetricsProvider.LogInventoryFetchFolderContents(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); | ||
225 | //return ret; | ||
226 | m_log.Warn("[OPENSIMINVENTORYSTORAGE]: Called TryFetchFolderContents which is not implemented."); | ||
227 | return BackendResponse.Success; | ||
228 | } | ||
229 | |||
230 | public BackendResponse TryFetchFolderList(Uri owner, out List<InventoryFolderWithChildren> folders) | ||
231 | { | ||
232 | folders = new List<InventoryFolderWithChildren>(); | ||
233 | BackendResponse ret; | ||
234 | UUID ownerID; | ||
235 | |||
236 | if (Utils.TryGetOpenSimUUID(owner, out ownerID)) | ||
237 | { | ||
238 | List<InventoryFolderBase> baseFolders = m_inventoryService.GetInventorySkeleton(ownerID); | ||
239 | foreach (InventoryFolderBase baseFolder in baseFolders) | ||
240 | { | ||
241 | InventoryFolderWithChildren folder = new InventoryFolderWithChildren(baseFolder); | ||
242 | //folder.Children = null; // This call does not create a folder hierarchy | ||
243 | folders.Add(folder); | ||
244 | } | ||
245 | |||
246 | ret = BackendResponse.Success; | ||
247 | } | ||
248 | else | ||
249 | { | ||
250 | folders = null; | ||
251 | ret = BackendResponse.NotFound; | ||
252 | } | ||
253 | |||
254 | m_server.MetricsProvider.LogInventoryFetchFolderList(EXTENSION_NAME, ret, owner, DateTime.Now); | ||
255 | return ret; | ||
256 | } | ||
257 | |||
258 | public BackendResponse TryFetchInventory(Uri owner, out InventoryCollection inventory) | ||
259 | { | ||
260 | inventory = null; | ||
261 | BackendResponse ret; | ||
262 | List<InventoryFolderWithChildren> folders; | ||
263 | |||
264 | ret = TryFetchFolderList(owner, out folders); | ||
265 | |||
266 | if (ret == BackendResponse.Success) | ||
267 | { | ||
268 | // Add the retrieved folders to the inventory collection | ||
269 | inventory = new InventoryCollection(); | ||
270 | inventory.Folders = new Dictionary<UUID, InventoryFolderWithChildren>(folders.Count); | ||
271 | foreach (InventoryFolderWithChildren folder in folders) | ||
272 | inventory.Folders[folder.ID] = folder; | ||
273 | |||
274 | // Fetch inventory items | ||
275 | UUID ownerID; | ||
276 | if (Utils.TryGetOpenSimUUID(owner, out ownerID)) | ||
277 | { | ||
278 | inventory.UserID = ownerID; | ||
279 | inventory.Items = new Dictionary<UUID, InventoryItemBase>(); | ||
280 | |||
281 | foreach (InventoryFolderWithChildren folder in folders) | ||
282 | { | ||
283 | foreach (InventoryItemBase item in m_inventoryService.RequestFolderItems(folder.ID)) | ||
284 | { | ||
285 | inventory.Items.Add(item.ID, item); | ||
286 | } | ||
287 | } | ||
288 | |||
289 | ret = BackendResponse.Success; | ||
290 | |||
291 | } | ||
292 | else | ||
293 | { | ||
294 | ret = BackendResponse.NotFound; | ||
295 | } | ||
296 | } | ||
297 | |||
298 | m_server.MetricsProvider.LogInventoryFetchInventory(EXTENSION_NAME, ret, owner, DateTime.Now); | ||
299 | return ret; | ||
300 | } | ||
301 | |||
302 | public BackendResponse TryFetchActiveGestures(Uri owner, out List<InventoryItemBase> gestures) | ||
303 | { | ||
304 | gestures = null; | ||
305 | BackendResponse ret; | ||
306 | UUID ownerID; | ||
307 | |||
308 | if (Utils.TryGetOpenSimUUID(owner, out ownerID)) | ||
309 | { | ||
310 | gestures = m_inventoryService.GetActiveGestures(ownerID); | ||
311 | ret = BackendResponse.Success; | ||
312 | } | ||
313 | else | ||
314 | { | ||
315 | ret = BackendResponse.NotFound; | ||
316 | } | ||
317 | |||
318 | m_server.MetricsProvider.LogInventoryFetchActiveGestures(EXTENSION_NAME, ret, owner, DateTime.Now); | ||
319 | return ret; | ||
320 | } | ||
321 | |||
322 | public BackendResponse TryCreateItem(Uri owner, InventoryItemBase item) | ||
323 | { | ||
324 | BackendResponse ret; | ||
325 | |||
326 | if (m_inventoryService.AddItem(item)) | ||
327 | { | ||
328 | ret = BackendResponse.Success; | ||
329 | } | ||
330 | else | ||
331 | { | ||
332 | ret = BackendResponse.Failure; | ||
333 | } | ||
334 | |||
335 | m_server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, false, DateTime.Now); | ||
336 | return ret; | ||
337 | } | ||
338 | |||
339 | public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) | ||
340 | { | ||
341 | BackendResponse ret; | ||
342 | |||
343 | if (m_inventoryService.AddFolder(folder)) | ||
344 | { | ||
345 | ret = BackendResponse.Success; | ||
346 | } | ||
347 | else | ||
348 | { | ||
349 | ret = BackendResponse.Failure; | ||
350 | } | ||
351 | |||
352 | m_server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); | ||
353 | return ret; | ||
354 | } | ||
355 | |||
356 | public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) | ||
357 | { | ||
358 | BackendResponse ret; | ||
359 | UUID ownerID; | ||
360 | |||
361 | if (Utils.TryGetOpenSimUUID(owner, out ownerID)) | ||
362 | { | ||
363 | if (m_inventoryService.CreateNewUserInventory(ownerID)) | ||
364 | { | ||
365 | ret = BackendResponse.Success; | ||
366 | } | ||
367 | else | ||
368 | { | ||
369 | ret = BackendResponse.Failure; | ||
370 | } | ||
371 | } | ||
372 | else | ||
373 | { | ||
374 | ret = BackendResponse.Failure; | ||
375 | } | ||
376 | |||
377 | return ret; | ||
378 | } | ||
379 | |||
380 | public BackendResponse TryDeleteItem(Uri owner, UUID itemID) | ||
381 | { | ||
382 | BackendResponse ret; | ||
383 | |||
384 | if (m_inventoryService.DeleteItem(m_inventoryService.GetInventoryItem(itemID))) | ||
385 | { | ||
386 | ret = BackendResponse.Success; | ||
387 | } | ||
388 | else | ||
389 | { | ||
390 | ret = BackendResponse.Failure; | ||
391 | } | ||
392 | |||
393 | m_server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); | ||
394 | return ret; | ||
395 | } | ||
396 | |||
397 | public BackendResponse TryDeleteFolder(Uri owner, UUID folderID) | ||
398 | { | ||
399 | //BackendResponse ret; | ||
400 | //UUID ownerID; | ||
401 | |||
402 | //if (Utils.TryGetOpenSimUUID(owner, out ownerID)) | ||
403 | //{ | ||
404 | // using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) | ||
405 | // { | ||
406 | // try | ||
407 | // { | ||
408 | // dbConnection.Open(); | ||
409 | |||
410 | // MySqlCommand command = new MySqlCommand( | ||
411 | // "DELETE FROM inventoryfolders WHERE folderID=?folderID AND agentID=?agentID", dbConnection); | ||
412 | |||
413 | // command.Parameters.AddWithValue("?folderID", folderID.ToString()); | ||
414 | // command.Parameters.AddWithValue("?agentID", ownerID.ToString()); | ||
415 | |||
416 | // int rowsAffected = command.ExecuteNonQuery(); | ||
417 | // if (rowsAffected == 1) | ||
418 | // { | ||
419 | // ret = BackendResponse.Success; | ||
420 | // } | ||
421 | // else | ||
422 | // { | ||
423 | // m_log.ErrorFormat("[OPENSIMINVENTORYSTORAGE]: MySQL DELETE query affected {0} rows", rowsAffected); | ||
424 | // ret = BackendResponse.NotFound; | ||
425 | // } | ||
426 | // } | ||
427 | // catch (MySqlException ex) | ||
428 | // { | ||
429 | // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); | ||
430 | // ret = BackendResponse.Failure; | ||
431 | // } | ||
432 | // } | ||
433 | //} | ||
434 | //else | ||
435 | //{ | ||
436 | // ret = BackendResponse.NotFound; | ||
437 | //} | ||
438 | |||
439 | //m_server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); | ||
440 | //return ret; | ||
441 | m_log.Warn("[OPENSIMINVENTORYSTORAGE]: Called TryDeleteFolder which is not implemented."); | ||
442 | return BackendResponse.Success; | ||
443 | } | ||
444 | |||
445 | public BackendResponse TryPurgeFolder(Uri owner, UUID folderID) | ||
446 | { | ||
447 | BackendResponse ret; | ||
448 | |||
449 | if (m_inventoryService.PurgeFolder(m_inventoryService.GetInventoryFolder(folderID))) | ||
450 | { | ||
451 | ret = BackendResponse.Success; | ||
452 | } | ||
453 | else | ||
454 | { | ||
455 | ret = BackendResponse.Failure; | ||
456 | } | ||
457 | |||
458 | m_server.MetricsProvider.LogInventoryPurgeFolder(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); | ||
459 | return ret; | ||
460 | } | ||
461 | |||
462 | public int ForEach(Action<AssetMetadata> action, int start, int count) | ||
463 | { | ||
464 | int rowCount = 0; | ||
465 | |||
466 | //using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) | ||
467 | //{ | ||
468 | // MySqlDataReader reader; | ||
469 | |||
470 | // try | ||
471 | // { | ||
472 | // dbConnection.Open(); | ||
473 | |||
474 | // MySqlCommand command = dbConnection.CreateCommand(); | ||
475 | // command.CommandText = String.Format("SELECT name,description,assetType,temporary,data,id FROM assets LIMIT {0}, {1}", | ||
476 | // start, count); | ||
477 | // reader = command.ExecuteReader(); | ||
478 | // } | ||
479 | // catch (MySqlException ex) | ||
480 | // { | ||
481 | // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); | ||
482 | // return 0; | ||
483 | // } | ||
484 | |||
485 | // while (reader.Read()) | ||
486 | // { | ||
487 | // Metadata metadata = new Metadata(); | ||
488 | // metadata.CreationDate = OpenMetaverse.Utils.Epoch; | ||
489 | // metadata.Description = reader.GetString(1); | ||
490 | // metadata.ID = UUID.Parse(reader.GetString(5)); | ||
491 | // metadata.Name = reader.GetString(0); | ||
492 | // metadata.SHA1 = OpenMetaverse.Utils.SHA1((byte[])reader.GetValue(4)); | ||
493 | // metadata.Temporary = reader.GetBoolean(3); | ||
494 | // metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2)); | ||
495 | |||
496 | // action(metadata); | ||
497 | // ++rowCount; | ||
498 | // } | ||
499 | |||
500 | // reader.Close(); | ||
501 | //} | ||
502 | |||
503 | return rowCount; | ||
504 | } | ||
505 | |||
506 | #endregion IInventoryStorageProvider implementation | ||
507 | |||
508 | #region IPlugin implementation | ||
509 | |||
510 | public void Initialise(AssetInventoryServer server) | ||
511 | { | ||
512 | m_server = server; | ||
513 | m_openSimConfig = server.ConfigFile.Configs["OpenSim"]; | ||
514 | |||
515 | m_inventoryService = new OpenSimInventoryService(); | ||
516 | m_inventoryService.AddPlugin(m_openSimConfig.GetString("inventory_database_provider"), | ||
517 | m_openSimConfig.GetString("inventory_database_connect")); | ||
518 | } | ||
519 | |||
520 | public void Stop() | ||
521 | { | ||
522 | } | ||
523 | |||
524 | public void Initialise() | ||
525 | { | ||
526 | m_log.InfoFormat("[OPENSIMINVENTORYSTORAGE]: {0} cannot be default-initialized!", Name); | ||
527 | throw new PluginNotInitialisedException(Name); | ||
528 | } | ||
529 | |||
530 | public void Dispose() | ||
531 | { | ||
532 | } | ||
533 | |||
534 | public string Version | ||
535 | { | ||
536 | // TODO: this should be something meaningful and not hardcoded? | ||
537 | get { return "0.1"; } | ||
538 | } | ||
539 | |||
540 | public string Name | ||
541 | { | ||
542 | get { return "OpenSimInventoryStorage"; } | ||
543 | } | ||
544 | |||
545 | #endregion IPlugin implementation | ||
546 | } | ||
547 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml deleted file mode 100644 index 8cd7585..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | <Addin id="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim" version="0.1"> | ||
2 | <Runtime> | ||
3 | <Import assembly="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.dll" /> | ||
4 | <Import assembly="OpenSim.Data.dll" /> | ||
5 | </Runtime> | ||
6 | |||
7 | <Dependencies> | ||
8 | <Addin id="OpenSim.Grid.AssetInventoryServer" version="0.1" /> | ||
9 | </Dependencies> | ||
10 | |||
11 | <ExtensionPoint path = "/OpenSim/AssetData"> | ||
12 | <ExtensionNode name="Plugin" type="OpenSim.Framework.PluginExtensionNode" objectType="OpenSim.Data.IAssetDataPlugin" /> | ||
13 | </ExtensionPoint> | ||
14 | |||
15 | <Extension path="/OpenSim/AssetInventoryServer/AssetStorageProvider"> | ||
16 | <Plugin id="OpenSimAssetStorage" provider="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.OpenSimAssetStoragePlugin" /> | ||
17 | </Extension> | ||
18 | <Extension path="/OpenSim/AssetInventoryServer/InventoryStorageProvider"> | ||
19 | <Plugin id="OpenSimInventoryStorage" provider="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.OpenSimInventoryStoragePlugin" /> | ||
20 | </Extension> | ||
21 | <Extension path="/OpenSim/AssetInventoryServer/Frontend"> | ||
22 | <Plugin id="OpenSimAssetFrontend" provider="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.OpenSimAssetFrontendPlugin" /> | ||
23 | </Extension> | ||
24 | <Extension path="/OpenSim/AssetInventoryServer/Frontend"> | ||
25 | <Plugin id="OpenSimInventoryFrontend" provider="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim.OpenSimInventoryFrontendPlugin" /> | ||
26 | </Extension> | ||
27 | </Addin> | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs deleted file mode 100644 index b5ad1a1..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs +++ /dev/null | |||
@@ -1,369 +0,0 @@ | |||
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.IO; | ||
30 | using System.Reflection; | ||
31 | using System.Net; | ||
32 | using OpenMetaverse; | ||
33 | using OpenMetaverse.StructuredData; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Servers; | ||
36 | using OpenSim.Framework.Servers.HttpServer; | ||
37 | using log4net; | ||
38 | |||
39 | namespace OpenSim.Grid.AssetInventoryServer.Plugins | ||
40 | { | ||
41 | public class ReferenceFrontendPlugin : IAssetInventoryServerPlugin | ||
42 | { | ||
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
44 | AssetInventoryServer m_server; | ||
45 | |||
46 | public ReferenceFrontendPlugin() | ||
47 | { | ||
48 | } | ||
49 | |||
50 | #region IPlugin implementation | ||
51 | |||
52 | public void Initialise(AssetInventoryServer server) | ||
53 | { | ||
54 | m_server = server; | ||
55 | |||
56 | // Asset metadata request | ||
57 | //m_server.HttpServer.AddStreamHandler(new MetadataRequestHandler(server)); | ||
58 | |||
59 | // Asset data request | ||
60 | m_server.HttpServer.AddStreamHandler(new DataRequestHandler(server)); | ||
61 | |||
62 | // Asset creation | ||
63 | //m_server.HttpServer.AddStreamHandler(new CreateRequestHandler(server)); | ||
64 | |||
65 | m_log.Info("[REFERENCEFRONTEND]: Reference Frontend loaded."); | ||
66 | } | ||
67 | |||
68 | /// <summary> | ||
69 | /// <para>Initialises asset interface</para> | ||
70 | /// </summary> | ||
71 | public void Initialise() | ||
72 | { | ||
73 | m_log.InfoFormat("[REFERENCEFRONTEND]: {0} cannot be default-initialized!", Name); | ||
74 | throw new PluginNotInitialisedException(Name); | ||
75 | } | ||
76 | |||
77 | public void Dispose() | ||
78 | { | ||
79 | } | ||
80 | |||
81 | public string Version | ||
82 | { | ||
83 | // TODO: this should be something meaningful and not hardcoded? | ||
84 | get { return "0.1"; } | ||
85 | } | ||
86 | |||
87 | public string Name | ||
88 | { | ||
89 | get { return "ReferenceFrontend"; } | ||
90 | } | ||
91 | |||
92 | #endregion IPlugin implementation | ||
93 | |||
94 | //public class MetadataRequestHandler : IStreamedRequestHandler | ||
95 | //{ | ||
96 | // AssetInventoryServer m_server; | ||
97 | // string m_contentType; | ||
98 | // string m_httpMethod; | ||
99 | // string m_path; | ||
100 | |||
101 | // public MetadataRequestHandler(AssetInventoryServer server) | ||
102 | // { | ||
103 | // m_server = server; | ||
104 | // m_contentType = null; | ||
105 | // m_httpMethod = "GET"; | ||
106 | // m_path = @"^/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/metadata"; | ||
107 | // } | ||
108 | |||
109 | // #region IStreamedRequestHandler implementation | ||
110 | |||
111 | // public string ContentType | ||
112 | // { | ||
113 | // get { return m_contentType; } | ||
114 | // } | ||
115 | |||
116 | // public string HttpMethod | ||
117 | // { | ||
118 | // get { return m_httpMethod; } | ||
119 | // } | ||
120 | |||
121 | // public string Path | ||
122 | // { | ||
123 | // get { return m_path; } | ||
124 | // } | ||
125 | |||
126 | // public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
127 | // { | ||
128 | // byte[] serializedData = null; | ||
129 | // UUID assetID; | ||
130 | // // Split the URL up into an AssetID and a method | ||
131 | // string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); | ||
132 | |||
133 | // if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) | ||
134 | // { | ||
135 | // UUID authToken = Utils.GetAuthToken(httpRequest); | ||
136 | |||
137 | // if (m_server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID)) | ||
138 | // { | ||
139 | // AssetMetadata metadata; | ||
140 | // BackendResponse storageResponse = m_server.StorageProvider.TryFetchMetadata(assetID, out metadata); | ||
141 | |||
142 | // if (storageResponse == BackendResponse.Success) | ||
143 | // { | ||
144 | // // If the asset data location wasn't specified in the metadata, specify it | ||
145 | // // manually here by pointing back to this asset server | ||
146 | // if (!metadata.Methods.ContainsKey("data")) | ||
147 | // { | ||
148 | // metadata.Methods["data"] = new Uri(String.Format("{0}://{1}/{2}/data", | ||
149 | // httpRequest.Url.Scheme, httpRequest.Url.Authority, assetID)); | ||
150 | // } | ||
151 | |||
152 | // serializedData = metadata.SerializeToBytes(); | ||
153 | |||
154 | // httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
155 | // httpResponse.ContentType = "application/json"; | ||
156 | // httpResponse.ContentLength = serializedData.Length; | ||
157 | // httpResponse.Body.Write(serializedData, 0, serializedData.Length); | ||
158 | // } | ||
159 | // else if (storageResponse == BackendResponse.NotFound) | ||
160 | // { | ||
161 | // m_log.Warn("[REFERENCEFRONTEND]: Could not find metadata for asset " + assetID.ToString()); | ||
162 | // httpResponse.StatusCode = (int) HttpStatusCode.NotFound; | ||
163 | // } | ||
164 | // else | ||
165 | // { | ||
166 | // httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
167 | // } | ||
168 | // } | ||
169 | // else | ||
170 | // { | ||
171 | // httpResponse.StatusCode = (int) HttpStatusCode.Forbidden; | ||
172 | // } | ||
173 | |||
174 | // return serializedData; | ||
175 | // } | ||
176 | |||
177 | // httpResponse.StatusCode = (int) HttpStatusCode.NotFound; | ||
178 | // return serializedData; | ||
179 | // } | ||
180 | |||
181 | // #endregion IStreamedRequestHandler implementation | ||
182 | //} | ||
183 | |||
184 | public class DataRequestHandler : IStreamedRequestHandler | ||
185 | { | ||
186 | AssetInventoryServer m_server; | ||
187 | string m_contentType; | ||
188 | string m_httpMethod; | ||
189 | string m_path; | ||
190 | |||
191 | public DataRequestHandler(AssetInventoryServer server) | ||
192 | { | ||
193 | m_server = server; | ||
194 | m_contentType = null; | ||
195 | m_httpMethod = "GET"; | ||
196 | m_path = @"^/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/data"; | ||
197 | } | ||
198 | |||
199 | #region IStreamedRequestHandler implementation | ||
200 | |||
201 | public string ContentType | ||
202 | { | ||
203 | get { return m_contentType; } | ||
204 | } | ||
205 | |||
206 | public string HttpMethod | ||
207 | { | ||
208 | get { return m_httpMethod; } | ||
209 | } | ||
210 | |||
211 | public string Path | ||
212 | { | ||
213 | get { return m_path; } | ||
214 | } | ||
215 | |||
216 | public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
217 | { | ||
218 | byte[] assetData = null; | ||
219 | UUID assetID; | ||
220 | // Split the URL up into an AssetID and a method | ||
221 | string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); | ||
222 | |||
223 | if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) | ||
224 | { | ||
225 | UUID authToken = Utils.GetAuthToken(httpRequest); | ||
226 | |||
227 | if (m_server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) | ||
228 | { | ||
229 | BackendResponse storageResponse = m_server.StorageProvider.TryFetchData(assetID, out assetData); | ||
230 | |||
231 | if (storageResponse == BackendResponse.Success) | ||
232 | { | ||
233 | httpResponse.StatusCode = (int) HttpStatusCode.OK; | ||
234 | httpResponse.ContentType = "application/octet-stream"; | ||
235 | httpResponse.AddHeader("Content-Disposition", "attachment; filename=" + assetID.ToString()); | ||
236 | httpResponse.ContentLength = assetData.Length; | ||
237 | httpResponse.Body.Write(assetData, 0, assetData.Length); | ||
238 | } | ||
239 | else if (storageResponse == BackendResponse.NotFound) | ||
240 | { | ||
241 | httpResponse.StatusCode = (int) HttpStatusCode.NotFound; | ||
242 | } | ||
243 | else | ||
244 | { | ||
245 | httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
246 | } | ||
247 | } | ||
248 | else | ||
249 | { | ||
250 | httpResponse.StatusCode = (int) HttpStatusCode.Forbidden; | ||
251 | } | ||
252 | |||
253 | return assetData; | ||
254 | } | ||
255 | |||
256 | httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
257 | return assetData; | ||
258 | } | ||
259 | |||
260 | #endregion IStreamedRequestHandler implementation | ||
261 | } | ||
262 | |||
263 | //public class CreateRequestHandler : IStreamedRequestHandler | ||
264 | //{ | ||
265 | // AssetInventoryServer m_server; | ||
266 | // string m_contentType; | ||
267 | // string m_httpMethod; | ||
268 | // string m_path; | ||
269 | |||
270 | // public CreateRequestHandler(AssetInventoryServer server) | ||
271 | // { | ||
272 | // m_server = server; | ||
273 | // m_contentType = null; | ||
274 | // m_httpMethod = "POST"; | ||
275 | // m_path = "^/createasset"; | ||
276 | // } | ||
277 | |||
278 | // #region IStreamedRequestHandler implementation | ||
279 | |||
280 | // public string ContentType | ||
281 | // { | ||
282 | // get { return m_contentType; } | ||
283 | // } | ||
284 | |||
285 | // public string HttpMethod | ||
286 | // { | ||
287 | // get { return m_httpMethod; } | ||
288 | // } | ||
289 | |||
290 | // public string Path | ||
291 | // { | ||
292 | // get { return m_path; } | ||
293 | // } | ||
294 | |||
295 | // public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
296 | // { | ||
297 | // byte[] responseData = null; | ||
298 | // UUID authToken = Utils.GetAuthToken(httpRequest); | ||
299 | |||
300 | // if (m_server.AuthorizationProvider.IsCreateAuthorized(authToken)) | ||
301 | // { | ||
302 | // try | ||
303 | // { | ||
304 | // OSD osdata = OSDParser.DeserializeJson(new StreamReader(httpRequest.InputStream).ReadToEnd()); | ||
305 | |||
306 | // if (osdata.Type == OSDType.Map) | ||
307 | // { | ||
308 | // OSDMap map = (OSDMap)osdata; | ||
309 | // Metadata metadata = new Metadata(); | ||
310 | // metadata.Deserialize(map); | ||
311 | |||
312 | // byte[] assetData = map["data"].AsBinary(); | ||
313 | |||
314 | // if (assetData != null && assetData.Length > 0) | ||
315 | // { | ||
316 | // BackendResponse storageResponse; | ||
317 | |||
318 | // if (metadata.ID != UUID.Zero) | ||
319 | // storageResponse = m_server.StorageProvider.TryCreateAsset(metadata, assetData); | ||
320 | // else | ||
321 | // storageResponse = m_server.StorageProvider.TryCreateAsset(metadata, assetData, out metadata.ID); | ||
322 | |||
323 | // if (storageResponse == BackendResponse.Success) | ||
324 | // { | ||
325 | // httpResponse.StatusCode = (int) HttpStatusCode.Created; | ||
326 | // OSDMap responseMap = new OSDMap(1); | ||
327 | // responseMap["id"] = OSD.FromUUID(metadata.ID); | ||
328 | // LitJson.JsonData jsonData = OSDParser.SerializeJson(responseMap); | ||
329 | // responseData = System.Text.Encoding.UTF8.GetBytes(jsonData.ToJson()); | ||
330 | // httpResponse.Body.Write(responseData, 0, responseData.Length); | ||
331 | // httpResponse.Body.Flush(); | ||
332 | // } | ||
333 | // else if (storageResponse == BackendResponse.NotFound) | ||
334 | // { | ||
335 | // httpResponse.StatusCode = (int) HttpStatusCode.NotFound; | ||
336 | // } | ||
337 | // else | ||
338 | // { | ||
339 | // httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
340 | // } | ||
341 | // } | ||
342 | // else | ||
343 | // { | ||
344 | // httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
345 | // } | ||
346 | // } | ||
347 | // else | ||
348 | // { | ||
349 | // httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; | ||
350 | // } | ||
351 | // } | ||
352 | // catch (Exception ex) | ||
353 | // { | ||
354 | // httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; | ||
355 | // httpResponse.StatusDescription = ex.Message; | ||
356 | // } | ||
357 | // } | ||
358 | // else | ||
359 | // { | ||
360 | // httpResponse.StatusCode = (int) HttpStatusCode.Forbidden; | ||
361 | // } | ||
362 | |||
363 | // return responseData; | ||
364 | // } | ||
365 | |||
366 | // #endregion IStreamedRequestHandler implementation | ||
367 | //} | ||
368 | } | ||
369 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml deleted file mode 100644 index 42a279d..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | <Addin id="OpenSim.Grid.AssetInventoryServer.Plugins" version="0.1"> | ||
2 | <Runtime> | ||
3 | <Import assembly="OpenSim.Grid.AssetInventoryServer.Plugins.dll" /> | ||
4 | </Runtime> | ||
5 | |||
6 | <Dependencies> | ||
7 | <Addin id="OpenSim.Grid.AssetInventoryServer" version="0.1" /> | ||
8 | </Dependencies> | ||
9 | |||
10 | <Extension path="/OpenSim/AssetInventoryServer/MetricsProvider"> | ||
11 | <Plugin id="NullMetrics" provider="OpenSim.Grid.AssetInventoryServer.Plugins.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.NullMetricsPlugin" /> | ||
12 | </Extension> | ||
13 | <Extension path="/OpenSim/AssetInventoryServer/Frontend"> | ||
14 | <Plugin id="BrowseFrontend" provider="OpenSim.Grid.AssetInventoryServer.Plugins.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.BrowseFrontendPlugin" /> | ||
15 | </Extension> | ||
16 | <Extension path="/OpenSim/AssetInventoryServer/Frontend"> | ||
17 | <Plugin id="ReferenceFrontend" provider="OpenSim.Grid.AssetInventoryServer.Plugins.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.ReferenceFrontendPlugin" /> | ||
18 | </Extension> | ||
19 | <Extension path="/OpenSim/AssetInventoryServer/AuthenticationProvider"> | ||
20 | <Plugin id="NullAuthentication" provider="OpenSim.Grid.AssetInventoryServer.Plugins.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.NullAuthenticationPlugin" /> | ||
21 | </Extension> | ||
22 | <Extension path="/OpenSim/AssetInventoryServer/AuthorizationProvider"> | ||
23 | <Plugin id="AuthorizeAll" provider="OpenSim.Grid.AssetInventoryServer.Plugins.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.AuthorizeAllPlugin" /> | ||
24 | </Extension> | ||
25 | <Extension path="/OpenSim/AssetInventoryServer/Frontend"> | ||
26 | <Plugin id="InventoryArchive" provider="OpenSim.Grid.AssetInventoryServer.Plugins.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.InventoryArchivePlugin" /> | ||
27 | </Extension> | ||
28 | </Addin> | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml deleted file mode 100644 index cb6959e..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | <Addin id="OpenSim.Grid.AssetInventoryServer.Plugins.Simple" version="0.1"> | ||
2 | <Runtime> | ||
3 | <Import assembly="OpenSim.Grid.AssetInventoryServer.Plugins.Simple.dll" /> | ||
4 | </Runtime> | ||
5 | |||
6 | <Dependencies> | ||
7 | <Addin id="OpenSim.Grid.AssetInventoryServer" version="0.1" /> | ||
8 | </Dependencies> | ||
9 | |||
10 | <Extension path="/OpenSim/AssetInventoryServer/AssetStorageProvider"> | ||
11 | <Plugin id="SimpleAssetStorage" provider="OpenSim.Grid.AssetInventoryServer.Plugins.Simple.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.Simple.SimpleAssetStoragePlugin" /> | ||
12 | </Extension> | ||
13 | <Extension path="/OpenSim/AssetInventoryServer/InventoryStorageProvider"> | ||
14 | <Plugin id="SimpleInventoryStorage" provider="OpenSim.Grid.AssetInventoryServer.Plugins.Simple.dll" type="OpenSim.Grid.AssetInventoryServer.Plugins.Simple.SimpleInventoryStoragePlugin" /> | ||
15 | </Extension> | ||
16 | </Addin> | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs deleted file mode 100644 index 4ec2d96..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs +++ /dev/null | |||
@@ -1,290 +0,0 @@ | |||
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 System.IO; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using log4net; | ||
35 | |||
36 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.Simple | ||
37 | { | ||
38 | public class SimpleAssetStoragePlugin : IAssetStorageProvider | ||
39 | { | ||
40 | const string EXTENSION_NAME = "SimpleAssetStorage"; // Used in metrics reporting | ||
41 | const string DEFAULT_DATA_DIR = "SimpleAssets"; | ||
42 | const string TEMP_DATA_DIR = "SimpleAssetsTemp"; | ||
43 | |||
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
45 | AssetInventoryServer server; | ||
46 | Dictionary<UUID, AssetMetadata> metadataStorage; | ||
47 | Dictionary<UUID, string> filenames; | ||
48 | |||
49 | public SimpleAssetStoragePlugin() | ||
50 | { | ||
51 | } | ||
52 | |||
53 | #region Required Interfaces | ||
54 | |||
55 | public BackendResponse TryFetchMetadata(UUID assetID, out AssetMetadata metadata) | ||
56 | { | ||
57 | metadata = null; | ||
58 | BackendResponse ret; | ||
59 | |||
60 | if (metadataStorage.TryGetValue(assetID, out metadata)) | ||
61 | ret = BackendResponse.Success; | ||
62 | else | ||
63 | ret = BackendResponse.NotFound; | ||
64 | |||
65 | server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now); | ||
66 | return ret; | ||
67 | } | ||
68 | |||
69 | public BackendResponse TryFetchData(UUID assetID, out byte[] assetData) | ||
70 | { | ||
71 | assetData = null; | ||
72 | string filename; | ||
73 | BackendResponse ret; | ||
74 | |||
75 | if (filenames.TryGetValue(assetID, out filename)) | ||
76 | { | ||
77 | try | ||
78 | { | ||
79 | assetData = File.ReadAllBytes(filename); | ||
80 | ret = BackendResponse.Success; | ||
81 | } | ||
82 | catch (Exception ex) | ||
83 | { | ||
84 | m_log.ErrorFormat("[SIMPLEASSETSTORAGE]: Failed reading data for asset {0} from {1}: {2}", assetID, filename, ex.Message); | ||
85 | ret = BackendResponse.Failure; | ||
86 | } | ||
87 | } | ||
88 | else | ||
89 | { | ||
90 | ret = BackendResponse.NotFound; | ||
91 | } | ||
92 | |||
93 | server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now); | ||
94 | return ret; | ||
95 | } | ||
96 | |||
97 | public BackendResponse TryFetchDataMetadata(UUID assetID, out AssetBase asset) | ||
98 | { | ||
99 | asset = new AssetBase(); | ||
100 | AssetMetadata metadata = asset.Metadata; | ||
101 | |||
102 | string filename; | ||
103 | BackendResponse ret; | ||
104 | |||
105 | if (metadataStorage.TryGetValue(assetID, out metadata) && | ||
106 | filenames.TryGetValue(assetID, out filename)) | ||
107 | { | ||
108 | try | ||
109 | { | ||
110 | asset.Data = File.ReadAllBytes(filename); | ||
111 | ret = BackendResponse.Success; | ||
112 | } | ||
113 | catch (Exception ex) | ||
114 | { | ||
115 | m_log.ErrorFormat("[SIMPLEASSETSTORAGE]: Failed reading data for asset {0} from {1}: {2}", assetID, filename, ex.Message); | ||
116 | ret = BackendResponse.Failure; | ||
117 | } | ||
118 | |||
119 | asset.Type = (sbyte) Utils.ContentTypeToSLAssetType(metadata.ContentType); | ||
120 | asset.Local = false; | ||
121 | } | ||
122 | else | ||
123 | { | ||
124 | asset = null; | ||
125 | ret = BackendResponse.NotFound; | ||
126 | } | ||
127 | |||
128 | server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now); | ||
129 | server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (asset != null && asset.Data != null ? asset.Data.Length : 0), DateTime.Now); | ||
130 | return ret; | ||
131 | } | ||
132 | |||
133 | public BackendResponse TryCreateAsset(AssetBase asset, out UUID assetID) | ||
134 | { | ||
135 | assetID = asset.FullID = UUID.Random(); | ||
136 | return TryCreateAsset(asset); | ||
137 | } | ||
138 | |||
139 | public BackendResponse TryCreateAsset(AssetBase asset) | ||
140 | { | ||
141 | BackendResponse ret; | ||
142 | AssetMetadata metadata = asset.Metadata; | ||
143 | |||
144 | string path; | ||
145 | string filename = String.Format("{0}.{1}", asset.FullID, Utils.ContentTypeToExtension(metadata.ContentType)); | ||
146 | |||
147 | if (asset.Temporary) | ||
148 | path = Path.Combine(TEMP_DATA_DIR, filename); | ||
149 | else | ||
150 | path = Path.Combine(DEFAULT_DATA_DIR, filename); | ||
151 | |||
152 | try | ||
153 | { | ||
154 | File.WriteAllBytes(path, asset.Data); | ||
155 | lock (filenames) filenames[asset.FullID] = path; | ||
156 | |||
157 | // Set the creation date to right now | ||
158 | metadata.CreationDate = DateTime.Now; | ||
159 | |||
160 | lock (metadataStorage) | ||
161 | metadataStorage[asset.FullID] = metadata; | ||
162 | |||
163 | ret = BackendResponse.Success; | ||
164 | } | ||
165 | catch (Exception ex) | ||
166 | { | ||
167 | m_log.ErrorFormat("[SIMPLEASSETSTORAGE]: Failed writing data for asset {0} to {1}: {2}", asset.FullID, filename, ex.Message); | ||
168 | ret = BackendResponse.Failure; | ||
169 | } | ||
170 | |||
171 | server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, asset.FullID, asset.Data.Length, DateTime.Now); | ||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | public int ForEach(Action<AssetMetadata> action, int start, int count) | ||
176 | { | ||
177 | int rowCount = 0; | ||
178 | |||
179 | //lock (metadataStorage) | ||
180 | //{ | ||
181 | // foreach (Metadata metadata in metadataStorage.Values) | ||
182 | // { | ||
183 | // action(metadata); | ||
184 | // ++rowCount; | ||
185 | // } | ||
186 | //} | ||
187 | |||
188 | return rowCount; | ||
189 | } | ||
190 | |||
191 | #endregion Required Interfaces | ||
192 | |||
193 | #region IPlugin implementation | ||
194 | |||
195 | public void Initialise(AssetInventoryServer server) | ||
196 | { | ||
197 | this.server = server; | ||
198 | |||
199 | metadataStorage = new Dictionary<UUID, AssetMetadata>(); | ||
200 | filenames = new Dictionary<UUID, string>(); | ||
201 | |||
202 | LoadFiles(DEFAULT_DATA_DIR, false); | ||
203 | LoadFiles(TEMP_DATA_DIR, true); | ||
204 | |||
205 | m_log.InfoFormat("[SIMPLEASSETSTORAGE]: Initialized the store index with metadata for {0} assets", | ||
206 | metadataStorage.Count); | ||
207 | } | ||
208 | |||
209 | /// <summary> | ||
210 | /// <para>Initialises asset interface</para> | ||
211 | /// </summary> | ||
212 | public void Initialise() | ||
213 | { | ||
214 | m_log.InfoFormat("[SIMPLEASSETSTORAGE]: {0} cannot be default-initialized!", Name); | ||
215 | throw new PluginNotInitialisedException(Name); | ||
216 | } | ||
217 | |||
218 | public void Dispose() | ||
219 | { | ||
220 | WipeTemporary(); | ||
221 | } | ||
222 | |||
223 | public string Version | ||
224 | { | ||
225 | // TODO: this should be something meaningful and not hardcoded? | ||
226 | get { return "0.1"; } | ||
227 | } | ||
228 | |||
229 | public string Name | ||
230 | { | ||
231 | get { return "SimpleAssetStorage"; } | ||
232 | } | ||
233 | |||
234 | #endregion IPlugin implementation | ||
235 | |||
236 | public void WipeTemporary() | ||
237 | { | ||
238 | if (Directory.Exists(TEMP_DATA_DIR)) | ||
239 | { | ||
240 | try { Directory.Delete(TEMP_DATA_DIR); } | ||
241 | catch (Exception ex) { m_log.Error("[SIMPLEASSETSTORAGE]: " + ex.Message); } | ||
242 | } | ||
243 | } | ||
244 | |||
245 | void LoadFiles(string folder, bool temporary) | ||
246 | { | ||
247 | // Try to create the directory if it doesn't already exist | ||
248 | if (!Directory.Exists(folder)) | ||
249 | { | ||
250 | try { Directory.CreateDirectory(folder); } | ||
251 | catch (Exception ex) | ||
252 | { | ||
253 | m_log.Warn("[SIMPLEASSETSTORAGE]: " + ex.Message); | ||
254 | return; | ||
255 | } | ||
256 | } | ||
257 | |||
258 | lock (metadataStorage) | ||
259 | { | ||
260 | try | ||
261 | { | ||
262 | string[] assets = Directory.GetFiles(folder); | ||
263 | |||
264 | for (int i = 0; i < assets.Length; i++) | ||
265 | { | ||
266 | string filename = assets[i]; | ||
267 | byte[] data = File.ReadAllBytes(filename); | ||
268 | |||
269 | AssetMetadata metadata = new AssetMetadata(); | ||
270 | metadata.CreationDate = File.GetCreationTime(filename); | ||
271 | metadata.Description = String.Empty; | ||
272 | metadata.FullID = SimpleUtils.ParseUUIDFromFilename(filename); | ||
273 | metadata.Name = SimpleUtils.ParseNameFromFilename(filename); | ||
274 | metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); | ||
275 | metadata.Temporary = false; | ||
276 | metadata.ContentType = Utils.ExtensionToContentType(Path.GetExtension(filename).TrimStart('.')); | ||
277 | |||
278 | // Store the loaded data | ||
279 | metadataStorage[metadata.FullID] = metadata; | ||
280 | filenames[metadata.FullID] = filename; | ||
281 | } | ||
282 | } | ||
283 | catch (Exception ex) | ||
284 | { | ||
285 | m_log.Warn("[SIMPLEASSETSTORAGE]: " + ex.Message); | ||
286 | } | ||
287 | } | ||
288 | } | ||
289 | } | ||
290 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs deleted file mode 100644 index 4010818..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs +++ /dev/null | |||
@@ -1,625 +0,0 @@ | |||
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 System.IO; | ||
32 | using System.Text; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Framework; | ||
35 | using log4net; | ||
36 | |||
37 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.Simple | ||
38 | { | ||
39 | public class SimpleInventoryStoragePlugin : IInventoryStorageProvider | ||
40 | { | ||
41 | const string EXTENSION_NAME = "SimpleInventoryStorage"; // Used for metrics reporting | ||
42 | const string DEFAULT_INVENTORY_DIR = "SimpleInventory"; | ||
43 | |||
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
45 | AssetInventoryServer server; | ||
46 | Dictionary<Uri, InventoryCollection> inventories = new Dictionary<Uri, InventoryCollection>(); | ||
47 | Dictionary<Uri, List<InventoryItemBase>> activeGestures = new Dictionary<Uri, List<InventoryItemBase>>(); | ||
48 | Utils.InventoryItemSerializer itemSerializer = new Utils.InventoryItemSerializer(); | ||
49 | Utils.InventoryFolderSerializer folderSerializer = new Utils.InventoryFolderSerializer(); | ||
50 | |||
51 | public SimpleInventoryStoragePlugin() | ||
52 | { | ||
53 | } | ||
54 | |||
55 | #region Required Interfaces | ||
56 | |||
57 | public BackendResponse TryFetchItem(Uri owner, UUID itemID, out InventoryItemBase item) | ||
58 | { | ||
59 | item = null; | ||
60 | BackendResponse ret; | ||
61 | |||
62 | InventoryCollection collection; | ||
63 | if (inventories.TryGetValue(owner, out collection) && collection.Items.TryGetValue(itemID, out item)) | ||
64 | ret = BackendResponse.Success; | ||
65 | else | ||
66 | ret = BackendResponse.NotFound; | ||
67 | |||
68 | server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); | ||
69 | return ret; | ||
70 | } | ||
71 | |||
72 | public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) | ||
73 | { | ||
74 | folder = null; | ||
75 | BackendResponse ret; | ||
76 | |||
77 | InventoryCollection collection; | ||
78 | if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) | ||
79 | ret = BackendResponse.Success; | ||
80 | else | ||
81 | ret = BackendResponse.NotFound; | ||
82 | |||
83 | server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); | ||
84 | return ret; | ||
85 | } | ||
86 | |||
87 | public BackendResponse TryFetchFolderContents(Uri owner, UUID folderID, out InventoryCollection contents) | ||
88 | { | ||
89 | contents = null; | ||
90 | BackendResponse ret; | ||
91 | |||
92 | InventoryCollection collection; | ||
93 | InventoryFolderWithChildren folder; | ||
94 | |||
95 | if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) | ||
96 | { | ||
97 | contents = new InventoryCollection(); | ||
98 | contents.UserID = collection.UserID; | ||
99 | contents.Folders = new Dictionary<UUID, InventoryFolderWithChildren>(); | ||
100 | contents.Items = new Dictionary<UUID, InventoryItemBase>(); | ||
101 | |||
102 | foreach (InventoryNodeBase invBase in folder.Children.Values) | ||
103 | { | ||
104 | if (invBase is InventoryItemBase) | ||
105 | { | ||
106 | InventoryItemBase invItem = invBase as InventoryItemBase; | ||
107 | contents.Items.Add(invItem.ID, invItem); | ||
108 | } | ||
109 | else | ||
110 | { | ||
111 | InventoryFolderWithChildren invFolder = invBase as InventoryFolderWithChildren; | ||
112 | contents.Folders.Add(invFolder.ID, invFolder); | ||
113 | } | ||
114 | } | ||
115 | |||
116 | ret = BackendResponse.Success; | ||
117 | } | ||
118 | else | ||
119 | { | ||
120 | ret = BackendResponse.NotFound; | ||
121 | } | ||
122 | |||
123 | server.MetricsProvider.LogInventoryFetchFolderContents(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | public BackendResponse TryFetchFolderList(Uri owner, out List<InventoryFolderWithChildren> folders) | ||
128 | { | ||
129 | folders = null; | ||
130 | BackendResponse ret; | ||
131 | |||
132 | InventoryCollection collection; | ||
133 | if (inventories.TryGetValue(owner, out collection)) | ||
134 | { | ||
135 | folders = new List<InventoryFolderWithChildren>(collection.Folders.Values); | ||
136 | return BackendResponse.Success; | ||
137 | } | ||
138 | else | ||
139 | { | ||
140 | ret = BackendResponse.NotFound; | ||
141 | } | ||
142 | |||
143 | server.MetricsProvider.LogInventoryFetchFolderList(EXTENSION_NAME, ret, owner, DateTime.Now); | ||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | public BackendResponse TryFetchInventory(Uri owner, out InventoryCollection inventory) | ||
148 | { | ||
149 | inventory = null; | ||
150 | BackendResponse ret; | ||
151 | |||
152 | if (inventories.TryGetValue(owner, out inventory)) | ||
153 | ret = BackendResponse.Success; | ||
154 | else | ||
155 | ret = BackendResponse.NotFound; | ||
156 | |||
157 | server.MetricsProvider.LogInventoryFetchInventory(EXTENSION_NAME, ret, owner, DateTime.Now); | ||
158 | return ret; | ||
159 | } | ||
160 | |||
161 | public BackendResponse TryFetchActiveGestures(Uri owner, out List<InventoryItemBase> gestures) | ||
162 | { | ||
163 | gestures = null; | ||
164 | BackendResponse ret; | ||
165 | |||
166 | if (activeGestures.TryGetValue(owner, out gestures)) | ||
167 | ret = BackendResponse.Success; | ||
168 | else | ||
169 | ret = BackendResponse.NotFound; | ||
170 | |||
171 | server.MetricsProvider.LogInventoryFetchActiveGestures(EXTENSION_NAME, ret, owner, DateTime.Now); | ||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | public BackendResponse TryCreateItem(Uri owner, InventoryItemBase item) | ||
176 | { | ||
177 | BackendResponse ret; | ||
178 | |||
179 | InventoryCollection collection; | ||
180 | if (inventories.TryGetValue(owner, out collection)) | ||
181 | { | ||
182 | // Delete this item first if it already exists | ||
183 | InventoryItemBase oldItem; | ||
184 | if (collection.Items.TryGetValue(item.ID, out oldItem)) | ||
185 | TryDeleteItem(owner, item.ID); | ||
186 | |||
187 | try | ||
188 | { | ||
189 | // Create the file | ||
190 | SaveItem(item); | ||
191 | |||
192 | // Add the item to the collection | ||
193 | lock (collection) collection.Items[item.ID] = item; | ||
194 | |||
195 | // Add the item to its parent folder | ||
196 | InventoryFolderWithChildren parent; | ||
197 | if (collection.Folders.TryGetValue(item.Folder, out parent)) | ||
198 | lock (parent.Children) parent.Children.Add(item.ID, item); | ||
199 | |||
200 | // Add active gestures to our list | ||
201 | if (item.InvType == (int)InventoryType.Gesture && item.Flags == 1) | ||
202 | { | ||
203 | lock (activeGestures) | ||
204 | activeGestures[owner].Add(item); | ||
205 | } | ||
206 | |||
207 | ret = BackendResponse.Success; | ||
208 | } | ||
209 | catch (Exception ex) | ||
210 | { | ||
211 | m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); | ||
212 | ret = BackendResponse.Failure; | ||
213 | } | ||
214 | } | ||
215 | else | ||
216 | { | ||
217 | return BackendResponse.NotFound; | ||
218 | } | ||
219 | |||
220 | server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, false, DateTime.Now); | ||
221 | return ret; | ||
222 | } | ||
223 | |||
224 | public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) | ||
225 | { | ||
226 | BackendResponse ret; | ||
227 | |||
228 | InventoryCollection collection; | ||
229 | if (inventories.TryGetValue(owner, out collection)) | ||
230 | { | ||
231 | // Delete this folder first if it already exists | ||
232 | InventoryFolderWithChildren oldFolder; | ||
233 | if (collection.Folders.TryGetValue(folder.ID, out oldFolder)) | ||
234 | TryDeleteFolder(owner, folder.ID); | ||
235 | |||
236 | try | ||
237 | { | ||
238 | // Create the file | ||
239 | SaveFolder(folder); | ||
240 | |||
241 | // Add the folder to the collection | ||
242 | lock (collection) collection.Folders[folder.ID] = folder; | ||
243 | |||
244 | // Add the folder to its parent folder | ||
245 | InventoryFolderWithChildren parent; | ||
246 | if (collection.Folders.TryGetValue(folder.ParentID, out parent)) | ||
247 | lock (parent.Children) parent.Children.Add(folder.ID, folder); | ||
248 | |||
249 | ret = BackendResponse.Success; | ||
250 | } | ||
251 | catch (Exception ex) | ||
252 | { | ||
253 | m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); | ||
254 | ret = BackendResponse.Failure; | ||
255 | } | ||
256 | } | ||
257 | else | ||
258 | { | ||
259 | ret = BackendResponse.NotFound; | ||
260 | } | ||
261 | |||
262 | server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); | ||
263 | return ret; | ||
264 | } | ||
265 | |||
266 | public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) | ||
267 | { | ||
268 | BackendResponse ret; | ||
269 | |||
270 | lock (inventories) | ||
271 | { | ||
272 | if (!inventories.ContainsKey(owner)) | ||
273 | { | ||
274 | InventoryCollection collection = new InventoryCollection(); | ||
275 | collection.UserID = rootFolder.Owner; | ||
276 | collection.Folders = new Dictionary<UUID, InventoryFolderWithChildren>(); | ||
277 | collection.Folders.Add(rootFolder.ID, rootFolder); | ||
278 | collection.Items = new Dictionary<UUID, InventoryItemBase>(); | ||
279 | |||
280 | inventories.Add(owner, collection); | ||
281 | |||
282 | ret = BackendResponse.Success; | ||
283 | } | ||
284 | else | ||
285 | { | ||
286 | ret = BackendResponse.Failure; | ||
287 | } | ||
288 | } | ||
289 | |||
290 | if (ret == BackendResponse.Success) | ||
291 | { | ||
292 | string path = Path.Combine(DEFAULT_INVENTORY_DIR, rootFolder.Owner.ToString()); | ||
293 | try | ||
294 | { | ||
295 | // Create the directory for this agent | ||
296 | Directory.CreateDirectory(path); | ||
297 | |||
298 | // Create an index.txt containing the UUID and URI for this agent | ||
299 | string[] index = new string[] { rootFolder.Owner.ToString(), owner.ToString() }; | ||
300 | File.WriteAllLines(Path.Combine(path, "index.txt"), index); | ||
301 | |||
302 | // Create the root folder file | ||
303 | SaveFolder(rootFolder); | ||
304 | } | ||
305 | catch (Exception ex) | ||
306 | { | ||
307 | m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); | ||
308 | ret = BackendResponse.Failure; | ||
309 | } | ||
310 | } | ||
311 | |||
312 | server.MetricsProvider.LogInventoryCreateInventory(EXTENSION_NAME, ret, DateTime.Now); | ||
313 | return ret; | ||
314 | } | ||
315 | |||
316 | public BackendResponse TryDeleteItem(Uri owner, UUID itemID) | ||
317 | { | ||
318 | BackendResponse ret; | ||
319 | |||
320 | InventoryCollection collection; | ||
321 | InventoryItemBase item; | ||
322 | if (inventories.TryGetValue(owner, out collection) && collection.Items.TryGetValue(itemID, out item)) | ||
323 | { | ||
324 | // Remove the item from its parent folder | ||
325 | InventoryFolderWithChildren parent; | ||
326 | if (collection.Folders.TryGetValue(item.Folder, out parent)) | ||
327 | lock (parent.Children) parent.Children.Remove(itemID); | ||
328 | |||
329 | // Remove the item from the collection | ||
330 | lock (collection) collection.Items.Remove(itemID); | ||
331 | |||
332 | // Remove from the active gestures list if applicable | ||
333 | if (item.InvType == (int)InventoryType.Gesture) | ||
334 | { | ||
335 | lock (activeGestures) | ||
336 | { | ||
337 | for (int i = 0; i < activeGestures[owner].Count; i++) | ||
338 | { | ||
339 | if (activeGestures[owner][i].ID == itemID) | ||
340 | { | ||
341 | activeGestures[owner].RemoveAt(i); | ||
342 | break; | ||
343 | } | ||
344 | } | ||
345 | } | ||
346 | } | ||
347 | |||
348 | // Delete the file. We don't know exactly what the file name is, | ||
349 | // so search for it | ||
350 | string path = PathFromURI(owner); | ||
351 | string[] matches = Directory.GetFiles(path, String.Format("*{0}.item", itemID), SearchOption.TopDirectoryOnly); | ||
352 | foreach (string match in matches) | ||
353 | { | ||
354 | try { File.Delete(match); } | ||
355 | catch (Exception ex) { m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed to delete file {0}: {1}", match, ex.Message); } | ||
356 | } | ||
357 | |||
358 | ret = BackendResponse.Success; | ||
359 | } | ||
360 | else | ||
361 | { | ||
362 | ret = BackendResponse.NotFound; | ||
363 | } | ||
364 | |||
365 | server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); | ||
366 | return ret; | ||
367 | } | ||
368 | |||
369 | public BackendResponse TryDeleteFolder(Uri owner, UUID folderID) | ||
370 | { | ||
371 | BackendResponse ret; | ||
372 | |||
373 | InventoryCollection collection; | ||
374 | InventoryFolderWithChildren folder; | ||
375 | if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) | ||
376 | { | ||
377 | // Remove the folder from its parent folder | ||
378 | InventoryFolderWithChildren parent; | ||
379 | if (collection.Folders.TryGetValue(folder.ParentID, out parent)) | ||
380 | lock (parent.Children) parent.Children.Remove(folderID); | ||
381 | |||
382 | // Remove the folder from the collection | ||
383 | lock (collection) collection.Items.Remove(folderID); | ||
384 | |||
385 | // Delete the folder file. We don't know exactly what the file name is, | ||
386 | // so search for it | ||
387 | string path = PathFromURI(owner); | ||
388 | string[] matches = Directory.GetFiles(path, String.Format("*{0}.folder", folderID), SearchOption.TopDirectoryOnly); | ||
389 | foreach (string match in matches) | ||
390 | { | ||
391 | try { File.Delete(match); } | ||
392 | catch (Exception ex) { m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed to delete folder file {0}: {1}", match, ex.Message); } | ||
393 | } | ||
394 | |||
395 | ret = BackendResponse.Success; | ||
396 | } | ||
397 | else | ||
398 | { | ||
399 | ret = BackendResponse.NotFound; | ||
400 | } | ||
401 | |||
402 | server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); | ||
403 | return ret; | ||
404 | } | ||
405 | |||
406 | public BackendResponse TryPurgeFolder(Uri owner, UUID folderID) | ||
407 | { | ||
408 | BackendResponse ret; | ||
409 | |||
410 | InventoryCollection collection; | ||
411 | InventoryFolderWithChildren folder; | ||
412 | if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) | ||
413 | { | ||
414 | // Delete all of the folder children | ||
415 | foreach (InventoryNodeBase obj in new List<InventoryNodeBase>(folder.Children.Values)) | ||
416 | { | ||
417 | if (obj is InventoryItemBase) | ||
418 | { | ||
419 | TryDeleteItem(owner, (obj as InventoryItemBase).ID); | ||
420 | } | ||
421 | else | ||
422 | { | ||
423 | InventoryFolderWithChildren childFolder = obj as InventoryFolderWithChildren; | ||
424 | TryPurgeFolder(owner, childFolder.ID); | ||
425 | TryDeleteFolder(owner, childFolder.ID); | ||
426 | } | ||
427 | } | ||
428 | |||
429 | ret = BackendResponse.Success; | ||
430 | } | ||
431 | else | ||
432 | { | ||
433 | ret = BackendResponse.NotFound; | ||
434 | } | ||
435 | |||
436 | server.MetricsProvider.LogInventoryPurgeFolder(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); | ||
437 | return ret; | ||
438 | } | ||
439 | |||
440 | #endregion Required Interfaces | ||
441 | |||
442 | void SaveItem(InventoryItemBase item) | ||
443 | { | ||
444 | string filename = String.Format("{0}-{1}.item", SanitizeFilename(item.Name), item.ID); | ||
445 | |||
446 | string path = Path.Combine(DEFAULT_INVENTORY_DIR, item.Owner.ToString()); | ||
447 | path = Path.Combine(path, filename); | ||
448 | |||
449 | using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write)) | ||
450 | { | ||
451 | itemSerializer.Serialize(stream, item); | ||
452 | stream.Flush(); | ||
453 | } | ||
454 | } | ||
455 | |||
456 | void SaveFolder(InventoryFolderWithChildren folder) | ||
457 | { | ||
458 | string filename = String.Format("{0}-{1}.folder", SanitizeFilename(folder.Name), folder.ID); | ||
459 | |||
460 | string path = Path.Combine(DEFAULT_INVENTORY_DIR, folder.Owner.ToString()); | ||
461 | path = Path.Combine(path, filename); | ||
462 | |||
463 | using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write)) | ||
464 | { | ||
465 | folderSerializer.Serialize(stream, folder); | ||
466 | stream.Flush(); | ||
467 | } | ||
468 | } | ||
469 | |||
470 | string SanitizeFilename(string filename) | ||
471 | { | ||
472 | string output = filename; | ||
473 | |||
474 | if (output.Length > 64) | ||
475 | output = output.Substring(0, 64); | ||
476 | |||
477 | foreach (char i in Path.GetInvalidFileNameChars()) | ||
478 | output = output.Replace(i, '_'); | ||
479 | |||
480 | return output; | ||
481 | } | ||
482 | |||
483 | static string PathFromURI(Uri uri) | ||
484 | { | ||
485 | byte[] hash = OpenMetaverse.Utils.SHA1(Encoding.UTF8.GetBytes(uri.ToString())); | ||
486 | StringBuilder digest = new StringBuilder(40); | ||
487 | |||
488 | // Convert the hash to a hex string | ||
489 | foreach (byte b in hash) | ||
490 | digest.AppendFormat(OpenMetaverse.Utils.EnUsCulture, "{0:x2}", b); | ||
491 | |||
492 | return Path.Combine(DEFAULT_INVENTORY_DIR, digest.ToString()); | ||
493 | } | ||
494 | |||
495 | void LoadFiles(string folder) | ||
496 | { | ||
497 | // Try to create the directory if it doesn't already exist | ||
498 | if (!Directory.Exists(folder)) | ||
499 | { | ||
500 | try { Directory.CreateDirectory(folder); } | ||
501 | catch (Exception ex) | ||
502 | { | ||
503 | m_log.Warn("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); | ||
504 | return; | ||
505 | } | ||
506 | } | ||
507 | |||
508 | try | ||
509 | { | ||
510 | string[] agentFolders = Directory.GetDirectories(DEFAULT_INVENTORY_DIR); | ||
511 | |||
512 | for (int i = 0; i < agentFolders.Length; i++) | ||
513 | { | ||
514 | string foldername = agentFolders[i]; | ||
515 | string indexPath = Path.Combine(foldername, "index.txt"); | ||
516 | UUID ownerID = UUID.Zero; | ||
517 | Uri owner = null; | ||
518 | |||
519 | try | ||
520 | { | ||
521 | string[] index = File.ReadAllLines(indexPath); | ||
522 | ownerID = UUID.Parse(index[0]); | ||
523 | owner = new Uri(index[1]); | ||
524 | } | ||
525 | catch (Exception ex) | ||
526 | { | ||
527 | m_log.WarnFormat("[SIMPLEINVENTORYSTORAGE]: Failed loading the index file {0}: {1}", indexPath, ex.Message); | ||
528 | } | ||
529 | |||
530 | if (ownerID != UUID.Zero && owner != null) | ||
531 | { | ||
532 | // Initialize the active gestures list for this agent | ||
533 | activeGestures.Add(owner, new List<InventoryItemBase>()); | ||
534 | |||
535 | InventoryCollection collection = new InventoryCollection(); | ||
536 | collection.UserID = ownerID; | ||
537 | |||
538 | // Load all of the folders for this agent | ||
539 | string[] folders = Directory.GetFiles(foldername, "*.folder", SearchOption.TopDirectoryOnly); | ||
540 | collection.Folders = new Dictionary<UUID,InventoryFolderWithChildren>(folders.Length); | ||
541 | |||
542 | for (int j = 0; j < folders.Length; j++) | ||
543 | { | ||
544 | InventoryFolderWithChildren invFolder = (InventoryFolderWithChildren)folderSerializer.Deserialize( | ||
545 | new FileStream(folders[j], FileMode.Open, FileAccess.Read)); | ||
546 | collection.Folders[invFolder.ID] = invFolder; | ||
547 | } | ||
548 | |||
549 | // Iterate over the folders collection, adding children to their parents | ||
550 | foreach (InventoryFolderWithChildren invFolder in collection.Folders.Values) | ||
551 | { | ||
552 | InventoryFolderWithChildren parent; | ||
553 | if (collection.Folders.TryGetValue(invFolder.ParentID, out parent)) | ||
554 | parent.Children[invFolder.ID] = invFolder; | ||
555 | } | ||
556 | |||
557 | // Load all of the items for this agent | ||
558 | string[] files = Directory.GetFiles(foldername, "*.item", SearchOption.TopDirectoryOnly); | ||
559 | collection.Items = new Dictionary<UUID, InventoryItemBase>(files.Length); | ||
560 | |||
561 | for (int j = 0; j < files.Length; j++) | ||
562 | { | ||
563 | InventoryItemBase invItem = (InventoryItemBase)itemSerializer.Deserialize( | ||
564 | new FileStream(files[j], FileMode.Open, FileAccess.Read)); | ||
565 | collection.Items[invItem.ID] = invItem; | ||
566 | |||
567 | // Add items to their parent folders | ||
568 | InventoryFolderWithChildren parent; | ||
569 | if (collection.Folders.TryGetValue(invItem.Folder, out parent)) | ||
570 | parent.Children[invItem.ID] = invItem; | ||
571 | |||
572 | // Add active gestures to our list | ||
573 | if (invItem.InvType == (int)InventoryType.Gesture && invItem.Flags != 0) | ||
574 | activeGestures[owner].Add(invItem); | ||
575 | } | ||
576 | |||
577 | inventories.Add(owner, collection); | ||
578 | } | ||
579 | } | ||
580 | } | ||
581 | catch (Exception ex) | ||
582 | { | ||
583 | m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed loading inventory from {0}: {1}", folder, ex.Message); | ||
584 | } | ||
585 | } | ||
586 | |||
587 | #region IPlugin implementation | ||
588 | |||
589 | public void Initialise(AssetInventoryServer server) | ||
590 | { | ||
591 | this.server = server; | ||
592 | |||
593 | LoadFiles(DEFAULT_INVENTORY_DIR); | ||
594 | |||
595 | m_log.InfoFormat("[SIMPLEINVENTORYSTORAGE]: Initialized the inventory index with data for {0} avatars", | ||
596 | inventories.Count); | ||
597 | } | ||
598 | |||
599 | /// <summary> | ||
600 | /// <para>Initialises asset interface</para> | ||
601 | /// </summary> | ||
602 | public void Initialise() | ||
603 | { | ||
604 | m_log.InfoFormat("[SIMPLEINVENTORYSTORAGE]: {0} cannot be default-initialized!", Name); | ||
605 | throw new PluginNotInitialisedException(Name); | ||
606 | } | ||
607 | |||
608 | public void Dispose() | ||
609 | { | ||
610 | } | ||
611 | |||
612 | public string Version | ||
613 | { | ||
614 | // TODO: this should be something meaningful and not hardcoded? | ||
615 | get { return "0.1"; } | ||
616 | } | ||
617 | |||
618 | public string Name | ||
619 | { | ||
620 | get { return "SimpleInventoryStorage"; } | ||
621 | } | ||
622 | |||
623 | #endregion IPlugin implementation | ||
624 | } | ||
625 | } | ||
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs deleted file mode 100644 index 0d5c53a..0000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs +++ /dev/null | |||
@@ -1,71 +0,0 @@ | |||
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.IO; | ||
30 | using OpenMetaverse; | ||
31 | |||
32 | namespace OpenSim.Grid.AssetInventoryServer.Plugins.Simple | ||
33 | { | ||
34 | public static class SimpleUtils | ||
35 | { | ||
36 | public static string ParseNameFromFilename(string filename) | ||
37 | { | ||
38 | filename = Path.GetFileName(filename); | ||
39 | |||
40 | int dot = filename.LastIndexOf('.'); | ||
41 | int firstDash = filename.IndexOf('-'); | ||
42 | |||
43 | if (dot - 37 > 0 && firstDash > 0) | ||
44 | return filename.Substring(0, firstDash); | ||
45 | else | ||
46 | return String.Empty; | ||
47 | } | ||
48 | |||
49 | public static UUID ParseUUIDFromFilename(string filename) | ||
50 | { | ||
51 | int dot = filename.LastIndexOf('.'); | ||
52 | |||
53 | if (dot > 35) | ||
54 | { | ||
55 | // Grab the last 36 characters of the filename | ||
56 | string uuidString = filename.Substring(dot - 36, 36); | ||
57 | UUID uuid; | ||
58 | UUID.TryParse(uuidString, out uuid); | ||
59 | return uuid; | ||
60 | } | ||
61 | else | ||
62 | { | ||
63 | UUID uuid; | ||
64 | if (UUID.TryParse(Path.GetFileName(filename), out uuid)) | ||
65 | return uuid; | ||
66 | else | ||
67 | return UUID.Zero; | ||
68 | } | ||
69 | } | ||
70 | } | ||
71 | } | ||