private void PostResponded(SharingResponseType responseType)
        {
            if (!this.SharingMessageType.IsRequest)
            {
                throw new InvalidOperationException("Only can response to a request message.");
            }
            base.OpenAsReadWrite();
            this.SharingResponseType = responseType;
            this.SharingResponseTime = new ExDateTime?(ExDateTime.Now);
            ConflictResolutionResult conflictResolutionResult = base.Save(SaveMode.ResolveConflicts);

            if (conflictResolutionResult.SaveStatus == SaveResult.IrresolvableConflict)
            {
                ExTraceGlobals.SharingTracer.TraceError <IExchangePrincipal, VersionedId>((long)this.GetHashCode(), "{0}: Conflict occurred when saving response-status into request message {1}", this.MailboxSession.MailboxOwner, base.Id);
            }
            if (responseType == SharingResponseType.Denied)
            {
                try
                {
                    SharingProvider targetSharingProvider = this.GetTargetSharingProvider();
                    targetSharingProvider.PerformRevocation(this.MailboxSession, this.SharingContext);
                }
                catch (StoragePermanentException arg)
                {
                    ExTraceGlobals.SharingTracer.TraceError <IExchangePrincipal, StoragePermanentException>((long)this.GetHashCode(), "{0}: Error occurred when revoking sharing from denied requester. Exception = {1}", this.MailboxSession.MailboxOwner, arg);
                }
            }
        }
        protected override void OnBeforeSend()
        {
            base.CoreItem.SaveRecipients();
            CheckRecipientsResults checkRecipientsResults = this.CheckRecipients();

            if (checkRecipientsResults.InvalidRecipients != null && checkRecipientsResults.InvalidRecipients.Length > 0)
            {
                throw new InvalidSharingRecipientsException(checkRecipientsResults.InvalidRecipients, new RecipientNotSupportedByAnyProviderException());
            }
            this.PerformInvitation();
            this.SharingContext.SerializeToMessage(this);
            this.AddBodyPrefix(this.CreateBodyPrefix());
            this.isSending = true;
            if (this.SharingMessageType.IsResponseToRequest)
            {
                SharingMessageItem sharingMessageItem = this.TryGetOriginalMessage();
                if (sharingMessageItem != null)
                {
                    try
                    {
                        SharingResponseType responseTypeFromMessageType = SharingMessageItem.GetResponseTypeFromMessageType(this.SharingMessageType);
                        sharingMessageItem.PostResponded(responseTypeFromMessageType);
                    }
                    finally
                    {
                        sharingMessageItem.Dispose();
                    }
                }
            }
            this[MessageItemSchema.RecipientReassignmentProhibited] = !this.IsPublishing;
            base.OnBeforeSend();
        }
        private static LocalizedString GetSubjectPrefixFromResponseType(SharingResponseType responseType)
        {
            switch (responseType)
            {
            case SharingResponseType.Allowed:
                return(ClientStrings.SharingRequestAllowed);

            case SharingResponseType.Denied:
                return(ClientStrings.SharingRequestDenied);

            default:
                throw new ArgumentException("responseType");
            }
        }
        private static SharingMessageType GetMessageTypeFromResponseType(SharingResponseType responseType)
        {
            switch (responseType)
            {
            case SharingResponseType.Allowed:
                return(SharingMessageType.AcceptOfRequest);

            case SharingResponseType.Denied:
                return(SharingMessageType.DenyOfRequest);

            default:
                throw new ArgumentException("responseType");
            }
        }
        private SharingMessageItem CreateRequestResponseMessage(SharingResponseType responseType, StoreId destFolderId)
        {
            if (base.IsDraft)
            {
                throw new InvalidOperationException("Cannot response on draft message.");
            }
            if (!this.SharingMessageType.IsRequest)
            {
                throw new InvalidOperationException("Only can response to a request message.");
            }
            StoreId            defaultFolderId    = this.MailboxSession.GetDefaultFolderId(this.SharedFolderType);
            SharingMessageItem sharingMessageItem = SharingMessageItem.InternalCreate(this.MailboxSession, destFolderId, defaultFolderId, this.GetTargetSharingProvider());

            sharingMessageItem.SharingMessageType = SharingMessageItem.GetMessageTypeFromResponseType(responseType);
            sharingMessageItem.Recipients.Add(base.From);
            sharingMessageItem[SharingMessageItemSchema.SharingOriginalMessageEntryId] = HexConverter.HexStringToByteArray(base.StoreObjectId.ToHexEntryId());
            sharingMessageItem[InternalSchema.NormalizedSubject] = this[InternalSchema.NormalizedSubject];
            sharingMessageItem[InternalSchema.SubjectPrefix]     = SharingMessageItem.GetSubjectPrefixFromResponseType(responseType).ToString(this.MailboxSession.InternalPreferedCulture);
            return(sharingMessageItem);
        }