diff options
author | John Hurliman | 2010-04-22 18:56:06 -0700 |
---|---|---|
committer | John Hurliman | 2010-04-22 18:56:06 -0700 |
commit | 8692ac53f56c8db9942021709e7415b2b2add0c6 (patch) | |
tree | 5681611d23f8f89b38d2c19ef032d412fd3fe3d2 /OpenSim | |
parent | * Better error logging for failed SimianGrid web service calls (diff) | |
parent | Insert a ROLLBACK command on migration step failure. This ensures that (diff) | |
download | opensim-SC-8692ac53f56c8db9942021709e7415b2b2add0c6.zip opensim-SC-8692ac53f56c8db9942021709e7415b2b2add0c6.tar.gz opensim-SC-8692ac53f56c8db9942021709e7415b2b2add0c6.tar.bz2 opensim-SC-8692ac53f56c8db9942021709e7415b2b2add0c6.tar.xz |
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim')
36 files changed, 455 insertions, 188 deletions
diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs index 6ee5995..906ba6c 100644 --- a/OpenSim/Data/IUserAccountData.cs +++ b/OpenSim/Data/IUserAccountData.cs | |||
@@ -48,6 +48,7 @@ namespace OpenSim.Data | |||
48 | { | 48 | { |
49 | UserAccountData[] Get(string[] fields, string[] values); | 49 | UserAccountData[] Get(string[] fields, string[] values); |
50 | bool Store(UserAccountData data); | 50 | bool Store(UserAccountData data); |
51 | bool Delete(string field, string val); | ||
51 | UserAccountData[] GetUsers(UUID scopeID, string query); | 52 | UserAccountData[] GetUsers(UUID scopeID, string query); |
52 | } | 53 | } |
53 | } | 54 | } |
diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 4622e23..68e25ef 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs | |||
@@ -146,6 +146,8 @@ namespace OpenSim.Data | |||
146 | { | 146 | { |
147 | m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", cmd.CommandText); | 147 | m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", cmd.CommandText); |
148 | m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing.", e.Message); | 148 | m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing.", e.Message); |
149 | cmd.CommandText = "ROLLBACK;"; | ||
150 | cmd.ExecuteNonQuery(); | ||
149 | } | 151 | } |
150 | 152 | ||
151 | if (version == 0) | 153 | if (version == 0) |
diff --git a/OpenSim/Data/Null/NullUserAccountData.cs b/OpenSim/Data/Null/NullUserAccountData.cs index fc2c5d5..9eb94e6 100644 --- a/OpenSim/Data/Null/NullUserAccountData.cs +++ b/OpenSim/Data/Null/NullUserAccountData.cs | |||
@@ -135,5 +135,26 @@ namespace OpenSim.Data.Null | |||
135 | return result; | 135 | return result; |
136 | } | 136 | } |
137 | 137 | ||
138 | public bool Delete(string field, string val) | ||
139 | { | ||
140 | // Only delete by PrincipalID | ||
141 | if (field.Equals("PrincipalID")) | ||
142 | { | ||
143 | UUID uuid = UUID.Zero; | ||
144 | if (UUID.TryParse(val, out uuid) && m_DataByUUID.ContainsKey(uuid)) | ||
145 | { | ||
146 | UserAccountData account = m_DataByUUID[uuid]; | ||
147 | m_DataByUUID.Remove(uuid); | ||
148 | if (m_DataByName.ContainsKey(account.FirstName + " " + account.LastName)) | ||
149 | m_DataByName.Remove(account.FirstName + " " + account.LastName); | ||
150 | if (account.Data.ContainsKey("Email") && account.Data["Email"] != string.Empty && m_DataByEmail.ContainsKey(account.Data["Email"])) | ||
151 | m_DataByEmail.Remove(account.Data["Email"]); | ||
152 | |||
153 | return true; | ||
154 | } | ||
155 | } | ||
156 | |||
157 | return false; | ||
158 | } | ||
138 | } | 159 | } |
139 | } | 160 | } |
diff --git a/OpenSim/Data/SQLite/Resources/001_UserAccount.sql b/OpenSim/Data/SQLite/Resources/001_UserAccount.sql index f9bf24c..c38d9a7 100644 --- a/OpenSim/Data/SQLite/Resources/001_UserAccount.sql +++ b/OpenSim/Data/SQLite/Resources/001_UserAccount.sql | |||
@@ -2,7 +2,7 @@ | |||
2 | 2 | ||
3 | -- useraccounts table | 3 | -- useraccounts table |
4 | CREATE TABLE UserAccounts ( | 4 | CREATE TABLE UserAccounts ( |
5 | PrincipalID CHAR(36) NOT NULL, | 5 | PrincipalID CHAR(36) primary key, |
6 | ScopeID CHAR(36) NOT NULL, | 6 | ScopeID CHAR(36) NOT NULL, |
7 | FirstName VARCHAR(64) NOT NULL, | 7 | FirstName VARCHAR(64) NOT NULL, |
8 | LastName VARCHAR(64) NOT NULL, | 8 | LastName VARCHAR(64) NOT NULL, |
diff --git a/OpenSim/Data/SQLite/SQLiteAuthenticationData.cs b/OpenSim/Data/SQLite/SQLiteAuthenticationData.cs index 2c28375..aa10734 100644 --- a/OpenSim/Data/SQLite/SQLiteAuthenticationData.cs +++ b/OpenSim/Data/SQLite/SQLiteAuthenticationData.cs | |||
@@ -235,7 +235,7 @@ namespace OpenSim.Data.SQLite | |||
235 | if (System.Environment.TickCount - m_LastExpire > 30000) | 235 | if (System.Environment.TickCount - m_LastExpire > 30000) |
236 | DoExpire(); | 236 | DoExpire(); |
237 | 237 | ||
238 | SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now, 'localtime', '+" + lifetime.ToString() + | 238 | SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now', 'localtime', '+" + lifetime.ToString() + |
239 | " minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')"); | 239 | " minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')"); |
240 | 240 | ||
241 | if (ExecuteNonQuery(cmd, m_Connection) > 0) | 241 | if (ExecuteNonQuery(cmd, m_Connection) > 0) |
diff --git a/OpenSim/Data/SQLite/SQLiteUserAccountData.cs b/OpenSim/Data/SQLite/SQLiteUserAccountData.cs index 50e8c23..67cf716 100644 --- a/OpenSim/Data/SQLite/SQLiteUserAccountData.cs +++ b/OpenSim/Data/SQLite/SQLiteUserAccountData.cs | |||
@@ -66,7 +66,7 @@ namespace OpenSim.Data.SQLite | |||
66 | 66 | ||
67 | if (words.Length == 1) | 67 | if (words.Length == 1) |
68 | { | 68 | { |
69 | cmd.CommandText = String.Format("select * from {0} where ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')", | 69 | cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')", |
70 | m_Realm, scopeID.ToString(), words[0]); | 70 | m_Realm, scopeID.ToString(), words[0]); |
71 | } | 71 | } |
72 | else | 72 | else |
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index be936b6..a3036d0 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs | |||
@@ -38,7 +38,7 @@ namespace OpenSim.Framework.Console | |||
38 | { | 38 | { |
39 | /// <summary> | 39 | /// <summary> |
40 | /// A console that uses cursor control and color | 40 | /// A console that uses cursor control and color |
41 | /// </summary> | 41 | /// </summary> |
42 | public class LocalConsole : CommandConsole | 42 | public class LocalConsole : CommandConsole |
43 | { | 43 | { |
44 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -100,24 +100,40 @@ namespace OpenSim.Framework.Console | |||
100 | private int SetCursorTop(int top) | 100 | private int SetCursorTop(int top) |
101 | { | 101 | { |
102 | // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try | 102 | // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try |
103 | // to set a cursor row position with a currently invalid column, mono will throw an exception. | 103 | // to set a cursor row position with a currently invalid column, mono will throw an exception. |
104 | // Therefore, we need to make sure that the column position is valid first. | 104 | // Therefore, we need to make sure that the column position is valid first. |
105 | int left = System.Console.CursorLeft; | 105 | int left = System.Console.CursorLeft; |
106 | 106 | ||
107 | if (left < 0) | 107 | if (left < 0) |
108 | { | ||
108 | System.Console.CursorLeft = 0; | 109 | System.Console.CursorLeft = 0; |
109 | else if (left >= System.Console.BufferWidth) | 110 | } |
110 | System.Console.CursorLeft = System.Console.BufferWidth - 1; | 111 | else |
112 | { | ||
113 | int bw = System.Console.BufferWidth; | ||
114 | |||
115 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | ||
116 | if (bw > 0 && left >= bw) | ||
117 | System.Console.CursorLeft = bw - 1; | ||
118 | } | ||
111 | 119 | ||
112 | if (top < 0) | 120 | if (top < 0) |
121 | { | ||
113 | top = 0; | 122 | top = 0; |
114 | if (top >= System.Console.BufferHeight) | 123 | } |
115 | top = System.Console.BufferHeight - 1; | 124 | else |
125 | { | ||
126 | int bh = System.Console.BufferHeight; | ||
127 | |||
128 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | ||
129 | if (bh > 0 && top >= bh) | ||
130 | top = bh - 1; | ||
131 | } | ||
116 | 132 | ||
117 | System.Console.CursorTop = top; | 133 | System.Console.CursorTop = top; |
118 | 134 | ||
119 | return top; | 135 | return top; |
120 | } | 136 | } |
121 | 137 | ||
122 | /// <summary> | 138 | /// <summary> |
123 | /// Set the cursor column. | 139 | /// Set the cursor column. |
@@ -129,23 +145,38 @@ namespace OpenSim.Framework.Console | |||
129 | /// </param> | 145 | /// </param> |
130 | /// <returns> | 146 | /// <returns> |
131 | /// The new cursor column. | 147 | /// The new cursor column. |
132 | /// </returns> | 148 | /// </returns> |
133 | private int SetCursorLeft(int left) | 149 | private int SetCursorLeft(int left) |
134 | { | 150 | { |
135 | // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try | 151 | // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try |
136 | // to set a cursor column position with a currently invalid row, mono will throw an exception. | 152 | // to set a cursor column position with a currently invalid row, mono will throw an exception. |
137 | // Therefore, we need to make sure that the row position is valid first. | 153 | // Therefore, we need to make sure that the row position is valid first. |
138 | int top = System.Console.CursorTop; | 154 | int top = System.Console.CursorTop; |
139 | 155 | ||
140 | if (top < 0) | 156 | if (top < 0) |
157 | { | ||
141 | System.Console.CursorTop = 0; | 158 | System.Console.CursorTop = 0; |
142 | else if (top >= System.Console.BufferHeight) | 159 | } |
143 | System.Console.CursorTop = System.Console.BufferHeight - 1; | 160 | else |
161 | { | ||
162 | int bh = System.Console.BufferHeight; | ||
163 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | ||
164 | if (bh > 0 && top >= bh) | ||
165 | System.Console.CursorTop = bh - 1; | ||
166 | } | ||
144 | 167 | ||
145 | if (left < 0) | 168 | if (left < 0) |
169 | { | ||
146 | left = 0; | 170 | left = 0; |
147 | if (left >= System.Console.BufferWidth) | 171 | } |
148 | left = System.Console.BufferWidth - 1; | 172 | else |
173 | { | ||
174 | int bw = System.Console.BufferWidth; | ||
175 | |||
176 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | ||
177 | if (bw > 0 && left >= bw) | ||
178 | left = bw - 1; | ||
179 | } | ||
149 | 180 | ||
150 | System.Console.CursorLeft = left; | 181 | System.Console.CursorLeft = left; |
151 | 182 | ||
@@ -183,7 +214,7 @@ namespace OpenSim.Framework.Console | |||
183 | System.Console.Write("{0}", prompt); | 214 | System.Console.Write("{0}", prompt); |
184 | 215 | ||
185 | SetCursorTop(new_y); | 216 | SetCursorTop(new_y); |
186 | SetCursorLeft(new_x); | 217 | SetCursorLeft(new_x); |
187 | } | 218 | } |
188 | } | 219 | } |
189 | 220 | ||
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 64f6118..802cb37 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -1486,4 +1486,4 @@ namespace OpenSim.Framework | |||
1486 | } | 1486 | } |
1487 | 1487 | ||
1488 | } | 1488 | } |
1489 | } | 1489 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 38b2084..1395030 100755..100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -251,8 +251,9 @@ namespace OpenSim | |||
251 | "Save named prim to XML2", SavePrimsXml2); | 251 | "Save named prim to XML2", SavePrimsXml2); |
252 | 252 | ||
253 | m_console.Commands.AddCommand("region", false, "load oar", | 253 | m_console.Commands.AddCommand("region", false, "load oar", |
254 | "load oar [--merge] <oar name>", | 254 | "load oar [--merge] [--skip-assets] <oar name>", |
255 | "Load a region's data from OAR archive", LoadOar); | 255 | "Load a region's data from OAR archive. --merge will merge the oar with the existing scene. --skip-assets will load the oar but ignore the assets it contains", |
256 | LoadOar); | ||
256 | 257 | ||
257 | m_console.Commands.AddCommand("region", false, "save oar", | 258 | m_console.Commands.AddCommand("region", false, "save oar", |
258 | "save oar <oar name>", | 259 | "save oar <oar name>", |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index b3f5f09..d7120a5 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -7091,32 +7091,90 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7091 | taskID = new UUID(transfer.TransferInfo.Params, 48); | 7091 | taskID = new UUID(transfer.TransferInfo.Params, 48); |
7092 | UUID itemID = new UUID(transfer.TransferInfo.Params, 64); | 7092 | UUID itemID = new UUID(transfer.TransferInfo.Params, 64); |
7093 | UUID requestID = new UUID(transfer.TransferInfo.Params, 80); | 7093 | UUID requestID = new UUID(transfer.TransferInfo.Params, 80); |
7094 | |||
7095 | // m_log.DebugFormat( | ||
7096 | // "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}", | ||
7097 | // requestID, itemID, taskID, Name); | ||
7098 | |||
7094 | if (!(((Scene)m_scene).Permissions.BypassPermissions())) | 7099 | if (!(((Scene)m_scene).Permissions.BypassPermissions())) |
7095 | { | 7100 | { |
7096 | if (taskID != UUID.Zero) // Prim | 7101 | if (taskID != UUID.Zero) // Prim |
7097 | { | 7102 | { |
7098 | SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); | 7103 | SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); |
7104 | |||
7099 | if (part == null) | 7105 | if (part == null) |
7106 | { | ||
7107 | m_log.WarnFormat( | ||
7108 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist", | ||
7109 | Name, requestID, itemID, taskID); | ||
7100 | return true; | 7110 | return true; |
7111 | } | ||
7101 | 7112 | ||
7102 | if (part.OwnerID != AgentId) | 7113 | TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID); |
7103 | return true; | 7114 | if (tii == null) |
7104 | 7115 | { | |
7105 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | 7116 | m_log.WarnFormat( |
7106 | return true; | 7117 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist", |
7107 | 7118 | Name, requestID, itemID, taskID); | |
7108 | TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID); | ||
7109 | if (ti == null) | ||
7110 | return true; | ||
7111 | |||
7112 | if (ti.OwnerID != AgentId) | ||
7113 | return true; | ||
7114 | |||
7115 | if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) | ||
7116 | return true; | ||
7117 | |||
7118 | if (ti.AssetID != requestID) | ||
7119 | return true; | 7119 | return true; |
7120 | } | ||
7121 | |||
7122 | if (tii.Type == (int)AssetType.LSLText) | ||
7123 | { | ||
7124 | if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId)) | ||
7125 | return true; | ||
7126 | } | ||
7127 | else if (tii.Type == (int)AssetType.Notecard) | ||
7128 | { | ||
7129 | if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId)) | ||
7130 | return true; | ||
7131 | } | ||
7132 | else | ||
7133 | { | ||
7134 | // TODO: Change this code to allow items other than notecards and scripts to be successfully | ||
7135 | // shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule | ||
7136 | if (part.OwnerID != AgentId) | ||
7137 | { | ||
7138 | m_log.WarnFormat( | ||
7139 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}", | ||
7140 | Name, requestID, itemID, taskID, part.OwnerID); | ||
7141 | return true; | ||
7142 | } | ||
7143 | |||
7144 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | ||
7145 | { | ||
7146 | m_log.WarnFormat( | ||
7147 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set", | ||
7148 | Name, requestID, itemID, taskID); | ||
7149 | return true; | ||
7150 | } | ||
7151 | |||
7152 | if (tii.OwnerID != AgentId) | ||
7153 | { | ||
7154 | m_log.WarnFormat( | ||
7155 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}", | ||
7156 | Name, requestID, itemID, taskID, tii.OwnerID); | ||
7157 | return true; | ||
7158 | } | ||
7159 | |||
7160 | if (( | ||
7161 | tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) | ||
7162 | != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) | ||
7163 | { | ||
7164 | m_log.WarnFormat( | ||
7165 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer", | ||
7166 | Name, requestID, itemID, taskID); | ||
7167 | return true; | ||
7168 | } | ||
7169 | |||
7170 | if (tii.AssetID != requestID) | ||
7171 | { | ||
7172 | m_log.WarnFormat( | ||
7173 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}", | ||
7174 | Name, requestID, itemID, taskID, tii.AssetID); | ||
7175 | return true; | ||
7176 | } | ||
7177 | } | ||
7120 | } | 7178 | } |
7121 | else // Agent | 7179 | else // Agent |
7122 | { | 7180 | { |
@@ -7136,7 +7194,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7136 | // only to notecards and scripts. All | 7194 | // only to notecards and scripts. All |
7137 | // other asset types are always available | 7195 | // other asset types are always available |
7138 | // | 7196 | // |
7139 | if (assetRequestItem.AssetType == 10) | 7197 | if (assetRequestItem.AssetType == (int)AssetType.LSLText) |
7140 | { | 7198 | { |
7141 | if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId)) | 7199 | if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId)) |
7142 | { | 7200 | { |
@@ -7144,7 +7202,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7144 | return true; | 7202 | return true; |
7145 | } | 7203 | } |
7146 | } | 7204 | } |
7147 | else if (assetRequestItem.AssetType == 7) | 7205 | else if (assetRequestItem.AssetType == (int)AssetType.Notecard) |
7148 | { | 7206 | { |
7149 | if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId)) | 7207 | if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId)) |
7150 | { | 7208 | { |
@@ -7154,7 +7212,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7154 | } | 7212 | } |
7155 | 7213 | ||
7156 | if (assetRequestItem.AssetID != requestID) | 7214 | if (assetRequestItem.AssetID != requestID) |
7215 | { | ||
7216 | m_log.WarnFormat( | ||
7217 | "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", | ||
7218 | Name, requestID, itemID, assetRequestItem.AssetID); | ||
7157 | return true; | 7219 | return true; |
7220 | } | ||
7158 | } | 7221 | } |
7159 | } | 7222 | } |
7160 | } | 7223 | } |
@@ -11389,7 +11452,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11389 | // } | 11452 | // } |
11390 | } | 11453 | } |
11391 | 11454 | ||
11392 | //m_log.DebugFormat("[LLCLIENTVIEW]: {0} requesting asset {1}", Name, requestID); | 11455 | // m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID); |
11393 | 11456 | ||
11394 | m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); | 11457 | m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); |
11395 | } | 11458 | } |
@@ -11757,4 +11820,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11757 | OutPacket(dialog, ThrottleOutPacketType.Task); | 11820 | OutPacket(dialog, ThrottleOutPacketType.Task); |
11758 | } | 11821 | } |
11759 | } | 11822 | } |
11760 | } | 11823 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 012d581..d30e954 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs | |||
@@ -181,7 +181,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
181 | Manager.MyScene.AssetService.Store(asset); | 181 | Manager.MyScene.AssetService.Store(asset); |
182 | 182 | ||
183 | if (part.Inventory.UpdateInventoryItem(item)) | 183 | if (part.Inventory.UpdateInventoryItem(item)) |
184 | { | ||
185 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | ||
184 | part.GetProperties(remoteClient); | 186 | part.GetProperties(remoteClient); |
187 | } | ||
185 | } | 188 | } |
186 | } | 189 | } |
187 | } | 190 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 23828ef..f050dcf 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -30,6 +30,7 @@ using System.Reflection; | |||
30 | using log4net; | 30 | using log4net; |
31 | using Nini.Config; | 31 | using Nini.Config; |
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenMetaverse.Packets; | ||
33 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
34 | using OpenSim.Region.Framework; | 35 | using OpenSim.Region.Framework; |
35 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
@@ -169,6 +170,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
169 | return true; | 170 | return true; |
170 | } | 171 | } |
171 | 172 | ||
173 | public void RezMultipleAttachmentsFromInventory( | ||
174 | IClientAPI remoteClient, | ||
175 | RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, | ||
176 | RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects) | ||
177 | { | ||
178 | foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects) | ||
179 | { | ||
180 | RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt); | ||
181 | } | ||
182 | } | ||
183 | |||
172 | public UUID RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | 184 | public UUID RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) |
173 | { | 185 | { |
174 | m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name); | 186 | m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name); |
@@ -227,6 +239,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
227 | // Fire after attach, so we don't get messy perms dialogs | 239 | // Fire after attach, so we don't get messy perms dialogs |
228 | // 3 == AttachedRez | 240 | // 3 == AttachedRez |
229 | objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3); | 241 | objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3); |
242 | objatt.ResumeScripts(); | ||
230 | 243 | ||
231 | // Do this last so that event listeners have access to all the effects of the attachment | 244 | // Do this last so that event listeners have access to all the effects of the attachment |
232 | m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); | 245 | m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); |
@@ -311,6 +324,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
311 | } | 324 | } |
312 | } | 325 | } |
313 | 326 | ||
327 | public void DetachObject(uint objectLocalID, IClientAPI remoteClient) | ||
328 | { | ||
329 | SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); | ||
330 | if (group != null) | ||
331 | { | ||
332 | //group.DetachToGround(); | ||
333 | ShowDetachInUserInventory(group.GetFromItemID(), remoteClient); | ||
334 | } | ||
335 | } | ||
336 | |||
314 | public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient) | 337 | public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient) |
315 | { | 338 | { |
316 | ScenePresence presence; | 339 | ScenePresence presence; |
@@ -329,6 +352,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
329 | DetachSingleAttachmentToInv(itemID, remoteClient); | 352 | DetachSingleAttachmentToInv(itemID, remoteClient); |
330 | } | 353 | } |
331 | 354 | ||
355 | public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) | ||
356 | { | ||
357 | SceneObjectPart part = m_scene.GetSceneObjectPart(itemID); | ||
358 | if (part == null || part.ParentGroup == null) | ||
359 | return; | ||
360 | |||
361 | UUID inventoryID = part.ParentGroup.GetFromItemID(); | ||
362 | |||
363 | ScenePresence presence; | ||
364 | if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) | ||
365 | { | ||
366 | if (!m_scene.Permissions.CanRezObject( | ||
367 | part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition)) | ||
368 | return; | ||
369 | |||
370 | presence.Appearance.DetachAttachment(itemID); | ||
371 | |||
372 | if (m_scene.AvatarFactory != null) | ||
373 | { | ||
374 | m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
375 | } | ||
376 | part.ParentGroup.DetachToGround(); | ||
377 | |||
378 | List<UUID> uuids = new List<UUID>(); | ||
379 | uuids.Add(inventoryID); | ||
380 | m_scene.InventoryService.DeleteItems(remoteClient.AgentId, uuids); | ||
381 | remoteClient.SendRemoveInventoryItem(inventoryID); | ||
382 | } | ||
383 | |||
384 | m_scene.EventManager.TriggerOnAttach(part.ParentGroup.LocalId, itemID, UUID.Zero); | ||
385 | } | ||
386 | |||
332 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | 387 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. |
333 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? | 388 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? |
334 | protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | 389 | protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) |
@@ -359,4 +414,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
359 | } | 414 | } |
360 | } | 415 | } |
361 | } | 416 | } |
362 | } \ No newline at end of file | 417 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 16e05b7..2352ced 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -601,6 +601,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
601 | 601 | ||
602 | // Fire on_rez | 602 | // Fire on_rez |
603 | group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0); | 603 | group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0); |
604 | rootPart.ParentGroup.ResumeScripts(); | ||
604 | 605 | ||
605 | rootPart.ScheduleFullUpdate(); | 606 | rootPart.ScheduleFullUpdate(); |
606 | } | 607 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index e97d21f..a2f26d5 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs | |||
@@ -311,10 +311,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
311 | { | 311 | { |
312 | // m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID); | 312 | // m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID); |
313 | 313 | ||
314 | UUID requestedItemId = item.ID; | ||
315 | |||
314 | item = m_InventoryService.GetItem(item); | 316 | item = m_InventoryService.GetItem(item); |
315 | 317 | ||
316 | if (null == item) | 318 | if (null == item) |
317 | m_log.ErrorFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", item.ID); | 319 | m_log.ErrorFormat( |
320 | "[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId); | ||
318 | 321 | ||
319 | return item; | 322 | return item; |
320 | } | 323 | } |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index b1b2336f8..c52f029 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -53,25 +53,27 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
53 | { | 53 | { |
54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
55 | 55 | ||
56 | private static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); | 56 | protected Scene m_scene; |
57 | private static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); | 57 | protected Stream m_loadStream; |
58 | 58 | protected Guid m_requestId; | |
59 | private Scene m_scene; | 59 | protected string m_errorMessage; |
60 | private Stream m_loadStream; | ||
61 | private Guid m_requestId; | ||
62 | private string m_errorMessage; | ||
63 | 60 | ||
64 | /// <value> | 61 | /// <value> |
65 | /// Should the archive being loaded be merged with what is already on the region? | 62 | /// Should the archive being loaded be merged with what is already on the region? |
66 | /// </value> | 63 | /// </value> |
67 | private bool m_merge; | 64 | protected bool m_merge; |
65 | |||
66 | /// <value> | ||
67 | /// Should we ignore any assets when reloading the archive? | ||
68 | /// </value> | ||
69 | protected bool m_skipAssets; | ||
68 | 70 | ||
69 | /// <summary> | 71 | /// <summary> |
70 | /// Used to cache lookups for valid uuids. | 72 | /// Used to cache lookups for valid uuids. |
71 | /// </summary> | 73 | /// </summary> |
72 | private IDictionary<UUID, bool> m_validUserUuids = new Dictionary<UUID, bool>(); | 74 | private IDictionary<UUID, bool> m_validUserUuids = new Dictionary<UUID, bool>(); |
73 | 75 | ||
74 | public ArchiveReadRequest(Scene scene, string loadPath, bool merge, Guid requestId) | 76 | public ArchiveReadRequest(Scene scene, string loadPath, bool merge, bool skipAssets, Guid requestId) |
75 | { | 77 | { |
76 | m_scene = scene; | 78 | m_scene = scene; |
77 | 79 | ||
@@ -89,14 +91,16 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
89 | 91 | ||
90 | m_errorMessage = String.Empty; | 92 | m_errorMessage = String.Empty; |
91 | m_merge = merge; | 93 | m_merge = merge; |
94 | m_skipAssets = skipAssets; | ||
92 | m_requestId = requestId; | 95 | m_requestId = requestId; |
93 | } | 96 | } |
94 | 97 | ||
95 | public ArchiveReadRequest(Scene scene, Stream loadStream, bool merge, Guid requestId) | 98 | public ArchiveReadRequest(Scene scene, Stream loadStream, bool merge, bool skipAssets, Guid requestId) |
96 | { | 99 | { |
97 | m_scene = scene; | 100 | m_scene = scene; |
98 | m_loadStream = loadStream; | 101 | m_loadStream = loadStream; |
99 | m_merge = merge; | 102 | m_merge = merge; |
103 | m_skipAssets = skipAssets; | ||
100 | m_requestId = requestId; | 104 | m_requestId = requestId; |
101 | } | 105 | } |
102 | 106 | ||
@@ -133,9 +137,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
133 | 137 | ||
134 | if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) | 138 | if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) |
135 | { | 139 | { |
136 | serialisedSceneObjects.Add(m_utf8Encoding.GetString(data)); | 140 | serialisedSceneObjects.Add(Encoding.UTF8.GetString(data)); |
137 | } | 141 | } |
138 | else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) | 142 | else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH) && !m_skipAssets) |
139 | { | 143 | { |
140 | if (LoadAsset(filePath, data)) | 144 | if (LoadAsset(filePath, data)) |
141 | successfulAssetRestores++; | 145 | successfulAssetRestores++; |
@@ -155,7 +159,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
155 | } | 159 | } |
156 | else if (!m_merge && filePath.StartsWith(ArchiveConstants.LANDDATA_PATH)) | 160 | else if (!m_merge && filePath.StartsWith(ArchiveConstants.LANDDATA_PATH)) |
157 | { | 161 | { |
158 | serialisedParcels.Add(m_utf8Encoding.GetString(data)); | 162 | serialisedParcels.Add(Encoding.UTF8.GetString(data)); |
159 | } | 163 | } |
160 | else if (filePath == ArchiveConstants.CONTROL_FILE_PATH) | 164 | else if (filePath == ArchiveConstants.CONTROL_FILE_PATH) |
161 | { | 165 | { |
@@ -178,12 +182,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
178 | archive.Close(); | 182 | archive.Close(); |
179 | } | 183 | } |
180 | 184 | ||
181 | m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores); | 185 | if (!m_skipAssets) |
182 | |||
183 | if (failedAssetRestores > 0) | ||
184 | { | 186 | { |
185 | m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); | 187 | m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores); |
186 | m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); | 188 | |
189 | if (failedAssetRestores > 0) | ||
190 | { | ||
191 | m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); | ||
192 | m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); | ||
193 | } | ||
187 | } | 194 | } |
188 | 195 | ||
189 | if (!m_merge) | 196 | if (!m_merge) |
@@ -277,6 +284,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
277 | { | 284 | { |
278 | sceneObjectsLoadedCount++; | 285 | sceneObjectsLoadedCount++; |
279 | sceneObject.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, 0); | 286 | sceneObject.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, 0); |
287 | sceneObject.ResumeScripts(); | ||
280 | } | 288 | } |
281 | } | 289 | } |
282 | 290 | ||
@@ -541,7 +549,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
541 | XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); | 549 | XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); |
542 | 550 | ||
543 | XmlTextReader xtr | 551 | XmlTextReader xtr |
544 | = new XmlTextReader(m_asciiEncoding.GetString(data), XmlNodeType.Document, context); | 552 | = new XmlTextReader(Encoding.ASCII.GetString(data), XmlNodeType.Document, context); |
545 | 553 | ||
546 | RegionSettings currentRegionSettings = m_scene.RegionInfo.RegionSettings; | 554 | RegionSettings currentRegionSettings = m_scene.RegionInfo.RegionSettings; |
547 | 555 | ||
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs index fc8d4e1..82ede01 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs | |||
@@ -94,8 +94,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
94 | public void HandleLoadOarConsoleCommand(string module, string[] cmdparams) | 94 | public void HandleLoadOarConsoleCommand(string module, string[] cmdparams) |
95 | { | 95 | { |
96 | bool mergeOar = false; | 96 | bool mergeOar = false; |
97 | bool skipAssets = false; | ||
97 | 98 | ||
98 | OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; }); | 99 | OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; }); |
100 | options.Add("s|skip-assets", delegate (string v) { skipAssets = v != null; }); | ||
101 | |||
99 | List<string> mainParams = options.Parse(cmdparams); | 102 | List<string> mainParams = options.Parse(cmdparams); |
100 | 103 | ||
101 | // m_log.DebugFormat("MERGE OAR IS [{0}]", mergeOar); | 104 | // m_log.DebugFormat("MERGE OAR IS [{0}]", mergeOar); |
@@ -105,11 +108,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
105 | 108 | ||
106 | if (mainParams.Count > 2) | 109 | if (mainParams.Count > 2) |
107 | { | 110 | { |
108 | DearchiveRegion(mainParams[2], mergeOar, Guid.Empty); | 111 | DearchiveRegion(mainParams[2], mergeOar, skipAssets, Guid.Empty); |
109 | } | 112 | } |
110 | else | 113 | else |
111 | { | 114 | { |
112 | DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, Guid.Empty); | 115 | DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, skipAssets, Guid.Empty); |
113 | } | 116 | } |
114 | } | 117 | } |
115 | 118 | ||
@@ -154,25 +157,25 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
154 | 157 | ||
155 | public void DearchiveRegion(string loadPath) | 158 | public void DearchiveRegion(string loadPath) |
156 | { | 159 | { |
157 | DearchiveRegion(loadPath, false, Guid.Empty); | 160 | DearchiveRegion(loadPath, false, false, Guid.Empty); |
158 | } | 161 | } |
159 | 162 | ||
160 | public void DearchiveRegion(string loadPath, bool merge, Guid requestId) | 163 | public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId) |
161 | { | 164 | { |
162 | m_log.InfoFormat( | 165 | m_log.InfoFormat( |
163 | "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath); | 166 | "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath); |
164 | 167 | ||
165 | new ArchiveReadRequest(m_scene, loadPath, merge, requestId).DearchiveRegion(); | 168 | new ArchiveReadRequest(m_scene, loadPath, merge, skipAssets, requestId).DearchiveRegion(); |
166 | } | 169 | } |
167 | 170 | ||
168 | public void DearchiveRegion(Stream loadStream) | 171 | public void DearchiveRegion(Stream loadStream) |
169 | { | 172 | { |
170 | DearchiveRegion(loadStream, false, Guid.Empty); | 173 | DearchiveRegion(loadStream, false, false, Guid.Empty); |
171 | } | 174 | } |
172 | 175 | ||
173 | public void DearchiveRegion(Stream loadStream, bool merge, Guid requestId) | 176 | public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId) |
174 | { | 177 | { |
175 | new ArchiveReadRequest(m_scene, loadStream, merge, requestId).DearchiveRegion(); | 178 | new ArchiveReadRequest(m_scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); |
176 | } | 179 | } |
177 | } | 180 | } |
178 | } | 181 | } |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index de16d89..624dc22 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs | |||
@@ -442,7 +442,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
442 | byte[] archive = archiveWriteStream.ToArray(); | 442 | byte[] archive = archiveWriteStream.ToArray(); |
443 | MemoryStream archiveReadStream = new MemoryStream(archive); | 443 | MemoryStream archiveReadStream = new MemoryStream(archive); |
444 | 444 | ||
445 | m_archiverModule.DearchiveRegion(archiveReadStream, true, Guid.Empty); | 445 | m_archiverModule.DearchiveRegion(archiveReadStream, true, false, Guid.Empty); |
446 | 446 | ||
447 | SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name); | 447 | SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name); |
448 | Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge"); | 448 | Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge"); |
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index d940564..01359f0 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs | |||
@@ -1079,7 +1079,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1079 | 1079 | ||
1080 | if ((part.GroupMask & (uint)PermissionMask.Modify) == 0) | 1080 | if ((part.GroupMask & (uint)PermissionMask.Modify) == 0) |
1081 | return false; | 1081 | return false; |
1082 | } else { | 1082 | } |
1083 | else | ||
1084 | { | ||
1083 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | 1085 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) |
1084 | return false; | 1086 | return false; |
1085 | } | 1087 | } |
@@ -1095,7 +1097,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1095 | return false; | 1097 | return false; |
1096 | 1098 | ||
1097 | if (!IsGroupMember(ti.GroupID, user, 0)) | 1099 | if (!IsGroupMember(ti.GroupID, user, 0)) |
1098 | return false; | 1100 | return false; |
1099 | } | 1101 | } |
1100 | 1102 | ||
1101 | // Require full perms | 1103 | // Require full perms |
@@ -1593,14 +1595,16 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1593 | if (part.OwnerID != user) | 1595 | if (part.OwnerID != user) |
1594 | { | 1596 | { |
1595 | if (part.GroupID == UUID.Zero) | 1597 | if (part.GroupID == UUID.Zero) |
1596 | return false; | 1598 | return false; |
1597 | 1599 | ||
1598 | if (!IsGroupMember(part.GroupID, user, 0)) | 1600 | if (!IsGroupMember(part.GroupID, user, 0)) |
1599 | return false; | 1601 | return false; |
1600 | 1602 | ||
1601 | if ((part.GroupMask & (uint)PermissionMask.Modify) == 0) | 1603 | if ((part.GroupMask & (uint)PermissionMask.Modify) == 0) |
1602 | return false; | 1604 | return false; |
1603 | } else { | 1605 | } |
1606 | else | ||
1607 | { | ||
1604 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | 1608 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) |
1605 | return false; | 1609 | return false; |
1606 | } | 1610 | } |
@@ -1855,7 +1859,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1855 | return GenericObjectPermission(agentID, prim, false); | 1859 | return GenericObjectPermission(agentID, prim, false); |
1856 | } | 1860 | } |
1857 | 1861 | ||
1858 | private bool CanCompileScript(UUID ownerUUID, int scriptType, Scene scene) { | 1862 | private bool CanCompileScript(UUID ownerUUID, int scriptType, Scene scene) |
1863 | { | ||
1859 | //m_log.DebugFormat("check if {0} is allowed to compile {1}", ownerUUID, scriptType); | 1864 | //m_log.DebugFormat("check if {0} is allowed to compile {1}", ownerUUID, scriptType); |
1860 | switch (scriptType) { | 1865 | switch (scriptType) { |
1861 | case 0: | 1866 | case 0: |
@@ -1889,4 +1894,4 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1889 | return(false); | 1894 | return(false); |
1890 | } | 1895 | } |
1891 | } | 1896 | } |
1892 | } | 1897 | } \ No newline at end of file |
diff --git a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs index 6949d7c..9fc002b 100644 --- a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs +++ b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs | |||
@@ -94,7 +94,7 @@ namespace OpenSim.Region.DataSnapshot | |||
94 | if (!m_configLoaded) | 94 | if (!m_configLoaded) |
95 | { | 95 | { |
96 | m_configLoaded = true; | 96 | m_configLoaded = true; |
97 | m_log.Info("[DATASNAPSHOT]: Loading configuration"); | 97 | //m_log.Debug("[DATASNAPSHOT]: Loading configuration"); |
98 | //Read from the config for options | 98 | //Read from the config for options |
99 | lock (m_syncInit) | 99 | lock (m_syncInit) |
100 | { | 100 | { |
@@ -123,7 +123,7 @@ namespace OpenSim.Region.DataSnapshot | |||
123 | } | 123 | } |
124 | catch (Exception) | 124 | catch (Exception) |
125 | { | 125 | { |
126 | m_log.Info("[DATASNAPSHOT]: Could not load configuration. DataSnapshot will be disabled."); | 126 | m_log.Warn("[DATASNAPSHOT]: Could not load configuration. DataSnapshot will be disabled."); |
127 | m_enabled = false; | 127 | m_enabled = false; |
128 | return; | 128 | return; |
129 | } | 129 | } |
@@ -179,7 +179,7 @@ namespace OpenSim.Region.DataSnapshot | |||
179 | } | 179 | } |
180 | else | 180 | else |
181 | { | 181 | { |
182 | m_log.Warn("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else)."); | 182 | //m_log.Debug("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else)."); |
183 | } | 183 | } |
184 | } | 184 | } |
185 | 185 | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index 0222b02..f8af367 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using OpenMetaverse; | 29 | using OpenMetaverse; |
30 | using OpenMetaverse.Packets; | ||
30 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
31 | using OpenSim.Region.Framework.Scenes; | 32 | using OpenSim.Region.Framework.Scenes; |
32 | 33 | ||
@@ -82,6 +83,34 @@ namespace OpenSim.Region.Framework.Interfaces | |||
82 | IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus); | 83 | IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus); |
83 | 84 | ||
84 | /// <summary> | 85 | /// <summary> |
86 | /// Rez multiple attachments from a user's inventory | ||
87 | /// </summary> | ||
88 | /// <param name="remoteClient"></param> | ||
89 | /// <param name="header"></param> | ||
90 | /// <param name="objects"></param> | ||
91 | void RezMultipleAttachmentsFromInventory( | ||
92 | IClientAPI remoteClient, | ||
93 | RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, | ||
94 | RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects); | ||
95 | |||
96 | /// <summary> | ||
97 | /// Detach an object from the avatar. | ||
98 | /// </summary> | ||
99 | /// | ||
100 | /// This method is called in response to a client's detach request, so we only update the information in | ||
101 | /// inventory | ||
102 | /// <param name="objectLocalID"></param> | ||
103 | /// <param name="remoteClient"></param> | ||
104 | void DetachObject(uint objectLocalID, IClientAPI remoteClient); | ||
105 | |||
106 | /// <summary> | ||
107 | /// Detach the given item to the ground. | ||
108 | /// </summary> | ||
109 | /// <param name="itemID"></param> | ||
110 | /// <param name="remoteClient"></param> | ||
111 | void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient); | ||
112 | |||
113 | /// <summary> | ||
85 | /// Update the user inventory to the attachment of an item | 114 | /// Update the user inventory to the attachment of an item |
86 | /// </summary> | 115 | /// </summary> |
87 | /// <param name="att"></param> | 116 | /// <param name="att"></param> |
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index f58904f..2b90960 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs | |||
@@ -74,6 +74,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
74 | void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); | 74 | void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); |
75 | 75 | ||
76 | ArrayList GetScriptErrors(UUID itemID); | 76 | ArrayList GetScriptErrors(UUID itemID); |
77 | void ResumeScripts(); | ||
77 | 78 | ||
78 | /// <summary> | 79 | /// <summary> |
79 | /// Stop all the scripts in this entity. | 80 | /// Stop all the scripts in this entity. |
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs index 991d60c..89e59d0 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs | |||
@@ -90,8 +90,12 @@ namespace OpenSim.Region.Framework.Interfaces | |||
90 | /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region | 90 | /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region |
91 | /// settings in the archive will be ignored. | 91 | /// settings in the archive will be ignored. |
92 | /// </param> | 92 | /// </param> |
93 | /// <param name="skipAssets"> | ||
94 | /// If true, the archive is loaded without loading any assets contained within it. This is useful if the | ||
95 | /// assets are already known to be present in the grid's asset service. | ||
96 | /// </param> | ||
93 | /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> | 97 | /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> |
94 | void DearchiveRegion(string loadPath, bool merge, Guid requestId); | 98 | void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId); |
95 | 99 | ||
96 | /// <summary> | 100 | /// <summary> |
97 | /// Dearchive a region from a stream. This replaces the existing scene. | 101 | /// Dearchive a region from a stream. This replaces the existing scene. |
@@ -113,7 +117,11 @@ namespace OpenSim.Region.Framework.Interfaces | |||
113 | /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region | 117 | /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region |
114 | /// settings in the archive will be ignored. | 118 | /// settings in the archive will be ignored. |
115 | /// </param> | 119 | /// </param> |
120 | /// <param name="skipAssets"> | ||
121 | /// If true, the archive is loaded without loading any assets contained within it. This is useful if the | ||
122 | /// assets are already known to be present in the grid's asset service. | ||
123 | /// </param | ||
116 | /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> | 124 | /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> |
117 | void DearchiveRegion(Stream loadStream, bool merge, Guid requestId); | 125 | void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId); |
118 | } | 126 | } |
119 | } | 127 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index e90b300..fecdd1b 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs | |||
@@ -41,6 +41,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
41 | bool PostScriptEvent(UUID itemID, string name, Object[] args); | 41 | bool PostScriptEvent(UUID itemID, string name, Object[] args); |
42 | bool PostObjectEvent(UUID itemID, string name, Object[] args); | 42 | bool PostObjectEvent(UUID itemID, string name, Object[] args); |
43 | 43 | ||
44 | // Suspend ALL scripts in a given scene object. The item ID | ||
45 | // is the UUID of a SOG, and the method acts on all contained | ||
46 | // scripts. This is different from the suspend/resume that | ||
47 | // can be issued by a client. | ||
48 | // | ||
49 | void SuspendScript(UUID itemID); | ||
50 | void ResumeScript(UUID itemID); | ||
51 | |||
44 | ArrayList GetScriptErrors(UUID itemID); | 52 | ArrayList GetScriptErrors(UUID itemID); |
45 | } | 53 | } |
46 | } | 54 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 7c68ef4..15b5230 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -35,7 +35,6 @@ using OpenMetaverse; | |||
35 | using OpenMetaverse.Packets; | 35 | using OpenMetaverse.Packets; |
36 | using log4net; | 36 | using log4net; |
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | |||
39 | using OpenSim.Region.Framework; | 38 | using OpenSim.Region.Framework; |
40 | using OpenSim.Region.Framework.Interfaces; | 39 | using OpenSim.Region.Framework.Interfaces; |
41 | using OpenSim.Region.Framework.Scenes.Serialization; | 40 | using OpenSim.Region.Framework.Scenes.Serialization; |
@@ -64,6 +63,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
64 | if (group is SceneObjectGroup) | 63 | if (group is SceneObjectGroup) |
65 | { | 64 | { |
66 | ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); | 65 | ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); |
66 | ((SceneObjectGroup) group).ResumeScripts(); | ||
67 | } | 67 | } |
68 | } | 68 | } |
69 | } | 69 | } |
@@ -202,7 +202,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
202 | 202 | ||
203 | // Update item with new asset | 203 | // Update item with new asset |
204 | item.AssetID = asset.FullID; | 204 | item.AssetID = asset.FullID; |
205 | group.UpdateInventoryItem(item); | 205 | if (group.UpdateInventoryItem(item)) |
206 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | ||
207 | |||
206 | part.GetProperties(remoteClient); | 208 | part.GetProperties(remoteClient); |
207 | 209 | ||
208 | // Trigger rerunning of script (use TriggerRezScript event, see RezScript) | 210 | // Trigger rerunning of script (use TriggerRezScript event, see RezScript) |
@@ -219,6 +221,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
219 | { | 221 | { |
220 | remoteClient.SendAgentAlertMessage("Script saved", false); | 222 | remoteClient.SendAgentAlertMessage("Script saved", false); |
221 | } | 223 | } |
224 | part.ParentGroup.ResumeScripts(); | ||
222 | return errors; | 225 | return errors; |
223 | } | 226 | } |
224 | 227 | ||
@@ -472,7 +475,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
472 | return null; | 475 | return null; |
473 | } | 476 | } |
474 | 477 | ||
475 | |||
476 | if (recipientParentFolderId == UUID.Zero) | 478 | if (recipientParentFolderId == UUID.Zero) |
477 | { | 479 | { |
478 | InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); | 480 | InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); |
@@ -1226,7 +1228,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1226 | remoteClient, part, transactionID, currentItem); | 1228 | remoteClient, part, transactionID, currentItem); |
1227 | } | 1229 | } |
1228 | if (part.Inventory.UpdateInventoryItem(itemInfo)) | 1230 | if (part.Inventory.UpdateInventoryItem(itemInfo)) |
1231 | { | ||
1232 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | ||
1229 | part.GetProperties(remoteClient); | 1233 | part.GetProperties(remoteClient); |
1234 | } | ||
1230 | } | 1235 | } |
1231 | } | 1236 | } |
1232 | else | 1237 | else |
@@ -1278,6 +1283,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1278 | // "Rezzed script {0} into prim local ID {1} for user {2}", | 1283 | // "Rezzed script {0} into prim local ID {1} for user {2}", |
1279 | // item.inventoryName, localID, remoteClient.Name); | 1284 | // item.inventoryName, localID, remoteClient.Name); |
1280 | part.GetProperties(remoteClient); | 1285 | part.GetProperties(remoteClient); |
1286 | part.ParentGroup.ResumeScripts(); | ||
1281 | } | 1287 | } |
1282 | else | 1288 | else |
1283 | { | 1289 | { |
@@ -1347,6 +1353,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1347 | part.GetProperties(remoteClient); | 1353 | part.GetProperties(remoteClient); |
1348 | 1354 | ||
1349 | part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); | 1355 | part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); |
1356 | part.ParentGroup.ResumeScripts(); | ||
1350 | } | 1357 | } |
1351 | } | 1358 | } |
1352 | 1359 | ||
@@ -1450,6 +1457,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1450 | destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, DefaultScriptEngine, 0); | 1457 | destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, DefaultScriptEngine, 0); |
1451 | } | 1458 | } |
1452 | 1459 | ||
1460 | destPart.ParentGroup.ResumeScripts(); | ||
1461 | |||
1453 | ScenePresence avatar; | 1462 | ScenePresence avatar; |
1454 | 1463 | ||
1455 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) | 1464 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) |
@@ -1870,50 +1879,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1870 | EventManager.TriggerStopScript(part.LocalId, itemID); | 1879 | EventManager.TriggerStopScript(part.LocalId, itemID); |
1871 | } | 1880 | } |
1872 | 1881 | ||
1873 | internal void SendAttachEvent(uint localID, UUID itemID, UUID avatarID) | ||
1874 | { | ||
1875 | EventManager.TriggerOnAttach(localID, itemID, avatarID); | ||
1876 | } | ||
1877 | |||
1878 | public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, | ||
1879 | RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects) | ||
1880 | { | ||
1881 | foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects) | ||
1882 | { | ||
1883 | AttachmentsModule.RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt); | ||
1884 | } | ||
1885 | } | ||
1886 | |||
1887 | public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) | ||
1888 | { | ||
1889 | SceneObjectPart part = GetSceneObjectPart(itemID); | ||
1890 | if (part == null || part.ParentGroup == null) | ||
1891 | return; | ||
1892 | |||
1893 | UUID inventoryID = part.ParentGroup.GetFromItemID(); | ||
1894 | |||
1895 | ScenePresence presence; | ||
1896 | if (TryGetScenePresence(remoteClient.AgentId, out presence)) | ||
1897 | { | ||
1898 | if (!Permissions.CanRezObject(part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition)) | ||
1899 | return; | ||
1900 | |||
1901 | presence.Appearance.DetachAttachment(itemID); | ||
1902 | IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); | ||
1903 | if (ava != null) | ||
1904 | { | ||
1905 | ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
1906 | } | ||
1907 | part.ParentGroup.DetachToGround(); | ||
1908 | |||
1909 | List<UUID> uuids = new List<UUID>(); | ||
1910 | uuids.Add(inventoryID); | ||
1911 | InventoryService.DeleteItems(remoteClient.AgentId, uuids); | ||
1912 | remoteClient.SendRemoveInventoryItem(inventoryID); | ||
1913 | } | ||
1914 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); | ||
1915 | } | ||
1916 | |||
1917 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) | 1882 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) |
1918 | { | 1883 | { |
1919 | EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); | 1884 | EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 685a678..57587be 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -1131,7 +1131,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1131 | { | 1131 | { |
1132 | if (m_scripts_enabled != !ScriptEngine) | 1132 | if (m_scripts_enabled != !ScriptEngine) |
1133 | { | 1133 | { |
1134 | // Tedd! Here's the method to disable the scripting engine! | ||
1135 | if (ScriptEngine) | 1134 | if (ScriptEngine) |
1136 | { | 1135 | { |
1137 | m_log.Info("Stopping all Scripts in Scene"); | 1136 | m_log.Info("Stopping all Scripts in Scene"); |
@@ -1153,6 +1152,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1153 | if (ent is SceneObjectGroup) | 1152 | if (ent is SceneObjectGroup) |
1154 | { | 1153 | { |
1155 | ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0); | 1154 | ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0); |
1155 | ((SceneObjectGroup)ent).ResumeScripts(); | ||
1156 | } | 1156 | } |
1157 | } | 1157 | } |
1158 | } | 1158 | } |
@@ -2769,14 +2769,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2769 | } | 2769 | } |
2770 | 2770 | ||
2771 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) | 2771 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) |
2772 | { | 2772 | { |
2773 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; | ||
2774 | client.OnObjectDetach += m_sceneGraph.DetachObject; | ||
2775 | |||
2776 | if (AttachmentsModule != null) | 2773 | if (AttachmentsModule != null) |
2777 | { | 2774 | { |
2778 | client.OnRezSingleAttachmentFromInv += AttachmentsModule.RezSingleAttachmentFromInventory; | 2775 | client.OnRezSingleAttachmentFromInv += AttachmentsModule.RezSingleAttachmentFromInventory; |
2776 | client.OnRezMultipleAttachmentsFromInv += AttachmentsModule.RezMultipleAttachmentsFromInventory; | ||
2779 | client.OnObjectAttach += AttachmentsModule.AttachObject; | 2777 | client.OnObjectAttach += AttachmentsModule.AttachObject; |
2778 | client.OnObjectDetach += AttachmentsModule.DetachObject; | ||
2780 | client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory; | 2779 | client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory; |
2781 | } | 2780 | } |
2782 | } | 2781 | } |
@@ -2925,14 +2924,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2925 | } | 2924 | } |
2926 | 2925 | ||
2927 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) | 2926 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) |
2928 | { | 2927 | { |
2929 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; | ||
2930 | client.OnObjectDetach -= m_sceneGraph.DetachObject; | ||
2931 | |||
2932 | if (AttachmentsModule != null) | 2928 | if (AttachmentsModule != null) |
2933 | { | 2929 | { |
2934 | client.OnRezSingleAttachmentFromInv -= AttachmentsModule.RezSingleAttachmentFromInventory; | 2930 | client.OnRezSingleAttachmentFromInv -= AttachmentsModule.RezSingleAttachmentFromInventory; |
2931 | client.OnRezMultipleAttachmentsFromInv -= AttachmentsModule.RezMultipleAttachmentsFromInventory; | ||
2935 | client.OnObjectAttach -= AttachmentsModule.AttachObject; | 2932 | client.OnObjectAttach -= AttachmentsModule.AttachObject; |
2933 | client.OnObjectDetach -= AttachmentsModule.DetachObject; | ||
2936 | client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory; | 2934 | client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory; |
2937 | } | 2935 | } |
2938 | } | 2936 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 23a4ee9..1421d0e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -443,9 +443,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
443 | { | 443 | { |
444 | SceneObjectGroup group = GetGroupByPrim(objectLocalID); | 444 | SceneObjectGroup group = GetGroupByPrim(objectLocalID); |
445 | if (group != null) | 445 | if (group != null) |
446 | { | 446 | m_parentScene.AttachmentsModule.DetachSingleAttachmentToGround(group.UUID, remoteClient); |
447 | m_parentScene.DetachSingleAttachmentToGround(group.UUID, remoteClient); | ||
448 | } | ||
449 | } | 447 | } |
450 | 448 | ||
451 | protected internal void DetachObject(uint objectLocalID, IClientAPI remoteClient) | 449 | protected internal void DetachObject(uint objectLocalID, IClientAPI remoteClient) |
@@ -1757,6 +1755,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1757 | copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0); | 1755 | copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0); |
1758 | copy.HasGroupChanged = true; | 1756 | copy.HasGroupChanged = true; |
1759 | copy.ScheduleGroupForFullUpdate(); | 1757 | copy.ScheduleGroupForFullUpdate(); |
1758 | copy.ResumeScripts(); | ||
1760 | 1759 | ||
1761 | // required for physics to update it's position | 1760 | // required for physics to update it's position |
1762 | copy.AbsolutePosition = copy.AbsolutePosition; | 1761 | copy.AbsolutePosition = copy.AbsolutePosition; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 4034744..f7e46af 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs | |||
@@ -416,5 +416,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
416 | scriptModule.SetXMLState(itemID, n.OuterXml); | 416 | scriptModule.SetXMLState(itemID, n.OuterXml); |
417 | } | 417 | } |
418 | } | 418 | } |
419 | |||
420 | public void ResumeScripts() | ||
421 | { | ||
422 | foreach (SceneObjectPart part in m_parts.Values) | ||
423 | { | ||
424 | part.Inventory.ResumeScripts(); | ||
425 | } | ||
426 | } | ||
419 | } | 427 | } |
420 | } | 428 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 2e13f90..3b1b567 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -282,36 +282,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
282 | return; | 282 | return; |
283 | } | 283 | } |
284 | 284 | ||
285 | m_part.ParentGroup.Scene.AssetService.Get( | 285 | AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); |
286 | item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset) | 286 | if (null == asset) |
287 | { | 287 | { |
288 | if (null == asset) | 288 | m_log.ErrorFormat( |
289 | { | 289 | "[PRIM INVENTORY]: " + |
290 | m_log.ErrorFormat( | 290 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", |
291 | "[PRIM INVENTORY]: " + | 291 | item.Name, item.ItemID, m_part.AbsolutePosition, |
292 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", | 292 | m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); |
293 | item.Name, item.ItemID, m_part.AbsolutePosition, | 293 | } |
294 | m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); | 294 | else |
295 | } | 295 | { |
296 | else | 296 | if (m_part.ParentGroup.m_savedScriptState != null) |
297 | { | 297 | RestoreSavedScriptState(item.OldItemID, item.ItemID); |
298 | if (m_part.ParentGroup.m_savedScriptState != null) | ||
299 | RestoreSavedScriptState(item.OldItemID, item.ItemID); | ||
300 | 298 | ||
301 | lock (m_items) | 299 | lock (m_items) |
302 | { | 300 | { |
303 | m_items[item.ItemID].PermsMask = 0; | 301 | m_items[item.ItemID].PermsMask = 0; |
304 | m_items[item.ItemID].PermsGranter = UUID.Zero; | 302 | m_items[item.ItemID].PermsGranter = UUID.Zero; |
305 | } | ||
306 | |||
307 | string script = Utils.BytesToString(asset.Data); | ||
308 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | ||
309 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); | ||
310 | m_part.ParentGroup.AddActiveScriptCount(1); | ||
311 | m_part.ScheduleFullUpdate(); | ||
312 | } | ||
313 | } | 303 | } |
314 | ); | 304 | |
305 | string script = Utils.BytesToString(asset.Data); | ||
306 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | ||
307 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); | ||
308 | m_part.ParentGroup.AddActiveScriptCount(1); | ||
309 | m_part.ScheduleFullUpdate(); | ||
310 | } | ||
315 | } | 311 | } |
316 | } | 312 | } |
317 | 313 | ||
@@ -630,16 +626,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
630 | { | 626 | { |
631 | item.AssetID = m_items[item.ItemID].AssetID; | 627 | item.AssetID = m_items[item.ItemID].AssetID; |
632 | } | 628 | } |
633 | else if ((InventoryType)item.Type == InventoryType.Notecard) | ||
634 | { | ||
635 | ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID); | ||
636 | |||
637 | if (presence != null) | ||
638 | { | ||
639 | presence.ControllingClient.SendAgentAlertMessage( | ||
640 | "Notecard saved", false); | ||
641 | } | ||
642 | } | ||
643 | 629 | ||
644 | m_items[item.ItemID] = item; | 630 | m_items[item.ItemID] = item; |
645 | m_inventorySerial++; | 631 | m_inventorySerial++; |
@@ -1042,5 +1028,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
1042 | 1028 | ||
1043 | return ret; | 1029 | return ret; |
1044 | } | 1030 | } |
1031 | |||
1032 | public void ResumeScripts() | ||
1033 | { | ||
1034 | IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); | ||
1035 | if (engines == null) | ||
1036 | return; | ||
1037 | |||
1038 | |||
1039 | lock (m_items) | ||
1040 | { | ||
1041 | foreach (TaskInventoryItem item in m_items.Values) | ||
1042 | { | ||
1043 | if (item.InvType == (int)InventoryType.LSL) | ||
1044 | { | ||
1045 | foreach (IScriptModule engine in engines) | ||
1046 | { | ||
1047 | if (engine != null) | ||
1048 | engine.ResumeScript(item.ItemID); | ||
1049 | } | ||
1050 | } | ||
1051 | } | ||
1052 | } | ||
1053 | } | ||
1045 | } | 1054 | } |
1046 | } \ No newline at end of file | 1055 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs index cf0f345..b6677f0 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs | |||
@@ -182,6 +182,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
182 | foreach (SceneObjectGroup sceneObject in sceneObjects) | 182 | foreach (SceneObjectGroup sceneObject in sceneObjects) |
183 | { | 183 | { |
184 | sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0); | 184 | sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0); |
185 | sceneObject.ResumeScripts(); | ||
185 | } | 186 | } |
186 | } | 187 | } |
187 | 188 | ||
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs index e664b44..d49a489 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs | |||
@@ -109,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
109 | } | 109 | } |
110 | else | 110 | else |
111 | { | 111 | { |
112 | m_log.WarnFormat("[IRC-Bridge] Not enabled. Connect for region {0} ignored", scene.RegionInfo.RegionName); | 112 | //m_log.DebugFormat("[IRC-Bridge] Not enabled. Connect for region {0} ignored", scene.RegionInfo.RegionName); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs index e7967d1..79b9a16 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs | |||
@@ -142,8 +142,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
142 | m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Timeout set to {0}.", m_cacheTimeout); | 142 | m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Timeout set to {0}.", m_cacheTimeout); |
143 | } | 143 | } |
144 | 144 | ||
145 | |||
146 | // If we got all the config options we need, lets start'er'up | 145 | // If we got all the config options we need, lets start'er'up |
146 | m_memoryCache = new ExpiringCache<string, XmlRpcResponse>(); | ||
147 | m_connectorEnabled = true; | 147 | m_connectorEnabled = true; |
148 | } | 148 | } |
149 | } | 149 | } |
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index ae148a9..9f6ea35 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -81,6 +81,9 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
81 | 81 | ||
82 | void PostEvent(EventParams data); | 82 | void PostEvent(EventParams data); |
83 | 83 | ||
84 | void Suspend(); | ||
85 | void Resume(); | ||
86 | |||
84 | /// <summary> | 87 | /// <summary> |
85 | /// Process the next event queued for this script | 88 | /// Process the next event queued for this script |
86 | /// </summary> | 89 | /// </summary> |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 2296379..4d7ead6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -302,6 +302,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
302 | float dz; | 302 | float dz; |
303 | 303 | ||
304 | Quaternion q = SensePoint.RotationOffset; | 304 | Quaternion q = SensePoint.RotationOffset; |
305 | if (SensePoint.ParentGroup.RootPart.IsAttachment) | ||
306 | { | ||
307 | // In attachments, the sensor cone always orients with the | ||
308 | // avatar rotation. This may include a nonzero elevation if | ||
309 | // in mouselook. | ||
310 | |||
311 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.RootPart.AttachedAvatar); | ||
312 | q = avatar.Rotation; | ||
313 | } | ||
305 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | 314 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); |
306 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); | 315 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); |
307 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); | 316 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index d30d2dc..3dd381d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -95,6 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
95 | private bool m_startedFromSavedState; | 95 | private bool m_startedFromSavedState; |
96 | private UUID m_CurrentStateHash; | 96 | private UUID m_CurrentStateHash; |
97 | private UUID m_RegionID; | 97 | private UUID m_RegionID; |
98 | private bool m_Suspended = false; | ||
98 | 99 | ||
99 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> | 100 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> |
100 | m_LineMap; | 101 | m_LineMap; |
@@ -638,6 +639,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
638 | /// <returns></returns> | 639 | /// <returns></returns> |
639 | public object EventProcessor() | 640 | public object EventProcessor() |
640 | { | 641 | { |
642 | if (m_Suspended) | ||
643 | return 0; | ||
644 | |||
641 | lock (m_Script) | 645 | lock (m_Script) |
642 | { | 646 | { |
643 | EventParams data = null; | 647 | EventParams data = null; |
@@ -1011,5 +1015,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
1011 | { | 1015 | { |
1012 | get { return m_RegionID; } | 1016 | get { return m_RegionID; } |
1013 | } | 1017 | } |
1018 | |||
1019 | public void Suspend() | ||
1020 | { | ||
1021 | m_Suspended = true; | ||
1022 | } | ||
1023 | |||
1024 | public void Resume() | ||
1025 | { | ||
1026 | m_Suspended = false; | ||
1027 | } | ||
1014 | } | 1028 | } |
1015 | } | 1029 | } |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 98e77c0..54074ed 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1488,5 +1488,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1488 | return new ArrayList(); | 1488 | return new ArrayList(); |
1489 | } | 1489 | } |
1490 | } | 1490 | } |
1491 | |||
1492 | public void SuspendScript(UUID itemID) | ||
1493 | { | ||
1494 | IScriptInstance instance = GetInstance(itemID); | ||
1495 | if (instance == null) | ||
1496 | return; | ||
1497 | |||
1498 | instance.Suspend(); | ||
1499 | } | ||
1500 | |||
1501 | public void ResumeScript(UUID itemID) | ||
1502 | { | ||
1503 | IScriptInstance instance = GetInstance(itemID); | ||
1504 | if (instance == null) | ||
1505 | return; | ||
1506 | |||
1507 | instance.Resume(); | ||
1508 | } | ||
1491 | } | 1509 | } |
1492 | } | 1510 | } |
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 7b25274..c333b5c 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs | |||
@@ -405,9 +405,9 @@ namespace OpenSim.Services.LLLoginService | |||
405 | } | 405 | } |
406 | else | 406 | else |
407 | { | 407 | { |
408 | position = new Vector3(float.Parse(uriMatch.Groups["x"].Value), | 408 | position = new Vector3(float.Parse(uriMatch.Groups["x"].Value, Culture.NumberFormatInfo), |
409 | float.Parse(uriMatch.Groups["y"].Value), | 409 | float.Parse(uriMatch.Groups["y"].Value, Culture.NumberFormatInfo), |
410 | float.Parse(uriMatch.Groups["z"].Value)); | 410 | float.Parse(uriMatch.Groups["z"].Value, Culture.NumberFormatInfo)); |
411 | 411 | ||
412 | string regionName = uriMatch.Groups["region"].ToString(); | 412 | string regionName = uriMatch.Groups["region"].ToString(); |
413 | if (regionName != null) | 413 | if (regionName != null) |