Beispiel #1
0
        // Token: 0x06000C40 RID: 3136 RVA: 0x000404C0 File Offset: 0x0003E6C0
        public void BuildResponse(XmlNode responseNode)
        {
            XmlNode xmlNode  = responseNode.OwnerDocument.CreateElement("Fetch", "ItemOperations:");
            XmlNode xmlNode2 = responseNode.OwnerDocument.CreateElement("Status", "ItemOperations:");
            XmlNode xmlNode3 = responseNode.OwnerDocument.CreateElement("Class", "AirSync:");
            XmlNode xmlNode4 = responseNode.OwnerDocument.CreateElement("Properties", "ItemOperations:");
            XmlNode xmlNode5 = responseNode.OwnerDocument.CreateElement("ServerId", "AirSync:");
            XmlNode xmlNode6 = responseNode.OwnerDocument.CreateElement("CollectionId", "AirSync:");
            XmlNode xmlNode7 = responseNode.OwnerDocument.CreateElement("LongId", "Search:");
            FlexibleSchemaStrategy missingPropertyStrategy = new FlexibleSchemaStrategy(this.schemaTags);

            this.schemaConverterOptions["BodyPreference"]     = this.bodyPreferences;
            this.schemaConverterOptions["BodyPartPreference"] = this.bodyPartPreferences;
            this.schemaConverterOptions["MIMESupport"]        = this.mimeSupport;
            bool flag = false;

            try
            {
                using (Item item = Item.Bind(this.mailboxSession, this.storeObjectId))
                {
                    if (this.removeRightsManagementProtection)
                    {
                        this.IrmRemoveRestriction(item);
                    }
                    if (this.bodyPartPreferences != null && this.bodyPartPreferences.Count > 0)
                    {
                        ConversationId valueOrDefault = item.GetValueOrDefault <ConversationId>(ItemSchema.ConversationId, null);
                        if (valueOrDefault != null)
                        {
                            Conversation conversation;
                            Command.CurrentCommand.GetOrCreateConversation(valueOrDefault, true, out conversation);
                            conversation.LoadItemParts(new List <StoreObjectId>
                            {
                                item.StoreObjectId
                            });
                        }
                    }
                    foreach (KeyValuePair <string, AirSyncSchemaState> keyValuePair in this.schemaStates)
                    {
                        AirSyncSchemaState       value = keyValuePair.Value;
                        AirSyncXsoSchemaState    airSyncXsoSchemaState    = value as AirSyncXsoSchemaState;
                        AirSyncEntitySchemaState airSyncEntitySchemaState = value as AirSyncEntitySchemaState;
                        IServerDataObject        serverDataObject;
                        if (airSyncXsoSchemaState != null)
                        {
                            serverDataObject = airSyncXsoSchemaState.GetXsoDataObject();
                        }
                        else
                        {
                            if (airSyncEntitySchemaState == null)
                            {
                                throw new NotImplementedException(string.Format("Schema state for \"{0}\" is not implemented yet.", keyValuePair.Key));
                            }
                            serverDataObject = airSyncEntitySchemaState.GetEntityDataObject();
                        }
                        if (serverDataObject.CanConvertItemClassUsingCurrentSchema(item.ClassName))
                        {
                            AirSyncDataObject airSyncDataObject = value.GetAirSyncDataObject(this.schemaConverterOptions, missingPropertyStrategy);
                            if (this.rightsManagementSupport)
                            {
                                Command.CurrentCommand.DecodeIrmMessage(item, true);
                            }
                            item.Load(serverDataObject.GetPrefetchProperties());
                            try
                            {
                                serverDataObject.Bind(item);
                                airSyncDataObject.Bind(xmlNode4);
                                airSyncDataObject.CopyFrom(serverDataObject);
                            }
                            finally
                            {
                                airSyncDataObject.Unbind();
                                serverDataObject.Unbind();
                            }
                            if (this.rightsManagementSupport)
                            {
                                Command.CurrentCommand.SaveLicense(item);
                            }
                            xmlNode3.InnerText = keyValuePair.Key;
                            flag = true;
                            break;
                        }
                    }
                }
            }
            catch (ObjectNotFoundException innerException)
            {
                throw new AirSyncPermanentException(StatusCode.Sync_ClientServerConversion, innerException, false)
                      {
                          ErrorStringForProtocolLogger = "NotFoundInMbxFetch"
                      };
            }
            catch (AirSyncPermanentException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (!SyncCommand.IsItemSyncTolerableException(ex))
                {
                    throw;
                }
                AirSyncDiagnostics.TraceError <Exception>(ExTraceGlobals.ConversionTracer, this, "Sync-tolerable Item conversion Exception was thrown. Location BuildResponse(). {0}", ex);
            }
            if (!flag)
            {
                throw new AirSyncPermanentException(StatusCode.Sync_InvalidWaitTime, false)
                      {
                          ErrorStringForProtocolLogger = "ConvertErrorInMbxFetch"
                      };
            }
            xmlNode2.InnerText = 1.ToString(CultureInfo.InvariantCulture);
            xmlNode.AppendChild(xmlNode2);
            if (this.longId != null)
            {
                xmlNode7.InnerText = this.longId;
                xmlNode.AppendChild(xmlNode7);
            }
            else
            {
                xmlNode6.InnerText = this.collectionId;
                xmlNode.AppendChild(xmlNode6);
                xmlNode5.InnerText = this.serverId;
                xmlNode.AppendChild(xmlNode5);
            }
            xmlNode.AppendChild(xmlNode3);
            xmlNode.AppendChild(xmlNode4);
            if (this.multiPartResponse)
            {
                XmlNode xmlNode8 = xmlNode4["Body"];
                if (xmlNode8 != null)
                {
                    XmlNode            xmlNode9           = xmlNode8["Data"];
                    AirSyncBlobXmlNode airSyncBlobXmlNode = xmlNode9 as AirSyncBlobXmlNode;
                    if (xmlNode9 != null && (!string.IsNullOrEmpty(xmlNode9.InnerText) || (airSyncBlobXmlNode != null && airSyncBlobXmlNode.Stream != null)))
                    {
                        XmlNode xmlNode10 = responseNode.OwnerDocument.CreateElement("Part", "ItemOperations:");
                        xmlNode10.InnerText = this.partNumber.ToString(CultureInfo.InvariantCulture);
                        xmlNode8.ReplaceChild(xmlNode10, xmlNode9);
                        if (airSyncBlobXmlNode != null && airSyncBlobXmlNode.Stream != null)
                        {
                            this.outStream = airSyncBlobXmlNode.Stream;
                            if (airSyncBlobXmlNode.Stream is AirSyncStream)
                            {
                                this.delayStreamDispose = true;
                            }
                            AirSyncDiagnostics.TraceError <Type>(ExTraceGlobals.ConversionTracer, this, "blobNode.Stream is of {0} type.", airSyncBlobXmlNode.Stream.GetType());
                        }
                        else
                        {
                            UTF8Encoding utf8Encoding = new UTF8Encoding();
                            this.outStream = new MemoryStream(utf8Encoding.GetBytes(xmlNode9.InnerText));
                        }
                    }
                }
            }
            responseNode.AppendChild(xmlNode);
        }
Beispiel #2
0
        public void BuildResponse(XmlElement responseNode)
        {
            MailboxSearchProvider.BuildResponseState buildResponseState = MailboxSearchProvider.BuildResponseState.Seeking;
            int  num  = -1;
            bool flag = false;

            this.totalRowCount   = 0;
            this.numberResponses = 0;
            XmlNode xmlNode = responseNode.OwnerDocument.CreateElement("Status", "Search:");

            responseNode.AppendChild(xmlNode);
            xmlNode.InnerText = 1.ToString(CultureInfo.InvariantCulture);
            foreach (MailboxSearchCriteriaBuilder.SchemaCacheItem schemaCacheItem in this.schemaCache.Values)
            {
                schemaCacheItem.SchemaState.Options.Clear();
                this.mailboxSchemaOptions.PopulateOptionsCollection(this.context.Request.DeviceIdentity.DeviceType, schemaCacheItem.SchemaState.Options);
            }
            bool flag2 = false;
            int  num2  = 0;
            bool hasBodyPartPreferences = this.mailboxSchemaOptions.HasBodyPartPreferences;

            if (this.queryFilter != null)
            {
                using (QueryResult queryResult = this.searchFolder.ItemQuery(ItemQueryType.None, null, this.defaultSortBy, MailboxSearchProvider.queryColumns))
                {
                    this.uncappedResultCount = queryResult.EstimatedRowCount;
                    num2 = this.uncappedResultCount;
                    while (!flag2 && num <= this.maxRange)
                    {
                        object[][] rows = queryResult.GetRows(this.maxRange + 1);
                        flag2 = (rows.Length == 0);
                        for (int i = 0; i < rows.Length; i++)
                        {
                            StoreObjectId objectId       = (rows[i][0] as VersionedId).ObjectId;
                            string        itemClass      = rows[i][1] as string;
                            StoreObjectId parentFolderId = rows[i][2] as StoreObjectId;
                            string        innerText      = null;
                            try
                            {
                                AirSyncDataObject airSyncDataObject = null;
                                IServerDataObject serverDataObject  = null;
                                foreach (string text in this.schemaCache.Keys)
                                {
                                    MailboxSearchCriteriaBuilder.SchemaCacheItem schemaCacheItem2 = this.schemaCache[text];
                                    if (schemaCacheItem2.MailboxDataObject.CanConvertItemClassUsingCurrentSchema(itemClass))
                                    {
                                        innerText         = text;
                                        airSyncDataObject = schemaCacheItem2.AirSyncDataObject;
                                        serverDataObject  = schemaCacheItem2.MailboxDataObject;
                                        break;
                                    }
                                }
                                if (airSyncDataObject != null)
                                {
                                    if (this.searchCriteriaBuilder.DoesMatchCriteria(parentFolderId, objectId))
                                    {
                                        num++;
                                        if (MailboxSearchProvider.BuildResponseState.BuildingResponse == buildResponseState || (buildResponseState == MailboxSearchProvider.BuildResponseState.Seeking && num >= this.minRange))
                                        {
                                            buildResponseState = MailboxSearchProvider.BuildResponseState.BuildingResponse;
                                            buildResponseState = MailboxSearchProvider.BuildResponseState.BuildingResponse;
                                            Item item = null;
                                            try
                                            {
                                                item = this.BindToItemWithItemClass(objectId, itemClass, serverDataObject.GetPrefetchProperties());
                                                if (this.searchCriteriaBuilder.ExcludedFolders.Contains(item.ParentId))
                                                {
                                                    num--;
                                                }
                                                else
                                                {
                                                    XmlNode xmlNode2 = responseNode.OwnerDocument.CreateElement("Result", "Search:");
                                                    XmlNode xmlNode3 = responseNode.OwnerDocument.CreateElement("Properties", "Search:");
                                                    XmlNode xmlNode4 = responseNode.OwnerDocument.CreateElement("Class", "AirSync:");
                                                    xmlNode4.InnerText = innerText;
                                                    XmlNode xmlNode5 = responseNode.OwnerDocument.CreateElement("LongId", "Search:");
                                                    XmlNode xmlNode6 = responseNode.OwnerDocument.CreateElement("CollectionId", "AirSync:");
                                                    xmlNode5.InnerText = HttpUtility.UrlEncode(item.Id.ObjectId.ToBase64String());
                                                    if (hasBodyPartPreferences)
                                                    {
                                                        if (this.searchCriteriaBuilder.Conversation == null)
                                                        {
                                                            throw new InvalidOperationException("Conversation object should not be null here when body part is requested!");
                                                        }
                                                        this.searchCriteriaBuilder.Conversation.LoadItemParts(new List <StoreObjectId>
                                                        {
                                                            item.StoreObjectId
                                                        });
                                                    }
                                                    if (this.mailboxSchemaOptions.RightsManagementSupport)
                                                    {
                                                        Command.CurrentCommand.DecodeIrmMessage(item, false);
                                                    }
                                                    try
                                                    {
                                                        serverDataObject.Bind(item);
                                                        airSyncDataObject.Bind(xmlNode3);
                                                        airSyncDataObject.CopyFrom(serverDataObject);
                                                    }
                                                    finally
                                                    {
                                                        airSyncDataObject.Unbind();
                                                        serverDataObject.Unbind();
                                                    }
                                                    if (this.mailboxSchemaOptions.RightsManagementSupport)
                                                    {
                                                        Command.CurrentCommand.SaveLicense(item);
                                                    }
                                                    xmlNode2.AppendChild(xmlNode4);
                                                    xmlNode2.AppendChild(xmlNode5);
                                                    if (this.FolderIdMappingSyncState == null)
                                                    {
                                                        throw new SearchNeedToFolderSyncException();
                                                    }
                                                    string text2 = ((FolderIdMapping)this.FolderIdMappingSyncState[CustomStateDatumType.IdMapping])[MailboxSyncItemId.CreateForNewItem(item.ParentId)];
                                                    if (text2 == null)
                                                    {
                                                        throw new SearchNeedToFolderSyncException();
                                                    }
                                                    xmlNode6.InnerText = text2;
                                                    xmlNode2.AppendChild(xmlNode6);
                                                    xmlNode2.AppendChild(xmlNode3);
                                                    responseNode.AppendChild(xmlNode2);
                                                    this.numberResponses++;
                                                    if (this.minRange + this.numberResponses > this.maxRange)
                                                    {
                                                        flag = true;
                                                        buildResponseState = MailboxSearchProvider.BuildResponseState.CountingTotal;
                                                    }
                                                }
                                            }
                                            catch
                                            {
                                                num--;
                                                throw;
                                            }
                                            finally
                                            {
                                                if (item != null)
                                                {
                                                    item.Dispose();
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                if (ex is SearchNeedToFolderSyncException)
                                {
                                    throw;
                                }
                                if (!SyncCommand.IsItemSyncTolerableException(ex) && !SyncCommand.IsObjectNotFound(ex))
                                {
                                    throw;
                                }
                            }
                        }
                    }
                    if (!flag && this.uncappedResultCount > queryResult.EstimatedRowCount)
                    {
                        this.haveUnretrievableResults = true;
                    }
                }
            }
            if (this.numberResponses == 0)
            {
                XmlNode newChild = responseNode.OwnerDocument.CreateElement("Result", "Search:");
                responseNode.AppendChild(newChild);
                if (this.minRange >= GlobalSettings.MaxMailboxSearchResults)
                {
                    xmlNode.InnerText = 12.ToString(CultureInfo.InvariantCulture);
                    return;
                }
            }
            else if (this.rangeSpecified)
            {
                XmlNode xmlNode7 = responseNode.OwnerDocument.CreateElement("Range", "Search:");
                XmlNode xmlNode8 = responseNode.OwnerDocument.CreateElement("Total", "Search:");
                xmlNode7.InnerText = this.minRange.ToString(CultureInfo.InvariantCulture) + "-" + (this.minRange + this.numberResponses - 1).ToString(CultureInfo.InvariantCulture);
                responseNode.AppendChild(xmlNode7);
                if (this.haveUnretrievableResults)
                {
                    this.totalRowCount = this.uncappedResultCount;
                    xmlNode.InnerText  = 12.ToString(CultureInfo.InvariantCulture);
                }
                else if (this.uncappedResultCount > num2 || !flag2)
                {
                    this.totalRowCount = this.uncappedResultCount;
                }
                else
                {
                    this.totalRowCount = num + 1;
                    if (this.minRange + this.numberResponses == GlobalSettings.MaxMailboxSearchResults)
                    {
                        xmlNode.InnerText = 12.ToString(CultureInfo.InvariantCulture);
                    }
                }
                xmlNode8.InnerText = this.totalRowCount.ToString(CultureInfo.InvariantCulture);
                responseNode.AppendChild(xmlNode8);
            }
        }