Example #1
0
        public override void Execute()
        {
            if (!this.ShouldExecuteOnThisStage)
            {
                return;
            }
            if (base.Context.DeliveryFolder != null && this.TargetFolderId.Equals(base.Context.DeliveryFolder.Id))
            {
                base.Context.TraceDebug("Copy action: Ignoring copy to same folder.");
                return;
            }
            bool           flag           = false;
            MailboxSession mailboxSession = base.Context.StoreSession as MailboxSession;

            if (mailboxSession != null && CopyWorkItem.IsRententionPolicyEnabled(base.Context.RecipientCache, base.Context.Recipient))
            {
                base.Context.TraceDebug("Copy action: Retention policy is enabled.");
                flag = true;
            }
            if (ExecutionStage.OnPromotedMessage == base.Context.ExecutionStage)
            {
                base.Context.TraceDebug("Copy action: Creating message.");
                using (MessageItem messageItem = MessageItem.Create(base.Context.StoreSession, this.TargetFolderId))
                {
                    base.Context.TraceDebug("Copy action: Copying content from original message.");
                    Item.CopyItemContent(base.Context.Message, messageItem);
                    if (base.Context.PropertiesForAllMessageCopies != null)
                    {
                        foreach (KeyValuePair <PropertyDefinition, object> keyValuePair in base.Context.PropertiesForAllMessageCopies)
                        {
                            if (keyValuePair.Value != null)
                            {
                                base.Context.TraceDebug <string, object>("Copy action: Setting property {0} to {1}", keyValuePair.Key.Name, keyValuePair.Value);
                            }
                            else
                            {
                                base.Context.TraceDebug <string>("Copy action: Removing property {0}", keyValuePair.Key.Name);
                            }
                            messageItem.SetOrDeleteProperty(keyValuePair.Key, keyValuePair.Value);
                        }
                    }
                    MessageFlags messageFlags = messageItem.GetValueOrDefault <MessageFlags>(MessageItemSchema.Flags);
                    messageFlags |= MessageFlags.IsUnmodified;
                    messageFlags &= ~(MessageFlags.IsRead | MessageFlags.IsDraft);
                    messageItem[MessageItemSchema.Flags] = messageFlags;
                    if (flag)
                    {
                        this.TagItem(mailboxSession, messageItem);
                    }
                    else
                    {
                        base.Context.TraceDebug("Copy action: Retention policy is not enabled. Skip tagging.");
                    }
                    base.Context.TraceDebug("Copy action: Saving message.");
                    messageItem.Save(SaveMode.ResolveConflicts);
                    base.Context.TraceDebug("Copy action: Message saved.");
                    return;
                }
            }
            if (ExecutionStage.OnDeliveredMessage == base.Context.ExecutionStage)
            {
                base.Context.TraceDebug("Copy action: Loading original message.");
                base.Context.DeliveredMessage.Load(new PropertyDefinition[]
                {
                    ItemSchema.Id
                });
                if (base.Context.DeliveredMessage.Id == null)
                {
                    base.Context.TraceError("Copy action: Cannot copy message since the message is not deliverred to store.");
                    return;
                }
                if (!flag)
                {
                    if (!base.Context.FinalDeliveryFolderId.Equals(base.Context.DeliveryFolder.Id))
                    {
                        base.Context.TraceDebug("Copy action: Binding to final delivery folder.");
                        using (Folder folder = Folder.Bind(base.Context.StoreSession, base.Context.FinalDeliveryFolderId))
                        {
                            base.Context.TraceDebug("Copy action: Copying from final delivery folder.");
                            folder.CopyItems(this.TargetFolderId, new StoreId[]
                            {
                                base.Context.DeliveredMessage.Id
                            });
                            return;
                        }
                    }
                    base.Context.TraceDebug("Copy action: Copying from initial delivery folder.");
                    base.Context.DeliveryFolder.CopyItems(this.TargetFolderId, new StoreId[]
                    {
                        base.Context.DeliveredMessage.Id
                    });
                    return;
                }
                base.Context.TraceDebug("Copy action: Copying from delivery folder and fixing RetentionPolicies on Item.");
                AggregateOperationResult aggregateOperationResult = mailboxSession.Copy(mailboxSession, this.TargetFolderId, true, new StoreId[]
                {
                    base.Context.DeliveredMessage.Id
                });
                if (aggregateOperationResult.OperationResult == OperationResult.Succeeded && aggregateOperationResult.GroupOperationResults.Length == 1 && aggregateOperationResult.GroupOperationResults[0].ResultObjectIds.Count == 1)
                {
                    PropertyDefinition[] array = new PropertyDefinition[]
                    {
                        ItemSchema.Id,
                        StoreObjectSchema.PolicyTag,
                        StoreObjectSchema.RetentionFlags,
                        StoreObjectSchema.RetentionPeriod,
                        StoreObjectSchema.ArchiveTag,
                        StoreObjectSchema.ArchivePeriod,
                        FolderSchema.RetentionTagEntryId
                    };
                    using (MessageItem messageItem2 = MessageItem.Bind(base.Context.StoreSession, aggregateOperationResult.GroupOperationResults[0].ResultObjectIds[0], (ICollection <PropertyDefinition>)array))
                    {
                        messageItem2.OpenAsReadWrite();
                        this.TagItem(mailboxSession, messageItem2);
                        base.Context.TraceDebug("Copy action: Saving message.");
                        messageItem2.Save(SaveMode.ResolveConflicts);
                        base.Context.TraceDebug("Copy action: Message saved.");
                    }
                }
            }
        }