/// <summary> /// Reads the response. /// </summary> /// <param name="ewsXmlReader">The XML reader.</param> /// <param name="responseHeaders">HTTP response headers</param> /// <returns>Service response.</returns> protected object ReadResponse(EwsServiceXmlReader ewsXmlReader, WebHeaderCollection responseHeaders) { object serviceResponse; this.ReadPreamble(ewsXmlReader); ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); this.ReadSoapHeader(ewsXmlReader); ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName); ewsXmlReader.ReadStartElement(XmlNamespace.Messages, this.GetResponseXmlElementName()); if (responseHeaders != null) { serviceResponse = this.ParseResponse(ewsXmlReader, responseHeaders); } else { serviceResponse = this.ParseResponse(ewsXmlReader); } ewsXmlReader.ReadEndElementIfNecessary(XmlNamespace.Messages, this.GetResponseXmlElementName()); ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName); ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); return(serviceResponse); }
/// <summary> /// Reads the response. /// </summary> /// <param name="ewsXmlReader">The XML reader.</param> /// <param name="responseHeaders">HTTP response headers</param> /// <returns>Service response.</returns> protected async Task <object> ReadResponseAsync(EwsServiceXmlReader ewsXmlReader, WebHeaderCollection responseHeaders, CancellationToken token) { object serviceResponse; await this.ReadPreambleAsync(ewsXmlReader, token); await ewsXmlReader.ReadStartElementAsync(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName, token); await this.ReadSoapHeaderAsync(ewsXmlReader, token); await ewsXmlReader.ReadStartElementAsync(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName, token); await ewsXmlReader.ReadStartElementAsync(XmlNamespace.Messages, this.GetResponseXmlElementName(), token); if (responseHeaders != null) { serviceResponse = this.ParseResponse(ewsXmlReader, responseHeaders); } else { serviceResponse = this.ParseResponse(ewsXmlReader); } ewsXmlReader.ReadEndElementIfNecessary(XmlNamespace.Messages, this.GetResponseXmlElementName()); await ewsXmlReader.ReadEndElementAsync(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName, token); await ewsXmlReader.ReadEndElementAsync(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName, token); return(serviceResponse); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { base.ReadElementsFromXml(reader); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.Token); this.Id = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Id); this.TokenType = (ClientAccessTokenType)Enum.Parse(typeof(ClientAccessTokenType), reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.TokenType)); this.TokenValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.TokenValue); this.TTL = int.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.TTL)); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.Token); }
/// <summary> /// Loads from XML. /// </summary> /// <param name="reader">The reader.</param> /// <param name="propertyBag">The property bag.</param> internal override sealed void LoadPropertyValueFromXml(EwsServiceXmlReader reader, PropertyBag propertyBag) { reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, this.XmlElementName); if (!reader.IsEmptyElement || reader.HasAttributes) { this.InternalLoadFromXml(reader, propertyBag); } reader.ReadEndElementIfNecessary(XmlNamespace.Types, this.XmlElementName); }
/// <summary> /// Parses the response. /// </summary> /// <param name="reader">The reader.</param> /// <returns>Response object.</returns> internal override object ParseResponse(EwsServiceXmlReader reader) { reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.ResponseMessages); GetStreamingEventsResponse response = new GetStreamingEventsResponse(this); response.LoadFromXml(reader, XmlElementNames.GetStreamingEventsResponseMessage); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.ResponseMessages); return(response); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.ReturnValue); using (XmlReader returnValueReader = reader.GetXmlReaderForNode()) { this.ReturnValue = new SafeXmlDocument(); this.ReturnValue.Load(returnValueReader); } reader.SkipCurrentElement(); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.ReturnValue); }
/// <summary> /// Tries to read element from XML. /// </summary> /// <param name="reader">The reader.</param> /// <returns>True if element was read.</returns> internal override bool TryReadElementFromXml(EwsServiceXmlReader reader) { switch (reader.LocalName) { case XmlElementNames.AttachmentId: this.id = reader.ReadAttributeValue(XmlAttributeNames.Id); if (this.Owner != null) { string rootItemChangeKey = reader.ReadAttributeValue(XmlAttributeNames.RootItemChangeKey); if (!string.IsNullOrEmpty(rootItemChangeKey)) { this.Owner.RootItemId.ChangeKey = rootItemChangeKey; } } reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.AttachmentId); return(true); case XmlElementNames.Name: this.name = reader.ReadElementValue(); return(true); case XmlElementNames.ContentType: this.contentType = reader.ReadElementValue(); return(true); case XmlElementNames.ContentId: this.contentId = reader.ReadElementValue(); return(true); case XmlElementNames.ContentLocation: this.contentLocation = reader.ReadElementValue(); return(true); case XmlElementNames.Size: this.size = reader.ReadElementValue <int>(); return(true); case XmlElementNames.LastModifiedTime: this.lastModifiedTime = reader.ReadElementValueAsDateTime().Value; return(true); case XmlElementNames.IsInline: this.isInline = reader.ReadElementValue <bool>(); return(true); default: return(false); } }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { base.ReadElementsFromXml(reader); reader.Read(); if (reader.IsStartElement(XmlNamespace.Messages, XmlElementNames.MovedItemId)) { this.MovedItemId = new ItemId(); this.MovedItemId.LoadFromXml(reader, XmlNamespace.Messages, XmlElementNames.MovedItemId); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.MovedItemId); } }
/// <summary> /// Loads from XML. /// </summary> /// <param name="reader">The reader.</param> internal void LoadFromXml(EwsServiceXmlReader reader) { reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.Notification); do { NotificationGroup notifications = new NotificationGroup(); notifications.SubscriptionId = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.SubscriptionId); notifications.Events = new Collection <NotificationEvent>(); lock (this) { this.events.Add(notifications); } do { reader.Read(); if (reader.IsStartElement()) { string eventElementName = reader.LocalName; EventType eventType; if (GetEventsResults.XmlElementNameToEventTypeMap.TryGetValue(eventElementName, out eventType)) { if (eventType == EventType.Status) { // We don't need to return status events reader.ReadEndElementIfNecessary(XmlNamespace.Types, eventElementName); } else { this.LoadNotificationEventFromXml( reader, eventElementName, eventType, notifications); } } else { reader.SkipCurrentElement(); } } }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.Notification)); reader.Read(); }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.Notifications)); }
/// <summary> /// Parses the response. /// </summary> /// <param name="reader">The reader.</param> /// <returns>Service response collection.</returns> internal override object ParseResponse(EwsServiceXmlReader reader) { ServiceResponseCollection <TResponse> serviceResponses = new ServiceResponseCollection <TResponse>(); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.ResponseMessages); for (int i = 0; i < this.GetExpectedResponseMessageCount(); i++) { // Read ahead to see if we've reached the end of the response messages early. reader.Read(); if (reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.ResponseMessages)) { break; } TResponse response = this.CreateServiceResponse(reader.Service, i); response.LoadFromXml(reader, this.GetResponseMessageXmlElementName()); // Add the response to the list after it has been deserialized because the response // list updates an overall result as individual responses are added to it. serviceResponses.Add(response); } // If there's a general error in batch processing, // the server will return a single response message containing the error // (for example, if the SavedItemFolderId is bogus in a batch CreateItem // call). In this case, throw a ServiceResponsException. Otherwise this // is an unexpected server error. if (serviceResponses.Count < this.GetExpectedResponseMessageCount()) { if ((serviceResponses.Count == 1) && (serviceResponses[0].Result == ServiceResult.Error)) { throw new ServiceResponseException(serviceResponses[0]); } else { throw new ServiceXmlDeserializationException( string.Format( Strings.TooFewServiceReponsesReturned, this.GetResponseMessageXmlElementName(), this.GetExpectedResponseMessageCount(), serviceResponses.Count)); } } reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.ResponseMessages); return(serviceResponses); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { base.ReadElementsFromXml(reader); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.RootItemId); string changeKey = reader.ReadAttributeValue(XmlAttributeNames.RootItemChangeKey); if (!string.IsNullOrEmpty(changeKey) && this.attachment.Owner != null) { this.attachment.Owner.RootItemId.ChangeKey = changeKey; } reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.RootItemId); }
/// <summary> /// Reads the response. /// </summary> /// <param name="ewsXmlReader">The XML reader.</param> /// <returns>Service response.</returns> protected object ReadResponse(EwsServiceXmlReader ewsXmlReader) { object serviceResponse; this.ReadPreamble(ewsXmlReader); ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); this.ReadSoapHeader(ewsXmlReader); ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName); ewsXmlReader.ReadStartElement(XmlNamespace.Messages, this.GetResponseXmlElementName()); serviceResponse = this.ParseResponse(ewsXmlReader); ewsXmlReader.ReadEndElementIfNecessary(XmlNamespace.Messages, this.GetResponseXmlElementName()); ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName); ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); return(serviceResponse); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { base.ReadElementsFromXml(reader); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.AlternateId); string alternateIdClass = reader.ReadAttributeValue(XmlNamespace.XmlSchemaInstance, XmlAttributeNames.Type); int aliasSeparatorIndex = alternateIdClass.IndexOf(':'); if (aliasSeparatorIndex > -1) { alternateIdClass = alternateIdClass.Substring(aliasSeparatorIndex + 1); } // Alternate Id classes are responsible fro reading the AlternateId end element when necessary switch (alternateIdClass) { case AlternateId.SchemaTypeName: this.convertedId = new AlternateId(); break; case AlternatePublicFolderId.SchemaTypeName: this.convertedId = new AlternatePublicFolderId(); break; case AlternatePublicFolderItemId.SchemaTypeName: this.convertedId = new AlternatePublicFolderItemId(); break; default: EwsUtilities.Assert( false, "ConvertIdResponse.ReadElementsFromXml", string.Format("Unknown alternate Id class: {0}", alternateIdClass)); break; } this.convertedId.LoadAttributesFromXml(reader); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.AlternateId); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { this.retentionPolicyTags.Clear(); base.ReadElementsFromXml(reader); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.RetentionPolicyTags); if (!reader.IsEmptyElement) { do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.RetentionPolicyTag)) { this.retentionPolicyTags.Add(RetentionPolicyTag.LoadFromXml(reader)); } }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.RetentionPolicyTags)); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.RetentionPolicyTags); } }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { this.configurations.Clear(); base.ReadElementsFromXml(reader); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.DiscoverySearchConfigurations); if (!reader.IsEmptyElement) { do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.DiscoverySearchConfiguration)) { this.configurations.Add(DiscoverySearchConfiguration.LoadFromXml(reader)); } }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.DiscoverySearchConfigurations)); } reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.DiscoverySearchConfigurations); }
/// <summary> /// Loads from XML. /// </summary> /// <param name="reader">The reader.</param> internal void LoadFromXml(EwsServiceXmlReader reader) { reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.Notification); this.subscriptionId = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.SubscriptionId); this.previousWatermark = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.PreviousWatermark); this.moreEventsAvailable = reader.ReadElementValue <bool>(XmlNamespace.Types, XmlElementNames.MoreEvents); do { reader.Read(); if (reader.IsStartElement()) { string eventElementName = reader.LocalName; EventType eventType; if (xmlElementNameToEventTypeMap.Member.TryGetValue(eventElementName, out eventType)) { this.newWatermark = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Watermark); if (eventType == EventType.Status) { // We don't need to return status events reader.ReadEndElementIfNecessary(XmlNamespace.Types, eventElementName); } else { this.LoadNotificationEventFromXml( reader, eventElementName, eventType); } } else { reader.SkipCurrentElement(); } } }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.Notification)); }
/// <summary> /// Loads from XML. /// </summary> /// <param name="reader">The reader.</param> /// <param name="propertyBag">The property bag.</param> internal override void LoadPropertyValueFromXml(EwsServiceXmlReader reader, PropertyBag propertyBag) { reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, XmlElementNames.Recurrence); Recurrence recurrence = null; reader.Read(XmlNodeType.Element); // This is the pattern element recurrence = GetRecurrenceFromString(reader.LocalName); recurrence.LoadFromXml(reader, reader.LocalName); reader.Read(XmlNodeType.Element); // This is the range element RecurrenceRange range = GetRecurrenceRange(reader.LocalName); range.LoadFromXml(reader, reader.LocalName); range.SetupRecurrence(recurrence); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.Recurrence); propertyBag[this] = recurrence; }
/// <summary> /// Loads from XML. /// </summary> /// <param name="reader">The reader.</param> /// <param name="localElementName">Name of the local element.</param> internal override void LoadFromXml(EwsServiceXmlReader reader, string localElementName) { reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, localElementName); reader.ReadStartElement(XmlNamespace.Types, this.InnerCollectionXmlElementName); base.LoadFromXml(reader, this.InnerCollectionXmlElementName); reader.ReadEndElementIfNecessary(XmlNamespace.Types, this.InnerCollectionXmlElementName); reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.UnknownEntries)) { do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.UnknownEntry)) { this.unknownEntries.Add(reader.ReadElementValue()); } }while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.UnknownEntries)); } }
/// <summary> /// Parses the response. /// See O15:324151 on why we need to override ParseResponse here instead of calling the one in MultiResponseServiceRequest.cs /// </summary> /// <param name="reader">The reader.</param> /// <returns>Service response collection.</returns> internal override object ParseResponse(EwsServiceXmlReader reader) { ServiceResponseCollection <SearchMailboxesResponse> serviceResponses = new ServiceResponseCollection <SearchMailboxesResponse>(); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.ResponseMessages); while (true) { // Read ahead to see if we've reached the end of the response messages early. reader.Read(); if (reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.ResponseMessages)) { break; } SearchMailboxesResponse response = new SearchMailboxesResponse(); response.LoadFromXml(reader, this.GetResponseMessageXmlElementName()); serviceResponses.Add(response); } reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.ResponseMessages); return(serviceResponses); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader"> /// The reader. /// </param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { base.ReadElementsFromXml(reader); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.MailTips); reader.ReadStartElement(XmlNamespace.Types, XmlElementNames.RecipientAddress); reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Name); var email = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.EmailAddress); var routing = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.RoutingType); recipientAddress = new Mailbox(email, routing); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.RecipientAddress); pendingMailTips = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.PendingMailTips); reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.MailboxFull)) { var mfTextValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.MailboxFull); mailboxFull = System.Convert.ToBoolean(mfTextValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.CustomMailTip)) { customMailTip = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.CustomMailTip); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.TotalMemberCount)) { var textValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.TotalMemberCount); totalMemberCount = System.Convert.ToInt32(textValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.MaxMessageSize)) { var textValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.MaxMessageSize); maxMessageSize = System.Convert.ToInt32(textValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.DeliveryRestricted)) { var restrictionTextValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.DeliveryRestricted); deliveryRestricted = System.Convert.ToBoolean(restrictionTextValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.IsModerated)) { var moderationTextValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.IsModerated); isModerated = System.Convert.ToBoolean(moderationTextValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.InvalidRecipient)) { var invalidRecipientTextValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.InvalidRecipient); isInvalid = System.Convert.ToBoolean(invalidRecipientTextValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.ExternalMemberCount)) { var textValue = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.ExternalMemberCount); externalMemberCount = System.Convert.ToInt32(textValue); reader.Read(); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.OutOfOffice)) { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.ReplayBody)) { var msg = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Message); DateTime?startTime = null; DateTime?endTime = null; reader.Read(); reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.Duration)) { startTime = DateTime.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.StartTime)); endTime = DateTime.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.EndTime)); reader.Read(); reader.Read(); } oof = new OutOfOfficeMessage(msg, startTime, endTime); reader.Read(); } } reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.MailTips); }
/// <summary> /// Load from xml /// </summary> /// <param name="reader">The reader</param> /// <returns>Discovery search configuration object</returns> internal static DiscoverySearchConfiguration LoadFromXml(EwsServiceXmlReader reader) { List <SearchableMailbox> mailboxes = new List <SearchableMailbox>(); reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, XmlElementNames.DiscoverySearchConfiguration); DiscoverySearchConfiguration configuration = new DiscoverySearchConfiguration(); configuration.SearchId = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.SearchId); // the query could be empty means there won't be Query element, hence needs to read and check // if the next element is not Query, then it means already read SearchableMailboxes element configuration.SearchQuery = string.Empty; configuration.InPlaceHoldIdentity = string.Empty; configuration.ManagedByOrganization = string.Empty; configuration.Language = string.Empty; do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.SearchQuery)) { configuration.SearchQuery = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.SearchQuery); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.SearchQuery); } else if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.SearchableMailboxes)) { // search object without any source mailbox is possible, hence need to check if element is empty if (!reader.IsEmptyElement) { while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.SearchableMailboxes)) { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.SearchableMailbox)) { mailboxes.Add(SearchableMailbox.LoadFromXml(reader)); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.SearchableMailbox); } } } } else if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.InPlaceHoldIdentity)) { configuration.InPlaceHoldIdentity = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.InPlaceHoldIdentity); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.InPlaceHoldIdentity); } else if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.ManagedByOrganization)) { configuration.ManagedByOrganization = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.ManagedByOrganization); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.ManagedByOrganization); } else if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.Language)) { configuration.Language = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Language); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.Language); } else { break; } }while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.DiscoverySearchConfiguration)); configuration.SearchableMailboxes = mailboxes.Count == 0 ? null : mailboxes.ToArray(); return(configuration); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.PhoneCallId); this.phoneCallId.LoadFromXml(reader, XmlNamespace.Messages, XmlElementNames.PhoneCallId); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, XmlElementNames.PhoneCallId); }
/// <summary> /// Loads this NotificationEvent from XML. /// </summary> /// <param name="reader">The reader from which to read the notification event.</param> /// <param name="xmlElementName">The start XML element name of this notification event.</param> internal void LoadFromXml(EwsServiceXmlReader reader, string xmlElementName) { this.InternalLoadFromXml(reader); reader.ReadEndElementIfNecessary(XmlNamespace.Types, xmlElementName); }
/// <summary> /// Loads response from XML. /// </summary> /// <param name="reader">The reader.</param> /// <param name="xmlElementName">Name of the XML element.</param> internal void LoadFromXml(EwsServiceXmlReader reader, string xmlElementName) { if (!reader.IsStartElement(XmlNamespace.Messages, xmlElementName)) { reader.ReadStartElement(XmlNamespace.Messages, xmlElementName); } this.result = reader.ReadAttributeValue <ServiceResult>(XmlAttributeNames.ResponseClass); if (this.result == ServiceResult.Success || this.result == ServiceResult.Warning) { if (this.result == ServiceResult.Warning) { this.errorMessage = reader.ReadElementValue(XmlNamespace.Messages, XmlElementNames.MessageText); } else { reader.ReadElementValue(); if (reader.IsStartElement(XmlNamespace.Messages, XmlElementNames.MessageText)) { this.errorMessage = reader.ReadElementValue(XmlNamespace.Messages, XmlElementNames.MessageText); } } this.errorCode = reader.ReadElementValue <ServiceError>(XmlNamespace.Messages, XmlElementNames.ResponseCode); if (this.result == ServiceResult.Warning) { reader.ReadElementValue <int>(XmlNamespace.Messages, XmlElementNames.DescriptiveLinkKey); } // If batch processing stopped, EWS returns an empty element. Skip over it. if (this.BatchProcessingStopped) { do { reader.Read(); }while (!reader.IsEndElement(XmlNamespace.Messages, xmlElementName)); } else { this.ReadElementsFromXml(reader); reader.ReadEndElementIfNecessary(XmlNamespace.Messages, xmlElementName); } } else { this.errorMessage = reader.ReadElementValue(XmlNamespace.Messages, XmlElementNames.MessageText); this.errorCode = reader.ReadElementValue <ServiceError>(XmlNamespace.Messages, XmlElementNames.ResponseCode); reader.ReadElementValue <int>(XmlNamespace.Messages, XmlElementNames.DescriptiveLinkKey); while (!reader.IsEndElement(XmlNamespace.Messages, xmlElementName)) { reader.Read(); if (reader.IsStartElement()) { if (!this.LoadExtraErrorDetailsFromXml(reader, reader.LocalName)) { reader.SkipCurrentElement(); } } } } this.MapErrorCodeToErrorMessage(); this.Loaded(); }
/// <summary> /// Reads response elements from XML. /// </summary> /// <param name="reader">The reader.</param> internal override void ReadElementsFromXml(EwsServiceXmlReader reader) { this.Changes.SyncState = reader.ReadElementValue(XmlNamespace.Messages, XmlElementNames.SyncState); this.Changes.MoreChangesAvailable = !reader.ReadElementValue <bool>(XmlNamespace.Messages, this.GetIncludesLastInRangeXmlElementName()); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.Changes); if (!reader.IsEmptyElement) { do { reader.Read(); if (reader.IsStartElement()) { TChange change = this.CreateChangeInstance(); switch (reader.LocalName) { case XmlElementNames.Create: change.ChangeType = ChangeType.Create; break; case XmlElementNames.Update: change.ChangeType = ChangeType.Update; break; case XmlElementNames.Delete: change.ChangeType = ChangeType.Delete; break; case XmlElementNames.ReadFlagChange: change.ChangeType = ChangeType.ReadFlagChange; break; default: reader.SkipCurrentElement(); break; } if (change != null) { reader.Read(); reader.EnsureCurrentNodeIsStartElement(); switch (change.ChangeType) { case ChangeType.Delete: case ChangeType.ReadFlagChange: change.Id = change.CreateId(); change.Id.LoadFromXml(reader, change.Id.GetXmlElementName()); if (change.ChangeType == ChangeType.ReadFlagChange) { reader.Read(); reader.EnsureCurrentNodeIsStartElement(); ItemChange itemChange = change as ItemChange; EwsUtilities.Assert( itemChange != null, "SyncResponse.ReadElementsFromXml", "ReadFlagChange is only valid on ItemChange"); itemChange.IsRead = reader.ReadElementValue <bool>(XmlNamespace.Types, XmlElementNames.IsRead); } break; default: change.ServiceObject = EwsUtilities.CreateEwsObjectFromXmlElementName <TServiceObject>( reader.Service, reader.LocalName); change.ServiceObject.LoadFromXml( reader, true, /* clearPropertyBag */ this.propertySet, this.SummaryPropertiesOnly); break; } reader.ReadEndElementIfNecessary(XmlNamespace.Types, change.ChangeType.ToString()); this.changes.Add(change); } } }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.Changes)); } }
/// <summary> /// Load from xml /// </summary> /// <param name="reader">The reader</param> /// <returns>Search result object</returns> internal static SearchMailboxesResult LoadFromXml(EwsServiceXmlReader reader) { SearchMailboxesResult searchResult = new SearchMailboxesResult(); reader.ReadStartElement(XmlNamespace.Messages, XmlElementNames.SearchMailboxesResult); List <MailboxQuery> searchQueries = new List <MailboxQuery>(); do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.SearchQueries)) { reader.ReadStartElement(XmlNamespace.Types, XmlElementNames.MailboxQuery); string query = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Query); reader.ReadStartElement(XmlNamespace.Types, XmlElementNames.MailboxSearchScopes); List <MailboxSearchScope> mailboxSearchScopes = new List <MailboxSearchScope>(); do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.MailboxSearchScope)) { string mailbox = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Mailbox); reader.ReadStartElement(XmlNamespace.Types, XmlElementNames.SearchScope); string searchScope = reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.SearchScope); reader.ReadEndElement(XmlNamespace.Types, XmlElementNames.MailboxSearchScope); mailboxSearchScopes.Add(new MailboxSearchScope(mailbox, (MailboxSearchLocation)Enum.Parse(typeof(MailboxSearchLocation), searchScope))); } }while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.MailboxSearchScopes)); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.MailboxSearchScopes); searchQueries.Add(new MailboxQuery(query, mailboxSearchScopes.ToArray())); } }while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.SearchQueries)); reader.ReadEndElementIfNecessary(XmlNamespace.Types, XmlElementNames.SearchQueries); searchResult.SearchQueries = searchQueries.ToArray(); searchResult.ResultType = (SearchResultType)Enum.Parse(typeof(SearchResultType), reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.ResultType)); searchResult.ItemCount = int.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.ItemCount)); searchResult.Size = ulong.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.Size)); searchResult.PageItemCount = int.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.PageItemCount)); searchResult.PageItemSize = ulong.Parse(reader.ReadElementValue(XmlNamespace.Types, XmlElementNames.PageItemSize)); do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.KeywordStats)) { searchResult.KeywordStats = LoadKeywordStatsXml(reader); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.Items)) { searchResult.PreviewItems = LoadPreviewItemsXml(reader); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.FailedMailboxes)) { searchResult.FailedMailboxes = FailedSearchMailbox.LoadFailedMailboxesXml(XmlNamespace.Types, reader); } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.Refiners)) { List <SearchRefinerItem> refiners = new List <SearchRefinerItem>(); do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.Refiner)) { refiners.Add(SearchRefinerItem.LoadFromXml(reader)); } }while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.Refiners)); if (refiners.Count > 0) { searchResult.Refiners = refiners.ToArray(); } } if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.MailboxStats)) { List <MailboxStatisticsItem> mailboxStats = new List <MailboxStatisticsItem>(); do { reader.Read(); if (reader.IsStartElement(XmlNamespace.Types, XmlElementNames.MailboxStat)) { mailboxStats.Add(MailboxStatisticsItem.LoadFromXml(reader)); } }while (!reader.IsEndElement(XmlNamespace.Types, XmlElementNames.MailboxStats)); if (mailboxStats.Count > 0) { searchResult.MailboxStats = mailboxStats.ToArray(); } } }while (!reader.IsEndElement(XmlNamespace.Messages, XmlElementNames.SearchMailboxesResult)); return(searchResult); }