From 86b005de1dc2192dc9d18988eed63e144a085866 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 2 Aug 2012 22:14:09 +0100 Subject: Add simple draw test for the VectorRenderModule --- .../VectorRender/Tests/VectorRenderModuleTests.cs | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs new file mode 100644 index 0000000..9787c8c --- /dev/null +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs @@ -0,0 +1,75 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Threading; +using log4net.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenMetaverse.Assets; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Scripting.DynamicTexture; +using OpenSim.Region.CoreModules.Scripting.VectorRender; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Framework.Scenes.Serialization; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests +{ + [TestFixture] + public class VectorRenderModuleTests + { + [Test] + public void TestDraw() + { + TestHelpers.InMethod(); + + Scene scene = new SceneHelpers().SetupScene(); + DynamicTextureModule dtm = new DynamicTextureModule(); + VectorRenderModule vrm = new VectorRenderModule(); + SceneHelpers.SetupSceneModules(scene, dtm, vrm); + + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene); + UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; + + dtm.AddDynamicTextureData( + scene.RegionInfo.RegionID, + so.UUID, + vrm.GetContentType(), + "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;", + "", + 0); + + + Assert.That(originalTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID)); + } + } +} \ No newline at end of file -- cgit v1.1 From eeef9d7e990cf158de5c143de546fc671169b3bd Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 3 Aug 2012 00:00:54 +0100 Subject: Properly dispose of all GDI+ entities used in VectorRenderModule for dynamic textures. The convention is that if an object implements IDiposable() the code must explicitly call Dispose() or call it via the using statement. This may be particularly important for GDI+ objects since they encapsulate native code entities. --- .../Scripting/VectorRender/VectorRenderModule.cs | 569 ++++++++++++--------- 1 file changed, 316 insertions(+), 253 deletions(-) (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs index c061868..d039111 100644 --- a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs @@ -98,16 +98,18 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender public void GetDrawStringSize(string text, string fontName, int fontSize, out double xSize, out double ySize) { - Font myFont = new Font(fontName, fontSize); - SizeF stringSize = new SizeF(); - lock (m_graph) { - stringSize = m_graph.MeasureString(text, myFont); - xSize = stringSize.Width; - ySize = stringSize.Height; + using (Font myFont = new Font(fontName, fontSize)) + { + SizeF stringSize = new SizeF(); + lock (m_graph) + { + stringSize = m_graph.MeasureString(text, myFont); + xSize = stringSize.Width; + ySize = stringSize.Height; + } } } - #endregion #region IRegionModule Members @@ -121,6 +123,8 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender if (m_graph == null) { + // We won't dispose of these explicitly since this module is only removed when the entire simulator + // is shut down. Bitmap bitmap = new Bitmap(1024, 1024, PixelFormat.Format32bppArgb); m_graph = Graphics.FromImage(bitmap); } @@ -299,53 +303,64 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender } } - Bitmap bitmap; - - if (alpha == 256) - { - bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb); - } - else - { - bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); - } - - Graphics graph = Graphics.FromImage(bitmap); - - // this is really just to save people filling the - // background color in their scripts, only do when fully opaque - if (alpha >= 255) - { - graph.FillRectangle(new SolidBrush(bgColor), 0, 0, width, height); - } + Bitmap bitmap = null; + Graphics graph = null; - for (int w = 0; w < bitmap.Width; w++) + try { - if (alpha <= 255) + if (alpha == 256) + bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb); + else + bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); + + graph = Graphics.FromImage(bitmap); + + // this is really just to save people filling the + // background color in their scripts, only do when fully opaque + if (alpha >= 255) { - for (int h = 0; h < bitmap.Height; h++) + using (SolidBrush bgFillBrush = new SolidBrush(bgColor)) { - bitmap.SetPixel(w, h, Color.FromArgb(alpha, bitmap.GetPixel(w, h))); + graph.FillRectangle(bgFillBrush, 0, 0, width, height); } } - } - - GDIDraw(data, graph, altDataDelim); - - byte[] imageJ2000 = new byte[0]; + + for (int w = 0; w < bitmap.Width; w++) + { + if (alpha <= 255) + { + for (int h = 0; h < bitmap.Height; h++) + { + bitmap.SetPixel(w, h, Color.FromArgb(alpha, bitmap.GetPixel(w, h))); + } + } + } + + GDIDraw(data, graph, altDataDelim); + + byte[] imageJ2000 = new byte[0]; + + try + { + imageJ2000 = OpenJPEG.EncodeFromImage(bitmap, true); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[VECTORRENDERMODULE]: OpenJpeg Encode Failed. Exception {0}{1}", + e.Message, e.StackTrace); + } - try - { - imageJ2000 = OpenJPEG.EncodeFromImage(bitmap, true); + m_textureManager.ReturnData(id, imageJ2000); } - catch (Exception e) + finally { - m_log.ErrorFormat( - "[VECTORRENDERMODULE]: OpenJpeg Encode Failed. Exception {0}{1}", - e.Message, e.StackTrace); - } + if (graph != null) + graph.Dispose(); - m_textureManager.ReturnData(id, imageJ2000); + if (bitmap != null) + bitmap.Dispose(); + } } private int parseIntParam(string strInt) @@ -407,238 +422,285 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender { Point startPoint = new Point(0, 0); Point endPoint = new Point(0, 0); - Pen drawPen = new Pen(Color.Black, 7); - string fontName = m_fontName; - float fontSize = 14; - Font myFont = new Font(fontName, fontSize); - SolidBrush myBrush = new SolidBrush(Color.Black); - - char[] lineDelimiter = {dataDelim}; - char[] partsDelimiter = {','}; - string[] lines = data.Split(lineDelimiter); + Pen drawPen = null; + Font myFont = null; + SolidBrush myBrush = null; - foreach (string line in lines) + try { - string nextLine = line.Trim(); - //replace with switch, or even better, do some proper parsing - if (nextLine.StartsWith("MoveTo")) - { - float x = 0; - float y = 0; - GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); - startPoint.X = (int) x; - startPoint.Y = (int) y; - } - else if (nextLine.StartsWith("LineTo")) - { - float x = 0; - float y = 0; - GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); - endPoint.X = (int) x; - endPoint.Y = (int) y; - graph.DrawLine(drawPen, startPoint, endPoint); - startPoint.X = endPoint.X; - startPoint.Y = endPoint.Y; - } - else if (nextLine.StartsWith("Text")) - { - nextLine = nextLine.Remove(0, 4); - nextLine = nextLine.Trim(); - graph.DrawString(nextLine, myFont, myBrush, startPoint); - } - else if (nextLine.StartsWith("Image")) + drawPen = new Pen(Color.Black, 7); + string fontName = m_fontName; + float fontSize = 14; + myFont = new Font(fontName, fontSize); + myBrush = new SolidBrush(Color.Black); + + char[] lineDelimiter = {dataDelim}; + char[] partsDelimiter = {','}; + string[] lines = data.Split(lineDelimiter); + + foreach (string line in lines) { - float x = 0; - float y = 0; - GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); - endPoint.X = (int) x; - endPoint.Y = (int) y; - Image image = ImageHttpRequest(nextLine); - if (image != null) + string nextLine = line.Trim(); + //replace with switch, or even better, do some proper parsing + if (nextLine.StartsWith("MoveTo")) { - graph.DrawImage(image, (float)startPoint.X, (float)startPoint.Y, x, y); + float x = 0; + float y = 0; + GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); + startPoint.X = (int) x; + startPoint.Y = (int) y; } - else + else if (nextLine.StartsWith("LineTo")) { - graph.DrawString("URL couldn't be resolved or is", new Font(m_fontName,6), - myBrush, startPoint); - graph.DrawString("not an image. Please check URL.", new Font(m_fontName, 6), - myBrush, new Point(startPoint.X, 12 + startPoint.Y)); - graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); + float x = 0; + float y = 0; + GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); + endPoint.X = (int) x; + endPoint.Y = (int) y; + graph.DrawLine(drawPen, startPoint, endPoint); + startPoint.X = endPoint.X; + startPoint.Y = endPoint.Y; } - startPoint.X += endPoint.X; - startPoint.Y += endPoint.Y; - } - else if (nextLine.StartsWith("Rectangle")) - { - float x = 0; - float y = 0; - GetParams(partsDelimiter, ref nextLine, 9, ref x, ref y); - endPoint.X = (int) x; - endPoint.Y = (int) y; - graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); - startPoint.X += endPoint.X; - startPoint.Y += endPoint.Y; - } - else if (nextLine.StartsWith("FillRectangle")) - { - float x = 0; - float y = 0; - GetParams(partsDelimiter, ref nextLine, 13, ref x, ref y); - endPoint.X = (int) x; - endPoint.Y = (int) y; - graph.FillRectangle(myBrush, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); - startPoint.X += endPoint.X; - startPoint.Y += endPoint.Y; - } - else if (nextLine.StartsWith("FillPolygon")) - { - PointF[] points = null; - GetParams(partsDelimiter, ref nextLine, 11, ref points); - graph.FillPolygon(myBrush, points); - } - else if (nextLine.StartsWith("Polygon")) - { - PointF[] points = null; - GetParams(partsDelimiter, ref nextLine, 7, ref points); - graph.DrawPolygon(drawPen, points); - } - else if (nextLine.StartsWith("Ellipse")) - { - float x = 0; - float y = 0; - GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y); - endPoint.X = (int)x; - endPoint.Y = (int)y; - graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); - startPoint.X += endPoint.X; - startPoint.Y += endPoint.Y; - } - else if (nextLine.StartsWith("FontSize")) - { - nextLine = nextLine.Remove(0, 8); - nextLine = nextLine.Trim(); - fontSize = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture); - myFont = new Font(fontName, fontSize); - } - else if (nextLine.StartsWith("FontProp")) - { - nextLine = nextLine.Remove(0, 8); - nextLine = nextLine.Trim(); - - string[] fprops = nextLine.Split(partsDelimiter); - foreach (string prop in fprops) + else if (nextLine.StartsWith("Text")) + { + nextLine = nextLine.Remove(0, 4); + nextLine = nextLine.Trim(); + graph.DrawString(nextLine, myFont, myBrush, startPoint); + } + else if (nextLine.StartsWith("Image")) { + float x = 0; + float y = 0; + GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); + endPoint.X = (int) x; + endPoint.Y = (int) y; - switch (prop) + using (Image image = ImageHttpRequest(nextLine)) { - case "B": - if (!(myFont.Bold)) - myFont = new Font(myFont, myFont.Style | FontStyle.Bold); - break; - case "I": - if (!(myFont.Italic)) - myFont = new Font(myFont, myFont.Style | FontStyle.Italic); - break; - case "U": - if (!(myFont.Underline)) - myFont = new Font(myFont, myFont.Style | FontStyle.Underline); - break; - case "S": - if (!(myFont.Strikeout)) - myFont = new Font(myFont, myFont.Style | FontStyle.Strikeout); - break; - case "R": - myFont = new Font(myFont, FontStyle.Regular); - break; + if (image != null) + { + graph.DrawImage(image, (float)startPoint.X, (float)startPoint.Y, x, y); + } + else + { + using (Font errorFont = new Font(m_fontName,6)) + { + graph.DrawString("URL couldn't be resolved or is", errorFont, + myBrush, startPoint); + graph.DrawString("not an image. Please check URL.", errorFont, + myBrush, new Point(startPoint.X, 12 + startPoint.Y)); + } + + graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); + } } + + startPoint.X += endPoint.X; + startPoint.Y += endPoint.Y; } - } - else if (nextLine.StartsWith("FontName")) - { - nextLine = nextLine.Remove(0, 8); - fontName = nextLine.Trim(); - myFont = new Font(fontName, fontSize); - } - else if (nextLine.StartsWith("PenSize")) - { - nextLine = nextLine.Remove(0, 7); - nextLine = nextLine.Trim(); - float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture); - drawPen.Width = size; - } - else if (nextLine.StartsWith("PenCap")) - { - bool start = true, end = true; - nextLine = nextLine.Remove(0, 6); - nextLine = nextLine.Trim(); - string[] cap = nextLine.Split(partsDelimiter); - if (cap[0].ToLower() == "start") - end = false; - else if (cap[0].ToLower() == "end") - start = false; - else if (cap[0].ToLower() != "both") - return; - string type = cap[1].ToLower(); - - if (end) + else if (nextLine.StartsWith("Rectangle")) { - switch (type) - { - case "arrow": - drawPen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; - break; - case "round": - drawPen.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor; - break; - case "diamond": - drawPen.EndCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; - break; - case "flat": - drawPen.EndCap = System.Drawing.Drawing2D.LineCap.Flat; - break; - } + float x = 0; + float y = 0; + GetParams(partsDelimiter, ref nextLine, 9, ref x, ref y); + endPoint.X = (int) x; + endPoint.Y = (int) y; + graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); + startPoint.X += endPoint.X; + startPoint.Y += endPoint.Y; + } + else if (nextLine.StartsWith("FillRectangle")) + { + float x = 0; + float y = 0; + GetParams(partsDelimiter, ref nextLine, 13, ref x, ref y); + endPoint.X = (int) x; + endPoint.Y = (int) y; + graph.FillRectangle(myBrush, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); + startPoint.X += endPoint.X; + startPoint.Y += endPoint.Y; + } + else if (nextLine.StartsWith("FillPolygon")) + { + PointF[] points = null; + GetParams(partsDelimiter, ref nextLine, 11, ref points); + graph.FillPolygon(myBrush, points); } - if (start) + else if (nextLine.StartsWith("Polygon")) { - switch (type) + PointF[] points = null; + GetParams(partsDelimiter, ref nextLine, 7, ref points); + graph.DrawPolygon(drawPen, points); + } + else if (nextLine.StartsWith("Ellipse")) + { + float x = 0; + float y = 0; + GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y); + endPoint.X = (int)x; + endPoint.Y = (int)y; + graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); + startPoint.X += endPoint.X; + startPoint.Y += endPoint.Y; + } + else if (nextLine.StartsWith("FontSize")) + { + nextLine = nextLine.Remove(0, 8); + nextLine = nextLine.Trim(); + fontSize = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture); + + myFont.Dispose(); + myFont = new Font(fontName, fontSize); + } + else if (nextLine.StartsWith("FontProp")) + { + nextLine = nextLine.Remove(0, 8); + nextLine = nextLine.Trim(); + + string[] fprops = nextLine.Split(partsDelimiter); + foreach (string prop in fprops) { - case "arrow": - drawPen.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; - break; - case "round": - drawPen.StartCap = System.Drawing.Drawing2D.LineCap.RoundAnchor; - break; - case "diamond": - drawPen.StartCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; - break; - case "flat": - drawPen.StartCap = System.Drawing.Drawing2D.LineCap.Flat; - break; + + switch (prop) + { + case "B": + if (!(myFont.Bold)) + { + Font newFont = new Font(myFont, myFont.Style | FontStyle.Bold); + myFont.Dispose(); + myFont = newFont; + } + break; + case "I": + if (!(myFont.Italic)) + { + Font newFont = new Font(myFont, myFont.Style | FontStyle.Italic); + myFont.Dispose(); + myFont = newFont; + } + break; + case "U": + if (!(myFont.Underline)) + { + Font newFont = new Font(myFont, myFont.Style | FontStyle.Underline); + myFont.Dispose(); + myFont = newFont; + } + break; + case "S": + if (!(myFont.Strikeout)) + { + Font newFont = new Font(myFont, myFont.Style | FontStyle.Strikeout); + myFont.Dispose(); + myFont = newFont; + } + break; + case "R": + Font newFont = new Font(myFont, FontStyle.Regular); + myFont.Dispose(); + myFont = newFont; + break; + } } } - } - else if (nextLine.StartsWith("PenColour") || nextLine.StartsWith("PenColor")) - { - nextLine = nextLine.Remove(0, 9); - nextLine = nextLine.Trim(); - int hex = 0; - - Color newColor; - if (Int32.TryParse(nextLine, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out hex)) + else if (nextLine.StartsWith("FontName")) { - newColor = Color.FromArgb(hex); + nextLine = nextLine.Remove(0, 8); + fontName = nextLine.Trim(); + myFont.Dispose(); + myFont = new Font(fontName, fontSize); } - else + else if (nextLine.StartsWith("PenSize")) { - // this doesn't fail, it just returns black if nothing is found - newColor = Color.FromName(nextLine); + nextLine = nextLine.Remove(0, 7); + nextLine = nextLine.Trim(); + float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture); + drawPen.Width = size; } + else if (nextLine.StartsWith("PenCap")) + { + bool start = true, end = true; + nextLine = nextLine.Remove(0, 6); + nextLine = nextLine.Trim(); + string[] cap = nextLine.Split(partsDelimiter); + if (cap[0].ToLower() == "start") + end = false; + else if (cap[0].ToLower() == "end") + start = false; + else if (cap[0].ToLower() != "both") + return; + string type = cap[1].ToLower(); + + if (end) + { + switch (type) + { + case "arrow": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; + break; + case "round": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor; + break; + case "diamond": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; + break; + case "flat": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.Flat; + break; + } + } + if (start) + { + switch (type) + { + case "arrow": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; + break; + case "round": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.RoundAnchor; + break; + case "diamond": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; + break; + case "flat": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.Flat; + break; + } + } + } + else if (nextLine.StartsWith("PenColour") || nextLine.StartsWith("PenColor")) + { + nextLine = nextLine.Remove(0, 9); + nextLine = nextLine.Trim(); + int hex = 0; + + Color newColor; + if (Int32.TryParse(nextLine, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out hex)) + { + newColor = Color.FromArgb(hex); + } + else + { + // this doesn't fail, it just returns black if nothing is found + newColor = Color.FromName(nextLine); + } - myBrush.Color = newColor; - drawPen.Color = newColor; + myBrush.Color = newColor; + drawPen.Color = newColor; + } } } + finally + { + if (drawPen != null) + drawPen.Dispose(); + + if (myFont != null) + myFont.Dispose(); + + if (myBrush != null) + myBrush.Dispose(); + } } private static void GetParams(char[] partsDelimiter, ref string line, int startLength, ref float x, ref float y) @@ -691,7 +753,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender { try { - WebRequest request = HttpWebRequest.Create(url); + WebRequest request = HttpWebRequest.Create(url); //Ckrinke: Comment out for now as 'str' is unused. Bring it back into play later when it is used. //Ckrinke Stream str = null; HttpWebResponse response = (HttpWebResponse)(request).GetResponse(); @@ -702,7 +764,8 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender } } catch { } + return null; } } -} +} \ No newline at end of file -- cgit v1.1 From 0cd698d82bc8f0fca4444a2691cd43147deb02a5 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 3 Aug 2012 00:23:03 +0100 Subject: Delete old blank SOGSpamTest --- .../Region/CoreModules/World/Tests/SOGSpamTest.cs | 37 ---------------------- 1 file changed, 37 deletions(-) delete mode 100644 OpenSim/Region/CoreModules/World/Tests/SOGSpamTest.cs (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/World/Tests/SOGSpamTest.cs b/OpenSim/Region/CoreModules/World/Tests/SOGSpamTest.cs deleted file mode 100644 index 53d775e..0000000 --- a/OpenSim/Region/CoreModules/World/Tests/SOGSpamTest.cs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace OpenSim.Region.CoreModules.World.Tests -{ - class SOGSpamTest - { - } -} -- cgit v1.1 From 0588f27d1886970e44765166714f24114d399fce Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 16 Jul 2012 10:30:38 +0300 Subject: Fixed a rare bug that caused Save OAR to fail because it thought it had timed-out The bug manifested as follows: a large world was saved. All the assets were found. But for some unknown reason, the timeout timer was restarted. So after 1 minute it closed the Archive Writer, because it didn't receive any more assets during that minute. That caused the OAR to become corrupted because ArchiveWriteRequestExecution.Save() was still running. --- .../Region/CoreModules/World/Archiver/AssetsRequest.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs index 55110dc..a073cb9 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs @@ -154,6 +154,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args) { + bool close = true; + try { lock (this) @@ -161,7 +163,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver // Take care of the possibilty that this thread started but was paused just outside the lock before // the final request came in (assuming that such a thing is possible) if (m_requestState == RequestState.Completed) + { + close = false; return; + } m_requestState = RequestState.Aborted; } @@ -208,7 +213,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver } finally { - m_assetsArchiver.ForceClose(); + if (close) + m_assetsArchiver.ForceClose(); } } @@ -242,11 +248,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_requestCallbackTimer.Stop(); - if (m_requestState == RequestState.Aborted) + if ((m_requestState == RequestState.Aborted) || (m_requestState == RequestState.Completed)) { m_log.WarnFormat( - "[ARCHIVER]: Received information about asset {0} after archive save abortion. Ignoring.", - id); + "[ARCHIVER]: Received information about asset {0} while in state {1}. Ignoring.", + id, m_requestState); return; } @@ -268,7 +274,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_notFoundAssetUuids.Add(new UUID(id)); } - if (m_foundAssetUuids.Count + m_notFoundAssetUuids.Count == m_repliesRequired) + if (m_foundAssetUuids.Count + m_notFoundAssetUuids.Count >= m_repliesRequired) { m_requestState = RequestState.Completed; -- cgit v1.1