/// <summary>
 /// Creates Mail Processor object based on mail store type
 /// </summary>
 /// <param name="evCorlibEntity"> evCorlibEntity is expected to have mail store details </param>
 /// <returns> object of class implementing IMailProcessor </returns>
 public IMailProcessor CreateMailProcessor(EvCorlibEntity evCorlibEntity)
 {
     if (evCorlibEntity != null && evCorlibEntity.HasMailStores && evCorlibEntity.MailStoreEntity.Count > 0)
     {
         if (evCorlibEntity.MailStoreEntity[0].EmailType == EmailType.Outlook) return new OutlookAdapter();
         if (evCorlibEntity.MailStoreEntity[0].EmailType == EmailType.LotusNotes) return new LotusNotesAdapater();
         throw new EVException().AddResMsg(ErrorCodes.MailProcessorCreateFailure);
     }
     throw new EVException().AddResMsg(ErrorCodes.MailProcessorCreateFailure);
 }
        /// <summary>
        /// Extracts specified mail document and converts to a BEO which could be interpreted by rest of the application.
        /// Overload allows intermediate operations be performed as documents are extracted. 
        /// In an example, a PST file extraction returns multiple documents. As each document is extracted import can be performed. 
        /// The logic to import need to be written in event handler for EvDocumentDataEntityAvailable
        /// This approach is useful when there is a loop of time taking operations to be done.
        /// </summary>
        /// <param name="mailEntity">List of mail stores to be processed</param>        
        /// <param name="temporaryWorkingDirectory"> Specify working directory to be used for extracting contents</param>
        /// <param name="batchSize"> Batch size used while extracting mail stores </param>        
        /// <param name="errorCallback"> Loop of operations expected - an error in the loop shouldn't break the loop - hence error call back. </param>        
        /// <returns> EvDocumentDataEntity that abstracts documents and relationships </returns>
        public void ProcessMailDocuments(EvCorlibEntity evCorlibEntity, DirectoryInfo temporaryWorkingDirectory, int batchSize)
        {

            try
            {
                // if file processor instance is null, create new instance.
                if (FileProcessorInstance == null)
                    FileProcessorInstance = new EvCorlibManager(outputDirectory: temporaryWorkingDirectory, outputBatchSize: batchSize);

                // If DeleteAll is the option, let EVCorlibManager delete all files/folders. 
                // If not this Adapter will manage deleting files.
                FileProcessorInstance.IsDeleteTemporaryFiles =
                    (IsDeleteTemporaryFiles == DeleteExtractedFilesOptions.DeleteNonNativeFiles) ? true : false;

                FileProcessorInstance.ProcessMailStores(evCorlibEntity, TransformOutlookEDRMToDocumentBusinessEntity);

            }
            catch (EVException evException)
            {
                ((Exception)evException).Trace().Swallow();
            }
            catch (Exception exception)
            {
                string errorCode = ErrorCodes.OutlookMailStoreProcessFailure;
                exception.AddErrorCode(errorCode).Trace().Swallow();
            }
        }