aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMW2008-02-04 12:04:02 +0000
committerMW2008-02-04 12:04:02 +0000
commit755ad9e3e0447b60299b08a18624064d1d64141b (patch)
tree89859180b5ba7ef47defbf6a1d6640177ecb1326
parent* Whole buncha stuff. (diff)
downloadopensim-SC-755ad9e3e0447b60299b08a18624064d1d64141b.zip
opensim-SC-755ad9e3e0447b60299b08a18624064d1d64141b.tar.gz
opensim-SC-755ad9e3e0447b60299b08a18624064d1d64141b.tar.bz2
opensim-SC-755ad9e3e0447b60299b08a18624064d1d64141b.tar.xz
First part of avatar persistence, currently only really works in standalone mode (with accounts_authenticate set to true), it also only currently has a mysql database connector. (sqlite one will follow soon). It also uses the tribalmedia database system, so this needs checking to see if the old problems with mono have been fixed.
To use, see the appearance section in opensim.ini.example, set "persist = true", then add the correct connection string for your database.(see mysql-AvatarAppearance.sql in share folder for a example of the table mysql table structure). This could possible be used in a very small grid, but would mean each region server would need to connect to the same mysql database. But the work to move the code to one of the grid servers shouldn't be too much.
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/Communications/Cache/GridAssetClient.cs2
-rw-r--r--OpenSim/Framework/Communications/RestClient/RestClient.cs1
-rw-r--r--OpenSim/Framework/Data.MySQL/MySQLDatabaseMapper.cs9
-rw-r--r--OpenSim/Framework/Data/OpenSimDataReader.cs4
-rw-r--r--OpenSim/Framework/Data/OpenSimDatabaseConnector.cs26
-rw-r--r--OpenSim/Framework/Data/OpenSimObjectFieldMapper.cs4
-rw-r--r--OpenSim/Framework/Data/OpenSimTableMapper.cs3
-rw-r--r--OpenSim/Framework/Data/PrimitiveBaseShapeTableMapper.cs6
-rw-r--r--OpenSim/Region/Application/Application.cs3
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs1
-rw-r--r--OpenSim/Region/ClientStack/RegionApplicationBase.cs2
-rw-r--r--OpenSim/Region/Environment/ModuleLoader.cs1
-rw-r--r--OpenSim/Region/Environment/Modules/AppearanceTableMapper.cs216
-rw-r--r--OpenSim/Region/Environment/Modules/AvatarFactoryModule.cs64
-rw-r--r--OpenSim/Region/Environment/PermissionManager.cs49
-rw-r--r--OpenSim/Region/Environment/Scenes/AvatarAppearance.cs12
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs3
-rw-r--r--ThirdParty/TribalMedia/TribalMedia.Framework.Data/BaseDatabaseConnector.cs1
-rw-r--r--bin/OpenSim.ini.example4
-rw-r--r--prebuild.xml2
-rw-r--r--share/sql/mysql-AvatarAppearance.sql42
21 files changed, 403 insertions, 52 deletions
diff --git a/OpenSim/Framework/Communications/Cache/GridAssetClient.cs b/OpenSim/Framework/Communications/Cache/GridAssetClient.cs
index cf54fa4..2f0727f 100644
--- a/OpenSim/Framework/Communications/Cache/GridAssetClient.cs
+++ b/OpenSim/Framework/Communications/Cache/GridAssetClient.cs
@@ -95,11 +95,13 @@ namespace OpenSim.Framework.Communications.Cache
95 // RestClient rc = new RestClient(_assetServerUrl); 95 // RestClient rc = new RestClient(_assetServerUrl);
96 MainLog.Instance.Verbose("ASSET", "Storing asset"); 96 MainLog.Instance.Verbose("ASSET", "Storing asset");
97 //rc.AddResourcePath("assets"); 97 //rc.AddResourcePath("assets");
98
98 // rc.RequestMethod = "POST"; 99 // rc.RequestMethod = "POST";
99 // rc.Request(s); 100 // rc.Request(s);
100 //MainLog.Instance.Verbose("ASSET", "Stored {0}", rc); 101 //MainLog.Instance.Verbose("ASSET", "Stored {0}", rc);
101 MainLog.Instance.Verbose("ASSET", "Sending to " + _assetServerUrl + "/assets/"); 102 MainLog.Instance.Verbose("ASSET", "Sending to " + _assetServerUrl + "/assets/");
102 RestObjectPoster.BeginPostObject<AssetBase>(_assetServerUrl + "/assets/", asset); 103 RestObjectPoster.BeginPostObject<AssetBase>(_assetServerUrl + "/assets/", asset);
104
103 } 105 }
104 catch (Exception e) 106 catch (Exception e)
105 { 107 {
diff --git a/OpenSim/Framework/Communications/RestClient/RestClient.cs b/OpenSim/Framework/Communications/RestClient/RestClient.cs
index e4da4dc..76bad64 100644
--- a/OpenSim/Framework/Communications/RestClient/RestClient.cs
+++ b/OpenSim/Framework/Communications/RestClient/RestClient.cs
@@ -389,6 +389,7 @@ namespace OpenSim.Framework.Communications
389 dst.Write(buf, 0, length); 389 dst.Write(buf, 0, length);
390 length = src.Read(buf, 0, 1024); 390 length = src.Read(buf, 0, 1024);
391 } 391 }
392
392 _response = (HttpWebResponse) _request.GetResponse(); 393 _response = (HttpWebResponse) _request.GetResponse();
393 394
394// IAsyncResult responseAsyncResult = _request.BeginGetResponse(new AsyncCallback(ResponseIsReadyDelegate), _request); 395// IAsyncResult responseAsyncResult = _request.BeginGetResponse(new AsyncCallback(ResponseIsReadyDelegate), _request);
diff --git a/OpenSim/Framework/Data.MySQL/MySQLDatabaseMapper.cs b/OpenSim/Framework/Data.MySQL/MySQLDatabaseMapper.cs
index 275ce47..5d636bd 100644
--- a/OpenSim/Framework/Data.MySQL/MySQLDatabaseMapper.cs
+++ b/OpenSim/Framework/Data.MySQL/MySQLDatabaseMapper.cs
@@ -1,10 +1,11 @@
1using System.Data.Common; 1using System.Data.Common;
2using MySql.Data.MySqlClient; 2using MySql.Data.MySqlClient;
3// using TribalMedia.Framework.Data; 3 //using TribalMedia.Framework.Data;
4
4 5
5/*
6namespace OpenSim.Framework.Data.MySQL 6namespace OpenSim.Framework.Data.MySQL
7{ 7{
8 /*
8 public class MySQLDatabaseMapper : OpenSimDatabaseConnector 9 public class MySQLDatabaseMapper : OpenSimDatabaseConnector
9 { 10 {
10 public MySQLDatabaseMapper(string connectionString) 11 public MySQLDatabaseMapper(string connectionString)
@@ -22,6 +23,6 @@ namespace OpenSim.Framework.Data.MySQL
22 { 23 {
23 return "?" + fieldName; 24 return "?" + fieldName;
24 } 25 }
25 } 26 }*/
26} 27}
27*/ 28
diff --git a/OpenSim/Framework/Data/OpenSimDataReader.cs b/OpenSim/Framework/Data/OpenSimDataReader.cs
index c7b6470..d113f14 100644
--- a/OpenSim/Framework/Data/OpenSimDataReader.cs
+++ b/OpenSim/Framework/Data/OpenSimDataReader.cs
@@ -4,7 +4,7 @@ using System.Data;
4using System.Text; 4using System.Text;
5using libsecondlife; 5using libsecondlife;
6 6
7/* 7
8using TribalMedia.Framework.Data; 8using TribalMedia.Framework.Data;
9 9
10namespace OpenSim.Framework.Data 10namespace OpenSim.Framework.Data
@@ -39,4 +39,4 @@ namespace OpenSim.Framework.Data
39 } 39 }
40 } 40 }
41} 41}
42*/ 42
diff --git a/OpenSim/Framework/Data/OpenSimDatabaseConnector.cs b/OpenSim/Framework/Data/OpenSimDatabaseConnector.cs
index 155bdc1..aba9329 100644
--- a/OpenSim/Framework/Data/OpenSimDatabaseConnector.cs
+++ b/OpenSim/Framework/Data/OpenSimDatabaseConnector.cs
@@ -1,6 +1,8 @@
1using System.Data; 1using System.Data;
2using System.Data.Common;
2using libsecondlife; 3using libsecondlife;
3/* 4using MySql.Data.MySqlClient;
5
4using TribalMedia.Framework.Data; 6using TribalMedia.Framework.Data;
5 7
6namespace OpenSim.Framework.Data 8namespace OpenSim.Framework.Data
@@ -26,5 +28,25 @@ namespace OpenSim.Framework.Data
26 return new OpenSimDataReader(reader); 28 return new OpenSimDataReader(reader);
27 } 29 }
28 } 30 }
31
32
33 public class MySQLDatabaseMapper : OpenSimDatabaseConnector
34 {
35 public MySQLDatabaseMapper(string connectionString)
36 : base(connectionString)
37 {
38 }
39
40 public override DbConnection GetNewConnection()
41 {
42 MySqlConnection connection = new MySqlConnection(m_connectionString);
43 return connection;
44 }
45
46 public override string CreateParamName(string fieldName)
47 {
48 return "?" + fieldName;
49 }
50 }
29} 51}
30*/ 52
diff --git a/OpenSim/Framework/Data/OpenSimObjectFieldMapper.cs b/OpenSim/Framework/Data/OpenSimObjectFieldMapper.cs
index 8d5b9cf..269f863 100644
--- a/OpenSim/Framework/Data/OpenSimObjectFieldMapper.cs
+++ b/OpenSim/Framework/Data/OpenSimObjectFieldMapper.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
3using System.Data.Common; 3using System.Data.Common;
4using System.Text; 4using System.Text;
5using libsecondlife; 5using libsecondlife;
6/* 6
7using TribalMedia.Framework.Data; 7using TribalMedia.Framework.Data;
8 8
9namespace OpenSim.Framework.Data 9namespace OpenSim.Framework.Data
@@ -73,4 +73,4 @@ namespace OpenSim.Framework.Data
73 } 73 }
74 } 74 }
75} 75}
76*/ 76
diff --git a/OpenSim/Framework/Data/OpenSimTableMapper.cs b/OpenSim/Framework/Data/OpenSimTableMapper.cs
index f596b45..e5deae0 100644
--- a/OpenSim/Framework/Data/OpenSimTableMapper.cs
+++ b/OpenSim/Framework/Data/OpenSimTableMapper.cs
@@ -1,5 +1,5 @@
1using System.Data; 1using System.Data;
2/* 2
3using TribalMedia.Framework.Data; 3using TribalMedia.Framework.Data;
4 4
5namespace OpenSim.Framework.Data 5namespace OpenSim.Framework.Data
@@ -11,4 +11,3 @@ namespace OpenSim.Framework.Data
11 } 11 }
12 } 12 }
13} 13}
14*/
diff --git a/OpenSim/Framework/Data/PrimitiveBaseShapeTableMapper.cs b/OpenSim/Framework/Data/PrimitiveBaseShapeTableMapper.cs
index 227a98e..ec9689a 100644
--- a/OpenSim/Framework/Data/PrimitiveBaseShapeTableMapper.cs
+++ b/OpenSim/Framework/Data/PrimitiveBaseShapeTableMapper.cs
@@ -1,9 +1,9 @@
1using System; 1using System;
2using OpenSim.Framework; 2using OpenSim.Framework;
3//using TribalMedia.Framework.Data; 3using TribalMedia.Framework.Data;
4using libsecondlife; 4using libsecondlife;
5 5
6/* 6
7namespace OpenSim.Framework.Data 7namespace OpenSim.Framework.Data
8{ 8{
9 public class PrimitiveBaseShapeRowMapper : BaseRowMapper<PrimitiveBaseShape> 9 public class PrimitiveBaseShapeRowMapper : BaseRowMapper<PrimitiveBaseShape>
@@ -142,4 +142,4 @@ namespace OpenSim.Framework.Data
142 } 142 }
143 } 143 }
144} 144}
145*/ 145
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
index 2045b56..4c4d315 100644
--- a/OpenSim/Region/Application/Application.cs
+++ b/OpenSim/Region/Application/Application.cs
@@ -58,7 +58,7 @@ namespace OpenSim
58 } 58 }
59 59
60 Console.WriteLine("Starting...\n"); 60 Console.WriteLine("Starting...\n");
61 61
62 Culture.SetCurrentCulture(); 62 Culture.SetCurrentCulture();
63 63
64 ArgvConfigSource configSource = new ArgvConfigSource(args); 64 ArgvConfigSource configSource = new ArgvConfigSource(args);
@@ -75,6 +75,7 @@ namespace OpenSim
75 OpenSimMain sim = new OpenSimMain(configSource); 75 OpenSimMain sim = new OpenSimMain(configSource);
76 76
77 sim.StartUp(); 77 sim.StartUp();
78
78 79
79 while (true) 80 while (true)
80 { 81 {
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index 7f62d4d..167e4c3 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -351,6 +351,7 @@ namespace OpenSim.Region.ClientStack
351 if (m_debug > 0) 351 if (m_debug > 0)
352 { 352 {
353 string info = String.Empty; 353 string info = String.Empty;
354
354 if (m_debug < 255 && packet.Type == PacketType.AgentUpdate) 355 if (m_debug < 255 && packet.Type == PacketType.AgentUpdate)
355 return; 356 return;
356 if (m_debug < 254 && packet.Type == PacketType.ViewerEffect) 357 if (m_debug < 254 && packet.Type == PacketType.ViewerEffect)
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
index 4dce9e7..d6cf7c3 100644
--- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs
+++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
@@ -1,7 +1,7 @@
1/* 1/*
2* Copyright (c) Contributors, http://opensimulator.org/ 2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders. 3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4* 4
5* Redistribution and use in source and binary forms, with or without 5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met: 6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright 7* * Redistributions of source code must retain the above copyright
diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs
index 41d8cac..76ba14b 100644
--- a/OpenSim/Region/Environment/ModuleLoader.cs
+++ b/OpenSim/Region/Environment/ModuleLoader.cs
@@ -135,6 +135,7 @@ namespace OpenSim.Region.Environment
135 m_loadedSharedModules.Add(xmlRpcMod.Name, xmlRpcMod); 135 m_loadedSharedModules.Add(xmlRpcMod.Name, xmlRpcMod);
136 } 136 }
137 //TextureDownloadModule textureModule = new TextureDownloadModule(); 137 //TextureDownloadModule textureModule = new TextureDownloadModule();
138
138 //LoadedSharedModules.Add(textureModule.Name, textureModule); 139 //LoadedSharedModules.Add(textureModule.Name, textureModule);
139 } 140 }
140 141
diff --git a/OpenSim/Region/Environment/Modules/AppearanceTableMapper.cs b/OpenSim/Region/Environment/Modules/AppearanceTableMapper.cs
new file mode 100644
index 0000000..ec82145
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/AppearanceTableMapper.cs
@@ -0,0 +1,216 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.Region.Environment.Scenes;
5using OpenSim.Framework;
6using TribalMedia.Framework.Data;
7
8namespace OpenSim.Region.Environment.Modules
9{
10 public class AppearanceRowMapper : BaseRowMapper<AvatarAppearance>
11 {
12
13 public AppearanceRowMapper(BaseSchema schema, AvatarAppearance obj)
14 : base(schema, obj)
15 {
16 }
17 }
18
19 public class AppearanceTableMapper : BaseTableMapper<AppearanceRowMapper, Guid>
20 {
21 public AppearanceTableMapper(BaseDatabaseConnector database, string tableName)
22 : base(database, tableName)
23 {
24 BaseSchema<AppearanceRowMapper> rowMapperSchema = new BaseSchema<AppearanceRowMapper>(this);
25 m_schema = rowMapperSchema;
26
27 m_keyFieldMapper = rowMapperSchema.AddMapping<Guid>("UUID",
28 delegate(AppearanceRowMapper mapper) { return mapper.Object.ScenePresenceID.UUID; },
29 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.ScenePresenceID = new libsecondlife.LLUUID(value.ToString()); });
30
31 rowMapperSchema.AddMapping<uint>("Serial",
32 delegate(AppearanceRowMapper mapper) { return (uint)mapper.Object.WearablesSerial; },
33 delegate(AppearanceRowMapper mapper, uint value) { mapper.Object.WearablesSerial = (int)value; });
34
35 rowMapperSchema.AddMapping<Guid>("WearableItem0",
36 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[0].ItemID.UUID; },
37 delegate(AppearanceRowMapper mapper, Guid value)
38 {
39 if (mapper.Object.Wearables == null)
40 {
41 mapper.Object.Wearables = new OpenSim.Framework.AvatarWearable[13];
42 for (int i = 0; i < 13; i++)
43 {
44 mapper.Object.Wearables[i] = new AvatarWearable();
45 }
46 }
47 mapper.Object.Wearables[0].ItemID = new libsecondlife.LLUUID(value.ToString());
48 });
49
50 rowMapperSchema.AddMapping<Guid>("WearableAsset0",
51 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[0].AssetID.UUID; },
52 delegate(AppearanceRowMapper mapper, Guid value)
53 { mapper.Object.Wearables[0].AssetID = new libsecondlife.LLUUID(value.ToString()); });
54
55 rowMapperSchema.AddMapping<Guid>("WearableItem1",
56 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[1].ItemID.UUID; },
57 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[1].ItemID = new libsecondlife.LLUUID(value.ToString()); });
58
59 rowMapperSchema.AddMapping<Guid>("WearableAsset1",
60 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[1].AssetID.UUID; },
61 delegate(AppearanceRowMapper mapper, Guid value)
62 { mapper.Object.Wearables[1].AssetID = new libsecondlife.LLUUID(value.ToString()); });
63
64 rowMapperSchema.AddMapping<Guid>("WearableItem2",
65 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[2].ItemID.UUID; },
66 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[2].ItemID = new libsecondlife.LLUUID(value.ToString()); });
67
68 rowMapperSchema.AddMapping<Guid>("WearableAsset2",
69 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[2].AssetID.UUID; },
70 delegate(AppearanceRowMapper mapper, Guid value)
71 { mapper.Object.Wearables[2].AssetID = new libsecondlife.LLUUID(value.ToString()); });
72
73 rowMapperSchema.AddMapping<Guid>("WearableItem3",
74 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[3].ItemID.UUID; },
75 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[3].ItemID = new libsecondlife.LLUUID(value.ToString()); });
76
77 rowMapperSchema.AddMapping<Guid>("WearableAsset3",
78 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[3].AssetID.UUID; },
79 delegate(AppearanceRowMapper mapper, Guid value)
80 { mapper.Object.Wearables[3].AssetID = new libsecondlife.LLUUID(value.ToString()); });
81
82 rowMapperSchema.AddMapping<Guid>("WearableItem4",
83 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[4].ItemID.UUID; },
84 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[4].ItemID = new libsecondlife.LLUUID(value.ToString()); });
85
86 rowMapperSchema.AddMapping<Guid>("WearableAsset4",
87 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[4].AssetID.UUID; },
88 delegate(AppearanceRowMapper mapper, Guid value)
89 { mapper.Object.Wearables[4].AssetID = new libsecondlife.LLUUID(value.ToString()); });
90
91 rowMapperSchema.AddMapping<Guid>("WearableItem5",
92 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[5].ItemID.UUID; },
93 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[5].ItemID = new libsecondlife.LLUUID(value.ToString()); });
94
95 rowMapperSchema.AddMapping<Guid>("WearableAsset5",
96 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[5].AssetID.UUID; },
97 delegate(AppearanceRowMapper mapper, Guid value)
98 { mapper.Object.Wearables[5].AssetID = new libsecondlife.LLUUID(value.ToString()); });
99
100 rowMapperSchema.AddMapping<Guid>("WearableItem6",
101 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[6].ItemID.UUID; },
102 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[6].ItemID = new libsecondlife.LLUUID(value.ToString()); });
103
104 rowMapperSchema.AddMapping<Guid>("WearableAsset6",
105 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[6].AssetID.UUID; },
106 delegate(AppearanceRowMapper mapper, Guid value)
107 { mapper.Object.Wearables[6].AssetID = new libsecondlife.LLUUID(value.ToString()); });
108
109 rowMapperSchema.AddMapping<Guid>("WearableItem7",
110 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[7].ItemID.UUID; },
111 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[7].ItemID = new libsecondlife.LLUUID(value.ToString()); });
112
113 rowMapperSchema.AddMapping<Guid>("WearableAsset7",
114 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[7].AssetID.UUID; },
115 delegate(AppearanceRowMapper mapper, Guid value)
116 { mapper.Object.Wearables[7].AssetID = new libsecondlife.LLUUID(value.ToString()); });
117
118 rowMapperSchema.AddMapping<Guid>("WearableItem8",
119 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[8].ItemID.UUID; },
120 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[8].ItemID = new libsecondlife.LLUUID(value.ToString()); });
121
122 rowMapperSchema.AddMapping<Guid>("WearableAsset8",
123 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[8].AssetID.UUID; },
124 delegate(AppearanceRowMapper mapper, Guid value)
125 { mapper.Object.Wearables[8].AssetID = new libsecondlife.LLUUID(value.ToString()); });
126
127 rowMapperSchema.AddMapping<Guid>("WearableItem9",
128 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[9].ItemID.UUID; },
129 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[9].ItemID = new libsecondlife.LLUUID(value.ToString()); });
130
131 rowMapperSchema.AddMapping<Guid>("WearableAsset9",
132 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[9].AssetID.UUID; },
133 delegate(AppearanceRowMapper mapper, Guid value)
134 { mapper.Object.Wearables[9].AssetID = new libsecondlife.LLUUID(value.ToString()); });
135
136 rowMapperSchema.AddMapping<Guid>("WearableItem10",
137 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[10].ItemID.UUID; },
138 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[10].ItemID = new libsecondlife.LLUUID(value.ToString()); });
139
140 rowMapperSchema.AddMapping<Guid>("WearableAsset10",
141 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[10].AssetID.UUID; },
142 delegate(AppearanceRowMapper mapper, Guid value)
143 { mapper.Object.Wearables[10].AssetID = new libsecondlife.LLUUID(value.ToString()); });
144
145 rowMapperSchema.AddMapping<Guid>("WearableItem11",
146 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[11].ItemID.UUID; },
147 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[11].ItemID = new libsecondlife.LLUUID(value.ToString()); });
148
149 rowMapperSchema.AddMapping<Guid>("WearableAsset11",
150 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[11].AssetID.UUID; },
151 delegate(AppearanceRowMapper mapper, Guid value)
152 { mapper.Object.Wearables[11].AssetID = new libsecondlife.LLUUID(value.ToString()); });
153
154 rowMapperSchema.AddMapping<Guid>("WearableItem12",
155 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[12].ItemID.UUID; },
156 delegate(AppearanceRowMapper mapper, Guid value) { mapper.Object.Wearables[12].ItemID = new libsecondlife.LLUUID(value.ToString()); });
157
158 rowMapperSchema.AddMapping<Guid>("WearableAsset12",
159 delegate(AppearanceRowMapper mapper) { return mapper.Object.Wearables[12].AssetID.UUID; },
160 delegate(AppearanceRowMapper mapper, Guid value)
161 { mapper.Object.Wearables[12].AssetID = new libsecondlife.LLUUID(value.ToString()); });
162
163 }
164
165 public bool Add(Guid userID, AvatarAppearance appearance)
166 {
167 AppearanceRowMapper mapper = CreateRowMapper(appearance);
168 return Add(mapper);
169 }
170
171 public bool Update(Guid userID, AvatarAppearance appearance)
172 {
173 AppearanceRowMapper mapper = CreateRowMapper(appearance);
174 return Update(appearance.ScenePresenceID.UUID, mapper);
175 }
176
177 protected AppearanceRowMapper CreateRowMapper(AvatarAppearance appearance)
178 {
179 return new AppearanceRowMapper(m_schema, appearance);
180 }
181
182 protected AppearanceRowMapper CreateRowMapper()
183 {
184 return CreateRowMapper(new AvatarAppearance());
185 }
186
187 protected AppearanceRowMapper FromReader(BaseDataReader reader, AvatarAppearance appearance)
188 {
189 AppearanceRowMapper mapper = CreateRowMapper(appearance);
190 mapper.FillObject(reader);
191 return mapper;
192 }
193
194 public override AppearanceRowMapper FromReader(BaseDataReader reader)
195 {
196 AppearanceRowMapper mapper = CreateRowMapper();
197 mapper.FillObject(reader);
198 return mapper;
199 }
200
201 public bool TryGetValue(Guid presenceID, out AvatarAppearance val)
202 {
203 AppearanceRowMapper mapper;
204 if (TryGetValue(presenceID, out mapper))
205 {
206 val = mapper.Object;
207 return true;
208 }
209 else
210 {
211 val = null;
212 return false;
213 }
214 }
215 }
216}
diff --git a/OpenSim/Region/Environment/Modules/AvatarFactoryModule.cs b/OpenSim/Region/Environment/Modules/AvatarFactoryModule.cs
index 4dd1cb1..19ebdb8 100644
--- a/OpenSim/Region/Environment/Modules/AvatarFactoryModule.cs
+++ b/OpenSim/Region/Environment/Modules/AvatarFactoryModule.cs
@@ -35,6 +35,8 @@ using OpenSim.Framework.Communications.Cache;
35using OpenSim.Framework.Console; 35using OpenSim.Framework.Console;
36using OpenSim.Region.Environment.Interfaces; 36using OpenSim.Region.Environment.Interfaces;
37using OpenSim.Region.Environment.Scenes; 37using OpenSim.Region.Environment.Scenes;
38using OpenSim.Framework.Data;
39using TribalMedia.Framework.Data;
38 40
39namespace OpenSim.Region.Environment.Modules 41namespace OpenSim.Region.Environment.Modules
40{ 42{
@@ -43,6 +45,12 @@ namespace OpenSim.Region.Environment.Modules
43 private Scene m_scene = null; 45 private Scene m_scene = null;
44 private readonly Dictionary<LLUUID, AvatarAppearance> m_avatarsAppearance = new Dictionary<LLUUID, AvatarAppearance>(); 46 private readonly Dictionary<LLUUID, AvatarAppearance> m_avatarsAppearance = new Dictionary<LLUUID, AvatarAppearance>();
45 47
48 private bool m_enablePersist = false;
49 private string m_connectionString;
50 private bool m_configured = false;
51 private BaseDatabaseConnector m_databaseMapper;
52 private AppearanceTableMapper m_appearanceMapper;
53
46 public bool TryGetAvatarAppearance(LLUUID avatarId, out AvatarAppearance appearance) 54 public bool TryGetAvatarAppearance(LLUUID avatarId, out AvatarAppearance appearance)
47 { 55 {
48 if (m_avatarsAppearance.ContainsKey(avatarId)) 56 if (m_avatarsAppearance.ContainsKey(avatarId))
@@ -50,22 +58,31 @@ namespace OpenSim.Region.Environment.Modules
50 appearance = m_avatarsAppearance[avatarId]; 58 appearance = m_avatarsAppearance[avatarId];
51 return true; 59 return true;
52 } 60 }
53 else 61
62 if (m_enablePersist)
54 { 63 {
55 AvatarWearable[] wearables; 64 if (m_appearanceMapper.TryGetValue(avatarId.UUID, out appearance))
56 byte[] visualParams;
57 GetDefaultAvatarAppearance(out wearables, out visualParams);
58 appearance = new AvatarAppearance(avatarId, wearables, visualParams);
59 try
60 { 65 {
66 appearance.VisualParams = GetDefaultVisualParams();
67 appearance.TextureEntry = AvatarAppearance.GetDefaultTextureEntry();
61 m_avatarsAppearance[avatarId] = appearance; 68 m_avatarsAppearance[avatarId] = appearance;
69 return true;
62 } 70 }
63 catch (NullReferenceException)
64 {
65 MainLog.Instance.Error("AVATAR", "Unable to load appearance for uninitialized avatar");
66 }
67 return true;
68 } 71 }
72
73
74 //not found a appearance for user, so create a new one
75 AvatarWearable[] wearables;
76 byte[] visualParams;
77 GetDefaultAvatarAppearance(out wearables, out visualParams);
78 appearance = new AvatarAppearance(avatarId, wearables, visualParams);
79
80 m_avatarsAppearance[avatarId] = appearance;
81 if (m_enablePersist)
82 {
83 m_appearanceMapper.Add(avatarId.UUID, appearance);
84 }
85 return true;
69 } 86 }
70 87
71 public void Initialise(Scene scene, IConfigSource source) 88 public void Initialise(Scene scene, IConfigSource source)
@@ -77,6 +94,24 @@ namespace OpenSim.Region.Environment.Modules
77 { 94 {
78 m_scene = scene; 95 m_scene = scene;
79 } 96 }
97
98 if (!m_configured)
99 {
100 m_configured = true;
101 try
102 {
103 m_enablePersist = source.Configs["Appearance"].GetBoolean("persist", false);
104 m_connectionString = source.Configs["Appearance"].GetString("connection_string", "");
105 }
106 catch (Exception)
107 {
108 }
109 if (m_enablePersist)
110 {
111 m_databaseMapper = new MySQLDatabaseMapper(m_connectionString);
112 m_appearanceMapper = new AppearanceTableMapper(m_databaseMapper, "AvatarAppearance");
113 }
114 }
80 } 115 }
81 116
82 public void PostInitialise() 117 public void PostInitialise()
@@ -109,7 +144,7 @@ namespace OpenSim.Region.Environment.Modules
109 144
110 public void AvatarIsWearing(Object sender, AvatarWearingArgs e) 145 public void AvatarIsWearing(Object sender, AvatarWearingArgs e)
111 { 146 {
112 IClientAPI clientView = (IClientAPI) sender; 147 IClientAPI clientView = (IClientAPI)sender;
113 CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(clientView.AgentId); 148 CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(clientView.AgentId);
114 if (profile != null) 149 if (profile != null)
115 { 150 {
@@ -134,6 +169,11 @@ namespace OpenSim.Region.Environment.Modules
134 AvatarAppearance avatAppearance = m_avatarsAppearance[clientView.AgentId]; 169 AvatarAppearance avatAppearance = m_avatarsAppearance[clientView.AgentId];
135 avatAppearance.Wearables[wear.Type].AssetID = assetId; 170 avatAppearance.Wearables[wear.Type].AssetID = assetId;
136 avatAppearance.Wearables[wear.Type].ItemID = wear.ItemID; 171 avatAppearance.Wearables[wear.Type].ItemID = wear.ItemID;
172
173 if (m_enablePersist)
174 {
175 m_appearanceMapper.Update(clientView.AgentId.UUID, avatAppearance);
176 }
137 } 177 }
138 } 178 }
139 } 179 }
diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs
index 9640ed7..6c49586 100644
--- a/OpenSim/Region/Environment/PermissionManager.cs
+++ b/OpenSim/Region/Environment/PermissionManager.cs
@@ -170,31 +170,9 @@ namespace OpenSim.Region.Environment
170 // the administrator object permissions to take effect. 170 // the administrator object permissions to take effect.
171 LLUUID objectOwner = task.OwnerID; 171 LLUUID objectOwner = task.OwnerID;
172 172
173 //return task.RootPart.ObjectFlags;task.RootPart.ObjectFlags |
174
175 uint objectOwnerMask = task.RootPart.ObjectFlags; 173 uint objectOwnerMask = task.RootPart.ObjectFlags;
174 objectOwnerMask = ApplyObjectModifyMasks(task.RootPart.OwnerMask, objectOwnerMask);
176 175
177 if((task.RootPart.OwnerMask & (uint)PermissionMask.Copy) != 0)
178 {
179 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectCopy;
180 }
181
182 if ((task.RootPart.OwnerMask & (uint) PermissionMask.Move) != 0)
183 {
184 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectMove;
185 }
186
187 if ((task.RootPart.OwnerMask & (uint) PermissionMask.Modify) != 0)
188 {
189 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectModify;
190 }
191
192 if ((task.RootPart.OwnerMask & (uint) PermissionMask.Transfer) != 0)
193 {
194 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectTransfer;
195 }
196
197 uint objectGroupMask = task.RootPart.ObjectFlags | task.RootPart.GroupMask;
198 uint objectEveryoneMask = task.RootPart.ObjectFlags | task.RootPart.EveryoneMask; 176 uint objectEveryoneMask = task.RootPart.ObjectFlags | task.RootPart.EveryoneMask;
199 177
200 if (m_bypassPermissions) 178 if (m_bypassPermissions)
@@ -240,6 +218,31 @@ namespace OpenSim.Region.Environment
240 return objectEveryoneMask; 218 return objectEveryoneMask;
241 } 219 }
242 220
221
222 private uint ApplyObjectModifyMasks(uint parentMask, uint objectOwnerMask)
223 {
224 if ((parentMask & (uint)PermissionMask.Copy) != 0)
225 {
226 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectCopy;
227 }
228
229 if ((parentMask & (uint)PermissionMask.Move) != 0)
230 {
231 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectMove;
232 }
233
234 if ((parentMask & (uint)PermissionMask.Modify) != 0)
235 {
236 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectModify;
237 }
238
239 if ((parentMask & (uint)PermissionMask.Transfer) != 0)
240 {
241 objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectTransfer;
242 }
243 return objectOwnerMask;
244 }
245
243 protected virtual bool GenericObjectPermission(LLUUID currentUser, LLUUID objId) 246 protected virtual bool GenericObjectPermission(LLUUID currentUser, LLUUID objId)
244 { 247 {
245 // Default: deny 248 // Default: deny
diff --git a/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs b/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs
index 1583124..b54f777 100644
--- a/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs
+++ b/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs
@@ -35,8 +35,20 @@ namespace OpenSim.Region.Environment.Scenes
35 public class AvatarAppearance 35 public class AvatarAppearance
36 { 36 {
37 protected LLUUID m_scenePresenceID; 37 protected LLUUID m_scenePresenceID;
38
39 public LLUUID ScenePresenceID
40 {
41 get { return m_scenePresenceID; }
42 set { m_scenePresenceID = value; }
43 }
38 protected int m_wearablesSerial = 1; 44 protected int m_wearablesSerial = 1;
39 45
46 public int WearablesSerial
47 {
48 get { return m_wearablesSerial; }
49 set { m_wearablesSerial = value; }
50 }
51
40 protected byte[] m_visualParams; 52 protected byte[] m_visualParams;
41 53
42 public byte[] VisualParams 54 public byte[] VisualParams
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 043b094..159eaf1 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -72,6 +72,7 @@ namespace OpenSim.Region.Environment.Scenes
72 72
73 public partial class SceneObjectPart : IScriptHost 73 public partial class SceneObjectPart : IScriptHost
74 { 74 {
75
75 [XmlIgnore] public PhysicsActor PhysActor = null; 76 [XmlIgnore] public PhysicsActor PhysActor = null;
76 77
77 public LLUUID LastOwnerID; 78 public LLUUID LastOwnerID;
@@ -764,11 +765,13 @@ namespace OpenSim.Region.Environment.Scenes
764 765
765 public void TrimPermissions() 766 public void TrimPermissions()
766 { 767 {
768
767 BaseMask &= (uint)PermissionMask.All; 769 BaseMask &= (uint)PermissionMask.All;
768 OwnerMask &= (uint)PermissionMask.All; 770 OwnerMask &= (uint)PermissionMask.All;
769 GroupMask &= (uint)PermissionMask.All; 771 GroupMask &= (uint)PermissionMask.All;
770 EveryoneMask &= (uint)PermissionMask.All; 772 EveryoneMask &= (uint)PermissionMask.All;
771 NextOwnerMask &= (uint)PermissionMask.All; 773 NextOwnerMask &= (uint)PermissionMask.All;
774
772 } 775 }
773 776
774 /// <summary> 777 /// <summary>
diff --git a/ThirdParty/TribalMedia/TribalMedia.Framework.Data/BaseDatabaseConnector.cs b/ThirdParty/TribalMedia/TribalMedia.Framework.Data/BaseDatabaseConnector.cs
index e5d4d62..45ca650 100644
--- a/ThirdParty/TribalMedia/TribalMedia.Framework.Data/BaseDatabaseConnector.cs
+++ b/ThirdParty/TribalMedia/TribalMedia.Framework.Data/BaseDatabaseConnector.cs
@@ -138,4 +138,5 @@ namespace TribalMedia.Framework.Data
138 138
139 public abstract BaseDataReader CreateReader(IDataReader reader); 139 public abstract BaseDataReader CreateReader(IDataReader reader);
140 } 140 }
141
141} \ No newline at end of file 142} \ No newline at end of file
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 3bcbdd2..366978d 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -241,3 +241,7 @@ CompileWithDebugInformation=true
241CleanUpOldScriptsOnStartup=true 241CleanUpOldScriptsOnStartup=true
242 242
243 243
244[Appearance]
245persist = false
246connection_string = "Data Source=localhost;Database=avatar_appearance;User ID=root;Password=xxxx;pooling=false;"
247
diff --git a/prebuild.xml b/prebuild.xml
index 6e64ce4..567715b 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -141,6 +141,7 @@
141 <Reference name="XMLRPC.dll"/> 141 <Reference name="XMLRPC.dll"/>
142 <Reference name="libsecondlife.dll"/> 142 <Reference name="libsecondlife.dll"/>
143 <Reference name="OpenSim.Framework"/> 143 <Reference name="OpenSim.Framework"/>
144 <Reference name="MySql.Data.dll"/>
144 <Reference name="TribalMedia.Framework.Data"/> 145 <Reference name="TribalMedia.Framework.Data"/>
145 <Files> 146 <Files>
146 <Match pattern="*.cs" recurse="true"/> 147 <Match pattern="*.cs" recurse="true"/>
@@ -651,6 +652,7 @@
651 <Reference name="Microsoft.JScript"/> 652 <Reference name="Microsoft.JScript"/>
652 <Reference name="XMLRPC.dll"/> 653 <Reference name="XMLRPC.dll"/>
653 <Reference name="OpenSim.Framework.Communications"/> 654 <Reference name="OpenSim.Framework.Communications"/>
655 <Reference name="TribalMedia.Framework.Data"/>
654 <Reference name="Nini.dll" /> 656 <Reference name="Nini.dll" />
655 <Files> 657 <Files>
656 <Match pattern="*.cs" recurse="true"/> 658 <Match pattern="*.cs" recurse="true"/>
diff --git a/share/sql/mysql-AvatarAppearance.sql b/share/sql/mysql-AvatarAppearance.sql
new file mode 100644
index 0000000..d9d3de0
--- /dev/null
+++ b/share/sql/mysql-AvatarAppearance.sql
@@ -0,0 +1,42 @@
1--
2-- Create schema avatar_appearance
3--
4
5CREATE DATABASE IF NOT EXISTS avatar_appearance;
6USE avatar_appearance;
7
8DROP TABLE IF EXISTS `avatarappearance`;
9CREATE TABLE `avatarappearance` (
10 `UUID` char(36) NOT NULL,
11 `Serial` int(10) unsigned NOT NULL,
12 `WearableItem0` char(36) NOT NULL,
13 `WearableAsset0` char(36) NOT NULL,
14 `WearableItem1` char(36) NOT NULL,
15 `WearableAsset1` char(36) NOT NULL,
16 `WearableItem2` char(36) NOT NULL,
17 `WearableAsset2` char(36) NOT NULL,
18 `WearableItem3` char(36) NOT NULL,
19 `WearableAsset3` char(36) NOT NULL,
20 `WearableItem4` char(36) NOT NULL,
21 `WearableAsset4` char(36) NOT NULL,
22 `WearableItem5` char(36) NOT NULL,
23 `WearableAsset5` char(36) NOT NULL,
24 `WearableItem6` char(36) NOT NULL,
25 `WearableAsset6` char(36) NOT NULL,
26 `WearableItem7` char(36) NOT NULL,
27 `WearableAsset7` char(36) NOT NULL,
28 `WearableItem8` char(36) NOT NULL,
29 `WearableAsset8` char(36) NOT NULL,
30 `WearableItem9` char(36) NOT NULL,
31 `WearableAsset9` char(36) NOT NULL,
32 `WearableItem10` char(36) NOT NULL,
33 `WearableAsset10` char(36) NOT NULL,
34 `WearableItem11` char(36) NOT NULL,
35 `WearableAsset11` char(36) NOT NULL,
36 `WearableItem12` char(36) NOT NULL,
37 `WearableAsset12` char(36) NOT NULL,
38
39
40 PRIMARY KEY (`UUID`)
41) ENGINE=InnoDB DEFAULT CHARSET=utf8;
42