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;
        }
Beispiel #2
0
        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);
        }