Bump corefx (#5167)
[mono.git] / mcs / class / System.Drawing / System.Drawing.Text / PrivateFontCollection.cs
index e5d46ed8397de5e1f7120f3635c367f40d4e3920..bc8daea7471fb9c8ced842f511fe2cee706d5699 100644 (file)
@@ -4,10 +4,10 @@
 // (C) 2002 Ximian, Inc.  http://www.ximian.com
 // Author: Everaldo Canuto everaldo.canuto@bol.com.br
 //             Sanjay Gupta (gsanjay@novell.com)
+//             Peter Dennis Bartok (pbartok@novell.com)
 //
-
 //
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004 - 2006 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;
+
 using System.IO;
-using System.Drawing;
 using System.Runtime.InteropServices;
 
 namespace System.Drawing.Text {
 
-       [ComVisible(false)]
        public sealed class PrivateFontCollection : FontCollection {
 
                // constructors
-               internal PrivateFontCollection (IntPtr ptr): base (ptr)
-               {}
 
-               public PrivateFontCollection()
+               public PrivateFontCollection ()
                {
-                       Status status = GDIPlus.GdipNewPrivateFontCollection (out nativeFontCollection);
+                       Status status = GDIPlus.GdipNewPrivateFontCollection (out _nativeFontCollection);
                        GDIPlus.CheckStatus (status);
                }
                
                // methods
-               public void AddFontFile(string filename) 
+               public void AddFontFile (string filename) 
                {
-                       if ( filename == null )
-                               throw new Exception ("Value cannot be null, Parameter name : filename");
-                       bool exists = File.Exists(filename);
-                       if (!exists)
-                               throw new Exception ("The path is not of a legal form");
+                       if (filename == null)
+                               throw new ArgumentNullException ("filename");
+
+                       // this ensure the filename is valid (or throw the correct exception)
+                       string fname = Path.GetFullPath (filename);
+
+                       if (!File.Exists (fname))
+                               throw new FileNotFoundException ();
 
-                       Status status = GDIPlus.GdipPrivateAddFontFile (nativeFontCollection, filename);
+                       // note: MS throw the same exception FileNotFoundException if the file exists but isn't a valid font file
+                       Status status = GDIPlus.GdipPrivateAddFontFile (_nativeFontCollection, fname);
                        GDIPlus.CheckStatus (status);                   
                }
 
-               public void AddMemoryFont(IntPtr memory, int length) 
+               public void AddMemoryFont (IntPtr memory, int length) 
                {
-                       Status status = GDIPlus.GdipPrivateAddMemoryFont (nativeFontCollection, memory, length);
+                       // note: MS throw FileNotFoundException if something is bad with the data (except for a null pointer)
+                       Status status = GDIPlus.GdipPrivateAddMemoryFont (_nativeFontCollection, memory, length);
                        GDIPlus.CheckStatus (status);                                           
                }
                
                // methods      
-               protected override void Dispose(bool disposing)
+               protected override void Dispose (bool disposing)
                {
-                       if (nativeFontCollection!=IntPtr.Zero){                         
-                               GDIPlus.GdipDeletePrivateFontCollection (nativeFontCollection);                                                 
-                               nativeFontCollection = IntPtr.Zero;
+                       if (_nativeFontCollection!=IntPtr.Zero) {
+                               GDIPlus.GdipDeletePrivateFontCollection (ref _nativeFontCollection);                                                    
+
+                               // This must be zeroed out, otherwise our base will also call
+                               // the GDI+ delete method on unix platforms. We're keeping the
+                               // base.Dispose() call in case other cleanup ever gets added there
+                               _nativeFontCollection = IntPtr.Zero;
                        }
                        
-                       base.Dispose (true);
+                       base.Dispose (disposing);
                }               
-               
-
        }
 }
-