diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2015-10-18 16:13:07 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2015-10-18 16:13:07 +0700 |
commit | f0c658a6d112912f819dced69348573f2a529c05 (patch) | |
tree | 6bf59e150efe6cc3c2f941df7a62a0deb7341dec | |
parent | No SerializableAttribute in PCL (diff) | |
download | BouncyCastle.NET-ed25519-f0c658a6d112912f819dced69348573f2a529c05.tar.xz |
PCL: Various non-IO changes
30 files changed, 91 insertions, 46 deletions
diff --git a/crypto/src/AssemblyInfo.cs b/crypto/src/AssemblyInfo.cs index 4a813bc5a..36beb99c4 100644 --- a/crypto/src/AssemblyInfo.cs +++ b/crypto/src/AssemblyInfo.cs @@ -65,7 +65,9 @@ using System.Runtime.InteropServices; [assembly: AssemblyKeyName("")] [assembly: CLSCompliant(true)] +#if !PORTABLE [assembly: ComVisible(false)] +#endif // Start with no permissions //[assembly: PermissionSet(SecurityAction.RequestOptional, Unrestricted=false)] diff --git a/crypto/src/asn1/DerGeneralizedTime.cs b/crypto/src/asn1/DerGeneralizedTime.cs index 548a268e1..6700b9016 100644 --- a/crypto/src/asn1/DerGeneralizedTime.cs +++ b/crypto/src/asn1/DerGeneralizedTime.cs @@ -159,7 +159,7 @@ namespace Org.BouncyCastle.Asn1 char sign = '+'; DateTime time = ToDateTime(); -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE long offset = time.Ticks - time.ToUniversalTime().Ticks; if (offset < 0) { diff --git a/crypto/src/asn1/cms/AttributeTable.cs b/crypto/src/asn1/cms/AttributeTable.cs index 8a3ee5d0e..8d357f1a6 100644 --- a/crypto/src/asn1/cms/AttributeTable.cs +++ b/crypto/src/asn1/cms/AttributeTable.cs @@ -10,7 +10,7 @@ namespace Org.BouncyCastle.Asn1.Cms { private readonly IDictionary attributes; -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public AttributeTable( Hashtable attrs) @@ -168,7 +168,7 @@ namespace Org.BouncyCastle.Asn1.Cms return Platform.CreateHashtable(attributes); } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete("Use 'ToDictionary' instead")] public Hashtable ToHashtable() { diff --git a/crypto/src/asn1/smime/SMIMECapabilities.cs b/crypto/src/asn1/smime/SMIMECapabilities.cs index 5fb67dde1..6435caf68 100644 --- a/crypto/src/asn1/smime/SMIMECapabilities.cs +++ b/crypto/src/asn1/smime/SMIMECapabilities.cs @@ -71,7 +71,7 @@ namespace Org.BouncyCastle.Asn1.Smime capabilities = seq; } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete("Use 'GetCapabilitiesForOid' instead")] public ArrayList GetCapabilities( DerObjectIdentifier capability) diff --git a/crypto/src/asn1/util/Dump.cs b/crypto/src/asn1/util/Dump.cs index 27c87f127..99ced5836 100644 --- a/crypto/src/asn1/util/Dump.cs +++ b/crypto/src/asn1/util/Dump.cs @@ -1,5 +1,4 @@ -using Org.BouncyCastle.Asn1; - +#if !PORTABLE using System; using System.IO; @@ -26,3 +25,4 @@ namespace Org.BouncyCastle.Asn1.Utilities } } } +#endif diff --git a/crypto/src/asn1/x509/AttributeTable.cs b/crypto/src/asn1/x509/AttributeTable.cs index ffe0ea935..33faad64a 100644 --- a/crypto/src/asn1/x509/AttributeTable.cs +++ b/crypto/src/asn1/x509/AttributeTable.cs @@ -16,7 +16,7 @@ namespace Org.BouncyCastle.Asn1.X509 this.attributes = Platform.CreateHashtable(attrs); } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public AttributeTable( Hashtable attrs) @@ -57,7 +57,7 @@ namespace Org.BouncyCastle.Asn1.X509 return (AttributeX509) attributes[oid]; } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete("Use 'ToDictionary' instead")] public Hashtable ToHashtable() { diff --git a/crypto/src/asn1/x509/ExtendedKeyUsage.cs b/crypto/src/asn1/x509/ExtendedKeyUsage.cs index a5b11f210..9b1400db9 100644 --- a/crypto/src/asn1/x509/ExtendedKeyUsage.cs +++ b/crypto/src/asn1/x509/ExtendedKeyUsage.cs @@ -70,7 +70,7 @@ namespace Org.BouncyCastle.Asn1.X509 } } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public ExtendedKeyUsage( ArrayList usages) @@ -101,7 +101,7 @@ namespace Org.BouncyCastle.Asn1.X509 return usageTable.Contains(keyPurposeId); } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete("Use 'GetAllUsages'")] public ArrayList GetUsages() { diff --git a/crypto/src/asn1/x509/NameConstraints.cs b/crypto/src/asn1/x509/NameConstraints.cs index 8374ff60a..c178f5b45 100644 --- a/crypto/src/asn1/x509/NameConstraints.cs +++ b/crypto/src/asn1/x509/NameConstraints.cs @@ -41,7 +41,7 @@ namespace Org.BouncyCastle.Asn1.X509 } } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) public NameConstraints( ArrayList permitted, ArrayList excluded) diff --git a/crypto/src/asn1/x509/PolicyMappings.cs b/crypto/src/asn1/x509/PolicyMappings.cs index 3ad351107..928ad134d 100644 --- a/crypto/src/asn1/x509/PolicyMappings.cs +++ b/crypto/src/asn1/x509/PolicyMappings.cs @@ -29,7 +29,7 @@ namespace Org.BouncyCastle.Asn1.X509 this.seq = seq; } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) public PolicyMappings( Hashtable mappings) : this((IDictionary)mappings) diff --git a/crypto/src/asn1/x509/SubjectDirectoryAttributes.cs b/crypto/src/asn1/x509/SubjectDirectoryAttributes.cs index fcb30290d..c76d94d78 100644 --- a/crypto/src/asn1/x509/SubjectDirectoryAttributes.cs +++ b/crypto/src/asn1/x509/SubjectDirectoryAttributes.cs @@ -78,7 +78,7 @@ namespace Org.BouncyCastle.Asn1.X509 } } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public SubjectDirectoryAttributes( ArrayList attributes) diff --git a/crypto/src/asn1/x509/X509Extensions.cs b/crypto/src/asn1/x509/X509Extensions.cs index 5dce5622d..1896450f5 100644 --- a/crypto/src/asn1/x509/X509Extensions.cs +++ b/crypto/src/asn1/x509/X509Extensions.cs @@ -278,7 +278,7 @@ namespace Org.BouncyCastle.Asn1.X509 } } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) /** * constructor from a table of extensions. * <p> diff --git a/crypto/src/asn1/x509/X509Name.cs b/crypto/src/asn1/x509/X509Name.cs index c183e5798..fb404a3ec 100644 --- a/crypto/src/asn1/x509/X509Name.cs +++ b/crypto/src/asn1/x509/X509Name.cs @@ -3,7 +3,7 @@ using System.Collections; using System.IO; using System.Text; -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE using System.Collections.Generic; #endif @@ -203,7 +203,7 @@ namespace Org.BouncyCastle.Asn1.X509 private static readonly bool[] defaultReverse = { false }; -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE /** * default look up table translating OID values into their common symbols following * the convention in RFC 2253 with a few extras @@ -1027,7 +1027,7 @@ namespace Org.BouncyCastle.Asn1.X509 bool reverse, IDictionary oidSymbols) { -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE List<object> components = new List<object>(); #else ArrayList components = new ArrayList(); diff --git a/crypto/src/bcpg/ArmoredOutputStream.cs b/crypto/src/bcpg/ArmoredOutputStream.cs index 5d4b6b5a7..fb1f6eb29 100644 --- a/crypto/src/bcpg/ArmoredOutputStream.cs +++ b/crypto/src/bcpg/ArmoredOutputStream.cs @@ -5,6 +5,10 @@ using System.IO; using System.Reflection; using System.Text; +#if PORTABLE +using System.Linq; +#endif + using Org.BouncyCastle.Utilities; using Org.BouncyCastle.Utilities.IO; @@ -98,7 +102,15 @@ namespace Org.BouncyCastle.Bcpg private static readonly string footerTail = "-----"; private static readonly string version = "BCPG C# v" +#if PORTABLE + + Assembly.GetExecutingAssembly() + .GetCustomAttributes(typeof(AssemblyVersionAttribute), true) + .Cast<AssemblyVersionAttribute>() + .First() + .Version; +#else + Assembly.GetExecutingAssembly().GetName().Version; +#endif private readonly IDictionary headers; diff --git a/crypto/src/cms/CMSSignedDataGenerator.cs b/crypto/src/cms/CMSSignedDataGenerator.cs index 201cfc5c4..07ee1a8d8 100644 --- a/crypto/src/cms/CMSSignedDataGenerator.cs +++ b/crypto/src/cms/CMSSignedDataGenerator.cs @@ -136,7 +136,7 @@ namespace Org.BouncyCastle.Cms IStreamCalculator calculator = sigCalc.CreateCalculator(); -#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT +#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE Stream sigStr = new SigOutputStream(calculator.Stream); #else Stream sigStr = new BufferedStream(calculator.Stream); diff --git a/crypto/src/cms/CMSTypedStream.cs b/crypto/src/cms/CMSTypedStream.cs index d04846ee1..b7b390c4c 100644 --- a/crypto/src/cms/CMSTypedStream.cs +++ b/crypto/src/cms/CMSTypedStream.cs @@ -32,7 +32,7 @@ namespace Org.BouncyCastle.Cms int bufSize) { _oid = oid; -#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT +#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE _in = new FullReaderStream(inStream); #else _in = new FullReaderStream(new BufferedStream(inStream, bufSize)); diff --git a/crypto/src/cms/DefaultSignedAttributeTableGenerator.cs b/crypto/src/cms/DefaultSignedAttributeTableGenerator.cs index 055de8957..925a98a3c 100644 --- a/crypto/src/cms/DefaultSignedAttributeTableGenerator.cs +++ b/crypto/src/cms/DefaultSignedAttributeTableGenerator.cs @@ -41,7 +41,7 @@ namespace Org.BouncyCastle.Cms } } -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE /** * Create a standard attribute table from the passed in parameters - this will * normally include contentType, signingTime, and messageDigest. If the constructor diff --git a/crypto/src/crypto/modes/CcmBlockCipher.cs b/crypto/src/crypto/modes/CcmBlockCipher.cs index 19e273d7c..4de40d58e 100644 --- a/crypto/src/crypto/modes/CcmBlockCipher.cs +++ b/crypto/src/crypto/modes/CcmBlockCipher.cs @@ -148,7 +148,15 @@ namespace Org.BouncyCastle.Crypto.Modes byte[] outBytes, int outOff) { - int len = ProcessPacket(data.GetBuffer(), 0, (int)data.Position, outBytes, outOff); +#if PORTABLE + byte[] input = data.ToArray(); + int inLen = input.Length; +#else + byte[] input = data.GetBuffer(); + int inLen = (int)data.Position; +#endif + + int len = ProcessPacket(input, 0, inLen, outBytes, outOff); Reset(); @@ -399,7 +407,15 @@ namespace Org.BouncyCastle.Crypto.Modes } if (associatedText.Position > 0) { - cMac.BlockUpdate(associatedText.GetBuffer(), 0, (int)associatedText.Position); +#if PORTABLE + byte[] input = associatedText.ToArray(); + int len = input.Length; +#else + byte[] input = associatedText.GetBuffer(); + int len = (int)associatedText.Position; +#endif + + cMac.BlockUpdate(input, 0, len); } extra = (extra + textLength) % 16; diff --git a/crypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs b/crypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs index 0e1fe14b7..42a0454a1 100644 --- a/crypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs +++ b/crypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs @@ -16,7 +16,7 @@ namespace Org.BouncyCastle.Crypto.Parameters private readonly BigInteger phiN; private readonly IList smallPrimes; -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public NaccacheSternPrivateKeyParameters( BigInteger g, @@ -63,7 +63,7 @@ namespace Org.BouncyCastle.Crypto.Parameters get { return phiN; } } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete("Use 'SmallPrimesList' instead")] public ArrayList SmallPrimes { diff --git a/crypto/src/crypto/prng/CryptoApiRandomGenerator.cs b/crypto/src/crypto/prng/CryptoApiRandomGenerator.cs index 521fae33e..fa5f523d3 100644 --- a/crypto/src/crypto/prng/CryptoApiRandomGenerator.cs +++ b/crypto/src/crypto/prng/CryptoApiRandomGenerator.cs @@ -1,4 +1,4 @@ -#if !NETCF_1_0 +#if !(NETCF_1_0 || PORTABLE) using System; using System.Security.Cryptography; diff --git a/crypto/src/crypto/prng/ThreadedSeedGenerator.cs b/crypto/src/crypto/prng/ThreadedSeedGenerator.cs index c29ad2c9a..f6a6b3c54 100644 --- a/crypto/src/crypto/prng/ThreadedSeedGenerator.cs +++ b/crypto/src/crypto/prng/ThreadedSeedGenerator.cs @@ -34,7 +34,7 @@ namespace Org.BouncyCastle.Crypto.Prng int numBytes, bool fast) { -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE return DoGenerateSeed(numBytes, fast); #else ThreadPriority originalPriority = Thread.CurrentThread.Priority; @@ -69,7 +69,11 @@ namespace Org.BouncyCastle.Crypto.Prng { try { - Thread.Sleep(1); +#if PORTABLE + new AutoResetEvent(false).WaitOne(1); +#else + Thread.Sleep(1); +#endif } catch (Exception) { diff --git a/crypto/src/pkcs/AsymmetricKeyEntry.cs b/crypto/src/pkcs/AsymmetricKeyEntry.cs index 1c37631d5..6da3ade3e 100644 --- a/crypto/src/pkcs/AsymmetricKeyEntry.cs +++ b/crypto/src/pkcs/AsymmetricKeyEntry.cs @@ -18,7 +18,7 @@ namespace Org.BouncyCastle.Pkcs this.key = key; } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public AsymmetricKeyEntry( AsymmetricKeyParameter key, diff --git a/crypto/src/pkcs/X509CertificateEntry.cs b/crypto/src/pkcs/X509CertificateEntry.cs index a621619fb..2f81dd87b 100644 --- a/crypto/src/pkcs/X509CertificateEntry.cs +++ b/crypto/src/pkcs/X509CertificateEntry.cs @@ -18,7 +18,7 @@ namespace Org.BouncyCastle.Pkcs this.cert = cert; } -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) [Obsolete] public X509CertificateEntry( X509Certificate cert, diff --git a/crypto/src/pkix/PkixCertPath.cs b/crypto/src/pkix/PkixCertPath.cs index e3d3ea7fe..23a53c396 100644 --- a/crypto/src/pkix/PkixCertPath.cs +++ b/crypto/src/pkix/PkixCertPath.cs @@ -208,12 +208,12 @@ namespace Org.BouncyCastle.Pkix string encoding) // : base("X.509") { - string upper = encoding.ToUpper(); + string upper = Platform.ToUpperInvariant(encoding); IList certs; try { - if (upper.Equals("PkiPath".ToUpper())) + if (upper.Equals(Platform.ToUpperInvariant("PkiPath"))) { Asn1InputStream derInStream = new Asn1InputStream(inStream); Asn1Object derObject = derInStream.ReadObject(); diff --git a/crypto/src/pkix/PkixNameConstraintValidator.cs b/crypto/src/pkix/PkixNameConstraintValidator.cs index 535f95174..cf944beae 100644 --- a/crypto/src/pkix/PkixNameConstraintValidator.cs +++ b/crypto/src/pkix/PkixNameConstraintValidator.cs @@ -638,7 +638,7 @@ namespace Org.BouncyCastle.Pkix // a particular mailbox if (constraint.IndexOf('@') != -1) { - if (email.ToUpper().Equals(constraint.ToUpper())) + if (Platform.ToUpperInvariant(email).Equals(Platform.ToUpperInvariant(constraint))) { return true; } @@ -646,7 +646,7 @@ namespace Org.BouncyCastle.Pkix // on particular host else if (!(constraint[0].Equals('.'))) { - if (sub.ToUpper().Equals(constraint.ToUpper())) + if (Platform.ToUpperInvariant(sub).Equals(Platform.ToUpperInvariant(constraint))) { return true; } @@ -708,7 +708,8 @@ namespace Org.BouncyCastle.Pkix String str = ((String)it.Current); // is sub domain - if (WithinDomain(dns, str) || dns.ToUpper().Equals(str.ToUpper())) + if (WithinDomain(dns, str) + || Platform.ToUpperInvariant(dns).Equals(Platform.ToUpperInvariant(str))) { return; } diff --git a/crypto/src/security/DotNetUtilities.cs b/crypto/src/security/DotNetUtilities.cs index 732b5e075..69322b549 100644 --- a/crypto/src/security/DotNetUtilities.cs +++ b/crypto/src/security/DotNetUtilities.cs @@ -1,4 +1,4 @@ -#if !(NETCF_1_0 || SILVERLIGHT) +#if !(NETCF_1_0 || SILVERLIGHT || PORTABLE) using System; using System.Security.Cryptography; diff --git a/crypto/src/security/SecureRandom.cs b/crypto/src/security/SecureRandom.cs index 137a471c1..5bad57a14 100644 --- a/crypto/src/security/SecureRandom.cs +++ b/crypto/src/security/SecureRandom.cs @@ -13,7 +13,7 @@ namespace Org.BouncyCastle.Security { private static long counter = Times.NanoTime(); -#if NETCF_1_0 +#if NETCF_1_0 || PORTABLE private static object counterLock = new object(); private static long NextCounterValue() { diff --git a/crypto/src/util/Enums.cs b/crypto/src/util/Enums.cs index 8bd9c4053..25b218667 100644 --- a/crypto/src/util/Enums.cs +++ b/crypto/src/util/Enums.cs @@ -1,7 +1,7 @@ using System; using System.Text; -#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT +#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE using System.Collections; using System.Reflection; #endif @@ -42,7 +42,7 @@ namespace Org.BouncyCastle.Utilities if (!enumType.IsEnum) throw new ArgumentException("Not an enumeration type", "enumType"); -#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT +#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE IList result = Platform.CreateArrayList(); FieldInfo[] fields = enumType.GetFields(BindingFlags.Static | BindingFlags.Public); foreach (FieldInfo field in fields) diff --git a/crypto/src/util/Platform.cs b/crypto/src/util/Platform.cs index 99d3982ea..bfed0950a 100644 --- a/crypto/src/util/Platform.cs +++ b/crypto/src/util/Platform.cs @@ -3,7 +3,7 @@ using System.Globalization; using System.IO; using System.Text; -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE using System.Collections.Generic; #else using System.Collections; @@ -34,12 +34,14 @@ namespace Org.BouncyCastle.Utilities { #if SILVERLIGHT return String.Compare(a, b, StringComparison.InvariantCultureIgnoreCase); +#elif PORTABLE + return String.Compare(a, b, CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); #else return String.Compare(a, b, true); #endif } -#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT +#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE internal static string GetEnvironmentVariable( string variable) { @@ -83,7 +85,7 @@ namespace Org.BouncyCastle.Utilities } #endif -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE internal static System.Collections.IList CreateArrayList() { return new List<object>(); @@ -165,12 +167,20 @@ namespace Org.BouncyCastle.Utilities internal static string ToLowerInvariant(string s) { +#if PORTABLE + return s.ToLowerInvariant(); +#else return s.ToLower(CultureInfo.InvariantCulture); +#endif } internal static string ToUpperInvariant(string s) { +#if PORTABLE + return s.ToUpperInvariant(); +#else return s.ToUpper(CultureInfo.InvariantCulture); +#endif } internal static readonly string NewLine = GetNewLine(); diff --git a/crypto/src/util/Strings.cs b/crypto/src/util/Strings.cs index a6080f427..3937a087f 100644 --- a/crypto/src/util/Strings.cs +++ b/crypto/src/util/Strings.cs @@ -52,7 +52,7 @@ namespace Org.BouncyCastle.Utilities public static string FromAsciiByteArray( byte[] bytes) { -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE // TODO Check for non-ASCII bytes in input? return Encoding.UTF8.GetString(bytes, 0, bytes.Length); #else @@ -63,7 +63,7 @@ namespace Org.BouncyCastle.Utilities public static byte[] ToAsciiByteArray( char[] cs) { -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE // TODO Check for non-ASCII characters in input? return Encoding.UTF8.GetBytes(cs); #else @@ -74,7 +74,7 @@ namespace Org.BouncyCastle.Utilities public static byte[] ToAsciiByteArray( string s) { -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE // TODO Check for non-ASCII characters in input? return Encoding.UTF8.GetBytes(s); #else diff --git a/crypto/src/x509/store/IX509Selector.cs b/crypto/src/x509/store/IX509Selector.cs index 09f6f1849..75358cbbf 100644 --- a/crypto/src/x509/store/IX509Selector.cs +++ b/crypto/src/x509/store/IX509Selector.cs @@ -3,11 +3,11 @@ using System; namespace Org.BouncyCastle.X509.Store { public interface IX509Selector -#if !SILVERLIGHT +#if !(SILVERLIGHT || PORTABLE) : ICloneable #endif { -#if SILVERLIGHT +#if SILVERLIGHT || PORTABLE object Clone(); #endif bool Match(object obj); |