/// <summary>
        /// Parses the XML through the specified reader and creates an Autodiscover error.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>An Autodiscover error.</returns>
        internal static AutodiscoverError Parse(EwsXmlReader reader)
        {
            AutodiscoverError error = new AutodiscoverError();

            error.time = reader.ReadAttributeValue(XmlAttributeNames.Time);
            error.id = reader.ReadAttributeValue(XmlAttributeNames.Id);

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.ErrorCode:
                            error.errorCode = reader.ReadElementValue<int>();
                            break;
                        case XmlElementNames.Message:
                            error.message = reader.ReadElementValue();
                            break;
                        case XmlElementNames.DebugData:
                            error.debugData = reader.ReadElementValue();
                            break;
                        default:
                            reader.SkipCurrentElement();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Error));

            return error;
        }
Пример #2
0
        /// <summary>
        /// Load from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.DisplayName:
                            this.displayName = reader.ReadElementValue();
                            break;
                        case XmlElementNames.LegacyDN:
                            this.legacyDN = reader.ReadElementValue();
                            break;
                        case XmlElementNames.DeploymentId:
                            this.deploymentId = reader.ReadElementValue();
                            break;
                        case XmlElementNames.AutoDiscoverSMTPAddress:
                            this.autodiscoverAMTPAddress = reader.ReadElementValue();
                            break;
                        default:
                            reader.SkipCurrentElement();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.User));
        }
        /// <summary>
        /// Read user setting with ProtocolConnection value.
        /// </summary>
        /// <param name="reader">EwsServiceXmlReader</param>
        internal static ProtocolConnection LoadFromXml(EwsXmlReader reader)
        {
            ProtocolConnection connection = new ProtocolConnection();
            
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.EncryptionMethod:
                            connection.EncryptionMethod = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.Hostname:
                            connection.Hostname = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.Port:
                            connection.Port = reader.ReadElementValue<int>();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.ProtocolConnection));

            return connection;
        }
        /// <summary>
        /// Read user setting with ProtocolConnectionCollection value.
        /// </summary>
        /// <param name="reader">EwsServiceXmlReader</param>
        internal static ProtocolConnectionCollection LoadFromXml(EwsXmlReader reader)
        {
            ProtocolConnectionCollection value = new ProtocolConnectionCollection();
            ProtocolConnection connection = null;

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.LocalName == XmlElementNames.ProtocolConnection)
                    {
                        connection = ProtocolConnection.LoadFromXml(reader);
                        if (connection != null)
                        {
                            value.Connections.Add(connection);
                        }
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.ProtocolConnections));

            return value;
        }
Пример #5
0
        /// <summary>
        /// Loads WebClientUrl instance from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>WebClientUrl.</returns>
        internal static WebClientUrl LoadFromXml(EwsXmlReader reader)
        {
            WebClientUrl webClientUrl = new WebClientUrl();

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.AuthenticationMethods:
                            webClientUrl.AuthenticationMethods = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.Url:
                            webClientUrl.Url = reader.ReadElementValue<string>();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.WebClientUrl));

            return webClientUrl;
        }
        /// <summary>
        /// Load from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.AccountType:
                            this.AccountType = reader.ReadElementValue();
                            break;
                        case XmlElementNames.Action:
                            string xmlResponseType = reader.ReadElementValue();

                            switch (xmlResponseType)
                            {
                                case OutlookAccount.Settings:
                                    this.ResponseType = AutodiscoverResponseType.Success;
                                    break;
                                case OutlookAccount.RedirectUrl:
                                    this.ResponseType = AutodiscoverResponseType.RedirectUrl;
                                    break;
                                case OutlookAccount.RedirectAddr:
                                    this.ResponseType = AutodiscoverResponseType.RedirectAddress;
                                    break;
                                default:
                                    this.ResponseType = AutodiscoverResponseType.Error;
                                    break;
                            }

                            break;
                        case XmlElementNames.Protocol:
                            OutlookProtocol protocol = new OutlookProtocol();
                            protocol.LoadFromXml(reader);
                            if (this.protocols.ContainsKey(protocol.ProtocolType))
                            {
                                // There should be strictly one node per protocol type in the autodiscover response.
                                throw new ServiceLocalException(Strings.InvalidAutodiscoverServiceResponse);
                            }
                            this.protocols.Add(protocol.ProtocolType, protocol);
                            break;
                        case XmlElementNames.RedirectAddr:
                        case XmlElementNames.RedirectUrl:
                            this.RedirectTarget = reader.ReadElementValue();
                            break;
                        case XmlElementNames.AlternateMailboxes:
                            AlternateMailbox alternateMailbox = AlternateMailbox.LoadFromXml(reader);
                            this.alternateMailboxes.Entries.Add(alternateMailbox);
                            break;

                        default:
                            reader.SkipCurrentElement();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Account));
        }
 /// <summary>
 /// Reads a single SOAP header.
 /// </summary>
 /// <param name="reader">EwsXmlReader</param>
 internal virtual void ReadSoapHeader(EwsXmlReader reader)
 {
     // Is this the ServerVersionInfo?
     if (reader.IsStartElement(XmlNamespace.Autodiscover, XmlElementNames.ServerVersionInfo))
     {
         this.service.ServerInfo = this.ReadServerVersionInfo(reader);
     }
 }
        /// <summary>
        /// Read SOAP body.
        /// </summary>
        /// <param name="reader">EwsXmlReader</param>
        internal AutodiscoverResponse ReadSoapBody(EwsXmlReader reader)
        {
            reader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName);
            AutodiscoverResponse responses = this.LoadFromXml(reader);

            reader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName);
            return(responses);
        }
        /// <summary>
        /// Read SOAP headers.
        /// </summary>
        /// <param name="reader">EwsXmlReader</param>
        internal void ReadSoapHeaders(EwsXmlReader reader)
        {
            reader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPHeaderElementName);
            do
            {
                reader.Read();

                this.ReadSoapHeader(reader);
            }while (!reader.IsEndElement(XmlNamespace.Soap, XmlElementNames.SOAPHeaderElementName));
        }
        /// <summary>
        /// Loads responses from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns></returns>
        internal AutodiscoverResponse LoadFromXml(EwsXmlReader reader)
        {
            string elementName = this.GetResponseXmlElementName();

            reader.ReadStartElement(XmlNamespace.Autodiscover, elementName);
            AutodiscoverResponse response = this.CreateServiceResponse();

            response.LoadFromXml(reader, elementName);
            return(response);
        }
Пример #11
0
        /// <summary>
        /// Tries to read the current XML element.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>True is the current element was read, false otherwise.</returns>
        internal virtual bool TryReadCurrentXmlElement(EwsXmlReader reader)
        {
            if (reader.LocalName == XmlElementNames.Error)
            {
                this.error = AutodiscoverError.Parse(reader);

                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Tries to read the current XML element.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>True is the current element was read, false otherwise.</returns>
        internal virtual bool TryReadCurrentXmlElement(EwsXmlReader reader)
        {
            if (reader.LocalName == XmlElementNames.Error)
            {
                this.error = AutodiscoverError.Parse(reader);

                return true;
            }
            else
            {
                return false;
            }
        }
 /// <summary>
 /// Loads response from XML.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <param name="endElementName">End element name.</param>
 internal virtual void LoadFromXml(EwsXmlReader reader, string endElementName)
 {
     switch (reader.LocalName)
     {
         case XmlElementNames.ErrorCode:
             this.ErrorCode = reader.ReadElementValue<AutodiscoverErrorCode>();
             break;
         case XmlElementNames.ErrorMessage:
             this.ErrorMessage = reader.ReadElementValue();
             break;
         default:
             break;
     }
 }
        /// <summary>
        /// Processes the web exception.
        /// </summary>
        /// <param name="webException">The web exception.</param>
        private void ProcessWebException(WebException webException)
        {
            if (webException.Response != null)
            {
                IEwsHttpWebResponse httpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(webException);
                SoapFaultDetails    soapFaultDetails;

                if (httpWebResponse.StatusCode == HttpStatusCode.InternalServerError)
                {
                    // If tracing is enabled, we read the entire response into a MemoryStream so that we
                    // can pass it along to the ITraceListener. Then we parse the response from the
                    // MemoryStream.
                    if (this.Service.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest))
                    {
                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            using (Stream serviceResponseStream = AutodiscoverRequest.GetResponseStream(httpWebResponse))
                            {
                                // Copy response to in-memory stream and reset position to start.
                                EwsUtilities.CopyStream(serviceResponseStream, memoryStream);
                                memoryStream.Position = 0;
                            }

                            this.Service.TraceResponse(httpWebResponse, memoryStream);

                            EwsXmlReader reader = new EwsXmlReader(memoryStream);
                            soapFaultDetails = this.ReadSoapFault(reader);
                        }
                    }
                    else
                    {
                        using (Stream stream = AutodiscoverRequest.GetResponseStream(httpWebResponse))
                        {
                            EwsXmlReader reader = new EwsXmlReader(stream);
                            soapFaultDetails = this.ReadSoapFault(reader);
                        }
                    }

                    if (soapFaultDetails != null)
                    {
                        throw new ServiceResponseException(new ServiceResponse(soapFaultDetails));
                    }
                }
                else
                {
                    this.Service.ProcessHttpErrorResponse(httpWebResponse, webException);
                }
            }
        }
Пример #15
0
        /// <summary>
        /// Loads response from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="endElementName">End element name.</param>
        internal virtual void LoadFromXml(EwsXmlReader reader, string endElementName)
        {
            switch (reader.LocalName)
            {
            case XmlElementNames.ErrorCode:
                this.ErrorCode = reader.ReadElementValue <AutodiscoverErrorCode>();
                break;

            case XmlElementNames.ErrorMessage:
                this.ErrorMessage = reader.ReadElementValue();
                break;

            default:
                break;
            }
        }
Пример #16
0
        /// <summary>
        /// Loads instance of AlternateMailboxCollection from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>AlternateMailboxCollection</returns>
        internal static AlternateMailboxCollection LoadFromXml(EwsXmlReader reader)
        {
            AlternateMailboxCollection instance = new AlternateMailboxCollection();

            do
            {
                reader.Read();

                if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.AlternateMailbox))
                {
                    instance.Entries.Add(AlternateMailbox.LoadFromXml(reader));
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.AlternateMailboxes));

            return(instance);
        }
 /// <summary>
 /// Loads the response collection from XML.
 /// </summary>
 /// <param name="reader">The reader.</param>
 private void LoadResponseCollectionFromXml(EwsXmlReader reader)
 {
     if (!reader.IsEmptyElement)
     {
         do
         {
             reader.Read();
             if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == this.GetResponseInstanceXmlElementName()))
             {
                 TResponse response = this.CreateResponseInstance();
                 response.LoadFromXml(reader, this.GetResponseInstanceXmlElementName());
                 this.Responses.Add(response);
             }
         }while (!reader.IsEndElement(XmlNamespace.Autodiscover, this.GetResponseCollectionXmlElementName()));
     }
 }
        /// <summary>
        /// Loads instance of WebClientUrlCollection from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal static WebClientUrlCollection LoadFromXml(EwsXmlReader reader)
        {
            WebClientUrlCollection instance = new WebClientUrlCollection();

            do
            {
                reader.Read();

                if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.WebClientUrl))
                {
                    instance.Urls.Add(WebClientUrl.LoadFromXml(reader));
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.WebClientUrls));

            return(instance);
        }
        /// <summary>
        /// Read the partner token soap header.
        /// </summary>
        /// <param name="reader">EwsXmlReader</param>
        internal override void ReadSoapHeader(EwsXmlReader reader)
        {
            base.ReadSoapHeader(reader);

            if (this.expectPartnerToken)
            {
                if (reader.IsStartElement(XmlNamespace.Autodiscover, XmlElementNames.PartnerToken))
                {
                    this.PartnerToken = reader.ReadInnerXml();
                }

                if (reader.IsStartElement(XmlNamespace.Autodiscover, XmlElementNames.PartnerTokenReference))
                {
                    this.PartnerTokenReference = reader.ReadInnerXml();
                }
            }
        }
        /// <summary>
        /// Loads instance of AlternateMailboxCollection from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>AlternateMailboxCollection</returns>
        internal static AlternateMailboxCollection LoadFromXml(EwsXmlReader reader)
        {
            AlternateMailboxCollection instance = new AlternateMailboxCollection();

            do
            {
                reader.Read();

                if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.AlternateMailbox))
                {
                    instance.Entries.Add(AlternateMailbox.LoadFromXml(reader));
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.AlternateMailboxes));

            return instance;
        }
Пример #21
0
        /// <summary>
        /// Loads the user setting errors.
        /// </summary>
        /// <param name="reader">The reader.</param>
        private void LoadUserSettingErrorsFromXml(EwsXmlReader reader)
        {
            if (!reader.IsEmptyElement)
            {
                do
                {
                    reader.Read();

                    if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.UserSettingError))
                    {
                        UserSettingError error = new UserSettingError();
                        error.LoadFromXml(reader);
                        this.UserSettingErrors.Add(error);
                    }
                }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.UserSettingErrors));
            }
        }
Пример #22
0
        /// <summary>
        /// Loads instance of DocumentSharingLocationCollection from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>DocumentSharingLocationCollection</returns>
        internal static DocumentSharingLocationCollection LoadFromXml(EwsXmlReader reader)
        {
            DocumentSharingLocationCollection instance = new DocumentSharingLocationCollection();

            do
            {
                reader.Read();

                if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.DocumentSharingLocation))
                {
                    DocumentSharingLocation location = DocumentSharingLocation.LoadFromXml(reader);
                    instance.Entries.Add(location);
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.DocumentSharingLocations));

            return(instance);
        }
        /// <summary>
        /// Loads instance of WebClientUrlCollection from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal static WebClientUrlCollection LoadFromXml(EwsXmlReader reader)
        {
            WebClientUrlCollection instance = new WebClientUrlCollection();

            do
            {
                reader.Read();

                if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.WebClientUrl))
                {
                    instance.Urls.Add(WebClientUrl.LoadFromXml(reader));
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.WebClientUrls));

            return instance;
        }
        /// <summary>
        /// Loads instance of DocumentSharingLocationCollection from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>DocumentSharingLocationCollection</returns>
        internal static DocumentSharingLocationCollection LoadFromXml(EwsXmlReader reader)
        {
            DocumentSharingLocationCollection instance = new DocumentSharingLocationCollection();

            do
            {
                reader.Read();

                if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == XmlElementNames.DocumentSharingLocation))
                {
                    DocumentSharingLocation location = DocumentSharingLocation.LoadFromXml(reader);
                    instance.Entries.Add(location);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.DocumentSharingLocations));

            return instance;
        }
        /// <summary>
        /// Loads AlternateMailbox instance from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>AlternateMailbox.</returns>
        internal static AlternateMailbox LoadFromXml(EwsXmlReader reader)
        {
            AlternateMailbox altMailbox = new AlternateMailbox();

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.Type:
                        altMailbox.Type = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.DisplayName:
                        altMailbox.DisplayName = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.LegacyDN:
                        altMailbox.LegacyDN = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.Server:
                        altMailbox.Server = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.SmtpAddress:
                        altMailbox.SmtpAddress = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.OwnerSmtpAddress:
                        altMailbox.OwnerSmtpAddress = reader.ReadElementValue <string>();
                        break;

                    default:
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.AlternateMailbox));

            return(altMailbox);
        }
        /// <summary>
        /// Loads response from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="endElementName">End element name.</param>
        internal override void LoadFromXml(EwsXmlReader reader, string endElementName)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.LocalName == this.GetResponseCollectionXmlElementName())
                    {
                        this.LoadResponseCollectionFromXml(reader);
                    }
                    else
                    {
                        base.LoadFromXml(reader, endElementName);
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, endElementName));
        }
Пример #27
0
        /// <summary>
        /// Loads the settings from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            reader.ReadStartElement(XmlNamespace.NotSpecified, XmlElementNames.Autodiscover);
            reader.ReadStartElement(XmlNamespace.NotSpecified, XmlElementNames.Response);

            do
            {
                reader.Read();

                if (reader.IsStartElement())
                {
                    if (!this.TryReadCurrentXmlElement(reader))
                    {
                        reader.SkipCurrentElement();
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Response));

            reader.ReadEndElement(XmlNamespace.NotSpecified, XmlElementNames.Autodiscover);
        }
        /// <summary>
        /// Loads the settings from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            reader.ReadStartElement(XmlNamespace.NotSpecified, XmlElementNames.Autodiscover);
            reader.ReadStartElement(XmlNamespace.NotSpecified, XmlElementNames.Response);

            do
            {
                reader.Read();

                if (reader.IsStartElement())
                {
                    if (!this.TryReadCurrentXmlElement(reader))
                    {
                        reader.SkipCurrentElement();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Response));

            reader.ReadEndElement(XmlNamespace.NotSpecified, XmlElementNames.Autodiscover);
        }
        /// <summary>
        /// Read ServerVersionInfo SOAP header.
        /// </summary>
        /// <param name="reader">EwsXmlReader</param>
        private ExchangeServerInfo ReadServerVersionInfo(EwsXmlReader reader)
        {
            ExchangeServerInfo serverInfo = new ExchangeServerInfo();

            do
            {
                reader.Read();

                if (reader.IsStartElement())
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.MajorVersion:
                        serverInfo.MajorVersion = reader.ReadElementValue <int>();
                        break;

                    case XmlElementNames.MinorVersion:
                        serverInfo.MinorVersion = reader.ReadElementValue <int>();
                        break;

                    case XmlElementNames.MajorBuildNumber:
                        serverInfo.MajorBuildNumber = reader.ReadElementValue <int>();
                        break;

                    case XmlElementNames.MinorBuildNumber:
                        serverInfo.MinorBuildNumber = reader.ReadElementValue <int>();
                        break;

                    case XmlElementNames.Version:
                        serverInfo.VersionString = reader.ReadElementValue();
                        break;

                    default:
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.ServerVersionInfo));

            return(serverInfo);
        }
Пример #30
0
        /// <summary>
        /// Loads AlternateMailbox instance from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>AlternateMailbox.</returns>
        internal static AlternateMailbox LoadFromXml(EwsXmlReader reader)
        {
            AlternateMailbox altMailbox = new AlternateMailbox();

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.Type:
                            altMailbox.Type = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.DisplayName:
                            altMailbox.DisplayName = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.LegacyDN:
                            altMailbox.LegacyDN = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.Server:
                            altMailbox.Server = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.SmtpAddress:
                            altMailbox.SmtpAddress = reader.ReadElementValue<string>();
                            break;
                        case XmlElementNames.OwnerSmtpAddress:
                            altMailbox.OwnerSmtpAddress = reader.ReadElementValue<string>();
                            break;
                        default:
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.AlternateMailbox));

            return altMailbox;
        }
        /// <summary>
        /// Tries to read the current XML element.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>True is the current element was read, false otherwise.</returns>
        internal override bool TryReadCurrentXmlElement(EwsXmlReader reader)
        {
            if (!base.TryReadCurrentXmlElement(reader))
            {
                switch (reader.LocalName)
                {
                case XmlElementNames.User:
                    this.user.LoadFromXml(reader);
                    return(true);

                case XmlElementNames.Account:
                    this.account.LoadFromXml(reader);
                    return(true);

                default:
                    reader.SkipCurrentElement();
                    return(false);
                }
            }
            else
            {
                return(true);
            }
        }
Пример #32
0
        /// <summary>
        /// Loads web client urls from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="webClientUrls">The web client urls.</param>
        /// <param name="elementName">Name of the element.</param>
        private static void LoadWebClientUrlsFromXml(EwsXmlReader reader, WebClientUrlCollection webClientUrls, string elementName)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.OWAUrl:
                        string       authMethod   = reader.ReadAttributeValue(XmlAttributeNames.AuthenticationMethod);
                        string       owaUrl       = reader.ReadElementValue();
                        WebClientUrl webClientUrl = new WebClientUrl(authMethod, owaUrl);
                        webClientUrls.Urls.Add(webClientUrl);
                        break;

                    default:
                        reader.SkipCurrentElement();
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.NotSpecified, elementName));
        }
        /// <summary>
        /// Loads from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.ErrorCode:
                            this.errorCode = reader.ReadElementValue<AutodiscoverErrorCode>();
                            break;
                        case XmlElementNames.ErrorMessage:
                            this.errorMessage = reader.ReadElementValue();
                            break;
                        case XmlElementNames.SettingName:
                            this.settingName = reader.ReadElementValue();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.DomainSettingError));
        }
Пример #34
0
        /// <summary>
        /// Read user setting with ProtocolConnectionCollection value.
        /// </summary>
        /// <param name="reader">EwsServiceXmlReader</param>
        internal static ProtocolConnectionCollection LoadFromXml(EwsXmlReader reader)
        {
            ProtocolConnectionCollection value      = new ProtocolConnectionCollection();
            ProtocolConnection           connection = null;

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.LocalName == XmlElementNames.ProtocolConnection)
                    {
                        connection = ProtocolConnection.LoadFromXml(reader);
                        if (connection != null)
                        {
                            value.Connections.Add(connection);
                        }
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.ProtocolConnections));

            return(value);
        }
        /// <summary>
        /// Loads from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.ErrorCode:
                            this.errorCode = reader.ReadElementValue<AutodiscoverErrorCode>();
                            break;
                        case XmlElementNames.ErrorMessage:
                            this.errorMessage = reader.ReadElementValue();
                            break;
                        case XmlElementNames.SettingName:
                            this.settingName = reader.ReadElementValue();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.DomainSettingError));
        }
Пример #36
0
        /// <summary>
        /// Parses the XML through the specified reader and creates an Autodiscover error.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>An Autodiscover error.</returns>
        internal static AutodiscoverError Parse(EwsXmlReader reader)
        {
            AutodiscoverError error = new AutodiscoverError();

            error.time = reader.ReadAttributeValue(XmlAttributeNames.Time);
            error.id   = reader.ReadAttributeValue(XmlAttributeNames.Id);

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.ErrorCode:
                        error.errorCode = reader.ReadElementValue <int>();
                        break;

                    case XmlElementNames.Message:
                        error.message = reader.ReadElementValue();
                        break;

                    case XmlElementNames.DebugData:
                        error.debugData = reader.ReadElementValue();
                        break;

                    default:
                        reader.SkipCurrentElement();
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Error));

            return(error);
        }
        /// <summary>
        /// Grabs the issued token information out of a response from Windows Live.
        /// </summary>
        /// <param name="response">The token response</param>
        private void ProcessTokenResponse(HttpWebResponse response)
        {
            // NOTE: We're not tracing responses here because they contain the actual token information
            // from Windows Live.    
            using (Stream responseStream = response.GetResponseStream())
            {
                // Always start fresh (nulls in all the data we're going to fill in).
                this.SecurityToken = null;

                EwsXmlReader rstResponse = new EwsXmlReader(responseStream);

                rstResponse.Read(XmlNodeType.XmlDeclaration);
                rstResponse.ReadStartElement(
                    WindowsLiveSoapNamespacePrefix,
                    XmlElementNames.SOAPEnvelopeElementName);

                // Process the SOAP headers from the response.
                this.ReadWindowsLiveRSTResponseHeaders(rstResponse);

                rstResponse.ReadStartElement(
                    WindowsLiveSoapNamespacePrefix,
                    XmlElementNames.SOAPBodyElementName);

                // Process the SOAP body from the response.
                this.ParseWindowsLiveRSTResponseBody(rstResponse);
            }
        }
        /// <summary>
        /// Function that parses the RSTR from Windows Live and pulls out all the important pieces
        /// of data from it.
        /// </summary>
        /// <param name="rstResponse">The RSTR, positioned at the beginning of the SOAP body.</param>
        private void ParseWindowsLiveRSTResponseBody(EwsXmlReader rstResponse)
        {
            // Read the WS-Trust RequestSecurityTokenResponseCollection node.
            rstResponse.ReadStartElement(
                XmlNamespace.WSTrustFebruary2005,
                RequestSecurityTokenResponseCollectionElementName);

            // Skip the first token - our interest is in the second token (the service token).
            rstResponse.SkipElement(
                XmlNamespace.WSTrustFebruary2005,
                RequestSecurityTokenResponseElementName);

            // Now process the second token.
            rstResponse.ReadStartElement(
                XmlNamespace.WSTrustFebruary2005,
                RequestSecurityTokenResponseElementName);

            while (!rstResponse.IsEndElement(
                       XmlNamespace.WSTrustFebruary2005,
                       RequestSecurityTokenResponseElementName))
            {
                // Watch for the EncryptedData element - when we find it, parse out the appropriate bits of data.
                //
                // Also watch for the "pp" element in the Passport SOAP fault namespace, which indicates that
                // something went wrong with the token request.  If we find it, trace and throw accordingly.
                if (rstResponse.IsStartElement() &&
                    (rstResponse.LocalName == EncryptedDataElementName) &&
                    (rstResponse.NamespaceUri == XmlEncNamespace))
                {
                    this.SecurityToken = rstResponse.ReadOuterXml();
                }
                else if (rstResponse.IsStartElement(XmlNamespace.PassportSoapFault, PpElementName))
                {
                    if (this.TraceEnabled)
                    {
                        string logMessage = string.Format(
                            "Windows Live reported an error retrieving the token - {0}",
                            rstResponse.ReadOuterXml());
                        this.traceListener.Trace("WindowsLiveResponse", logMessage);
                    }
                    throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, EncryptedDataElementName));
                }

                // Move to the next bit of data...
                rstResponse.Read();
            }

            // If we didn't find the token, throw.
            if (this.SecurityToken == null)
            {
                if (this.TraceEnabled)
                {
                    string logMessage = string.Format(
                        "Did not find all required parts of the Windows Live response - " +
                        "Security Token - {0}",
                        (this.SecurityToken == null) ? "NOT FOUND" : "found");
                    this.traceListener.Trace("WindowsLiveResponse", logMessage);
                }
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, "No security token found."));
            }
            
            // Read past the RequestSecurityTokenResponseCollection end element.
            rstResponse.Read();
        }
        /// <summary>
        /// Function that parses the SOAP headers from the response to the RST to Windows Live.
        /// </summary>
        /// <param name="rstResponse">The Windows Live response, positioned at the beginning of the SOAP headers.</param>
        private void ReadWindowsLiveRSTResponseHeaders(EwsXmlReader rstResponse)
        {
            // Read the beginning of the SOAP header, then go looking for the Passport SOAP fault section...
            rstResponse.ReadStartElement(
                WindowsLiveSoapNamespacePrefix,
                XmlElementNames.SOAPHeaderElementName);

            // Attempt to read to the psf:pp element - if at the end of the ReadToDescendant call we're at the
            // end element for the SOAP headers, we didn't find it.
            rstResponse.ReadToDescendant(XmlNamespace.PassportSoapFault, PpElementName);
            if (rstResponse.IsEndElement(WindowsLiveSoapNamespacePrefix, XmlElementNames.SOAPHeaderElementName))
            {
                // We didn't find the psf:pp element - without that, we don't know what happened -
                // something went wrong.  Trace and throw.
                if (this.TraceEnabled)
                {
                    this.traceListener.Trace(
                        "WindowsLiveResponse",
                        "Could not find Passport SOAP fault information in Windows Live response");
                }
                
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, PpElementName));
            }
            
            // Now that we've found the psf:pp element, look for the 'reqstatus' element under it.  If after
            // the ReadToDescendant call we're at the end element for the psf:pp element, we didn't find it.
            rstResponse.ReadToDescendant(XmlNamespace.PassportSoapFault, ReqstatusElementName);
            if (rstResponse.IsEndElement(XmlNamespace.PassportSoapFault, PpElementName))
            {
                // We didn't find the "reqstatus" element - without that, we don't know what happened -
                // something went wrong.  Trace and throw.
                if (this.TraceEnabled)
                {
                    this.traceListener.Trace(
                        "WindowsLiveResponse",
                        "Could not find reqstatus element in Passport SOAP fault information in Windows Live response");
                }
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ReqstatusElementName));
            }
            
            // Now that we've found the reqstatus element, get its value.
            string reqstatus = rstResponse.ReadElementValue();

            // Read to body tag in both success and failure cases, 
            // since we need to trace the fault response in failure cases
            while (!rstResponse.IsEndElement(WindowsLiveSoapNamespacePrefix, XmlElementNames.SOAPHeaderElementName))
            {
                rstResponse.Read();
            }
            
            if (!string.Equals(reqstatus, SuccessfulReqstatus))
            {
                // Our request status was non-zero - something went wrong.  Trace and throw.
                if (this.TraceEnabled)
                {
                    string logMessage = string.Format(
                        "Received status {0} from Windows Live instead of {1}.",
                        reqstatus,
                        SuccessfulReqstatus);
                    this.traceListener.Trace("WindowsLiveResponse", logMessage);

                    rstResponse.ReadStartElement(
                        WindowsLiveSoapNamespacePrefix,
                        XmlElementNames.SOAPBodyElementName);

                    // Trace Fault Information
                    this.traceListener.Trace(
                           "WindowsLiveResponse",
                           string.Format(
                           "Windows Live reported Fault : {0}",
                           rstResponse.ReadInnerXml()));
                }               
                
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ReqstatusElementName + ": " + reqstatus));
            }
        }
 /// <summary>
 /// Loads responses from XML.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <returns></returns>
 internal AutodiscoverResponse LoadFromXml(EwsXmlReader reader)
 {
     string elementName = this.GetResponseXmlElementName();
     reader.ReadStartElement(XmlNamespace.Autodiscover, elementName);
     AutodiscoverResponse response = this.CreateServiceResponse();
     response.LoadFromXml(reader, elementName);
     return response;
 }
        /// <summary>
        /// Parses the message XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        private void ParseMessageXml(EwsXmlReader reader)
        {
            // E12 and E14 return the MessageXml element in different
            // namespaces (types namespace for E12, errors namespace in E14). To
            // avoid this problem, the parser will match the namespace from the
            // start and end elements.
            XmlNamespace elementNS = EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);

            if (!reader.IsEmptyElement)
            {
                do
                {
                    reader.Read();

                    if (reader.IsStartElement() && !reader.IsEmptyElement)
                    {
                        switch (reader.LocalName)
                        {
                            case XmlElementNames.Value:
                                this.errorDetails.Add(
                                    reader.ReadAttributeValue(XmlAttributeNames.Name),
                                    reader.ReadElementValue());
                                break;

                            default:
                                break;
                        }
                    }
                }
                while (!reader.IsEndElement(elementNS, XmlElementNames.MessageXml));
            }
        }
        /// <summary>
        /// Parses the detail node.
        /// </summary>
        /// <param name="reader">The reader.</param>
        private void ParseDetailNode(EwsXmlReader reader)
        {
            do
            {
                reader.Read();
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.EwsResponseCodeElementName:
                            try
                            {
                                this.ResponseCode = reader.ReadElementValue<ServiceError>();
                            }
                            catch (ArgumentException)
                            {
                                // ServiceError couldn't be mapped to enum value, treat as an ISE
                                this.ResponseCode = ServiceError.ErrorInternalServerError;
                            }

                            break;

                        case XmlElementNames.EwsMessageElementName:
                            this.Message = reader.ReadElementValue();
                            break;

                        case XmlElementNames.EwsLineElementName:
                            this.LineNumber = reader.ReadElementValue<int>();
                            break;

                        case XmlElementNames.EwsPositionElementName:
                            this.PositionWithinLine = reader.ReadElementValue<int>();
                            break;

                        case XmlElementNames.EwsErrorCodeElementName:
                            try
                            {
                                this.ErrorCode = reader.ReadElementValue<ServiceError>();
                            }
                            catch (ArgumentException)
                            {
                                // ServiceError couldn't be mapped to enum value, treat as an ISE
                                this.ErrorCode = ServiceError.ErrorInternalServerError;
                            }

                            break;

                        case XmlElementNames.EwsExceptionTypeElementName:
                            this.ExceptionType = reader.ReadElementValue();
                            break;

                        case XmlElementNames.MessageXml:
                            this.ParseMessageXml(reader);
                            break;

                        default:
                            // Ignore any other details
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.SOAPDetailElementName));
        }
Пример #43
0
        /// <summary>
        /// Load from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.AccountType:
                        this.AccountType = reader.ReadElementValue();
                        break;

                    case XmlElementNames.Action:
                        string xmlResponseType = reader.ReadElementValue();

                        switch (xmlResponseType)
                        {
                        case OutlookAccount.Settings:
                            this.ResponseType = AutodiscoverResponseType.Success;
                            break;

                        case OutlookAccount.RedirectUrl:
                            this.ResponseType = AutodiscoverResponseType.RedirectUrl;
                            break;

                        case OutlookAccount.RedirectAddr:
                            this.ResponseType = AutodiscoverResponseType.RedirectAddress;
                            break;

                        default:
                            this.ResponseType = AutodiscoverResponseType.Error;
                            break;
                        }

                        break;

                    case XmlElementNames.Protocol:
                        OutlookProtocol protocol = new OutlookProtocol();
                        protocol.LoadFromXml(reader);
                        if (this.protocols.ContainsKey(protocol.ProtocolType))
                        {
                            // There should be strictly one node per protocol type in the autodiscover response.
                            throw new ServiceLocalException(Strings.InvalidAutodiscoverServiceResponse);
                        }
                        this.protocols.Add(protocol.ProtocolType, protocol);
                        break;

                    case XmlElementNames.RedirectAddr:
                    case XmlElementNames.RedirectUrl:
                        this.RedirectTarget = reader.ReadElementValue();
                        break;

                    case XmlElementNames.AlternateMailboxes:
                        AlternateMailbox alternateMailbox = AlternateMailbox.LoadFromXml(reader);
                        this.alternateMailboxes.Entries.Add(alternateMailbox);
                        break;

                    default:
                        reader.SkipCurrentElement();
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Account));
        }
 /// <summary>
 /// Tries to read the current XML element.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <returns>True is the current element was read, false otherwise.</returns>
 internal override bool TryReadCurrentXmlElement(EwsXmlReader reader)
 {
     if (!base.TryReadCurrentXmlElement(reader))
     {
         switch (reader.LocalName)
         {
             case XmlElementNames.User:
                 this.user.LoadFromXml(reader);
                 return true;
             case XmlElementNames.Account:
                 this.account.LoadFromXml(reader);
                 return true;
             default:
                 reader.SkipCurrentElement();
                 return false;
         }
     }
     else
     {
         return true;
     }
 }
Пример #45
0
        /// <summary>
        /// Loads web client urls from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="webClientUrls">The web client urls.</param>
        /// <param name="elementName">Name of the element.</param>
        private static void LoadWebClientUrlsFromXml(EwsXmlReader reader, WebClientUrlCollection webClientUrls, string elementName)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.OWAUrl:
                            string authMethod = reader.ReadAttributeValue(XmlAttributeNames.AuthenticationMethod);
                            string owaUrl = reader.ReadElementValue();
                            WebClientUrl webClientUrl = new WebClientUrl(authMethod, owaUrl);
                            webClientUrls.Urls.Add(webClientUrl);
                            break;
                        default:
                            reader.SkipCurrentElement();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, elementName));
        }
Пример #46
0
    /// <summary>
    /// Function that parses the RSTR from Windows Live and pulls out all the important pieces
    /// of data from it.
    /// </summary>
    /// <param name="rstResponse">The RSTR, positioned at the beginning of the SOAP body.</param>
    /* private */ void ParseWindowsLiveRSTResponseBody(EwsXmlReader rstResponse)
    {
        // Read the WS-Trust RequestSecurityTokenResponseCollection node.
        rstResponse.ReadStartElement(
            XmlNamespace.WSTrustFebruary2005,
            RequestSecurityTokenResponseCollectionElementName);

        // Skip the first token - our interest is in the second token (the service token).
        rstResponse.SkipElement(
            XmlNamespace.WSTrustFebruary2005,
            RequestSecurityTokenResponseElementName);

        // Now process the second token.
        rstResponse.ReadStartElement(
            XmlNamespace.WSTrustFebruary2005,
            RequestSecurityTokenResponseElementName);

        while (!rstResponse.IsEndElement(
                   XmlNamespace.WSTrustFebruary2005,
                   RequestSecurityTokenResponseElementName))
        {
            // Watch for the EncryptedData element - when we find it, parse out the appropriate bits of data.
            //
            // Also watch for the "pp" element in the Passport SOAP fault namespace, which indicates that
            // something went wrong with the token request.  If we find it, trace and throw accordingly.
            if (rstResponse.IsStartElement() &&
                (rstResponse.LocalName == EncryptedDataElementName) &&
                (rstResponse.NamespaceUri == XmlEncNamespace))
            {
                this.SecurityToken = rstResponse.ReadOuterXml();
            }
            else if (rstResponse.IsStartElement(XmlNamespace.PassportSoapFault, PpElementName))
            {
                if (this.TraceEnabled)
                {
                    String logMessage = string.Format(
                        "Windows Live reported an error retrieving the token - {0}",
                        rstResponse.ReadOuterXml());
                    this.traceListener.Trace("WindowsLiveResponse", logMessage);
                }
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, EncryptedDataElementName));
            }

            // Move to the next bit of data...
            rstResponse.Read();
        }

        // If we didn't find the token, throw.
        if (this.SecurityToken == null)
        {
            if (this.TraceEnabled)
            {
                String logMessage = string.Format(
                    "Did not find all required parts of the Windows Live response - " +
                    "Security Token - {0}",
                    (this.SecurityToken == null) ? "NOT FOUND" : "found");
                this.traceListener.Trace("WindowsLiveResponse", logMessage);
            }
            throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, "No security token found."));
        }

        // Read past the RequestSecurityTokenResponseCollection end element.
        rstResponse.Read();
    }
Пример #47
0
    /// <summary>
    /// Function that parses the SOAP headers from the response to the RST to Windows Live.
    /// </summary>
    /// <param name="rstResponse">The Windows Live response, positioned at the beginning of the SOAP headers.</param>
    /* private */ void ReadWindowsLiveRSTResponseHeaders(EwsXmlReader rstResponse)
    {
        // Read the beginning of the SOAP header, then go looking for the Passport SOAP fault section...
        rstResponse.ReadStartElement(
            WindowsLiveSoapNamespacePrefix,
            XmlElementNames.SOAPHeaderElementName);

        // Attempt to read to the psf:pp element - if at the end of the ReadToDescendant call we're at the
        // end element for the SOAP headers, we didn't find it.
        rstResponse.ReadToDescendant(XmlNamespace.PassportSoapFault, PpElementName);
        if (rstResponse.IsEndElement(WindowsLiveSoapNamespacePrefix, XmlElementNames.SOAPHeaderElementName))
        {
            // We didn't find the psf:pp element - without that, we don't know what happened -
            // something went wrong.  Trace and throw.
            if (this.TraceEnabled)
            {
                this.traceListener.Trace(
                    "WindowsLiveResponse",
                    "Could not find Passport SOAP fault information in Windows Live response");
            }

            throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, PpElementName));
        }

        // Now that we've found the psf:pp element, look for the 'reqstatus' element under it.  If after
        // the ReadToDescendant call we're at the end element for the psf:pp element, we didn't find it.
        rstResponse.ReadToDescendant(XmlNamespace.PassportSoapFault, ReqstatusElementName);
        if (rstResponse.IsEndElement(XmlNamespace.PassportSoapFault, PpElementName))
        {
            // We didn't find the "reqstatus" element - without that, we don't know what happened -
            // something went wrong.  Trace and throw.
            if (this.TraceEnabled)
            {
                this.traceListener.Trace(
                    "WindowsLiveResponse",
                    "Could not find reqstatus element in Passport SOAP fault information in Windows Live response");
            }
            throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ReqstatusElementName));
        }

        // Now that we've found the reqstatus element, get its value.
        String reqstatus = rstResponse.ReadElementValue();

        // Read to body tag in both success and failure cases,
        // since we need to trace the fault response in failure cases
        while (!rstResponse.IsEndElement(WindowsLiveSoapNamespacePrefix, XmlElementNames.SOAPHeaderElementName))
        {
            rstResponse.Read();
        }

        if (!string.Equals(reqstatus, SuccessfulReqstatus))
        {
            // Our request status was non-zero - something went wrong.  Trace and throw.
            if (this.TraceEnabled)
            {
                String logMessage = string.Format(
                    "Received status {0} from Windows Live instead of {1}.",
                    reqstatus,
                    SuccessfulReqstatus);
                this.traceListener.Trace("WindowsLiveResponse", logMessage);

                rstResponse.ReadStartElement(
                    WindowsLiveSoapNamespacePrefix,
                    XmlElementNames.SOAPBodyElementName);

                // Trace Fault Information
                this.traceListener.Trace(
                    "WindowsLiveResponse",
                    string.Format(
                        "Windows Live reported Fault : {0}",
                        rstResponse.ReadInnerXml()));
            }

            throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ReqstatusElementName + ": " + reqstatus));
        }
    }
        /// <summary>
        /// Executes this instance.
        /// </summary>
        /// <returns></returns>
        internal AutodiscoverResponse InternalExecute()
        {
            this.Validate();

            try
            {
                IEwsHttpWebRequest request = this.Service.PrepareHttpWebRequestForUrl(this.Url);

                this.Service.TraceHttpRequestHeaders(TraceFlags.AutodiscoverRequestHttpHeaders, request);

                bool needSignature = this.Service.Credentials != null && this.Service.Credentials.NeedSignature;
                bool needTrace     = this.Service.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest);

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    using (EwsServiceXmlWriter writer = new EwsServiceXmlWriter(this.Service, memoryStream))
                    {
                        writer.RequireWSSecurityUtilityNamespace = needSignature;
                        this.WriteSoapRequest(
                            this.Url,
                            writer);
                    }

                    if (needSignature)
                    {
                        this.service.Credentials.Sign(memoryStream);
                    }

                    if (needTrace)
                    {
                        memoryStream.Position = 0;
                        this.Service.TraceXml(TraceFlags.AutodiscoverRequest, memoryStream);
                    }

                    request.SetRequestStream(memoryStream);
                }


                using (IEwsHttpWebResponse webResponse = request.GetResponse())
                {
                    if (AutodiscoverRequest.IsRedirectionResponse(webResponse))
                    {
                        AutodiscoverResponse response = this.CreateRedirectionResponse(webResponse);
                        if (response != null)
                        {
                            return(response);
                        }
                        else
                        {
                            throw new ServiceRemoteException(Strings.InvalidRedirectionResponseReturned);
                        }
                    }

                    using (Stream responseStream = AutodiscoverRequest.GetResponseStream(webResponse))
                    {
                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            // Copy response stream to in-memory stream and reset to start
                            EwsUtilities.CopyStream(responseStream, memoryStream);
                            memoryStream.Position = 0;

                            this.Service.TraceResponse(webResponse, memoryStream);

                            EwsXmlReader ewsXmlReader = new EwsXmlReader(memoryStream);

                            // WCF may not generate an XML declaration.
                            ewsXmlReader.Read();
                            if (ewsXmlReader.NodeType == XmlNodeType.XmlDeclaration)
                            {
                                ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName);
                            }
                            else if ((ewsXmlReader.NodeType != XmlNodeType.Element) || (ewsXmlReader.LocalName != XmlElementNames.SOAPEnvelopeElementName) || (ewsXmlReader.NamespaceUri != EwsUtilities.GetNamespaceUri(XmlNamespace.Soap)))
                            {
                                throw new ServiceXmlDeserializationException(Strings.InvalidAutodiscoverServiceResponse);
                            }

                            this.ReadSoapHeaders(ewsXmlReader);

                            AutodiscoverResponse response = this.ReadSoapBody(ewsXmlReader);

                            ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName);

                            if (response.ErrorCode == AutodiscoverErrorCode.NoError)
                            {
                                return(response);
                            }
                            else
                            {
                                throw new AutodiscoverResponseException(response.ErrorCode, response.ErrorMessage);
                            }
                        }
                    }
                }
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
                {
                    IEwsHttpWebResponse httpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(ex);

                    if (AutodiscoverRequest.IsRedirectionResponse(httpWebResponse))
                    {
                        this.Service.ProcessHttpResponseHeaders(
                            TraceFlags.AutodiscoverResponseHttpHeaders,
                            httpWebResponse);

                        AutodiscoverResponse response = this.CreateRedirectionResponse(httpWebResponse);
                        if (response != null)
                        {
                            return(response);
                        }
                    }
                    else
                    {
                        this.ProcessWebException(ex);
                    }
                }

                // Wrap exception if the above code block didn't throw
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex);
            }
            catch (XmlException ex)
            {
                this.Service.TraceMessage(
                    TraceFlags.AutodiscoverConfiguration,
                    string.Format("XML parsing error: {0}", ex.Message));

                // Wrap exception
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex);
            }
            catch (IOException ex)
            {
                this.Service.TraceMessage(
                    TraceFlags.AutodiscoverConfiguration,
                    string.Format("I/O error: {0}", ex.Message));

                // Wrap exception
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex);
            }
        }
Пример #49
0
        /// <summary>
        /// Loads from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.Type:
                        this.ProtocolType = OutlookProtocol.ProtocolNameToType(reader.ReadElementValue());
                        break;

                    case XmlElementNames.AuthPackage:
                        this.authPackage = reader.ReadElementValue();
                        break;

                    case XmlElementNames.Server:
                        this.server = reader.ReadElementValue();
                        break;

                    case XmlElementNames.ServerDN:
                        this.serverDN = reader.ReadElementValue();
                        break;

                    case XmlElementNames.ServerVersion:
                        // just read it out
                        reader.ReadElementValue();
                        break;

                    case XmlElementNames.AD:
                        this.activeDirectoryServer = reader.ReadElementValue();
                        break;

                    case XmlElementNames.MdbDN:
                        this.mailboxDN = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EWSUrl:
                        this.exchangeWebServicesUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EmwsUrl:
                        this.exchangeManagementWebServicesUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.ASUrl:
                        this.availabilityServiceUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.OOFUrl:
                        // just read it out
                        reader.ReadElementValue();
                        break;

                    case XmlElementNames.UMUrl:
                        this.unifiedMessagingUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.OABUrl:
                        this.offlineAddressBookUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.PublicFolderServer:
                        this.publicFolderServer = reader.ReadElementValue();
                        break;

                    case XmlElementNames.Internal:
                        OutlookProtocol.LoadWebClientUrlsFromXml(reader, this.internalOutlookWebAccessUrls, reader.LocalName);
                        break;

                    case XmlElementNames.External:
                        OutlookProtocol.LoadWebClientUrlsFromXml(reader, this.externalOutlookWebAccessUrls, reader.LocalName);
                        break;

                    case XmlElementNames.Ssl:
                        string sslStr = reader.ReadElementValue();
                        this.sslEnabled = sslStr.Equals("On", StringComparison.OrdinalIgnoreCase);
                        break;

                    case XmlElementNames.SharingUrl:
                        this.sharingEnabled = reader.ReadElementValue().Length > 0;
                        break;

                    case XmlElementNames.EcpUrl:
                        this.ecpUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_um:
                        this.ecpUrlUm = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_aggr:
                        this.ecpUrlAggr = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_sms:
                        this.ecpUrlSms = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_mt:
                        this.ecpUrlMt = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_ret:
                        this.ecpUrlRet = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_publish:
                        this.ecpUrlPublish = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_photo:
                        this.ecpUrlPhoto = reader.ReadElementValue();
                        break;

                    case XmlElementNames.ExchangeRpcUrl:
                        this.exchangeRpcUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EwsPartnerUrl:
                        this.exchangeWebServicesPartnerUrl = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_connect:
                        this.ecpUrlConnect = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_tm:
                        this.ecpUrlTm = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_tmCreating:
                        this.ecpUrlTmCreating = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_tmEditing:
                        this.ecpUrlTmEditing = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_tmHiding:
                        this.ecpUrlTmHiding = reader.ReadElementValue();
                        break;

                    case XmlElementNames.SiteMailboxCreationURL:
                        this.siteMailboxCreationURL = reader.ReadElementValue();
                        break;

                    case XmlElementNames.EcpUrl_extinstall:
                        this.ecpUrlExtInstall = reader.ReadElementValue();
                        break;

                    case XmlElementNames.ServerExclusiveConnect:
                        string serverExclusiveConnectStr = reader.ReadElementValue();
                        this.serverExclusiveConnect = serverExclusiveConnectStr.Equals("On", StringComparison.OrdinalIgnoreCase);
                        break;

                    case XmlElementNames.CertPrincipalName:
                        this.certPrincipalName = reader.ReadElementValue();
                        break;

                    case XmlElementNames.GroupingInformation:
                        this.groupingInformation = reader.ReadElementValue();
                        break;

                    default:
                        reader.SkipCurrentElement();
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Protocol));
        }
        /// <summary>
        /// Parses the soap:Fault content.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="soapNamespace">The SOAP namespace to use.</param>
        /// <returns>SOAP fault details.</returns>
        internal static SoapFaultDetails Parse(EwsXmlReader reader, XmlNamespace soapNamespace)
        {
            SoapFaultDetails soapFaultDetails = new SoapFaultDetails();

            do
            {
                reader.Read();
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.SOAPFaultCodeElementName:
                            soapFaultDetails.FaultCode = reader.ReadElementValue();
                            break;

                        case XmlElementNames.SOAPFaultStringElementName:
                            soapFaultDetails.FaultString = reader.ReadElementValue();
                            break;

                        case XmlElementNames.SOAPFaultActorElementName:
                            soapFaultDetails.FaultActor = reader.ReadElementValue();
                            break;

                        case XmlElementNames.SOAPDetailElementName:
                            soapFaultDetails.ParseDetailNode(reader);
                            break;

                        default:
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(soapNamespace, XmlElementNames.SOAPFaultElementName));

            return soapFaultDetails;
        }
 /// <summary>
 /// Read SOAP body.
 /// </summary>
 /// <param name="reader">EwsXmlReader</param>
 internal AutodiscoverResponse ReadSoapBody(EwsXmlReader reader)
 {
     reader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName);
     AutodiscoverResponse responses = this.LoadFromXml(reader);
     reader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName);
     return responses;
 }
 /// <summary>
 /// Reads a single SOAP header.
 /// </summary>
 /// <param name="reader">EwsXmlReader</param>
 internal virtual void ReadSoapHeader(EwsXmlReader reader)
 {
     // Is this the ServerVersionInfo?
     if (reader.IsStartElement(XmlNamespace.Autodiscover, XmlElementNames.ServerVersionInfo))
     {
         this.service.ServerInfo = this.ReadServerVersionInfo(reader);
     }
 }
        /// <summary>
        /// Reads the SOAP fault.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>SOAP fault details.</returns>
        private SoapFaultDetails ReadSoapFault(EwsXmlReader reader)
        {
            SoapFaultDetails soapFaultDetails = null;

            try
            {
                // WCF may not generate an XML declaration.
                reader.Read();
                if (reader.NodeType == XmlNodeType.XmlDeclaration)
                {
                    reader.Read();
                }

                if (!reader.IsStartElement() || (reader.LocalName != XmlElementNames.SOAPEnvelopeElementName))
                {
                    return soapFaultDetails;
                }

                // Get the namespace URI from the envelope element and use it for the rest of the parsing.
                // If it's not 1.1 or 1.2, we can't continue.
                XmlNamespace soapNamespace = EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
                if (soapNamespace == XmlNamespace.NotSpecified)
                {
                    return soapFaultDetails;
                }

                reader.Read();

                // Skip SOAP header.
                if (reader.IsStartElement(soapNamespace, XmlElementNames.SOAPHeaderElementName))
                {
                    do
                    {
                        reader.Read();
                    }
                    while (!reader.IsEndElement(soapNamespace, XmlElementNames.SOAPHeaderElementName));

                    // Queue up the next read
                    reader.Read();
                }

                // Parse the fault element contained within the SOAP body.
                if (reader.IsStartElement(soapNamespace, XmlElementNames.SOAPBodyElementName))
                {
                    do
                    {
                        reader.Read();

                        // Parse Fault element
                        if (reader.IsStartElement(soapNamespace, XmlElementNames.SOAPFaultElementName))
                        {
                            soapFaultDetails = SoapFaultDetails.Parse(reader, soapNamespace);
                        }
                    }
                    while (!reader.IsEndElement(soapNamespace, XmlElementNames.SOAPBodyElementName));
                }

                reader.ReadEndElement(soapNamespace, XmlElementNames.SOAPEnvelopeElementName);
            }
            catch (XmlException)
            {
                // If response doesn't contain a valid SOAP fault, just ignore exception and
                // return null for SOAP fault details.
            }

            return soapFaultDetails;
        }
        /// <summary>
        /// Read ServerVersionInfo SOAP header.
        /// </summary>
        /// <param name="reader">EwsXmlReader</param>
        private ExchangeServerInfo ReadServerVersionInfo(EwsXmlReader reader)
        {
            ExchangeServerInfo serverInfo = new ExchangeServerInfo();
            do
            {
                reader.Read();

                if (reader.IsStartElement())
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.MajorVersion:
                            serverInfo.MajorVersion = reader.ReadElementValue<int>();
                            break;
                        case XmlElementNames.MinorVersion:
                            serverInfo.MinorVersion = reader.ReadElementValue<int>();
                            break;
                        case XmlElementNames.MajorBuildNumber:
                            serverInfo.MajorBuildNumber = reader.ReadElementValue<int>();
                            break;
                        case XmlElementNames.MinorBuildNumber:
                            serverInfo.MinorBuildNumber = reader.ReadElementValue<int>();
                            break;
                        case XmlElementNames.Version:
                            serverInfo.VersionString = reader.ReadElementValue();
                            break;
                        default:
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.ServerVersionInfo));

            return serverInfo;
        }
        /// <summary>
        /// Reads the SOAP fault.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>SOAP fault details.</returns>
        private SoapFaultDetails ReadSoapFault(EwsXmlReader reader)
        {
            SoapFaultDetails soapFaultDetails = null;

            try
            {
                // WCF may not generate an XML declaration.
                reader.Read();
                if (reader.NodeType == XmlNodeType.XmlDeclaration)
                {
                    reader.Read();
                }

                if (!reader.IsStartElement() || (reader.LocalName != XmlElementNames.SOAPEnvelopeElementName))
                {
                    return(soapFaultDetails);
                }

                // Get the namespace URI from the envelope element and use it for the rest of the parsing.
                // If it's not 1.1 or 1.2, we can't continue.
                XmlNamespace soapNamespace = EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
                if (soapNamespace == XmlNamespace.NotSpecified)
                {
                    return(soapFaultDetails);
                }

                reader.Read();

                // Skip SOAP header.
                if (reader.IsStartElement(soapNamespace, XmlElementNames.SOAPHeaderElementName))
                {
                    do
                    {
                        reader.Read();
                    }while (!reader.IsEndElement(soapNamespace, XmlElementNames.SOAPHeaderElementName));

                    // Queue up the next read
                    reader.Read();
                }

                // Parse the fault element contained within the SOAP body.
                if (reader.IsStartElement(soapNamespace, XmlElementNames.SOAPBodyElementName))
                {
                    do
                    {
                        reader.Read();

                        // Parse Fault element
                        if (reader.IsStartElement(soapNamespace, XmlElementNames.SOAPFaultElementName))
                        {
                            soapFaultDetails = SoapFaultDetails.Parse(reader, soapNamespace);
                        }
                    }while (!reader.IsEndElement(soapNamespace, XmlElementNames.SOAPBodyElementName));
                }

                reader.ReadEndElement(soapNamespace, XmlElementNames.SOAPEnvelopeElementName);
            }
            catch (XmlException)
            {
                // If response doesn't contain a valid SOAP fault, just ignore exception and
                // return null for SOAP fault details.
            }

            return(soapFaultDetails);
        }
        /// <summary>
        /// Read SOAP headers.
        /// </summary>
        /// <param name="reader">EwsXmlReader</param>
        internal void ReadSoapHeaders(EwsXmlReader reader)
        {
            reader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPHeaderElementName);
            do
            {
                reader.Read();

                this.ReadSoapHeader(reader);
            }
            while (!reader.IsEndElement(XmlNamespace.Soap, XmlElementNames.SOAPHeaderElementName));
        }
Пример #57
0
        /// <summary>
        /// Loads from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        internal void LoadFromXml(EwsXmlReader reader)
        {
            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                        case XmlElementNames.Type:
                            this.ProtocolType = OutlookProtocol.ProtocolNameToType(reader.ReadElementValue());
                            break;
                        case XmlElementNames.AuthPackage:
                            this.authPackage = reader.ReadElementValue();
                            break;
                        case XmlElementNames.Server:
                            this.server = reader.ReadElementValue();
                            break;
                        case XmlElementNames.ServerDN:
                            this.serverDN = reader.ReadElementValue();
                            break;
                        case XmlElementNames.ServerVersion:
                            // just read it out
                            reader.ReadElementValue();
                            break;
                        case XmlElementNames.AD:
                            this.activeDirectoryServer = reader.ReadElementValue();
                            break;
                        case XmlElementNames.MdbDN:
                            this.mailboxDN = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EWSUrl:
                            this.exchangeWebServicesUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EmwsUrl:
                            this.exchangeManagementWebServicesUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.ASUrl:
                            this.availabilityServiceUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.OOFUrl:
                            // just read it out
                            reader.ReadElementValue();
                            break;
                        case XmlElementNames.UMUrl:
                            this.unifiedMessagingUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.OABUrl:
                            this.offlineAddressBookUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.PublicFolderServer:
                            this.publicFolderServer = reader.ReadElementValue();
                            break;
                        case XmlElementNames.Internal:
                            OutlookProtocol.LoadWebClientUrlsFromXml(reader, this.internalOutlookWebAccessUrls, reader.LocalName);
                            break;
                        case XmlElementNames.External:
                            OutlookProtocol.LoadWebClientUrlsFromXml(reader, this.externalOutlookWebAccessUrls, reader.LocalName);
                            break;
                        case XmlElementNames.Ssl:
                            string sslStr = reader.ReadElementValue();
                            this.sslEnabled = sslStr.Equals("On", StringComparison.OrdinalIgnoreCase);
                            break;
                        case XmlElementNames.SharingUrl:
                            this.sharingEnabled = reader.ReadElementValue().Length > 0;
                            break;
                        case XmlElementNames.EcpUrl:
                            this.ecpUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_um:
                            this.ecpUrlUm = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_aggr:
                            this.ecpUrlAggr = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_sms:
                            this.ecpUrlSms = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_mt:
                            this.ecpUrlMt = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_ret:
                            this.ecpUrlRet = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_publish:
                            this.ecpUrlPublish = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_photo:
                            this.ecpUrlPhoto = reader.ReadElementValue();
                            break;
                        case XmlElementNames.ExchangeRpcUrl:
                            this.exchangeRpcUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EwsPartnerUrl:
                            this.exchangeWebServicesPartnerUrl = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_connect:
                            this.ecpUrlConnect = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_tm:
                            this.ecpUrlTm = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_tmCreating:
                            this.ecpUrlTmCreating = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_tmEditing:
                            this.ecpUrlTmEditing = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_tmHiding:
                            this.ecpUrlTmHiding = reader.ReadElementValue();
                            break;
                        case XmlElementNames.SiteMailboxCreationURL:
                            this.siteMailboxCreationURL = reader.ReadElementValue();
                            break;
                        case XmlElementNames.EcpUrl_extinstall:
                            this.ecpUrlExtInstall = reader.ReadElementValue();
                            break;
                        case XmlElementNames.ServerExclusiveConnect:
                            string serverExclusiveConnectStr = reader.ReadElementValue();
                            this.serverExclusiveConnect = serverExclusiveConnectStr.Equals("On", StringComparison.OrdinalIgnoreCase);
                            break;
                        case XmlElementNames.CertPrincipalName:
                            this.certPrincipalName = reader.ReadElementValue();
                            break;
                        case XmlElementNames.GroupingInformation:
                            this.groupingInformation = reader.ReadElementValue();
                            break;
                        default:
                            reader.SkipCurrentElement();
                            break;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, XmlElementNames.Protocol));
        }
        /// <summary>
        /// Executes this instance.
        /// </summary>
        /// <returns></returns>
        internal AutodiscoverResponse InternalExecute()
        {
            this.Validate();

            try
            {
                IEwsHttpWebRequest request = this.Service.PrepareHttpWebRequestForUrl(this.Url);

                this.Service.TraceHttpRequestHeaders(TraceFlags.AutodiscoverRequestHttpHeaders, request);

                bool needSignature = this.Service.Credentials != null && this.Service.Credentials.NeedSignature;
                bool needTrace = this.Service.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest);

                using (Stream requestStream = request.GetRequestStream())
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        using (EwsServiceXmlWriter writer = new EwsServiceXmlWriter(this.Service, memoryStream))
                        {
                            writer.RequireWSSecurityUtilityNamespace = needSignature;
                            this.WriteSoapRequest(
                                this.Url, 
                                writer);
                        }

                        if (needSignature)
                        {
                            this.service.Credentials.Sign(memoryStream);
                        }

                        if (needTrace)
                        {
                            memoryStream.Position = 0;
                            this.Service.TraceXml(TraceFlags.AutodiscoverRequest, memoryStream);
                        }

                        EwsUtilities.CopyStream(memoryStream, requestStream);
                    }
                }

                using (IEwsHttpWebResponse webResponse = request.GetResponse())
                {
                    if (AutodiscoverRequest.IsRedirectionResponse(webResponse))
                    {
                        AutodiscoverResponse response = this.CreateRedirectionResponse(webResponse);
                        if (response != null)
                        {
                            return response;
                        }
                        else
                        {
                            throw new ServiceRemoteException(Strings.InvalidRedirectionResponseReturned);
                        }
                    }

                    using (Stream responseStream = AutodiscoverRequest.GetResponseStream(webResponse))
                    {
                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            // Copy response stream to in-memory stream and reset to start
                            EwsUtilities.CopyStream(responseStream, memoryStream);
                            memoryStream.Position = 0;

                            this.Service.TraceResponse(webResponse, memoryStream);                           

                            EwsXmlReader ewsXmlReader = new EwsXmlReader(memoryStream);

                            // WCF may not generate an XML declaration.
                            ewsXmlReader.Read();
                            if (ewsXmlReader.NodeType == XmlNodeType.XmlDeclaration)
                            {
                                ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName);
                            }
                            else if ((ewsXmlReader.NodeType != XmlNodeType.Element) || (ewsXmlReader.LocalName != XmlElementNames.SOAPEnvelopeElementName) || (ewsXmlReader.NamespaceUri != EwsUtilities.GetNamespaceUri(XmlNamespace.Soap)))
                            {
                                throw new ServiceXmlDeserializationException(Strings.InvalidAutodiscoverServiceResponse);
                            }

                            this.ReadSoapHeaders(ewsXmlReader);

                            AutodiscoverResponse response = this.ReadSoapBody(ewsXmlReader);

                            ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName);

                            if (response.ErrorCode == AutodiscoverErrorCode.NoError)
                            {
                                return response;
                            }
                            else
                            {
                                throw new AutodiscoverResponseException(response.ErrorCode, response.ErrorMessage);
                            }
                        }
                    }
                }
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
                {
                    IEwsHttpWebResponse httpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(ex);

                    if (AutodiscoverRequest.IsRedirectionResponse(httpWebResponse))
                    {
                        this.Service.ProcessHttpResponseHeaders(
                            TraceFlags.AutodiscoverResponseHttpHeaders,
                            httpWebResponse);

                        AutodiscoverResponse response = this.CreateRedirectionResponse(httpWebResponse);
                        if (response != null)
                        {
                            return response;
                        }
                    }
                    else
                    {
                        this.ProcessWebException(ex);
                    }
                }

                // Wrap exception if the above code block didn't throw
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex);
            }
            catch (XmlException ex)
            {
                this.Service.TraceMessage(
                    TraceFlags.AutodiscoverConfiguration,
                    string.Format("XML parsing error: {0}", ex.Message));

                // Wrap exception
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex);
            }
            catch (IOException ex)
            {
                this.Service.TraceMessage(
                    TraceFlags.AutodiscoverConfiguration,
                    string.Format("I/O error: {0}", ex.Message));

                // Wrap exception
                throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex);
            }
        }
Пример #59
0
        /// <summary>
        /// Loads DocumentSharingLocation instance from XML.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>DocumentSharingLocation.</returns>
        internal static DocumentSharingLocation LoadFromXml(EwsXmlReader reader)
        {
            DocumentSharingLocation location = new DocumentSharingLocation();

            do
            {
                reader.Read();

                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.LocalName)
                    {
                    case XmlElementNames.ServiceUrl:
                        location.ServiceUrl = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.LocationUrl:
                        location.LocationUrl = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.DisplayName:
                        location.DisplayName = reader.ReadElementValue <string>();
                        break;

                    case XmlElementNames.SupportedFileExtensions:
                        List <string> fileExtensions = new List <string>();
                        reader.Read();
                        while (reader.IsStartElement(XmlNamespace.Autodiscover, XmlElementNames.FileExtension))
                        {
                            string extension = reader.ReadElementValue <string>();
                            fileExtensions.Add(extension);
                            reader.Read();
                        }

                        location.SupportedFileExtensions = fileExtensions;
                        break;

                    case XmlElementNames.ExternalAccessAllowed:
                        location.ExternalAccessAllowed = reader.ReadElementValue <bool>();
                        break;

                    case XmlElementNames.AnonymousAccessAllowed:
                        location.AnonymousAccessAllowed = reader.ReadElementValue <bool>();
                        break;

                    case XmlElementNames.CanModifyPermissions:
                        location.CanModifyPermissions = reader.ReadElementValue <bool>();
                        break;

                    case XmlElementNames.IsDefault:
                        location.IsDefault = reader.ReadElementValue <bool>();
                        break;

                    default:
                        break;
                    }
                }
            }while (!reader.IsEndElement(XmlNamespace.Autodiscover, XmlElementNames.DocumentSharingLocation));

            return(location);
        }