// Token: 0x06000010 RID: 16 RVA: 0x0000274C File Offset: 0x0000094C
 private static bool IsDisabled(string assistantName)
 {
     if (InfoworkerAssistants.disabledAssistantsNames == null)
     {
         InfoworkerAssistants.disabledAssistantsNames = InfoworkerAssistants.ReadDisabledAssistants();
     }
     return(InfoworkerAssistants.disabledAssistantsNames.Contains(assistantName));
 }
        // Token: 0x06000012 RID: 18 RVA: 0x000029F4 File Offset: 0x00000BF4
        internal static T[] CreateAssistantTypes <T>(InfoworkerAssistants.AssistantConstructor <T>[] assistantTypes)
        {
            List <T> list = new List <T>();

            foreach (InfoworkerAssistants.AssistantConstructor <T> assistantConstructor in assistantTypes)
            {
                if (!InfoworkerAssistants.IsDisabled(assistantConstructor.Name) && (assistantConstructor.IsEnabledDelegate == null || assistantConstructor.IsEnabledDelegate()))
                {
                    bool flag = false;
                    Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_CreatingAssistant, null, new object[]
                    {
                        assistantConstructor.Name
                    });
                    try
                    {
                        list.Add(assistantConstructor.ConstructorDelegate());
                        flag = true;
                    }
                    finally
                    {
                        if (!flag)
                        {
                            Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_FailCreateAssistant, null, new object[]
                            {
                                assistantConstructor.Name
                            });
                        }
                    }
                    InfoworkerAssistants.TracerPfd.TracePfd <int, string>(3L, "PFD IWS {0} Assistant {1} is Enabled", 18839, assistantConstructor.Name);
                }
                else
                {
                    Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_DisabledAssistant, null, new object[]
                    {
                        assistantConstructor.Name
                    });
                }
            }
            return(list.ToArray());
        }
        // Token: 0x06000011 RID: 17 RVA: 0x000028D4 File Offset: 0x00000AD4
        internal static void DeleteWatermarksForDisabledAndDeprecatedAssistants(object stateNotUsed)
        {
            List <Guid> disabledEventAssistants = new List <Guid>(InfoworkerAssistants.EventBasedAssistantTypes.Length);

            foreach (InfoworkerAssistants.EventAssistantConstructor eventAssistantConstructor in InfoworkerAssistants.EventBasedAssistantTypes)
            {
                if (InfoworkerAssistants.IsDisabled(eventAssistantConstructor.Name))
                {
                    ExTraceGlobals.AssistantBaseTracer.TraceDebug <string>(0L, "[InfoworkerAssistants]: Event assistant '{0}' is disabled.", eventAssistantConstructor.Name);
                    disabledEventAssistants.Add(eventAssistantConstructor.Identity);
                }
            }
            disabledEventAssistants.AddRange(InfoworkerAssistants.deprecatedAssistants);
            if (disabledEventAssistants.Count == 0)
            {
                ExTraceGlobals.AssistantBaseTracer.TraceDebug(0L, "[InfoworkerAssistants]: There are no disabled or deprecated assistants.");
                return;
            }
            ExTraceGlobals.AssistantBaseTracer.TraceDebug <int>(0L, "[InfoworkerAssistants]: There are {0} disabled and/or deprecated assistants.", disabledEventAssistants.Count);
            Exception exception = null;

            try
            {
                GrayException.MapAndReportGrayExceptions(delegate()
                {
                    try
                    {
                        using (ExRpcAdmin exRpcAdmin = ExRpcAdmin.Create("Client=EBA", null, null, null, null))
                        {
                            MdbStatus[] array = exRpcAdmin.ListMdbStatus(false);
                            foreach (MdbStatus mdbStatus in array)
                            {
                                if (DatabaseManager.IsOnlineDatabase(mdbStatus))
                                {
                                    foreach (Guid guid in disabledEventAssistants)
                                    {
                                        MapiEventManager mapiEventManager = MapiEventManager.Create(exRpcAdmin, guid, mdbStatus.MdbGuid);
                                        ExTraceGlobals.AssistantBaseTracer.TraceDebug <Guid, string>(0L, "[InfoworkerAssistants]: Deleting watermarks for consumer {0} on database {1}.", guid, mdbStatus.MdbName);
                                        mapiEventManager.DeleteWatermarks();
                                    }
                                }
                            }
                        }
                    }
                    catch (MapiExceptionVersion exception2)
                    {
                        exception = exception2;
                    }
                    catch (MapiExceptionMdbOffline exception3)
                    {
                        exception = exception3;
                    }
                    catch (MapiExceptionExiting exception4)
                    {
                        exception = exception4;
                    }
                    catch (MapiExceptionNetworkError exception5)
                    {
                        exception = exception5;
                    }
                    catch (MapiExceptionADUnavailable exception6)
                    {
                        exception = exception6;
                    }
                    catch (MapiExceptionNoAccess exception7)
                    {
                        exception = exception7;
                    }
                });
            }
            catch (GrayException exception)
            {
                GrayException exception8;
                exception = exception8;
            }
            if (exception != null)
            {
                ExTraceGlobals.AssistantBaseTracer.TraceError <Exception>(0L, "[InfoworkerAssistants]: Failed to cleanup the watermarks at this time. Exception: {0}", exception);
            }
        }
 // Token: 0x0600000F RID: 15 RVA: 0x00002740 File Offset: 0x00000940
 public static ITimeBasedAssistantType[] CreateTimeBasedAssistantTypes()
 {
     return(InfoworkerAssistants.CreateAssistantTypes <ITimeBasedAssistantType>(InfoworkerAssistants.TimeBasedAssistantTypes));
 }
 // Token: 0x0600000E RID: 14 RVA: 0x0000272E File Offset: 0x0000092E
 public static IEventBasedAssistantType[] CreateEventBasedAssistantTypes()
 {
     InfoworkerAssistants.DeleteWatermarksForDisabledAndDeprecatedAssistants(null);
     return(InfoworkerAssistants.CreateAssistantTypes <IEventBasedAssistantType>(InfoworkerAssistants.EventBasedAssistantTypes));
 }
        // Token: 0x06000004 RID: 4 RVA: 0x0000223C File Offset: 0x0000043C
        protected override void OnStartInternal(string[] args)
        {
            if (AssistantsService.debugBreakOnStart)
            {
                Debugger.Break();
            }
            using (Process currentProcess = Process.GetCurrentProcess())
            {
                Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_ServiceStarting, null, new object[]
                {
                    currentProcess.Id,
                    "Microsoft Exchange",
                    "15.00.1497.010"
                });
            }
            AssistantsService.TracerPfd.TracePfd <int, DateTime>((long)this.GetHashCode(), "PFD IWS {0} Starting the Mailbox Assistants Service {1} ", 28055, DateTime.UtcNow);
            AssistantsLog.LogServiceStartEvent(this.activityId);
            bool flag = false;

            try
            {
                ADSession.DisableAdminTopologyMode();
                SettingOverrideSync.Instance.Start(true);
                ProcessAccessManager.RegisterComponent(SettingOverrideSync.Instance);
                AssistantsService.TracerPfd.TracePfd <int>((long)this.GetHashCode(), "PFD IWS {0} Initializing the Assistant Infrastructure", 27479);
                this.databaseManager = new DatabaseManager("MSExchangeMailboxAssistants", 50, InfoworkerAssistants.CreateEventBasedAssistantTypes(), InfoworkerAssistants.CreateTimeBasedAssistantTypes(), true);
                this.databaseManager.Start();
                MailboxSearchServer.StartServer();
                Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_ServiceStarted, null, new object[0]);
                AssistantsService.TracerPfd.TracePfd <int>((long)this.GetHashCode(), "PFD IWS {0} Mailbox Assistants Service is started successfully ", 23959);
                if (Configuration.MemoryMonitorEnabled)
                {
                    this.memoryMonitor = new MemoryMonitor();
                    this.memoryMonitor.Start((ulong)Configuration.MemoryBarrierPrivateBytesUsageLimit, (uint)Configuration.MemoryBarrierNumberOfSamples, Configuration.MemoryBarrierSamplingDelay, Configuration.MemoryBarrierSamplingInterval, delegate(ulong memoryInUse)
                    {
                        Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_ServiceOutOfMemory, null, new object[]
                        {
                            memoryInUse
                        });
                        throw new ServiceOutOfMemoryException();
                    });
                }
                this.watermarkCleanupTimer = new Timer(new TimerCallback(InfoworkerAssistants.DeleteWatermarksForDisabledAndDeprecatedAssistants), null, Configuration.WatermarkCleanupInterval, Configuration.WatermarkCleanupInterval);
                ProcessAccessManager.RegisterComponent(this);
                flag = true;
            }
            finally
            {
                if (!flag)
                {
                    Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_ServiceFailedToStart, null, new object[0]);
                }
            }
        }