Merge pull request #726 from pruiz/xamarin-bug-13708
[mono.git] / mcs / class / corlib / System.Globalization / RegionInfo.cs
index e34af971ea716c39c686d818049ef989272f199c..b6165a661d0ad1f4dac3498c8faa5e154b6df193 100644 (file)
@@ -1,12 +1,12 @@
 //
-// RegionInfo.cs
+// System.Globalization.RegionInfo.cs
 //
-// Author:
+// Authors:
 //     Atsushi Enomoto  <atsushi@ximian.com>
-//
-
+//   Marek Safar (marek.safar@gmail.com)
 //
 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2012 Xamarin Inc (http://www.xamarin.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.Globalization;
 using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
 
 namespace System.Globalization
 {
-#if NET_2_0
        [System.Runtime.InteropServices.ComVisible(true)]
-#endif
        [Serializable]
-       public class RegionInfo
+       [StructLayout (LayoutKind.Sequential)]
+       public partial class RegionInfo
        {
                static RegionInfo currentRegion;
 
@@ -48,29 +47,39 @@ namespace System.Globalization
                                        // make sure to fill BootstrapCultureID.
                                        CultureInfo ci = CultureInfo.CurrentCulture;
                                        // If current culture is invariant then region is not available.
-                                       if (ci == null || CultureInfo.BootstrapCultureID == 0x7F)
-                                               return null;
-                                       currentRegion = new RegionInfo (CultureInfo.BootstrapCultureID);
+                                       if (ci != null && CultureInfo.BootstrapCultureID != 0x7F)
+                                               currentRegion = new RegionInfo (CultureInfo.BootstrapCultureID);
+                                       else
+#if MONOTOUCH
+                                               currentRegion = CreateFromNSLocale ();
+#else
+                                               currentRegion = null;
+#endif
                                }
                                return currentRegion;
                        }
                }
-
+               
+               // the following (instance) fields must be _first_ and stay synchronized
+               // with the mono's MonoRegionInfo defined in mono/metadata/object-internals.h
+#pragma warning disable 649
                int regionId;
                string iso2Name;
                string iso3Name;
                string win3Name;
                string englishName;
+               string nativeName;
                string currencySymbol;
                string isoCurrencySymbol;
                string currencyEnglishName;
-
-               public RegionInfo (int lcid)
+               string currencyNativeName;
+#pragma warning restore 649
+               
+               public RegionInfo (int culture)
                {
-                       if (!construct_internal_region_from_lcid (lcid))
+                       if (!GetByTerritory (CultureInfo.GetCultureInfo (culture)))
                                throw new ArgumentException (
-                                       String.Format ("Region ID {0} (0x{0:X4}) is not a " +
-                                                       "supported region.", lcid), "lcid");
+                                       String.Format ("Region ID {0} (0x{0:X4}) is not a supported region.", culture), "culture");
                }
 
                public RegionInfo (string name)
@@ -78,23 +87,30 @@ namespace System.Globalization
                        if (name == null)
                                throw new ArgumentNullException ();
 
-                       if (!construct_internal_region_from_name (name.ToUpperInvariant ()))
-                               throw new ArgumentException ("Region name " + name +
-                                               " is not supported.", "name");
+                       if (construct_internal_region_from_name (name.ToUpperInvariant ())) {
+                               return;
+                       }
+                       if (!GetByTerritory (CultureInfo.GetCultureInfo (name)))
+                               throw new ArgumentException (String.Format ("Region name {0} is not supported.", name), "name");
                }
 
-               [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               private extern bool construct_internal_region_from_lcid (int lcid);
+               bool GetByTerritory (CultureInfo ci)
+               {
+                       if (ci == null)
+                               throw new Exception ("INTERNAL ERROR: should not happen.");
+                       if (ci.IsNeutralCulture || ci.Territory == null)
+                               return false;
+
+                       return construct_internal_region_from_name (ci.Territory.ToUpperInvariant ());
+               }
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern bool construct_internal_region_from_name (string name);
 
-#if NET_2_0
                [System.Runtime.InteropServices.ComVisible(false)]
                public virtual string CurrencyEnglishName {
                        get { return currencyEnglishName; }
                }
-#endif
 
                public virtual string CurrencySymbol {
                        get { return currencySymbol; }
@@ -109,6 +125,11 @@ namespace System.Globalization
                        get { return englishName; }
                }
 
+               [System.Runtime.InteropServices.ComVisible(false)]
+               public virtual int GeoId {
+                       get { return regionId; }
+               }
+
                public virtual bool IsMetric {
                        get {
                                switch (iso2Name) {
@@ -125,18 +146,15 @@ namespace System.Globalization
                        get { return isoCurrencySymbol; }
                }
 
-#if NET_2_0
-               [MonoTODO]
-               [System.Runtime.InteropServices.ComVisible(false)]
+               [ComVisible(false)]
                public virtual string NativeName {
-                       get { return DisplayName; }
+                       get { return nativeName; }
                }
 
-               [MonoTODO ("Not implemented")]
+               [ComVisible(false)]
                public virtual string CurrencyNativeName {
-                       get { throw new NotImplementedException (); }
+                       get { return currencyNativeName; }
                }
-#endif
 
                public virtual string Name {
                        get { return iso2Name; }
@@ -154,21 +172,16 @@ namespace System.Globalization
                        get { return iso2Name; }
                }
 
-               //
-               // methods
-
-#if NET_2_0
-#else
                public override bool Equals (object value)
                {
                        RegionInfo other = value as RegionInfo;
-                       return other != null && regionId == other.regionId;
+                       return other != null && Name == other.Name;
                }
 
-               public override int GetHashCode () {
-                       return regionId;
+               public override int GetHashCode ()
+               {
+                       return Name.GetHashCode ();
                }
-#endif
 
                public override string ToString ()
                {