// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
/*============================================================
 **
 ** Class: SoapFault
 **
 ** <EMAIL>Author: Peter de Jong (Microsoft)</EMAIL>
 **
 ** Purpose: Specifies information for a Soap Fault
 **
 ** Date:  June 27, 2000
 **
 ===========================================================*/
#if FEATURE_REMOTING || MOBILE_LEGACY
namespace System.Runtime.Serialization.Formatters
{
    using System;
    using System.Runtime.Serialization;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Metadata;
    using System.Globalization;
    using System.Security.Permissions;

    //* Class holds soap fault information

[Serializable]
[SoapType(Embedded=true)]    
[System.Runtime.InteropServices.ComVisible(true)]
    public sealed class SoapFault : ISerializable
    {
        String faultCode;
        String faultString;
        String faultActor;
        [SoapField(Embedded=true)] Object detail;

        public SoapFault()
        {
        }

        public SoapFault(String faultCode, String faultString, String faultActor, ServerFault serverFault)
        {
            this.faultCode = faultCode;
            this.faultString = faultString;
            this.faultActor = faultActor;
            this.detail = serverFault;
        }

        internal SoapFault(SerializationInfo info, StreamingContext context)
        {
            SerializationInfoEnumerator siEnum = info.GetEnumerator();        

            while(siEnum.MoveNext())
            {
                String name = siEnum.Name;
                Object value = siEnum.Value;
                SerTrace.Log(this, "SetObjectData enum ",name," value ",value);
                if (String.Compare(name, "faultCode", true, CultureInfo.InvariantCulture) == 0)
                {
                    int index = ((String)value).IndexOf(':');
                    if (index > -1)
                        faultCode = ((String)value).Substring(++index);
                    else
                        faultCode = (String)value;
                }
                else if (String.Compare(name, "faultString", true, CultureInfo.InvariantCulture) == 0)
                    faultString = (String)value;
                else if (String.Compare(name, "faultActor", true, CultureInfo.InvariantCulture) == 0)
                    faultActor = (String)value;
                else if (String.Compare(name, "detail", true, CultureInfo.InvariantCulture) == 0)
                    detail = value;
            }
        }

        [System.Security.SecurityCritical]  // auto-generated_required
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("faultcode", "SOAP-ENV:"+faultCode);
            info.AddValue("faultstring", faultString);
            if (faultActor != null)
                info.AddValue("faultactor", faultActor);
            info.AddValue("detail", detail, typeof(Object));
        }

        public String FaultCode
        {
            get {return faultCode;}
            set { faultCode = value;}
        }

        public String FaultString
        {
            get {return faultString;}
            set { faultString = value;}
        }


        public String FaultActor
        {
            get {return faultActor;}
            set { faultActor = value;}
        }


        public Object Detail
        {
            get {return detail;}
            set {detail = value;}
        }
    }

[Serializable]
[SoapType(Embedded=true)]
[System.Runtime.InteropServices.ComVisible(true)]
    public sealed class ServerFault
    {
        String exceptionType;
        String message;
        String stackTrace;
        Exception exception;

        internal ServerFault(Exception exception)
        {
            this.exception = exception;
            //this.exceptionType = exception.GetType().AssemblyQualifiedName;
            //this.message = exception.Message;
        }

        public ServerFault(String exceptionType, String message, String stackTrace)
        {
            this.exceptionType = exceptionType;
            this.message = message;
            this.stackTrace = stackTrace;
        }


        public String ExceptionType
        {
            get {return exceptionType;}
            set { exceptionType = value;}
        }
        
        public String ExceptionMessage
        {
            get {return message;}
            set { message = value;}
        }


        public String StackTrace
        {
            get {return stackTrace;}
            set {stackTrace = value;}
        }

        internal Exception Exception
        {
            get {return exception;}
        }
    }
}
#endif // FEATURE_REMOTING
