2009-02-12 09:53:12 +00:00
/ *
2008-05-30 08:35:57 +00:00
* Copyright ( c ) Contributors , http : //opensimulator.org/
* See CONTRIBUTORS . TXT for a full list of copyright holders .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
2009-06-01 06:37:14 +00:00
* * Neither the name of the OpenSimulator Project nor the
2008-05-30 08:35:57 +00:00
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ` ` AS IS ' ' AND ANY
* EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
* ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
* LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* /
2009-02-12 18:59:45 +00:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.IO.Compression ;
using System.Net ;
using System.Reflection ;
using System.Text ;
2009-06-03 12:48:04 +00:00
using System.Xml ;
2009-02-12 18:59:45 +00:00
using log4net ;
using OpenMetaverse ;
using OpenSim.Framework ;
2009-03-16 00:12:25 +00:00
using OpenSim.Framework.Serialization ;
2009-03-27 18:13:34 +00:00
using OpenSim.Framework.Serialization.External ;
2009-02-12 18:59:45 +00:00
using OpenSim.Region.CoreModules.World.Terrain ;
using OpenSim.Region.Framework.Interfaces ;
using OpenSim.Region.Framework.Scenes ;
2010-01-10 18:40:07 +00:00
using OpenSim.Services.Interfaces ;
2009-02-12 18:59:45 +00:00
2009-02-10 13:10:57 +00:00
namespace OpenSim.Region.CoreModules.World.Archiver
2008-05-30 08:35:57 +00:00
{
/// <summary>
/// Handles an individual archive read request
/// </summary>
public class ArchiveReadRequest
{
2008-06-04 09:59:27 +00:00
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2010-10-16 03:59:51 +00:00
/// <summary>
2010-10-22 18:30:15 +00:00
/// The maximum major version of OAR that we can read. Minor versions shouldn't need a max number since version
2010-10-16 03:59:51 +00:00
/// bumps here should be compatible.
/// </summary>
2010-11-20 02:59:21 +00:00
public static int MAX_MAJOR_VERSION = 1 ;
2011-04-18 21:35:33 +00:00
/// <summary>
/// Has the control file been loaded for this archive?
/// </summary>
public bool ControlFileLoaded { get ; private set ; }
2008-06-04 09:59:27 +00:00
2010-04-16 21:29:11 +00:00
protected Scene m_scene ;
protected Stream m_loadStream ;
protected Guid m_requestId ;
protected string m_errorMessage ;
2009-03-16 00:12:25 +00:00
2009-02-10 18:43:36 +00:00
/// <value>
/// Should the archive being loaded be merged with what is already on the region?
/// </value>
2010-04-16 21:29:11 +00:00
protected bool m_merge ;
/// <value>
/// Should we ignore any assets when reloading the archive?
/// </value>
protected bool m_skipAssets ;
2008-08-18 00:39:10 +00:00
2008-08-09 22:04:42 +00:00
/// <summary>
/// Used to cache lookups for valid uuids.
/// </summary>
2008-09-06 07:52:41 +00:00
private IDictionary < UUID , bool > m_validUserUuids = new Dictionary < UUID , bool > ( ) ;
2008-05-30 08:35:57 +00:00
2010-11-21 21:16:52 +00:00
private IUserManagement m_UserMan ;
private IUserManagement UserManager
{
get
{
if ( m_UserMan = = null )
{
m_UserMan = m_scene . RequestModuleInterface < IUserManagement > ( ) ;
}
return m_UserMan ;
}
}
2010-04-16 21:29:11 +00:00
public ArchiveReadRequest ( Scene scene , string loadPath , bool merge , bool skipAssets , Guid requestId )
2008-05-30 08:35:57 +00:00
{
m_scene = scene ;
2010-02-19 22:30:46 +00:00
try
{
2010-05-28 18:21:00 +00:00
m_loadStream = new GZipStream ( ArchiveHelpers . GetStream ( loadPath ) , CompressionMode . Decompress ) ;
2010-02-19 22:30:46 +00:00
}
catch ( EntryPointNotFoundException e )
{
m_log . ErrorFormat (
"[ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?" ) ;
m_log . Error ( e ) ;
}
2009-01-28 09:22:12 +00:00
m_errorMessage = String . Empty ;
2009-02-10 18:43:36 +00:00
m_merge = merge ;
2010-04-16 21:29:11 +00:00
m_skipAssets = skipAssets ;
2009-04-15 19:12:37 +00:00
m_requestId = requestId ;
2008-05-30 08:35:57 +00:00
}
2009-02-04 00:01:36 +00:00
2010-04-16 21:29:11 +00:00
public ArchiveReadRequest ( Scene scene , Stream loadStream , bool merge , bool skipAssets , Guid requestId )
2009-01-23 17:07:37 +00:00
{
m_scene = scene ;
m_loadStream = loadStream ;
2009-02-10 18:43:36 +00:00
m_merge = merge ;
2010-04-16 21:29:11 +00:00
m_skipAssets = skipAssets ;
2009-04-15 19:12:37 +00:00
m_requestId = requestId ;
2009-02-04 00:01:36 +00:00
}
2008-06-04 09:59:27 +00:00
2009-01-23 17:07:37 +00:00
/// <summary>
/// Dearchive the region embodied in this request.
/// </summary>
public void DearchiveRegion ( )
2008-12-30 19:00:19 +00:00
{
// The same code can handle dearchiving 0.1 and 0.2 OpenSim Archive versions
DearchiveRegion0DotStar ( ) ;
}
2009-02-04 00:01:36 +00:00
2008-12-30 19:00:19 +00:00
private void DearchiveRegion0DotStar ( )
2008-08-18 00:39:10 +00:00
{
2009-01-28 09:22:12 +00:00
int successfulAssetRestores = 0 ;
int failedAssetRestores = 0 ;
List < string > serialisedSceneObjects = new List < string > ( ) ;
2009-10-02 09:10:52 +00:00
List < string > serialisedParcels = new List < string > ( ) ;
2009-04-28 19:40:02 +00:00
string filePath = "NONE" ;
2009-11-24 17:47:09 +00:00
2010-01-03 21:10:45 +00:00
TarArchiveReader archive = new TarArchiveReader ( m_loadStream ) ;
2009-11-24 17:47:09 +00:00
byte [ ] data ;
TarArchiveReader . TarEntryType entryType ;
2009-04-28 19:40:02 +00:00
2009-01-28 09:22:12 +00:00
try
{
while ( ( data = archive . ReadEntry ( out filePath , out entryType ) ) ! = null )
2009-09-30 16:00:09 +00:00
{
2009-04-28 19:54:57 +00:00
//m_log.DebugFormat(
// "[ARCHIVER]: Successfully read {0} ({1} bytes)", filePath, data.Length);
2009-04-28 19:40:02 +00:00
if ( TarArchiveReader . TarEntryType . TYPE_DIRECTORY = = entryType )
2009-09-30 16:00:09 +00:00
continue ;
2009-03-16 00:12:25 +00:00
2009-03-24 21:05:20 +00:00
if ( filePath . StartsWith ( ArchiveConstants . OBJECTS_PATH ) )
2009-01-28 09:22:12 +00:00
{
2010-04-16 21:38:42 +00:00
serialisedSceneObjects . Add ( Encoding . UTF8 . GetString ( data ) ) ;
2009-01-28 09:22:12 +00:00
}
2010-04-16 21:29:11 +00:00
else if ( filePath . StartsWith ( ArchiveConstants . ASSETS_PATH ) & & ! m_skipAssets )
2009-01-28 09:22:12 +00:00
{
if ( LoadAsset ( filePath , data ) )
successfulAssetRestores + + ;
else
failedAssetRestores + + ;
2009-10-29 08:46:58 +00:00
if ( ( successfulAssetRestores + failedAssetRestores ) % 250 = = 0 )
m_log . Debug ( "[ARCHIVER]: Loaded " + successfulAssetRestores + " assets and failed to load " + failedAssetRestores + " assets..." ) ;
2009-01-28 09:22:12 +00:00
}
2009-02-10 18:43:36 +00:00
else if ( ! m_merge & & filePath . StartsWith ( ArchiveConstants . TERRAINS_PATH ) )
2009-01-28 09:22:12 +00:00
{
LoadTerrain ( filePath , data ) ;
}
2009-02-10 18:43:36 +00:00
else if ( ! m_merge & & filePath . StartsWith ( ArchiveConstants . SETTINGS_PATH ) )
2009-01-28 09:22:12 +00:00
{
LoadRegionSettings ( filePath , data ) ;
2009-06-12 14:18:01 +00:00
}
2009-10-02 09:10:52 +00:00
else if ( ! m_merge & & filePath . StartsWith ( ArchiveConstants . LANDDATA_PATH ) )
{
2010-04-16 21:38:42 +00:00
serialisedParcels . Add ( Encoding . UTF8 . GetString ( data ) ) ;
2009-10-02 09:10:52 +00:00
}
2009-06-12 14:18:01 +00:00
else if ( filePath = = ArchiveConstants . CONTROL_FILE_PATH )
{
LoadControlFile ( filePath , data ) ;
2009-01-28 09:22:12 +00:00
}
2008-12-30 19:00:19 +00:00
}
2009-02-04 00:01:36 +00:00
2009-01-28 09:22:12 +00:00
//m_log.Debug("[ARCHIVER]: Reached end of archive");
}
catch ( Exception e )
{
m_log . ErrorFormat (
2009-04-28 19:40:02 +00:00
"[ARCHIVER]: Aborting load with error in archive file {0}. {1}" , filePath , e ) ;
2009-01-28 09:22:12 +00:00
m_errorMessage + = e . ToString ( ) ;
2009-04-15 19:12:37 +00:00
m_scene . EventManager . TriggerOarFileLoaded ( m_requestId , m_errorMessage ) ;
2009-01-28 09:22:12 +00:00
return ;
}
2009-11-24 17:47:09 +00:00
finally
{
archive . Close ( ) ;
}
2008-08-18 00:39:10 +00:00
2010-04-16 21:29:11 +00:00
if ( ! m_skipAssets )
2009-01-28 09:22:12 +00:00
{
2010-04-16 21:29:11 +00:00
m_log . InfoFormat ( "[ARCHIVER]: Restored {0} assets" , successfulAssetRestores ) ;
if ( failedAssetRestores > 0 )
{
m_log . ErrorFormat ( "[ARCHIVER]: Failed to load {0} assets" , failedAssetRestores ) ;
m_errorMessage + = String . Format ( "Failed to load {0} assets" , failedAssetRestores ) ;
}
2009-01-28 09:22:12 +00:00
}
2009-02-04 00:01:36 +00:00
2009-02-10 18:43:36 +00:00
if ( ! m_merge )
{
m_log . Info ( "[ARCHIVER]: Clearing all existing scene objects" ) ;
m_scene . DeleteAllSceneObjects ( ) ;
}
2009-02-04 00:01:36 +00:00
2011-01-27 21:07:21 +00:00
LoadParcels ( serialisedParcels ) ;
LoadObjects ( serialisedSceneObjects ) ;
2009-10-02 09:10:52 +00:00
2011-01-27 21:07:21 +00:00
m_log . InfoFormat ( "[ARCHIVER]: Successfully loaded archive" ) ;
2009-10-02 09:10:52 +00:00
2011-01-27 21:07:21 +00:00
m_scene . EventManager . TriggerOarFileLoaded ( m_requestId , m_errorMessage ) ;
}
/// <summary>
/// Load serialized scene objects.
/// </summary>
/// <param name="serialisedSceneObjects"></param>
protected void LoadObjects ( List < string > serialisedSceneObjects )
{
2008-05-30 16:08:28 +00:00
// Reload serialized prims
2008-07-13 00:18:29 +00:00
m_log . InfoFormat ( "[ARCHIVER]: Loading {0} scene objects. Please wait." , serialisedSceneObjects . Count ) ;
2008-06-04 09:59:27 +00:00
2008-12-19 19:07:11 +00:00
IRegionSerialiserModule serialiser = m_scene . RequestModuleInterface < IRegionSerialiserModule > ( ) ;
2009-09-30 16:00:09 +00:00
int sceneObjectsLoadedCount = 0 ;
2008-06-21 21:20:59 +00:00
2008-06-21 23:45:22 +00:00
foreach ( string serialisedSceneObject in serialisedSceneObjects )
2008-08-18 00:39:10 +00:00
{
2009-03-24 21:05:20 +00:00
/ *
2009-03-24 20:48:27 +00:00
m_log . DebugFormat ( "[ARCHIVER]: Loading xml with raw size {0}" , serialisedSceneObject . Length ) ;
// Really large xml files (multi megabyte) appear to cause
// memory problems
// when loading the xml. But don't enable this check yet
2009-03-24 21:05:20 +00:00
2009-03-24 20:48:27 +00:00
if ( serialisedSceneObject . Length > 5000000 )
{
m_log . Error ( "[ARCHIVER]: Ignoring xml since size > 5000000);" ) ;
continue ;
}
2009-03-24 21:05:20 +00:00
* /
2009-03-24 20:48:27 +00:00
2008-07-18 14:42:06 +00:00
SceneObjectGroup sceneObject = serialiser . DeserializeGroupFromXml2 ( serialisedSceneObject ) ;
2008-08-18 00:39:10 +00:00
2008-07-21 21:10:15 +00:00
// For now, give all incoming scene objects new uuids. This will allow scenes to be cloned
// on the same region server and multiple examples a single object archive to be imported
// to the same scene (when this is possible).
sceneObject . ResetIDs ( ) ;
2008-08-18 00:39:10 +00:00
2011-01-27 21:07:21 +00:00
// Try to retain the original creator/owner/lastowner if their uuid is present on this grid
// or creator data is present. Otherwise, use the estate owner instead.
2010-09-17 00:30:46 +00:00
foreach ( SceneObjectPart part in sceneObject . Parts )
2008-07-14 16:44:50 +00:00
{
2010-11-21 21:16:52 +00:00
if ( part . CreatorData = = null | | part . CreatorData = = string . Empty )
{
if ( ! ResolveUserUuid ( part . CreatorID ) )
part . CreatorID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
}
2010-11-22 01:19:24 +00:00
if ( UserManager ! = null )
UserManager . AddUser ( part . CreatorID , part . CreatorData ) ;
2010-08-27 23:40:33 +00:00
if ( ! ResolveUserUuid ( part . OwnerID ) )
part . OwnerID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
if ( ! ResolveUserUuid ( part . LastOwnerID ) )
part . LastOwnerID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
// And zap any troublesome sit target information
part . SitTargetOrientation = new Quaternion ( 0 , 0 , 0 , 1 ) ;
part . SitTargetPosition = new Vector3 ( 0 , 0 , 0 ) ;
// Fix ownership/creator of inventory items
// Not doing so results in inventory items
// being no copy/no mod for everyone
lock ( part . TaskInventory )
2008-10-12 03:16:49 +00:00
{
2010-08-27 23:40:33 +00:00
TaskInventoryDictionary inv = part . TaskInventory ;
foreach ( KeyValuePair < UUID , TaskInventoryItem > kvp in inv )
2008-10-12 03:16:49 +00:00
{
2010-08-27 23:40:33 +00:00
if ( ! ResolveUserUuid ( kvp . Value . OwnerID ) )
{
kvp . Value . OwnerID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
}
2010-11-22 01:19:24 +00:00
if ( kvp . Value . CreatorData = = null | | kvp . Value . CreatorData = = string . Empty )
2009-02-20 14:04:29 +00:00
{
2010-11-22 01:19:24 +00:00
if ( ! ResolveUserUuid ( kvp . Value . CreatorID ) )
kvp . Value . CreatorID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
2009-02-20 14:04:29 +00:00
}
2010-11-22 01:19:24 +00:00
if ( UserManager ! = null )
UserManager . AddUser ( kvp . Value . CreatorID , kvp . Value . CreatorData ) ;
2008-10-12 03:16:49 +00:00
}
}
2008-08-18 00:39:10 +00:00
}
2008-07-18 14:42:06 +00:00
if ( m_scene . AddRestoredSceneObject ( sceneObject , true , false ) )
2008-08-18 00:39:10 +00:00
{
2009-03-24 20:48:27 +00:00
sceneObjectsLoadedCount + + ;
2009-09-16 13:39:07 +00:00
sceneObject . CreateScriptInstances ( 0 , false , m_scene . DefaultScriptEngine , 0 ) ;
2010-04-19 05:29:26 +00:00
sceneObject . ResumeScripts ( ) ;
2008-07-14 16:44:50 +00:00
}
2008-08-18 00:39:10 +00:00
}
2009-03-24 20:48:27 +00:00
m_log . InfoFormat ( "[ARCHIVER]: Restored {0} scene objects to the scene" , sceneObjectsLoadedCount ) ;
2008-08-18 00:39:10 +00:00
2009-03-24 20:48:27 +00:00
int ignoredObjects = serialisedSceneObjects . Count - sceneObjectsLoadedCount ;
2008-08-18 00:39:10 +00:00
2008-07-12 22:14:38 +00:00
if ( ignoredObjects > 0 )
2011-01-27 21:07:21 +00:00
m_log . WarnFormat ( "[ARCHIVER]: Ignored {0} scene objects that already existed in the scene" , ignoredObjects ) ;
}
/// <summary>
/// Load serialized parcels.
/// </summary>
/// <param name="serialisedParcels"></param>
protected void LoadParcels ( List < string > serialisedParcels )
{
// Reload serialized parcels
m_log . InfoFormat ( "[ARCHIVER]: Loading {0} parcels. Please wait." , serialisedParcels . Count ) ;
List < LandData > landData = new List < LandData > ( ) ;
foreach ( string serialisedParcel in serialisedParcels )
{
LandData parcel = LandDataSerializer . Deserialize ( serialisedParcel ) ;
if ( ! ResolveUserUuid ( parcel . OwnerID ) )
parcel . OwnerID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
// m_log.DebugFormat(
// "[ARCHIVER]: Adding parcel {0}, local id {1}, area {2}",
// parcel.Name, parcel.LocalID, parcel.Area);
landData . Add ( parcel ) ;
}
if ( ! m_merge )
m_scene . LandChannel . Clear ( false ) ;
m_scene . EventManager . TriggerIncomingLandDataFromStorage ( landData ) ;
m_log . InfoFormat ( "[ARCHIVER]: Restored {0} parcels." , landData . Count ) ;
2008-05-30 08:35:57 +00:00
}
2008-08-18 00:39:10 +00:00
2008-08-09 22:04:42 +00:00
/// <summary>
/// Look up the given user id to check whether it's one that is valid for this grid.
/// </summary>
/// <param name="uuid"></param>
/// <returns></returns>
2009-02-10 18:43:36 +00:00
private bool ResolveUserUuid ( UUID uuid )
2008-08-09 22:04:42 +00:00
{
if ( ! m_validUserUuids . ContainsKey ( uuid ) )
{
2010-01-10 18:40:07 +00:00
UserAccount account = m_scene . UserAccountService . GetUserAccount ( m_scene . RegionInfo . ScopeID , uuid ) ;
if ( account ! = null )
2008-08-09 22:04:42 +00:00
m_validUserUuids . Add ( uuid , true ) ;
else
m_validUserUuids . Add ( uuid , false ) ;
}
2008-08-18 00:39:10 +00:00
2008-08-09 22:04:42 +00:00
if ( m_validUserUuids [ uuid ] )
return true ;
else
2008-08-18 00:39:10 +00:00
return false ;
2008-08-09 22:04:42 +00:00
}
2008-08-18 00:39:10 +00:00
2008-06-27 20:08:29 +00:00
/// <summary>
2008-06-29 20:08:58 +00:00
/// Load an asset
2008-06-27 20:08:29 +00:00
/// </summary>
/// <param name="assetFilename"></param>
/// <param name="data"></param>
/// <returns>true if asset was successfully loaded, false otherwise</returns>
2008-08-09 22:04:42 +00:00
private bool LoadAsset ( string assetPath , byte [ ] data )
2008-06-27 20:08:29 +00:00
{
2008-09-06 07:52:41 +00:00
// Right now we're nastily obtaining the UUID from the filename
2008-06-27 20:08:29 +00:00
string filename = assetPath . Remove ( 0 , ArchiveConstants . ASSETS_PATH . Length ) ;
2008-08-26 18:14:10 +00:00
int i = filename . LastIndexOf ( ArchiveConstants . ASSET_EXTENSION_SEPARATOR ) ;
2008-08-28 14:41:54 +00:00
2008-08-26 18:14:10 +00:00
if ( i = = - 1 )
{
m_log . ErrorFormat (
"[ARCHIVER]: Could not find extension information in asset path {0} since it's missing the separator {1}. Skipping" ,
assetPath , ArchiveConstants . ASSET_EXTENSION_SEPARATOR ) ;
2008-08-28 14:41:54 +00:00
2008-08-26 18:14:10 +00:00
return false ;
}
2008-08-28 14:41:54 +00:00
2008-08-26 18:14:10 +00:00
string extension = filename . Substring ( i ) ;
2008-08-18 00:39:10 +00:00
string uuid = filename . Remove ( filename . Length - extension . Length ) ;
2008-06-27 20:08:29 +00:00
if ( ArchiveConstants . EXTENSION_TO_ASSET_TYPE . ContainsKey ( extension ) )
{
sbyte assetType = ArchiveConstants . EXTENSION_TO_ASSET_TYPE [ extension ] ;
2008-08-18 00:39:10 +00:00
2009-11-05 21:10:58 +00:00
if ( assetType = = ( sbyte ) AssetType . Unknown )
m_log . WarnFormat ( "[ARCHIVER]: Importing {0} byte asset {1} with unknown type" , data . Length , uuid ) ;
2008-07-13 00:18:29 +00:00
//m_log.DebugFormat("[ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType);
2008-08-18 00:39:10 +00:00
2010-02-22 22:18:59 +00:00
AssetBase asset = new AssetBase ( new UUID ( uuid ) , String . Empty , assetType , UUID . Zero . ToString ( ) ) ;
2008-06-27 20:08:29 +00:00
asset . Data = data ;
2008-08-18 00:39:10 +00:00
2009-06-01 16:00:46 +00:00
// We're relying on the asset service to do the sensible thing and not store the asset if it already
// exists.
2009-05-15 05:00:25 +00:00
m_scene . AssetService . Store ( asset ) ;
2009-02-04 00:01:36 +00:00
/ * *
2009-01-23 20:38:44 +00:00
* Create layers on decode for image assets . This is likely to significantly increase the time to load archives so
* it might be best done when dearchive takes place on a separate thread
if ( asset . Type = AssetType . Texture )
{
IJ2KDecoder cacheLayerDecode = scene . RequestModuleInterface < IJ2KDecoder > ( ) ;
if ( cacheLayerDecode ! = null )
cacheLayerDecode . syncdecode ( asset . FullID , asset . Data ) ;
}
* /
2008-08-18 00:39:10 +00:00
2008-06-27 20:08:29 +00:00
return true ;
}
else
{
m_log . ErrorFormat (
2008-06-29 20:08:58 +00:00
"[ARCHIVER]: Tried to dearchive data with path {0} with an unknown type extension {1}" ,
2008-06-27 20:08:29 +00:00
assetPath , extension ) ;
2008-08-18 00:39:10 +00:00
2008-06-27 20:08:29 +00:00
return false ;
}
2008-06-29 20:08:58 +00:00
}
2009-02-04 00:01:36 +00:00
2008-12-30 19:00:19 +00:00
/// <summary>
/// Load region settings data
/// </summary>
/// <param name="settingsPath"></param>
/// <param name="data"></param>
/// <returns>
/// true if settings were loaded successfully, false otherwise
/// </returns>
private bool LoadRegionSettings ( string settingsPath , byte [ ] data )
{
RegionSettings loadedRegionSettings ;
2009-02-04 00:01:36 +00:00
2008-12-30 19:00:19 +00:00
try
{
loadedRegionSettings = RegionSettingsSerializer . Deserialize ( data ) ;
}
catch ( Exception e )
{
m_log . ErrorFormat (
2009-02-04 00:01:36 +00:00
"[ARCHIVER]: Could not parse region settings file {0}. Ignoring. Exception was {1}" ,
2008-12-30 19:00:19 +00:00
settingsPath , e ) ;
return false ;
}
2009-02-04 00:01:36 +00:00
2008-12-30 19:00:19 +00:00
RegionSettings currentRegionSettings = m_scene . RegionInfo . RegionSettings ;
2009-02-04 00:01:36 +00:00
2008-12-30 19:00:19 +00:00
currentRegionSettings . AgentLimit = loadedRegionSettings . AgentLimit ;
currentRegionSettings . AllowDamage = loadedRegionSettings . AllowDamage ;
currentRegionSettings . AllowLandJoinDivide = loadedRegionSettings . AllowLandJoinDivide ;
currentRegionSettings . AllowLandResell = loadedRegionSettings . AllowLandResell ;
currentRegionSettings . BlockFly = loadedRegionSettings . BlockFly ;
currentRegionSettings . BlockShowInSearch = loadedRegionSettings . BlockShowInSearch ;
currentRegionSettings . BlockTerraform = loadedRegionSettings . BlockTerraform ;
currentRegionSettings . DisableCollisions = loadedRegionSettings . DisableCollisions ;
currentRegionSettings . DisablePhysics = loadedRegionSettings . DisablePhysics ;
currentRegionSettings . DisableScripts = loadedRegionSettings . DisableScripts ;
currentRegionSettings . Elevation1NE = loadedRegionSettings . Elevation1NE ;
currentRegionSettings . Elevation1NW = loadedRegionSettings . Elevation1NW ;
currentRegionSettings . Elevation1SE = loadedRegionSettings . Elevation1SE ;
currentRegionSettings . Elevation1SW = loadedRegionSettings . Elevation1SW ;
currentRegionSettings . Elevation2NE = loadedRegionSettings . Elevation2NE ;
currentRegionSettings . Elevation2NW = loadedRegionSettings . Elevation2NW ;
currentRegionSettings . Elevation2SE = loadedRegionSettings . Elevation2SE ;
currentRegionSettings . Elevation2SW = loadedRegionSettings . Elevation2SW ;
currentRegionSettings . FixedSun = loadedRegionSettings . FixedSun ;
currentRegionSettings . ObjectBonus = loadedRegionSettings . ObjectBonus ;
currentRegionSettings . RestrictPushing = loadedRegionSettings . RestrictPushing ;
currentRegionSettings . TerrainLowerLimit = loadedRegionSettings . TerrainLowerLimit ;
currentRegionSettings . TerrainRaiseLimit = loadedRegionSettings . TerrainRaiseLimit ;
currentRegionSettings . TerrainTexture1 = loadedRegionSettings . TerrainTexture1 ;
currentRegionSettings . TerrainTexture2 = loadedRegionSettings . TerrainTexture2 ;
currentRegionSettings . TerrainTexture3 = loadedRegionSettings . TerrainTexture3 ;
currentRegionSettings . TerrainTexture4 = loadedRegionSettings . TerrainTexture4 ;
currentRegionSettings . UseEstateSun = loadedRegionSettings . UseEstateSun ;
currentRegionSettings . WaterHeight = loadedRegionSettings . WaterHeight ;
2010-02-26 18:30:05 +00:00
currentRegionSettings . Save ( ) ;
2010-01-22 16:22:23 +00:00
2008-12-30 19:00:19 +00:00
IEstateModule estateModule = m_scene . RequestModuleInterface < IEstateModule > ( ) ;
2010-01-22 16:22:23 +00:00
if ( estateModule ! = null )
estateModule . sendRegionHandshakeToAll ( ) ;
2009-02-04 00:01:36 +00:00
2008-12-30 19:00:19 +00:00
return true ;
}
2008-08-18 00:39:10 +00:00
2008-06-29 20:08:58 +00:00
/// <summary>
/// Load terrain data
/// </summary>
/// <param name="terrainPath"></param>
/// <param name="data"></param>
/// <returns>
/// true if terrain was resolved successfully, false otherwise.
/// </returns>
2008-08-09 22:04:42 +00:00
private bool LoadTerrain ( string terrainPath , byte [ ] data )
2008-06-29 20:08:58 +00:00
{
ITerrainModule terrainModule = m_scene . RequestModuleInterface < ITerrainModule > ( ) ;
2008-08-18 00:39:10 +00:00
2008-06-29 20:08:58 +00:00
MemoryStream ms = new MemoryStream ( data ) ;
terrainModule . LoadFromStream ( terrainPath , ms ) ;
ms . Close ( ) ;
2008-08-18 00:39:10 +00:00
2008-07-13 00:18:29 +00:00
m_log . DebugFormat ( "[ARCHIVER]: Restored terrain {0}" , terrainPath ) ;
2008-08-18 00:39:10 +00:00
2008-06-29 20:08:58 +00:00
return true ;
}
2008-10-30 15:31:44 +00:00
2009-06-03 12:48:04 +00:00
/// <summary>
2009-06-12 14:18:01 +00:00
/// Load oar control file
2009-06-03 12:48:04 +00:00
/// </summary>
2009-06-12 14:18:01 +00:00
/// <param name="path"></param>
2009-06-03 12:48:04 +00:00
/// <param name="data"></param>
2011-04-18 21:35:33 +00:00
public void LoadControlFile ( string path , byte [ ] data )
2009-06-03 12:48:04 +00:00
{
2010-10-22 17:47:38 +00:00
XmlNamespaceManager nsmgr = new XmlNamespaceManager ( new NameTable ( ) ) ;
2009-06-03 12:48:04 +00:00
XmlParserContext context = new XmlParserContext ( null , nsmgr , null , XmlSpace . None ) ;
2010-10-22 17:47:38 +00:00
XmlTextReader xtr = new XmlTextReader ( Encoding . ASCII . GetString ( data ) , XmlNodeType . Document , context ) ;
2009-06-03 12:48:04 +00:00
RegionSettings currentRegionSettings = m_scene . RegionInfo . RegionSettings ;
// Loaded metadata will empty if no information exists in the archive
2009-06-29 15:05:12 +00:00
currentRegionSettings . LoadedCreationDateTime = 0 ;
2009-06-03 12:48:04 +00:00
currentRegionSettings . LoadedCreationID = "" ;
while ( xtr . Read ( ) )
{
if ( xtr . NodeType = = XmlNodeType . Element )
{
2010-10-16 03:59:51 +00:00
if ( xtr . Name . ToString ( ) = = "archive" )
{
int majorVersion = int . Parse ( xtr [ "major_version" ] ) ;
int minorVersion = int . Parse ( xtr [ "minor_version" ] ) ;
string version = string . Format ( "{0}.{1}" , majorVersion , minorVersion ) ;
if ( majorVersion > MAX_MAJOR_VERSION )
{
throw new Exception (
string . Format (
"The OAR you are trying to load has major version number of {0} but this version of OpenSim can only load OARs with major version number {1} and below" ,
majorVersion , MAX_MAJOR_VERSION ) ) ;
}
m_log . InfoFormat ( "[ARCHIVER]: Loading OAR with version {0}" , version ) ;
}
2009-06-29 15:05:12 +00:00
if ( xtr . Name . ToString ( ) = = "datetime" )
2009-06-03 12:48:04 +00:00
{
2009-06-29 15:05:12 +00:00
int value ;
if ( Int32 . TryParse ( xtr . ReadElementContentAsString ( ) , out value ) )
currentRegionSettings . LoadedCreationDateTime = value ;
2009-06-03 12:48:04 +00:00
}
2009-06-12 14:18:01 +00:00
else if ( xtr . Name . ToString ( ) = = "id" )
2009-06-03 12:48:04 +00:00
{
currentRegionSettings . LoadedCreationID = xtr . ReadElementContentAsString ( ) ;
}
}
}
2009-06-12 14:23:31 +00:00
2009-06-03 12:48:04 +00:00
currentRegionSettings . Save ( ) ;
2011-04-18 21:35:33 +00:00
ControlFileLoaded = true ;
2009-06-03 12:48:04 +00:00
}
2008-05-30 08:35:57 +00:00
}
2010-10-22 17:47:38 +00:00
}