// Token: 0x06001400 RID: 5120 RVA: 0x00073D14 File Offset: 0x00071F14
        protected override void DrainNotifications(ConcurrentDictionary <Guid, PushNotificationContext> notificationContexts)
        {
            MailboxNotificationBatch mailboxNotificationBatch = new MailboxNotificationBatch();

            foreach (Guid guid in notificationContexts.Keys)
            {
                if (base.CheckCancellation())
                {
                    return;
                }
                PushNotificationContext pushNotificationContext = notificationContexts[guid];
                MailboxNotification     notification            = this.CreateMailboxNotification(guid, pushNotificationContext);
                mailboxNotificationBatch.Add(notification);
                NotificationTracker.ReportCreated(notification, pushNotificationContext.OriginalTime);
                PushNotificationHelper.LogNotificationBatchEntry(guid, notification);
            }
            if (!mailboxNotificationBatch.IsEmpty)
            {
                ExTraceGlobals.PushNotificationAssistantTracer.TraceDebug <int>((long)this.GetHashCode(), "PushNotificationBatchManager.DrainNotifications: Ready to send notification batch, size:'{0}'.", mailboxNotificationBatch.Count);
                if (base.CheckCancellation())
                {
                    return;
                }
                PushNotificationBatchManager.notificationsPerBatchCounter.AddSample((long)mailboxNotificationBatch.Count);
                this.SendPublishNotificationRequest(mailboxNotificationBatch);
            }
            notificationContexts.Clear();
        }
Exemple #2
0
            // Token: 0x060013C4 RID: 5060 RVA: 0x00073304 File Offset: 0x00071504
            public PushNotificationBatchManager TakeReference()
            {
                PushNotificationBatchManager batchManager;

                lock (this.syncroot)
                {
                    this.referenceCounter++;
                    if (this.BatchManager == null)
                    {
                        this.PublisherClient = new PublisherServiceProxy(null);
                        this.BatchManager    = new PushNotificationBatchManager(this.BatchConfig, this.PublisherClient);
                    }
                    if (this.ProxyWatcher == null && !this.AssistantConfig.IsAssistantPublishingEnabled)
                    {
                        this.ProxyWatcher = new PushNotificationProxyConfigWatcher(this.AssistantConfig);
                        this.ProxyWatcher.Start();
                    }
                    if (this.referenceCounter == 1)
                    {
                        PushNotificationHelper.LogAssistantPublishingStatus(this.AssistantConfig.IsPublishingEnabled);
                    }
                    batchManager = this.BatchManager;
                }
                return(batchManager);
            }
 // Token: 0x060013F9 RID: 5113 RVA: 0x00073C50 File Offset: 0x00071E50
 internal PushNotificationBatchManager(PushNotificationBatchManagerConfig assistantConfig, IPublisherServiceContract publisherClient) : base((assistantConfig != null) ? assistantConfig.BatchTimerInSeconds : 0U, (assistantConfig != null) ? assistantConfig.BatchSize : 0U)
 {
     ArgumentValidator.ThrowIfNull("assistantConfig", assistantConfig);
     ArgumentValidator.ThrowIfNull("publisherClient", publisherClient);
     this.configuration   = assistantConfig;
     this.publisherClient = publisherClient;
     PushNotificationHelper.LogBatchManager(this.configuration);
 }
Exemple #4
0
        // Token: 0x060013B0 RID: 5040 RVA: 0x0007314C File Offset: 0x0007134C
        static PushNotificationAssistant()
        {
            RegistrySession registrySession = new RegistrySession(true);
            PushNotificationBatchManagerConfig pushNotificationBatchManagerConfig = registrySession.Read <PushNotificationBatchManagerConfig>();

            PushNotificationHelper.CheckAndLogInvalidConfigurationSetting(pushNotificationBatchManagerConfig);
            PushNotificationAssistant.AssistantConfig = registrySession.Read <PushNotificationAssistantConfig>();
            PushNotificationHelper.CheckAndLogInvalidConfigurationSetting(PushNotificationAssistant.AssistantConfig);
            PushNotificationAssistant.SharedResources = new PushNotificationAssistant.SharedResourcesGuard(pushNotificationBatchManagerConfig, PushNotificationAssistant.AssistantConfig);
        }
Exemple #5
0
 // Token: 0x060013B3 RID: 5043 RVA: 0x000731DC File Offset: 0x000713DC
 protected override void HandleEventInternal(MapiEvent mapiEvent, MailboxSession itemStore, StoreObject item, List <KeyValuePair <string, object> > customDataToLog)
 {
     try
     {
         this.assistantAdapter.HandleEvent(mapiEvent, itemStore, item);
     }
     catch (PushNotificationBaseException ex)
     {
         PushNotificationHelper.LogHandleEventError(ex, base.DatabaseInfo, mapiEvent);
         throw new SkipException(ex);
     }
     catch (Exception ex2)
     {
         PushNotificationHelper.LogHandleEventError(ex2, base.DatabaseInfo, mapiEvent);
         throw;
     }
 }
        // Token: 0x06001402 RID: 5122 RVA: 0x00073EB8 File Offset: 0x000720B8
        private MailboxNotification CreateMailboxNotification(Guid mailboxGuid, PushNotificationContext context)
        {
            MailboxNotificationPayload          payload = new MailboxNotificationPayload(context.TenantId, context.UnseenEmailCount, context.BackgroundSyncType, null);
            List <MailboxNotificationRecipient> list    = new List <MailboxNotificationRecipient>(context.Subscriptions.Count);

            foreach (PushNotificationServerSubscription pushNotificationServerSubscription in context.Subscriptions)
            {
                if (this.IsSubscriptionSuitable(pushNotificationServerSubscription))
                {
                    list.Add(new MailboxNotificationRecipient(pushNotificationServerSubscription.AppId, pushNotificationServerSubscription.DeviceNotificationId, pushNotificationServerSubscription.LastSubscriptionUpdate, pushNotificationServerSubscription.InstallationId));
                }
                else
                {
                    PushNotificationHelper.LogInvalidSubscription(mailboxGuid, pushNotificationServerSubscription);
                }
            }
            return(new MailboxNotification(payload, list));
        }
        // Token: 0x060013D6 RID: 5078 RVA: 0x000736A8 File Offset: 0x000718A8
        private void HandleNotificationEvent(IMapiEvent mapiEvent, IMailboxSession session, IStoreObject item)
        {
            PushNotificationContext pushNotificationContext = new PushNotificationContext
            {
                OriginalTime = ExDateTime.UtcNow
            };

            if (this.assistantCache.ShouldProcessUnseenEmailEvent(session, this.XSOFactory, mapiEvent) && this.PopulateSubscriptionsAndTenantId(mapiEvent, session, pushNotificationContext))
            {
                if (this.assistantCache.IsBackgroundSyncEnabled(mapiEvent.MailboxGuid))
                {
                    pushNotificationContext.BackgroundSyncType = BackgroundSyncType.Email;
                }
                pushNotificationContext.UnseenEmailCount = new int?(this.ResolveUnseenEmailCount(mapiEvent, pushNotificationContext.Subscriptions));
                PushNotificationHelper.LogMailboxNotificationResolution(mapiEvent.MailboxGuid, pushNotificationContext);
                this.NotificationBatchManager.Add(mapiEvent.MailboxGuid, pushNotificationContext);
            }
        }
Exemple #8
0
        // Token: 0x06001423 RID: 5155 RVA: 0x00074378 File Offset: 0x00072578
        internal void OnStart(IDatabaseInfo databaseInfo)
        {
            IEnumerable <IMailboxInformation> mailboxTable = databaseInfo.GetMailboxTable(ClientType.EventBased, new PropertyTagPropertyDefinition[]
            {
                MailboxSchema.PushNotificationSubscriptionType
            });

            foreach (IMailboxInformation mailboxInformation in mailboxTable)
            {
                object mailboxProperty = mailboxInformation.GetMailboxProperty(MailboxSchema.PushNotificationSubscriptionType);
                byte[] array           = mailboxProperty as byte[];
                if (!(mailboxProperty is PropertyError) && !PushNotificationSubscriptionTableEntry.IsSubscriptionDisabled(array))
                {
                    this.subscribedMailboxes[mailboxInformation.MailboxGuid] = array[0];
                }
            }
            PushNotificationsAssistantPerfCounters.CurrentActiveUserSubscriptions.IncrementBy((long)this.subscribedMailboxes.Count);
            PushNotificationHelper.LogAssistantStartup(databaseInfo.DatabaseName, this.subscribedMailboxes.Count);
        }
        // Token: 0x06001401 RID: 5121 RVA: 0x00073E68 File Offset: 0x00072068
        private void SendPublishNotificationRequest(MailboxNotificationBatch batch)
        {
            AverageTimeCounter requestCounter = new AverageTimeCounter(PushNotificationsAssistantPerfCounters.AveragePublishingRequestProcessing, PushNotificationsAssistantPerfCounters.AveragePublishingRequestProcessingBase, true);

            this.publisherClient.BeginPublishNotifications(batch, delegate(IAsyncResult asyncResult)
            {
                object asyncState = asyncResult.AsyncState;
                try
                {
                    this.publisherClient.EndPublishNotifications(asyncResult);
                    PushNotificationsMonitoring.PublishSuccessNotification("SendPublishNotification", "");
                }
                catch (Exception exception)
                {
                    PushNotificationsAssistantPerfCounters.PublishingRequestErrors.Increment();
                    PushNotificationHelper.LogSendPublishNotificationException(exception, null);
                }
                finally
                {
                    requestCounter.Stop();
                }
            }, requestCounter);
        }
        // Token: 0x060013D8 RID: 5080 RVA: 0x000737D4 File Offset: 0x000719D4
        private List <PushNotificationServerSubscription> ResolveSubscriptions(IMailboxSession session, IPushNotificationStorage storage)
        {
            List <PushNotificationServerSubscription> list = storage.GetActiveNotificationSubscriptions(session, this.AssistantConfig.SubscriptionExpirationInHours);

            if (list == null || list.Count == 0)
            {
                PushNotificationsAssistantPerfCounters.TotalSubscriptionsExpiredCleanup.Increment();
                PushNotificationsAssistantPerfCounters.CurrentActiveUserSubscriptions.Decrement();
                PushNotificationHelper.LogSubscriptionExpired(session.MailboxGuid);
                this.assistantCache.RemoveSubscriptions(session.MailboxGuid);
                this.MailboxTable.DisableSubscriptionOnMailboxTable(session);
                storage.DeleteExpiredSubscriptions(this.AssistantConfig.SubscriptionExpirationInHours);
                list = null;
            }
            else
            {
                list = list.Distinct(PushNotificationAssistantAdapter.SubscriptionComparer.Default).ToList <PushNotificationServerSubscription>();
                PushNotificationHelper.LogActiveSubscriptions(session.MailboxGuid, list);
                if (session.IsMailboxOof())
                {
                    List <PushNotificationServerSubscription> list2 = new List <PushNotificationServerSubscription>();
                    foreach (PushNotificationServerSubscription pushNotificationServerSubscription in list)
                    {
                        if ((pushNotificationServerSubscription.GetSubscriptionOption() & PushNotificationSubscriptionOption.SuppressNotificationsWhenOof) == PushNotificationSubscriptionOption.NoSubscription)
                        {
                            list2.Add(pushNotificationServerSubscription);
                        }
                        else
                        {
                            PushNotificationHelper.LogSuppressedNotifications(session.MailboxGuid, pushNotificationServerSubscription);
                        }
                    }
                    list = list2;
                }
            }
            return(list);
        }
        // Token: 0x060013D5 RID: 5077 RVA: 0x000735A0 File Offset: 0x000717A0
        private void HandleSubscriptionChangeEvent(IMailboxSession session, IStoreObject item)
        {
            IPushNotificationSubscriptionItem pushNotificationSubscriptionItem = item as IPushNotificationSubscriptionItem;

            if (pushNotificationSubscriptionItem == null)
            {
                throw new InvalidStoreObjectInstanceException((item != null) ? item.GetType() : null);
            }
            try
            {
                PushNotificationServerSubscription pushNotificationServerSubscription = PushNotificationServerSubscription.FromJson(pushNotificationSubscriptionItem.SerializedNotificationSubscription);
                this.assistantCache.UpdateSubscriptionData(session.MailboxGuid, pushNotificationServerSubscription);
                if (pushNotificationServerSubscription.GetSubscriptionOption() == this.MailboxTable.ReadSubscriptionOnMailboxTable(session))
                {
                    ExTraceGlobals.PushNotificationAssistantTracer.TraceDebug <Guid>((long)this.GetHashCode(), "PushNotificationAssistantAdapter.HandleSubscriptionChangeEvent: Mailbox Header Table is up to date for {0}.", session.MailboxGuid);
                    PushNotificationsAssistantPerfCounters.TotalSubscriptionsUpdated.Increment();
                }
                else
                {
                    this.MailboxTable.UpdateSubscriptionOnMailboxTable(session, pushNotificationServerSubscription);
                    PushNotificationHelper.LogSubscriptionUpdated(pushNotificationSubscriptionItem, pushNotificationServerSubscription, session.MailboxGuid);
                    PushNotificationsAssistantPerfCounters.TotalNewSubscriptionsCreated.Increment();
                    PushNotificationsAssistantPerfCounters.CurrentActiveUserSubscriptions.Increment();
                }
            }
            catch (Exception ex)
            {
                Globals.Logger.LogEvent(InfoWorkerEventLogConstants.Tuple_FailedToUpdateSubscriptionOnMailboxTable, ex.ToString(), new object[]
                {
                    pushNotificationSubscriptionItem.SerializedNotificationSubscription,
                    session.MailboxGuid,
                    ex.ToTraceString()
                });
                throw;
            }
        }
 // Token: 0x060013FE RID: 5118 RVA: 0x00073CF1 File Offset: 0x00071EF1
 protected override void ReportDrainNotificationsException(AggregateException error)
 {
     PushNotificationHelper.LogProcessNotificationBatchException(error);
 }