| 38 |
|
|
| 39 |
namespace AssetServer.Extensions |
namespace AssetServer.Extensions |
| 40 |
{ |
{ |
|
#region Extension classes for Metadata |
|
|
|
|
|
public class SimpleMetadata : Metadata |
|
|
{ |
|
|
public string Filename; |
|
|
} |
|
|
|
|
|
#endregion Extension classes for Metadata |
|
|
|
|
| 41 |
public class SimpleStorage : IExtension<AssetServer>, IStorageProvider |
public class SimpleStorage : IExtension<AssetServer>, IStorageProvider |
| 42 |
{ |
{ |
| 43 |
public const string DEFAULT_DATA_DIR = "DefaultAssets"; |
public const string DEFAULT_DATA_DIR = "DefaultAssets"; |
| 45 |
public const string TEMP_DATA_DIR = "TemporaryAssets"; |
public const string TEMP_DATA_DIR = "TemporaryAssets"; |
| 46 |
|
|
| 47 |
AssetServer server; |
AssetServer server; |
| 48 |
Dictionary<UUID, SimpleMetadata> metadataStorage; |
Dictionary<UUID, Metadata> metadataStorage; |
| 49 |
|
Dictionary<UUID, string> filenames; |
| 50 |
|
|
| 51 |
public SimpleStorage() |
public SimpleStorage() |
| 52 |
{ |
{ |
| 57 |
public void Start(AssetServer server) |
public void Start(AssetServer server) |
| 58 |
{ |
{ |
| 59 |
this.server = server; |
this.server = server; |
| 60 |
metadataStorage = new Dictionary<UUID, SimpleMetadata>(); |
metadataStorage = new Dictionary<UUID, Metadata>(); |
| 61 |
|
filenames = new Dictionary<UUID, string>(); |
| 62 |
|
|
| 63 |
LoadFiles(DEFAULT_DATA_DIR, false); |
LoadFiles(DEFAULT_DATA_DIR, false); |
| 64 |
LoadFiles(UPLOAD_DATA_DIR, false); |
LoadFiles(UPLOAD_DATA_DIR, false); |
| 77 |
|
|
| 78 |
if (server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID)) |
if (server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID)) |
| 79 |
{ |
{ |
| 80 |
SimpleMetadata simpleMetadata; |
if (metadataStorage.TryGetValue(assetID, out metadata)) |
|
if (metadataStorage.TryGetValue(assetID, out simpleMetadata)) |
|
|
{ |
|
|
metadata = simpleMetadata; |
|
| 81 |
return StorageResponse.Success; |
return StorageResponse.Success; |
|
} |
|
| 82 |
else |
else |
|
{ |
|
| 83 |
return StorageResponse.NotFound; |
return StorageResponse.NotFound; |
| 84 |
} |
} |
|
} |
|
| 85 |
else |
else |
| 86 |
{ |
{ |
| 87 |
return StorageResponse.AuthNeeded; |
return StorageResponse.AuthNeeded; |
| 113 |
public StorageResponse TryFetchData(UUID assetID, UUID authToken, out byte[] assetData) |
public StorageResponse TryFetchData(UUID assetID, UUID authToken, out byte[] assetData) |
| 114 |
{ |
{ |
| 115 |
assetData = null; |
assetData = null; |
| 116 |
SimpleMetadata metadata; |
string filename; |
| 117 |
|
|
| 118 |
if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) |
if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) |
| 119 |
{ |
{ |
| 120 |
if (metadataStorage.TryGetValue(assetID, out metadata)) |
if (filenames.TryGetValue(assetID, out filename)) |
| 121 |
{ |
{ |
| 122 |
try |
try |
| 123 |
{ |
{ |
| 124 |
assetData = File.ReadAllBytes(metadata.Filename); |
assetData = File.ReadAllBytes(filename); |
| 125 |
return StorageResponse.Success; |
return StorageResponse.Success; |
| 126 |
} |
} |
| 127 |
catch (Exception ex) |
catch (Exception ex) |
| 128 |
{ |
{ |
| 129 |
Logger.Log(String.Format("Failed reading data for asset {0} from {1}", assetID, metadata.Filename), |
Logger.Log(String.Format("Failed reading data for asset {0} from {1}", assetID, filename), |
| 130 |
Helpers.LogLevel.Error, ex); |
Helpers.LogLevel.Error, ex); |
| 131 |
return StorageResponse.Failure; |
return StorageResponse.Failure; |
| 132 |
} |
} |
| 146 |
{ |
{ |
| 147 |
metadata = null; |
metadata = null; |
| 148 |
assetData = null; |
assetData = null; |
| 149 |
SimpleMetadata simpleMetadata; |
string filename; |
| 150 |
|
|
| 151 |
if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) |
if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) |
| 152 |
{ |
{ |
| 153 |
if (metadataStorage.TryGetValue(assetID, out simpleMetadata)) |
if (metadataStorage.TryGetValue(assetID, out metadata) && |
| 154 |
|
filenames.TryGetValue(assetID, out filename)) |
| 155 |
{ |
{ |
| 156 |
try |
try |
| 157 |
{ |
{ |
| 158 |
metadata = simpleMetadata; |
assetData = File.ReadAllBytes(filename); |
|
assetData = File.ReadAllBytes(simpleMetadata.Filename); |
|
| 159 |
return StorageResponse.Success; |
return StorageResponse.Success; |
| 160 |
} |
} |
| 161 |
catch (Exception ex) |
catch (Exception ex) |
| 162 |
{ |
{ |
| 163 |
Logger.Log(String.Format("Failed reading data for asset {0} from {1}", assetID, simpleMetadata.Filename), |
Logger.Log(String.Format("Failed reading data for asset {0} from {1}", assetID, filename), |
| 164 |
Helpers.LogLevel.Error, ex); |
Helpers.LogLevel.Error, ex); |
| 165 |
return StorageResponse.Failure; |
return StorageResponse.Failure; |
| 166 |
} |
} |
| 197 |
try |
try |
| 198 |
{ |
{ |
| 199 |
File.WriteAllBytes(path, assetData); |
File.WriteAllBytes(path, assetData); |
| 200 |
|
lock (filenames) filenames[metadata.ID] = path; |
| 201 |
|
|
| 202 |
SimpleMetadata simpleMetadata = (SimpleMetadata)metadata; |
// Re-calculate the SHA1 hash for the asset |
| 203 |
simpleMetadata.Filename = path; |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(assetData); |
| 204 |
|
// Set the creation date to right now |
| 205 |
|
metadata.CreationDate = DateTime.Now; |
| 206 |
|
|
| 207 |
if (simpleMetadata.Type == AssetType.Texture) |
if (metadata.Type == AssetType.Texture) |
| 208 |
{ |
{ |
| 209 |
// Decode the layer boundaries at storage time |
// Decode the layer boundaries at storage time |
| 210 |
int components; |
int components; |
| 220 |
osdata["components"] = OSD.FromInteger(components); |
osdata["components"] = OSD.FromInteger(components); |
| 221 |
osdata["layer_ends"] = layerEnds; |
osdata["layer_ends"] = layerEnds; |
| 222 |
|
|
| 223 |
simpleMetadata.ExtraData = osdata; |
metadata.ExtraData = osdata; |
| 224 |
} |
} |
| 225 |
} |
} |
| 226 |
|
|
| 227 |
lock (metadataStorage) metadataStorage[metadata.ID] = simpleMetadata; |
lock (metadataStorage) metadataStorage[metadata.ID] = metadata; |
| 228 |
return StorageResponse.Success; |
return StorageResponse.Success; |
| 229 |
} |
} |
| 230 |
catch (Exception ex) |
catch (Exception ex) |
| 281 |
int components; |
int components; |
| 282 |
OpenJPEG.J2KLayerInfo[] layerInfo; |
OpenJPEG.J2KLayerInfo[] layerInfo; |
| 283 |
|
|
| 284 |
SimpleMetadata metadata = new SimpleMetadata(); |
Metadata metadata = new Metadata(); |
| 285 |
metadata.CreationDate = File.GetCreationTime(filename); |
metadata.CreationDate = File.GetCreationTime(filename); |
| 286 |
metadata.Description = String.Empty; |
metadata.Description = String.Empty; |
|
metadata.Filename = filename; |
|
| 287 |
metadata.ID = ParseUUIDFromFilename(filename); |
metadata.ID = ParseUUIDFromFilename(filename); |
| 288 |
metadata.Name = ParseNameFromFilename(filename); |
metadata.Name = ParseNameFromFilename(filename); |
| 289 |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
| 290 |
metadata.Temporary = false; |
metadata.Temporary = false; |
| 291 |
metadata.Type = AssetType.Texture; |
metadata.Type = AssetType.Texture; |
| 292 |
|
|
| 293 |
|
filenames[metadata.ID] = filename; |
| 294 |
|
|
| 295 |
if (OpenJPEG.DecodeLayerBoundaries(data, out layerInfo, out components)) |
if (OpenJPEG.DecodeLayerBoundaries(data, out layerInfo, out components)) |
| 296 |
{ |
{ |
| 297 |
OSDArray layerEnds = new OSDArray(); |
OSDArray layerEnds = new OSDArray(); |
| 316 |
string filename = clothing[i]; |
string filename = clothing[i]; |
| 317 |
byte[] data = File.ReadAllBytes(filename); |
byte[] data = File.ReadAllBytes(filename); |
| 318 |
|
|
| 319 |
SimpleMetadata metadata = new SimpleMetadata(); |
Metadata metadata = new Metadata(); |
| 320 |
metadata.CreationDate = File.GetCreationTime(filename); |
metadata.CreationDate = File.GetCreationTime(filename); |
| 321 |
metadata.Description = String.Empty; |
metadata.Description = String.Empty; |
|
metadata.Filename = filename; |
|
| 322 |
metadata.ID = ParseUUIDFromFilename(filename); |
metadata.ID = ParseUUIDFromFilename(filename); |
| 323 |
metadata.Name = ParseNameFromFilename(filename); |
metadata.Name = ParseNameFromFilename(filename); |
| 324 |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
| 325 |
metadata.Temporary = false; |
metadata.Temporary = false; |
| 326 |
metadata.Type = AssetType.Clothing; |
metadata.Type = AssetType.Clothing; |
| 327 |
metadataStorage[metadata.ID] = metadata; |
metadataStorage[metadata.ID] = metadata; |
| 328 |
|
|
| 329 |
|
filenames[metadata.ID] = filename; |
| 330 |
} |
} |
| 331 |
|
|
| 332 |
for (int i = 0; i < bodyparts.Length; i++) |
for (int i = 0; i < bodyparts.Length; i++) |
| 334 |
string filename = bodyparts[i]; |
string filename = bodyparts[i]; |
| 335 |
byte[] data = File.ReadAllBytes(filename); |
byte[] data = File.ReadAllBytes(filename); |
| 336 |
|
|
| 337 |
SimpleMetadata metadata = new SimpleMetadata(); |
Metadata metadata = new Metadata(); |
| 338 |
metadata.CreationDate = File.GetCreationTime(filename); |
metadata.CreationDate = File.GetCreationTime(filename); |
| 339 |
metadata.Description = String.Empty; |
metadata.Description = String.Empty; |
|
metadata.Filename = filename; |
|
| 340 |
metadata.ID = ParseUUIDFromFilename(filename); |
metadata.ID = ParseUUIDFromFilename(filename); |
| 341 |
metadata.Name = ParseNameFromFilename(filename); |
metadata.Name = ParseNameFromFilename(filename); |
| 342 |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
| 343 |
metadata.Temporary = false; |
metadata.Temporary = false; |
| 344 |
metadata.Type = AssetType.Bodypart; |
metadata.Type = AssetType.Bodypart; |
| 345 |
metadataStorage[metadata.ID] = metadata; |
metadataStorage[metadata.ID] = metadata; |
| 346 |
|
|
| 347 |
|
filenames[metadata.ID] = filename; |
| 348 |
} |
} |
| 349 |
|
|
| 350 |
for (int i = 0; i < sounds.Length; i++) |
for (int i = 0; i < sounds.Length; i++) |
| 352 |
string filename = sounds[i]; |
string filename = sounds[i]; |
| 353 |
byte[] data = File.ReadAllBytes(filename); |
byte[] data = File.ReadAllBytes(filename); |
| 354 |
|
|
| 355 |
SimpleMetadata metadata = new SimpleMetadata(); |
Metadata metadata = new Metadata(); |
| 356 |
metadata.CreationDate = File.GetCreationTime(filename); |
metadata.CreationDate = File.GetCreationTime(filename); |
| 357 |
metadata.Description = String.Empty; |
metadata.Description = String.Empty; |
|
metadata.Filename = filename; |
|
| 358 |
metadata.ID = ParseUUIDFromFilename(filename); |
metadata.ID = ParseUUIDFromFilename(filename); |
| 359 |
metadata.Name = ParseNameFromFilename(filename); |
metadata.Name = ParseNameFromFilename(filename); |
| 360 |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); |
| 361 |
metadata.Temporary = false; |
metadata.Temporary = false; |
| 362 |
metadata.Type = AssetType.Sound; |
metadata.Type = AssetType.Sound; |
| 363 |
metadataStorage[metadata.ID] = metadata; |
metadataStorage[metadata.ID] = metadata; |
| 364 |
|
|
| 365 |
|
filenames[metadata.ID] = filename; |
| 366 |
} |
} |
| 367 |
} |
} |
| 368 |
catch (Exception ex) |
catch (Exception ex) |