mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-04 10:11:30 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			410 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			410 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
// This code is derived from jcifs smb client library <jcifs at samba dot org>
 | 
						|
// Ported by J. Arturo <webmaster at komodosoft dot net>
 | 
						|
//  
 | 
						|
// This library is free software; you can redistribute it and/or
 | 
						|
// modify it under the terms of the GNU Lesser General Public
 | 
						|
// License as published by the Free Software Foundation; either
 | 
						|
// version 2.1 of the License, or (at your option) any later version.
 | 
						|
// 
 | 
						|
// This library is distributed in the hope that it will be useful,
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
// Lesser General Public License for more details.
 | 
						|
// 
 | 
						|
// You should have received a copy of the GNU Lesser General Public
 | 
						|
// License along with this library; if not, write to the Free Software
 | 
						|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
using System;
 | 
						|
using System.IO;
 | 
						|
using System.Net;
 | 
						|
using System.Security;
 | 
						|
using SharpCifs.Util;
 | 
						|
using SharpCifs.Util.Sharpen;
 | 
						|
 | 
						|
namespace SharpCifs
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// This class uses a static
 | 
						|
    /// <see cref="Properties">Sharpen.Properties</see>
 | 
						|
    /// to act
 | 
						|
    /// as a cental repository for all jCIFS configuration properties. It cannot be
 | 
						|
    /// instantiated. Similar to <code>System</code> properties the namespace
 | 
						|
    /// is global therefore property names should be unique. Before use,
 | 
						|
    /// the <code>load</code> method should be called with the name of a
 | 
						|
    /// <code>Properties</code> file (or <code>null</code> indicating no
 | 
						|
    /// file) to initialize the <code>Config</code>. The <code>System</code>
 | 
						|
    /// properties will then populate the <code>Config</code> as well potentially
 | 
						|
    /// overwriting properties from the file. Thus properties provided on the
 | 
						|
    /// commandline with the <code>-Dproperty.name=value</code> VM parameter
 | 
						|
    /// will override properties from the configuration file.
 | 
						|
    /// 
 | 
						|
    /// There are several ways to set jCIFS properties. See
 | 
						|
    /// the <a href="../overview-summary.html#scp">overview page of the API
 | 
						|
    /// documentation</a> for details.
 | 
						|
    /// </summary>
 | 
						|
    public class Config
 | 
						|
    {        
 | 
						|
 | 
						|
        /// <summary>The static <code>Properties</code>.</summary>
 | 
						|
        /// <remarks>The static <code>Properties</code>.</remarks>
 | 
						|
        private static Properties _prp = new Properties();
 | 
						|
 | 
						|
        private static LogStream _log;
 | 
						|
 | 
						|
        public static string DefaultOemEncoding = "UTF-8"; //"Cp850";
 | 
						|
 | 
						|
        static Config()
 | 
						|
        {
 | 
						|
            int level;
 | 
						|
            FileInputStream fis = null;
 | 
						|
            _log = LogStream.GetInstance();
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                string filename = Runtime.GetProperty("jcifs.properties");
 | 
						|
                if (filename != null && filename.Length > 1)
 | 
						|
                {
 | 
						|
                    fis = new FileInputStream(filename);
 | 
						|
                }
 | 
						|
                Load(fis);
 | 
						|
                if (fis != null)
 | 
						|
                {
 | 
						|
                    fis.Close();
 | 
						|
                }
 | 
						|
            }
 | 
						|
            catch (IOException ioe)
 | 
						|
            {
 | 
						|
                if (_log.Level > 0)
 | 
						|
                {
 | 
						|
                    Runtime.PrintStackTrace(ioe, _log);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if ((level = GetInt("jcifs.util.loglevel", -1)) != -1)
 | 
						|
            {
 | 
						|
                _log.SetLevel(level);
 | 
						|
            }
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                Runtime.GetBytesForString(string.Empty, DefaultOemEncoding);
 | 
						|
            }
 | 
						|
            catch (Exception)
 | 
						|
            {
 | 
						|
                if (_log.Level >= 2)
 | 
						|
                {
 | 
						|
                    _log.WriteLine("WARNING: The default OEM encoding " + DefaultOemEncoding + " does not appear to be supported by this JRE. The default encoding will be US-ASCII."
 | 
						|
                        );
 | 
						|
                }
 | 
						|
 | 
						|
                //DEFAULT_OEM_ENCODING = "US-ASCII";
 | 
						|
            }
 | 
						|
 | 
						|
            if (_log.Level >= 4)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    _prp.Store(_log);
 | 
						|
                }
 | 
						|
                catch (IOException)
 | 
						|
                {
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// This static method registers the SMB URL protocol handler which is
 | 
						|
        /// required to use SMB URLs with the <tt>java.net.URL</tt> class.
 | 
						|
        /// </summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// This static method registers the SMB URL protocol handler which is
 | 
						|
        /// required to use SMB URLs with the <tt>java.net.URL</tt> class. If this
 | 
						|
        /// method is not called before attempting to create an SMB URL with the
 | 
						|
        /// URL class the following exception will occur:
 | 
						|
        /// <blockquote><pre>
 | 
						|
        /// Exception MalformedURLException: unknown protocol: smb
 | 
						|
        /// at java.net.URL.<init>(URL.java:480)
 | 
						|
        /// at java.net.URL.<init>(URL.java:376)
 | 
						|
        /// at java.net.URL.<init>(URL.java:330)
 | 
						|
        /// at jcifs.smb.SmbFile.<init>(SmbFile.java:355)
 | 
						|
        /// ...
 | 
						|
        /// </pre><blockquote>
 | 
						|
        /// </remarks>
 | 
						|
        public static void RegisterSmbURLHandler()
 | 
						|
        {
 | 
						|
            throw new NotImplementedException();
 | 
						|
        }
 | 
						|
 | 
						|
        // supress javadoc constructor summary by removing 'protected'
 | 
						|
        /// <summary>Set the default properties of the static Properties used by <tt>Config</tt>.
 | 
						|
        /// 	</summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Set the default properties of the static Properties used by <tt>Config</tt>. This permits
 | 
						|
        /// a different Properties object/file to be used as the source of properties for
 | 
						|
        /// use by the jCIFS library. The Properties must be set <i>before jCIFS
 | 
						|
        /// classes are accessed</i> as most jCIFS classes load properties statically once.
 | 
						|
        /// Using this method will also override properties loaded
 | 
						|
        /// using the <tt>-Djcifs.properties=</tt> commandline parameter.
 | 
						|
        /// </remarks>
 | 
						|
        public static void SetProperties(Properties prp)
 | 
						|
        {
 | 
						|
            Config._prp = new Properties(prp);
 | 
						|
            try
 | 
						|
            {
 | 
						|
                Config._prp.PutAll(Runtime.GetProperties());
 | 
						|
            }
 | 
						|
            catch (SecurityException)
 | 
						|
            {
 | 
						|
                if (_log.Level > 1)
 | 
						|
                {
 | 
						|
                    _log.WriteLine("SecurityException: jcifs will ignore System properties");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Load the <code>Config</code> with properties from the stream
 | 
						|
        /// <code>in</code> from a <code>Properties</code> file.
 | 
						|
        /// </summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Load the <code>Config</code> with properties from the stream
 | 
						|
        /// <code>in</code> from a <code>Properties</code> file.
 | 
						|
        /// </remarks>
 | 
						|
        /// <exception cref="System.IO.IOException"></exception>
 | 
						|
        public static void Load(InputStream input)
 | 
						|
        {
 | 
						|
            if (input != null)
 | 
						|
            {
 | 
						|
                _prp.Load(input);
 | 
						|
            }
 | 
						|
            try
 | 
						|
            {
 | 
						|
                _prp.PutAll(Runtime.GetProperties());
 | 
						|
            }
 | 
						|
            catch (SecurityException)
 | 
						|
            {
 | 
						|
                if (_log.Level > 1)
 | 
						|
                {
 | 
						|
                    _log.WriteLine("SecurityException: jcifs will ignore System properties");
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <exception cref="System.IO.IOException"></exception>
 | 
						|
        public static void Store(OutputStream output, string header)
 | 
						|
        {
 | 
						|
            _prp.Store(output);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Add a property.</summary>
 | 
						|
        /// <remarks>Add a property.</remarks>
 | 
						|
        public static void SetProperty(string key, string value)
 | 
						|
        {
 | 
						|
            _prp.SetProperty(key, value);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve a property as an <code>Object</code>.</summary>
 | 
						|
        /// <remarks>Retrieve a property as an <code>Object</code>.</remarks>
 | 
						|
        public static object Get(string key)
 | 
						|
        {
 | 
						|
            return _prp.GetProperty(key);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve a <code>String</code>.</summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Retrieve a <code>String</code>. If the key cannot be found,
 | 
						|
        /// the provided <code>def</code> default parameter will be returned.
 | 
						|
        /// </remarks>
 | 
						|
        public static string GetProperty(string key, string def)
 | 
						|
        {
 | 
						|
            return (string)_prp.GetProperty(key, def);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve a <code>String</code>.</summary>
 | 
						|
        /// <remarks>Retrieve a <code>String</code>. If the property is not found, <code>null</code> is returned.
 | 
						|
        /// 	</remarks>
 | 
						|
        public static string GetProperty(string key)
 | 
						|
        {
 | 
						|
            return (string)_prp.GetProperty(key);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve an <code>int</code>.</summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Retrieve an <code>int</code>. If the key does not exist or
 | 
						|
        /// cannot be converted to an <code>int</code>, the provided default
 | 
						|
        /// argument will be returned.
 | 
						|
        /// </remarks>
 | 
						|
        public static int GetInt(string key, int def)
 | 
						|
        {
 | 
						|
            string s = (string)_prp.GetProperty(key);
 | 
						|
            if (s != null)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    def = Convert.ToInt32(s);
 | 
						|
                }
 | 
						|
                catch (FormatException nfe)
 | 
						|
                {
 | 
						|
                    if (_log.Level > 0)
 | 
						|
                    {
 | 
						|
                        Runtime.PrintStackTrace(nfe, _log);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return def;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve an <code>int</code>.</summary>
 | 
						|
        /// <remarks>Retrieve an <code>int</code>. If the property is not found, <code>-1</code> is returned.
 | 
						|
        /// 	</remarks>
 | 
						|
        public static int GetInt(string key)
 | 
						|
        {
 | 
						|
            string s = (string)_prp.GetProperty(key);
 | 
						|
            int result = -1;
 | 
						|
            if (s != null)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    result = Convert.ToInt32(s);
 | 
						|
                }
 | 
						|
                catch (FormatException nfe)
 | 
						|
                {
 | 
						|
                    if (_log.Level > 0)
 | 
						|
                    {
 | 
						|
                        Runtime.PrintStackTrace(nfe, _log);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve a <code>long</code>.</summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Retrieve a <code>long</code>. If the key does not exist or
 | 
						|
        /// cannot be converted to a <code>long</code>, the provided default
 | 
						|
        /// argument will be returned.
 | 
						|
        /// </remarks>
 | 
						|
        public static long GetLong(string key, long def)
 | 
						|
        {
 | 
						|
            string s = (string)_prp.GetProperty(key);
 | 
						|
            if (s != null)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    def = long.Parse(s);
 | 
						|
                }
 | 
						|
                catch (FormatException nfe)
 | 
						|
                {
 | 
						|
                    if (_log.Level > 0)
 | 
						|
                    {
 | 
						|
                        Runtime.PrintStackTrace(nfe, _log);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return def;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve an <code>InetAddress</code>.</summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Retrieve an <code>InetAddress</code>. If the address is not
 | 
						|
        /// an IP address and cannot be resolved <code>null</code> will
 | 
						|
        /// be returned.
 | 
						|
        /// </remarks>
 | 
						|
        public static IPAddress GetInetAddress(string key, IPAddress def)
 | 
						|
        {
 | 
						|
            string addr = (string)_prp.GetProperty(key);
 | 
						|
            if (addr != null)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    def = Extensions.GetAddressByName(addr);
 | 
						|
                }
 | 
						|
                catch (UnknownHostException uhe)
 | 
						|
                {
 | 
						|
                    if (_log.Level > 0)
 | 
						|
                    {
 | 
						|
                        _log.WriteLine(addr);
 | 
						|
                        Runtime.PrintStackTrace(uhe, _log);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return def;
 | 
						|
        }
 | 
						|
 | 
						|
        public static IPAddress GetLocalHost()
 | 
						|
        {
 | 
						|
            string addr = (string)_prp.GetProperty("jcifs.smb.client.laddr");
 | 
						|
            if (addr != null)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    return Extensions.GetAddressByName(addr);
 | 
						|
                }
 | 
						|
                catch (UnknownHostException uhe)
 | 
						|
                {
 | 
						|
                    if (_log.Level > 0)
 | 
						|
                    {
 | 
						|
                        _log.WriteLine("Ignoring jcifs.smb.client.laddr address: " + addr);
 | 
						|
                        Runtime.PrintStackTrace(uhe, _log);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Retrieve a boolean value.</summary>
 | 
						|
        /// <remarks>Retrieve a boolean value. If the property is not found, the value of <code>def</code> is returned.
 | 
						|
        /// 	</remarks>
 | 
						|
        public static bool GetBoolean(string key, bool def)
 | 
						|
        {
 | 
						|
            string b = GetProperty(key);
 | 
						|
            if (b != null)
 | 
						|
            {
 | 
						|
                def = b.ToLower().Equals("true");
 | 
						|
            }
 | 
						|
            return def;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Retrieve an array of <tt>InetAddress</tt> created from a property
 | 
						|
        /// value containting a <tt>delim</tt> separated list of hostnames and/or
 | 
						|
        /// ipaddresses.
 | 
						|
        /// </summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Retrieve an array of <tt>InetAddress</tt> created from a property
 | 
						|
        /// value containting a <tt>delim</tt> separated list of hostnames and/or
 | 
						|
        /// ipaddresses.
 | 
						|
        /// </remarks>
 | 
						|
        public static IPAddress[] GetInetAddressArray(string key, string delim, IPAddress
 | 
						|
            [] def)
 | 
						|
        {
 | 
						|
            string p = GetProperty(key);
 | 
						|
            if (p != null)
 | 
						|
            {
 | 
						|
                StringTokenizer tok = new StringTokenizer(p, delim);
 | 
						|
                int len = tok.CountTokens();
 | 
						|
                IPAddress[] arr = new IPAddress[len];
 | 
						|
                for (int i = 0; i < len; i++)
 | 
						|
                {
 | 
						|
                    string addr = tok.NextToken();
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        arr[i] = Extensions.GetAddressByName(addr);
 | 
						|
                    }
 | 
						|
                    catch (UnknownHostException uhe)
 | 
						|
                    {
 | 
						|
                        if (_log.Level > 0)
 | 
						|
                        {
 | 
						|
                            _log.WriteLine(addr);
 | 
						|
                            Runtime.PrintStackTrace(uhe, _log);
 | 
						|
                        }
 | 
						|
                        return def;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                return arr;
 | 
						|
            }
 | 
						|
            return def;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |