internal SharingContext(Folder folderToShare, SharingProvider sharingProvider) : this() { Util.ThrowOnNullArgument(folderToShare, "folderToShare"); MailboxSession mailboxSession = folderToShare.Session as MailboxSession; IExchangePrincipal mailboxOwner = mailboxSession.MailboxOwner; if (sharingProvider == null) { SharingProvider[] compatibleProviders = SharingProvider.GetCompatibleProviders(folderToShare); if (compatibleProviders.Length == 0) { ExTraceGlobals.SharingTracer.TraceError <IExchangePrincipal, VersionedId>((long)this.GetHashCode(), "{0}: Cannot share folder {1}: no compatible provider was found.", mailboxOwner, folderToShare.Id); throw new CannotShareFolderException(ServerStrings.NoProviderSupportShareFolder); } for (int i = 0; i < compatibleProviders.Length; i++) { ExTraceGlobals.SharingTracer.TraceDebug <IExchangePrincipal, SharingProvider, VersionedId>((long)this.GetHashCode(), "{0}: Find compatible provider {1} for folder {2}.", mailboxOwner, compatibleProviders[i], folderToShare.Id); this.AvailableSharingProviders.Add(compatibleProviders[i], null); } } else if (!sharingProvider.IsCompatible(folderToShare)) { ExTraceGlobals.SharingTracer.TraceError <IExchangePrincipal, VersionedId, SharingProvider>((long)this.GetHashCode(), "{0}: Cannot share folder {1} with sharing provider: {2}.", mailboxOwner, folderToShare.Id, sharingProvider); if (sharingProvider == SharingProvider.SharingProviderPublish) { throw new FolderNotPublishedException(); } throw new CannotShareFolderException(ServerStrings.NoProviderSupportShareFolder); } else { this.AvailableSharingProviders.Add(sharingProvider, null); if (sharingProvider == SharingProvider.SharingProviderPublish) { this.PopulateUrls(folderToShare); } } this.InitiatorName = mailboxOwner.MailboxInfo.DisplayName; this.InitiatorSmtpAddress = mailboxOwner.MailboxInfo.PrimarySmtpAddress.ToString(); this.InitiatorEntryId = AddressBookEntryId.MakeAddressBookEntryID(mailboxOwner); this.FolderClass = folderToShare.ClassName; this.FolderId = folderToShare.StoreObjectId; this.IsPrimary = (mailboxSession.IsDefaultFolderType(this.FolderId) != DefaultFolderType.None); this.FolderName = (this.IsPrimary ? this.DataType.DisplayName.ToString(mailboxSession.InternalPreferedCulture) : folderToShare.DisplayName); this.MailboxId = StoreEntryId.ToProviderStoreEntryId(mailboxOwner); this.SharingMessageType = SharingMessageType.Invitation; this.SharingPermissions = SharingContextPermissions.Reviewer; if (StringComparer.OrdinalIgnoreCase.Equals(folderToShare.ClassName, "IPF.Appointment")) { this.SharingDetail = (this.IsPrimary ? SharingContextDetailLevel.AvailabilityOnly : SharingContextDetailLevel.FullDetails); } this.SetDefaultCapabilities(); this.UserLegacyDN = mailboxOwner.LegacyDn; }
internal void ReadFromMessageItem(MessageItem messageItem, bool isDraft) { byte[] array = messageItem.GetValueOrDefault <byte[]>(InternalSchema.ProviderGuidBinary, null); if (array == null) { ExTraceGlobals.SharingTracer.TraceDebug <string>((long)this.GetHashCode(), "{0}: ProviderGuidBinary is missing, reading from XSharingProviderGuid", messageItem.Session.UserLegacyDN); string valueOrDefault = messageItem.GetValueOrDefault <string>(InternalSchema.XSharingProviderGuid, null); if (valueOrDefault == null) { ExTraceGlobals.SharingTracer.TraceError <string>((long)this.GetHashCode(), "{0}: XSharingProviderGuid is missing", messageItem.Session.UserLegacyDN); throw new NotSupportedSharingMessageException(); } try { array = HexConverter.HexStringToByteArray(valueOrDefault); } catch (FormatException) { ExTraceGlobals.SharingTracer.TraceError <string>((long)this.GetHashCode(), "{0}: XSharingProviderGuid is invalid", messageItem.Session.UserLegacyDN); throw new NotSupportedSharingMessageException(); } } SharingProvider sharingProvider = SharingProvider.FromGuid(new Guid(array)); if (sharingProvider == null) { ExTraceGlobals.SharingTracer.TraceError <string, byte[]>((long)this.GetHashCode(), "{0}: Unknown sharing provider guid: {1}", messageItem.Session.UserLegacyDN, array); throw new NotSupportedSharingMessageException(); } ExTraceGlobals.SharingTracer.TraceDebug <string, SharingProvider>((long)this.GetHashCode(), "{0}: Find provider {1} that is specified in message.", messageItem.Session.UserLegacyDN, sharingProvider); if (sharingProvider == SharingProvider.SharingProviderPublish) { ExTraceGlobals.SharingTracer.TraceDebug <string, SharingProvider>((long)this.GetHashCode(), "{0}: Read from message x-properties for provider {1}.", messageItem.Session.UserLegacyDN, sharingProvider); this.ReadFromMessageXProperties(messageItem); } if (isDraft || sharingProvider != SharingProvider.SharingProviderPublish) { ExTraceGlobals.SharingTracer.TraceDebug <string, SharingProvider>((long)this.GetHashCode(), "{0}: Read from message properties for provider {1}.", messageItem.Session.UserLegacyDN, sharingProvider); this.ReadFromMessageProperties(messageItem); } if (this.context.SharingMessageType == SharingMessageType.Unknown && !isDraft) { ExTraceGlobals.SharingTracer.TraceError <string>((long)this.GetHashCode(), "{0}: SharingMessageType is unknown", messageItem.Session.UserLegacyDN); throw new InvalidSharingMessageException("SharingFlavor"); } this.context.AvailableSharingProviders.Clear(); if (isDraft && !this.context.SharingMessageType.IsResponseToRequest) { SharingProvider[] array2 = null; using (Folder folder = Folder.Bind(messageItem.Session, this.context.FolderId)) { array2 = SharingProvider.GetCompatibleProviders(sharingProvider, folder); } foreach (SharingProvider sharingProvider2 in array2) { ExTraceGlobals.SharingTracer.TraceDebug <string, SharingProvider>((long)this.GetHashCode(), "{0}: Find compatible provider {1}.", messageItem.Session.UserLegacyDN, sharingProvider2); this.context.AvailableSharingProviders.Add(sharingProvider2, null); } return; } this.context.AvailableSharingProviders.Add(sharingProvider, null); }