private static MessageStatus ProcessExchangeDataException(ExchangeDataException exchangeDataException, IMessageConverter converter)
        {
            MessageStatus messageStatus = StorageExceptionHandler.GetMessageStatus(converter, exchangeDataException);

            if (messageStatus.Action == MessageAction.NDR)
            {
                converter.LogMessage(exchangeDataException);
            }
            return(messageStatus);
        }
 private static MessageStatus GetMessageStatus(IMessageConverter converter, DataSourceOperationException dataSourceOperationException)
 {
     if (dataSourceOperationException is ADInvalidCredentialException)
     {
         ADTransientException unavailableException = new ADTransientException(dataSourceOperationException.LocalizedString, dataSourceOperationException);
         return(StorageExceptionHandler.GetMessageStatus(converter, unavailableException));
     }
     StorageExceptionHandler.LogException(converter, dataSourceOperationException);
     return(new MessageStatus(MessageAction.NDR, StorageExceptionHandler.GetExceptionSmtpResponse(converter, dataSourceOperationException, true), dataSourceOperationException));
 }
 private static MessageStatus GetMessageStatus(IMessageConverter converter, StorageTransientException storageException)
 {
     StorageExceptionHandler.LogException(converter, storageException);
     if (storageException is MailboxInSiteFailoverException)
     {
         return(new MessageStatus(converter.IsOutbound ? MessageAction.Skip : MessageAction.Reroute, StorageExceptionHandler.GetExceptionSmtpResponse(converter, storageException, false), storageException));
     }
     if (storageException.InnerException != null)
     {
         MapiPermanentException ex = storageException.InnerException as MapiPermanentException;
         if (ex != null)
         {
             return(StorageExceptionHandler.GetMessageStatus <StorageTransientException>(converter, ex, storageException));
         }
         MapiRetryableException ex2 = storageException.InnerException as MapiRetryableException;
         if (ex2 != null)
         {
             return(StorageExceptionHandler.GetMessageStatus <StorageTransientException>(converter, ex2, storageException));
         }
     }
     return(new MessageStatus(MessageAction.Retry, StorageExceptionHandler.GetExceptionSmtpResponse(converter, storageException, false), storageException));
 }
        private static MessageStatus GetMessageStatus(IMessageConverter converter, StoragePermanentException storageException)
        {
            StorageExceptionHandler.LogException(converter, storageException);
            ConversionFailedException ex = storageException as ConversionFailedException;

            if (ex != null)
            {
                return(StorageExceptionHandler.GetMessageStatus(converter, ex));
            }
            if (storageException is MailboxCrossSiteFailoverException || storageException is MailboxInfoStaleException)
            {
                return(new MessageStatus(converter.IsOutbound ? MessageAction.Skip : MessageAction.Reroute, StorageExceptionHandler.GetExceptionSmtpResponse(converter, storageException, true), storageException));
            }
            if (storageException is UnableToFindServerForDatabaseException || storageException is IllegalCrossServerConnectionException)
            {
                return(new MessageStatus(converter.IsOutbound ? MessageAction.Skip : MessageAction.RetryQueue, StorageExceptionHandler.GetExceptionSmtpResponse(converter, storageException, false), storageException));
            }
            if (storageException.InnerException is CannotGetSiteInfoException)
            {
                return(new MessageStatus(converter.IsOutbound ? MessageAction.RetryMailboxServer : MessageAction.RetryQueue, StorageExceptionHandler.GetExceptionSmtpResponse(converter, storageException.InnerException, true), storageException));
            }
            if (storageException.InnerException != null)
            {
                MapiPermanentException ex2 = storageException.InnerException as MapiPermanentException;
                if (ex2 != null)
                {
                    return(StorageExceptionHandler.GetMessageStatus <StoragePermanentException>(converter, ex2, storageException));
                }
                MapiRetryableException ex3 = storageException.InnerException as MapiRetryableException;
                if (ex3 != null)
                {
                    return(StorageExceptionHandler.GetMessageStatus <StoragePermanentException>(converter, ex3, storageException));
                }
            }
            return(new MessageStatus(MessageAction.NDR, StorageExceptionHandler.GetExceptionSmtpResponse(converter, storageException, true), storageException));
        }
        private static MessageStatus RunUnderExplicitExceptionHandler(IMessageConverter converter, StoreDriverDelegate workerFunction)
        {
            MessageStatus messageStatus = MessageStatus.Success;

            StorageExceptionHandler.diag = converter.Tracer;
            try
            {
                workerFunction();
            }
            catch (StoreDriverAgentRaisedException ex)
            {
                if (ex.InnerException == null)
                {
                    TraceHelper.TraceFail(StorageExceptionHandler.diag, 0L, "StoreDriverAgentRaisedException's InnerException is null. It is expected to contain the actual exception that the agent has thrown. StoreDriverAgentRaisedException.Message: {0}; StoreDriverAgentRaisedException.StackTrace: {1}.", new object[]
                    {
                        ex.Message,
                        ex.StackTrace
                    });
                    throw;
                }
                if (ex.InnerException is StoreDriverAgentTransientException)
                {
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (StoreDriverAgentTransientException)ex.InnerException);
                }
                else if (ex.InnerException is SmtpResponseException)
                {
                    messageStatus = StorageExceptionHandler.ProcessSmtpResponseException((SmtpResponseException)ex.InnerException, converter);
                }
                else if (ex.InnerException is ADTransientException)
                {
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (ADTransientException)ex.InnerException);
                }
                else if (ex.InnerException is DataValidationException)
                {
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (DataValidationException)ex.InnerException);
                }
                else if (ex.InnerException is DataSourceOperationException)
                {
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (DataSourceOperationException)ex.InnerException);
                }
                else if (ex.InnerException is StorageTransientException)
                {
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (StorageTransientException)ex.InnerException);
                }
                else if (ex.InnerException is StoragePermanentException)
                {
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (StoragePermanentException)ex.InnerException);
                }
                else if (ex.InnerException is ExchangeDataException)
                {
                    messageStatus = StorageExceptionHandler.ProcessExchangeDataException((ExchangeDataException)ex.InnerException, converter);
                }
                else
                {
                    if (!(ex.InnerException is IOException))
                    {
                        throw;
                    }
                    messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (IOException)ex.InnerException);
                }
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (StoreDriverAgentTransientException storeDriverAgentTransientException)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, storeDriverAgentTransientException);
            }
            catch (SmtpResponseException smtpResponseException)
            {
                messageStatus = StorageExceptionHandler.ProcessSmtpResponseException(smtpResponseException, converter);
            }
            catch (ADTransientException unavailableException)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, unavailableException);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (DataValidationException invalidDataException)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, invalidDataException);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (DataSourceOperationException dataSourceOperationException)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, dataSourceOperationException);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (StorageTransientException storageException)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, storageException);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (StoragePermanentException storageException2)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, storageException2);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (ExchangeDataException exchangeDataException)
            {
                messageStatus = StorageExceptionHandler.ProcessExchangeDataException(exchangeDataException, converter);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            catch (IOException e)
            {
                messageStatus = StorageExceptionHandler.GetMessageStatus(converter, e);
                if (messageStatus.Action == MessageAction.Throw)
                {
                    throw;
                }
            }
            return(messageStatus);
        }