File: system\operatingsystem.cs
Project: ndp\clr\src\bcl\mscorlib.csproj (mscorlib)
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
/*============================================================
**
** Class:    OperatingSystem
**
**
** Purpose: 
**
**
===========================================================*/
namespace System {
    using System.Runtime.Serialization;
    using System.Globalization;
    using System.Security.Permissions;
    using System.Runtime.InteropServices;
    using System.Diagnostics.Contracts;
 
 
    [ComVisible(true)]
    [Serializable]
    public sealed class OperatingSystem : ICloneable , ISerializable
    {
        private Version _version;
        private PlatformID _platform;
        private string _servicePack;
        private string _versionString;
 
        private OperatingSystem()
        {
        }
 
        public OperatingSystem(PlatformID platform, Version version) : this(platform, version, null) {
        }
    
        internal OperatingSystem(PlatformID platform, Version version, string servicePack) {
#if !FEATURE_LEGACYNETCF
            if( platform < PlatformID.Win32S || platform > PlatformID.MacOSX) {
#else // FEATURE_LEGACYNETCF
            if( platform < PlatformID.Win32S || platform > PlatformID.NokiaS60) {
#endif // FEATURE_LEGACYNETCF
                throw new ArgumentException(
                    Environment.GetResourceString("Arg_EnumIllegalVal", (int)platform),
                    "platform");
            }
 
            if ((Object) version == null)
                throw new ArgumentNullException("version");
            Contract.EndContractBlock();
 
            _platform = platform;
            _version = (Version) version.Clone();
            _servicePack = servicePack;
        }
        
        private OperatingSystem(SerializationInfo info, StreamingContext context) {            
            SerializationInfoEnumerator enumerator = info.GetEnumerator();                        
            while( enumerator.MoveNext()) {
                switch( enumerator.Name) {
                    case "_version":
                        _version = (Version) info.GetValue("_version", typeof(Version));
                        break;
                    case "_platform":
                        _platform = (PlatformID) info.GetValue("_platform", typeof(PlatformID));
                        break;
                    case "_servicePack":
                        _servicePack = info.GetString("_servicePack");
                        break;
                }
            }
 
            if (_version == null ) {
                throw new SerializationException(Environment.GetResourceString("Serialization_MissField", "_version"));
            }
        }
 
        [System.Security.SecurityCritical]  // auto-generated_required
        public void GetObjectData(SerializationInfo info, StreamingContext context) {
            if( info == null ) {
                throw new ArgumentNullException("info");
            }
            Contract.EndContractBlock();
 
            info.AddValue("_version", _version);
            info.AddValue("_platform", _platform);
            info.AddValue("_servicePack", _servicePack);
        }        
 
        public PlatformID Platform {
            get { return _platform; }
        }
        
        public string ServicePack { 
            get { 
                if( _servicePack == null) {
                    return string.Empty;
                }
 
                return _servicePack;
            }
        }    
 
        public Version Version {
            get { return _version; }
        }
    
        public Object Clone() {
            return new OperatingSystem(_platform,
                                       _version, _servicePack );
        }
    
        public override String ToString() {
            return VersionString;
        }
 
        public String VersionString {
            get {
                if(_versionString != null) {
                    return _versionString;
                }
 
                String os;
                switch(_platform)
                {
                    case PlatformID.Win32NT:
                        os = "Microsoft Windows NT ";
                        break;
                    case PlatformID.Win32Windows:
                        if ((_version.Major > 4) ||
                            ((_version.Major == 4) && (_version.Minor > 0)))
                            os = "Microsoft Windows 98 ";
                        else
                            os = "Microsoft Windows 95 ";
                        break;
                    case PlatformID.Win32S:
                        os = "Microsoft Win32S ";
                        break;
                    case PlatformID.WinCE:
                        os = "Microsoft Windows CE ";
                        break;
#if !FEATURE_LEGACYNETCF
                    case PlatformID.MacOSX:
                        os = "Mac OS X ";
                        break;
#endif
                    default:
                        os = "<unknown> ";
                        break;
                }
 
                if( String.IsNullOrEmpty(_servicePack)) {
                    _versionString = os + _version.ToString();
                }
                else {
                    _versionString = os + _version.ToString(3) + " " + _servicePack;
                }
 
                return _versionString;            
            }
        }
    }
}