internal void ExecuteUpdateQuery(GetUpdates getUpdates) { UpdateQueryContext updateQueryContext = null; lock (this.queryQueueLockObject) { if (this.queryQueue.Count > 0) { updateQueryContext = this.queryQueue.Dequeue(); } else { this.GetUpdatesCount--; if (this.GetUpdatesCount < 0) { throw new InvalidOperationException("GetUpdatesCount can't be less than 0."); } ExtensionsCache.Tracer.TraceDebug <int>(0L, "Query queue is empty. GetUpdates Count {0}", this.GetUpdatesCount); } } if (updateQueryContext != null) { ExtensionsCache.Tracer.TraceDebug <IExchangePrincipal>(0L, "Starting query for {0}.", updateQueryContext.ExchangePrincipal); if (this.SkipSubmitUpdateQueryForTest) { this.SubmitCount = updateQueryContext.UpdateRequestAssets.Count; return; } getUpdates.Execute(updateQueryContext); } }
internal void QueueQueryItem(UpdateQueryContext queryContext) { GetUpdates getUpdates = null; lock (this.queryQueueLockObject) { if (this.queryQueue.Count > 500) { ExtensionsCache.Tracer.TraceError <IExchangePrincipal>(0L, "Query for {0} not added to the query queue because queue is full.", queryContext.ExchangePrincipal); ExtensionDiagnostics.Logger.LogEvent(ApplicationLogicEventLogConstants.Tuple_ExtensionUpdateQueryMaxExceeded, null, new object[] { "ProcessUpdates", ExtensionDiagnostics.GetLoggedMailboxIdentifier(queryContext.ExchangePrincipal) }); return; } ExtensionsCache.Tracer.TraceDebug <IExchangePrincipal>(0L, "Adding query for {0} to the query queue.", queryContext.ExchangePrincipal); this.queryQueue.Enqueue(queryContext); if (this.GetUpdatesCount < 50) { getUpdates = new GetUpdates(this.urlsCache, this); this.GetUpdatesCount++; ExtensionsCache.Tracer.TraceDebug <int>(0L, "Creating a new instance of GetUpdates. GetUpdates Count {0}", this.GetUpdatesCount); } else { ExtensionsCache.Tracer.TraceDebug <int>(0L, "Too many GetUpdates commands. Query will be handled from pool. GetUpdates Count {0}", this.GetUpdatesCount); } } if (getUpdates != null) { this.ExecuteUpdateQuery(getUpdates); } }
// Token: 0x06000BF5 RID: 3061 RVA: 0x00031C20 File Offset: 0x0002FE20 internal void InstallExtensionUpdates(List <ExtensionData> updates, UpdateQueryContext queryContext) { GetUpdates.Tracer.TraceDebug <int>(0L, "GetUpdates.InstallExtensionUpdates: Installing {0} extensions.", updates.Count); ExtensionData currentExtensionData = null; Exception ex = InstalledExtensionTable.RunClientExtensionAction(delegate { using (MailboxSession mailboxSession = MailboxSession.OpenAsSystemService(queryContext.ExchangePrincipal, queryContext.CultureInfo, queryContext.ClientInfoString)) { using (InstalledExtensionTable installedExtensionTable = InstalledExtensionTable.CreateInstalledExtensionTable(queryContext.Domain, queryContext.IsUserScope, queryContext.OrgEmptyMasterTableCache, mailboxSession)) { foreach (ExtensionData currentExtensionData in updates) { currentExtensionData = currentExtensionData; GetUpdates.Tracer.TraceDebug <string>(0L, "GetUpdates.InstallExtensionUpdates: Installing asset {0}", currentExtensionData.MarketplaceAssetID); installedExtensionTable.AddExtension(currentExtensionData, true); currentExtensionData = null; } installedExtensionTable.SaveXML(); } } }); string text = (currentExtensionData == null) ? string.Empty : currentExtensionData.MarketplaceAssetID; if (ex != null) { GetUpdates.Tracer.TraceError <string, Exception>(0L, "GetUpdates.InstallExtensionUpdates: Installation failed for extension {0}. Exception: {1}", text, ex); ExtensionDiagnostics.Logger.LogEvent(ApplicationLogicEventLogConstants.Tuple_ExtensionUpdateFailed, null, new object[] { "UpdateExtension", ExtensionDiagnostics.GetLoggedMailboxIdentifier(queryContext.ExchangePrincipal), text, ExtensionDiagnostics.GetLoggedExceptionString(ex) }); } else { ExtensionDiagnostics.LogToDatacenterOnly(ApplicationLogicEventLogConstants.Tuple_ExtensionUpdateSuccess, null, new object[] { "UpdateExtension", ExtensionDiagnostics.GetLoggedMailboxIdentifier(queryContext.ExchangePrincipal), text }); } this.ExecuteNextUpdateQuery(); }
// Token: 0x06000BE9 RID: 3049 RVA: 0x00030B20 File Offset: 0x0002ED20 internal void Execute(UpdateQueryContext queryContext) { if (queryContext == null) { throw new ArgumentNullException("queryContext"); } if (queryContext.UpdateRequestAssets == null) { throw new ArgumentNullException("QueryContext.UpdateRequestAssets"); } if (queryContext.UpdateRequestAssets.Count == 0) { throw new ArgumentException("QueryContext.UpdateRequestAssets must include 1 or more extensions"); } this.queryContext = queryContext; if (queryContext.UpdateRequestAssets.Count > 100) { GetUpdates.Tracer.TraceError <int, int>(0L, "GetUpdates.Execute: Too many extensions passed. Passed: {0} Supported: {1}", queryContext.UpdateRequestAssets.Count, 100); string[] array = queryContext.UpdateRequestAssets.Keys.ToArray <string>(); for (int i = 100; i < array.Length; i++) { GetUpdates.Tracer.TraceDebug <string>(0L, "GetUpdates.Execute: Too many extensions. Removing {0}.", array[i]); queryContext.UpdateRequestAssets.Remove(array[i]); } ExtensionDiagnostics.Logger.LogEvent(ApplicationLogicEventLogConstants.Tuple_TooManyExtensionsForAutomaticUpdate, null, new object[] { "ProcessUpdates", this.GetLoggedMailboxIdentifier() }); } GetUpdates.Tracer.TraceDebug <int>(0L, "GetUpdates.Execute: Getting update information for {0} extensions.", queryContext.UpdateRequestAssets.Count); this.updateRequestAssets = queryContext.UpdateRequestAssets; GetAppState getAppState = new GetAppState(this.urlsCache); using (ActivityContext.SuppressThreadScope()) { getAppState.Execute(queryContext.UpdateRequestAssets.Values, queryContext.DeploymentId, new BaseAsyncCommand.GetLoggedMailboxIdentifierCallback(this.GetLoggedMailboxIdentifier), new GetAppState.SuccessCallback(this.GetAppStateSuccessCallback), new BaseAsyncCommand.FailureCallback(this.GetAppStateFailureCallback)); } }
// Token: 0x06000BE7 RID: 3047 RVA: 0x00030AB8 File Offset: 0x0002ECB8 internal GetUpdates(Dictionary <string, UpdateRequestAsset> updateRequestAssets, ExtensionsCache extensionsCache, UpdateQueryContext updateQueryContext) { this.updateRequestAssets = updateRequestAssets; this.extensionsCache = extensionsCache; this.queryContext = updateQueryContext; }
internal void SubmitUpdateQuery(ICollection <ExtensionData> extensions, UpdateQueryContext queryContext) { if (extensions == null) { throw new ArgumentNullException("extensions"); } if (extensions.Count == 0) { throw new ArgumentException("extensions must contain one or more extensions"); } if (this.SkipSubmitUpdateQueryForTest) { this.SubmitCount = 0; } Dictionary <string, UpdateRequestAsset> dictionary = new Dictionary <string, UpdateRequestAsset>(extensions.Count); foreach (ExtensionData extensionData in extensions) { if (extensionData.Version == null) { ExtensionsCache.Tracer.TraceDebug <string>(0L, "ExtensionsCache.SubmitUpdateQuery: Extension {0} not added to query list because version is invalid", extensionData.MarketplaceAssetID); ExtensionDiagnostics.Logger.LogEvent(ApplicationLogicEventLogConstants.Tuple_InvalidVersionSubmitUpdateQuery, extensionData.MarketplaceAssetID, new object[] { "ProcessUpdates", ExtensionDiagnostics.GetLoggedMailboxIdentifier(queryContext.ExchangePrincipal), extensionData.MarketplaceAssetID }); } else { if (extensionData.Scope == null) { throw new ArgumentNullException("extensionData.Scope"); } if (extensionData.RequestedCapabilities == null) { throw new ArgumentNullException("extensionData.RequestedCapabilities"); } ExtensionsCacheEntry extensionsCacheEntry = null; if (this.extensionsDictionary.TryGetValue(extensionData.MarketplaceAssetID, out extensionsCacheEntry) && !InstalledExtensionTable.IsUpdateCheckTimeExpired(extensionsCacheEntry.LastUpdateCheckTime) && extensionsCacheEntry.Version == extensionData.Version) { ExtensionsCache.Tracer.TraceDebug <string>(0L, "ExtensionsCache.SubmitUpdateQuery: Extension {0} not added to query list because version matches recent cache entry", extensionData.MarketplaceAssetID); } else { UpdateRequestAsset updateRequestAsset = null; if (dictionary.TryGetValue(extensionData.MarketplaceAssetID, out updateRequestAsset)) { ExtensionsCache.Tracer.TraceDebug <string, string, string>(0L, "ExtensionsCache.SubmitUpdateQuery: Extension {0} not added to query list because asset with same MarketplaceAssetID is already in list. ExtensionIds with same asset id: {1} {2}", extensionData.MarketplaceAssetID, extensionData.ExtensionId, updateRequestAsset.ExtensionID); } else { dictionary.Add(extensionData.MarketplaceAssetID, new UpdateRequestAsset { MarketplaceContentMarket = extensionData.MarketplaceContentMarket, ExtensionID = extensionData.ExtensionId, MarketplaceAssetID = extensionData.MarketplaceAssetID, RequestedCapabilities = extensionData.RequestedCapabilities.Value, Version = extensionData.Version, DisableReason = extensionData.DisableReason, Enabled = extensionData.Enabled, Scope = extensionData.Scope.Value, Etoken = extensionData.Etoken }); } } } } if (dictionary.Count == 0) { ExtensionsCache.Tracer.TraceDebug(0L, "ExtensionsCache.SubmitUpdateQuery: UpdateRequestAssets count is 0. Updates query will not be started."); return; } queryContext.UpdateRequestAssets = dictionary; queryContext.DeploymentId = ExtensionDataHelper.GetDeploymentId(queryContext.Domain); this.QueueQueryItem(queryContext); }