// 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 ;
}
}
}