public static IPushNotificationSubscriptionItem CreateOrUpdateSubscription(IMailboxSession session, IXSOFactory xsoFactory, IFolder folder, string subscriptionId, PushNotificationServerSubscription subscription) { Util.ThrowOnNullArgument(session, "session"); Util.ThrowOnNullArgument(xsoFactory, "xsoFactory"); Util.ThrowOnNullArgument(folder, "folder"); Util.ThrowOnNullOrEmptyArgument(subscriptionId, "subscriptionId"); Util.ThrowOnNullArgument(subscription, "subscription"); ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceDebug <string, IExchangePrincipal>((long)subscription.GetHashCode(), "PushNotificationSubscriptionItem.CreateOrUpdateSubscription: Searching for Subscription {0} on Mailbox {1}.", subscriptionId, session.MailboxOwner); IStorePropertyBag[] array = PushNotificationSubscriptionItem.GetSubscriptionById(folder, subscriptionId).ToArray <IStorePropertyBag>(); IPushNotificationSubscriptionItem pushNotificationSubscriptionItem = null; try { if (array.Length >= 1) { if (array.Length > 1) { ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceWarning <string, Guid>(0L, "PushNotificationSubscriptionItem.CreateOrUpdateSubscription: AmbiguousSubscription for subscription {0} and user {1}", subscriptionId, session.MailboxGuid); } IStorePropertyBag storePropertyBag = array[0]; VersionedId valueOrDefault = storePropertyBag.GetValueOrDefault <VersionedId>(ItemSchema.Id, null); if (valueOrDefault == null) { ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceError <string>((long)storePropertyBag.GetHashCode(), "PushNotificationSubscriptionItem.CreateOrUpdateSubscription: Cannot resolve the ItemSchema.Id property from the Enumerable.", subscriptionId); throw new CannotResolvePropertyException(ItemSchema.Id.Name); } ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceDebug <VersionedId>((long)storePropertyBag.GetHashCode(), "PushNotificationSubscriptionItem.CreateOrUpdateSubscription: Found one existing subscription with ItemSchema.Id = {0}.", valueOrDefault); pushNotificationSubscriptionItem = xsoFactory.BindToPushNotificationSubscriptionItem(session, valueOrDefault, null); pushNotificationSubscriptionItem.LastUpdateTimeUTC = ExDateTime.UtcNow; subscription.LastSubscriptionUpdate = (DateTime)pushNotificationSubscriptionItem.LastUpdateTimeUTC; pushNotificationSubscriptionItem.SerializedNotificationSubscription = subscription.ToJson(); ConflictResolutionResult conflictResolutionResult = pushNotificationSubscriptionItem.Save(SaveMode.ResolveConflicts); if (conflictResolutionResult.SaveStatus == SaveResult.IrresolvableConflict) { ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceError <string>((long)storePropertyBag.GetHashCode(), "PushNotificationSubscriptionItem.CreateOrUpdateSubscription: Save failed due to conflicts for subscription {0}.", subscriptionId); throw new SaveConflictException(ServerStrings.ExSaveFailedBecauseOfConflicts(subscriptionId)); } pushNotificationSubscriptionItem.Load(SubscriptionItemEnumeratorBase.PushNotificationSubscriptionItemProperties); } else { ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceDebug((long)subscription.GetHashCode(), "PushNotificationSubscriptionItem.CreateOrUpdateSubscription: Cannot resolve given subscription, about to create a new SubscriptionItem."); pushNotificationSubscriptionItem = PushNotificationSubscriptionItem.Create(session, xsoFactory, folder.StoreObjectId, subscriptionId, subscription); } } catch { if (pushNotificationSubscriptionItem != null) { pushNotificationSubscriptionItem.Dispose(); } throw; } return(pushNotificationSubscriptionItem); }
public static string GetSerializedNotificationSubscription(IMailboxSession mailboxSession, IStorePropertyBag propertyBag, IXSOFactory xsoFactory) { string valueOrDefault = propertyBag.GetValueOrDefault <string>(PushNotificationSubscriptionItemSchema.SerializedNotificationSubscription, null); if (string.IsNullOrWhiteSpace(valueOrDefault)) { ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceError(0L, "PushNotificationStorage.GetSerializedNotificationSubscription: A subscription with an empty serialized value was returned by the Enumerator."); throw new CannotResolvePropertyException(PushNotificationSubscriptionItemSchema.SerializedNotificationSubscription.Name); } if (valueOrDefault.Length < 255) { return(valueOrDefault); } ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceDebug(0L, "PushNotificationStorage.GetSerializedNotificationSubscription: We need to bind to the item in order to obtain the full serialized notification subscription."); VersionedId valueOrDefault2 = propertyBag.GetValueOrDefault <VersionedId>(ItemSchema.Id, null); string result; using (IPushNotificationSubscriptionItem pushNotificationSubscriptionItem = xsoFactory.BindToPushNotificationSubscriptionItem(mailboxSession, valueOrDefault2, new PropertyDefinition[] { PushNotificationSubscriptionItemSchema.SerializedNotificationSubscription })) { string serializedNotificationSubscription = pushNotificationSubscriptionItem.SerializedNotificationSubscription; if (string.IsNullOrWhiteSpace(serializedNotificationSubscription)) { ExTraceGlobals.StorageNotificationSubscriptionTracer.TraceError <VersionedId, string>(0L, "PushNotificationStorage.GetFullSerializedNotificationSubscription: Unable to obtain the full SerializedNotificationSubscription from {0}, partial value: {1}", valueOrDefault2, valueOrDefault); throw new CannotResolvePropertyException(PushNotificationSubscriptionItemSchema.SerializedNotificationSubscription.Name); } result = serializedNotificationSubscription; } return(result); }