# --
# Kernel/System/PostMaster/DestQueue.pm - sub part of PostMaster.pm
# Copyright (C) 2001-2007 OTRS GmbH, http://otrs.org/
# --
# $Id: DestQueue.pm,v 1.19 2007/01/21 01:26:10 mh Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see http://www.gnu.org/licenses/gpl.txt.
# --

package Kernel::System::PostMaster::DestQueue;

use strict;

use vars qw($VERSION);
$VERSION = '$Revision: 1.19 $';
$VERSION =~ s/^.*:\s(\d+\.\d+)\s.*$/$1/;

sub new {
    my $Type = shift;
    my %Param = @_;

    # allocate new hash for object
    my $Self = {};
    bless ($Self, $Type);

    $Self->{Debug} = $Param{Debug} || 0;

    # get needed opbjects
    foreach (qw(ConfigObject LogObject DBObject ParseObject QueueObject)) {
        $Self->{$_} = $Param{$_} || die "Got no $_!";
    }

    return $Self;
}
# GetQueueID
sub GetQueueID {
    my $Self = shift;
    my %Param = @_;
    my $Queue = $Self->{ConfigObject}->Get('PostmasterDefaultQueue');
    my %GetParam = %{$Param{Params}};
    my $QueueID;
    # get all system addresses
    my %SystemAddresses = $Self->{DBObject}->GetTableData(
        Table => 'system_address',
        What => 'value0, queue_id',
        Valid => 1
    );
    # check possible to, cc and resent-to emailaddresses
    my $Recipient = '';
    foreach (qw(Cc To Resent-To)) {
        if ($GetParam{$_}) {
            if ($Recipient) {
                $Recipient .= ', ';
            }
            $Recipient .= $GetParam{$_};
        }
    }
    # get addresses
    my @EmailAddresses = $Self->{ParseObject}->SplitAddressLine(
        Line => $Recipient,
    );
    # check addresses
    foreach (@EmailAddresses) {
        my $Address = $Self->{ParseObject}->GetEmailAddress(Email => $_);
        foreach (keys %SystemAddresses) {
            if ($_ =~ /^\Q$Address\E$/i) {
                if ($Self->{Debug} > 1) {
                    $Self->{LogObject}->Log(
                        Priority => 'debug',
                        Message => "Match email: $_ (QueueID=$SystemAddresses{$_}/MessageID:$GetParam{'Message-ID'})!",
                    );
                }
                $QueueID = $SystemAddresses{$_};
            }
            else {
                if ($Self->{Debug} > 1) {
                    $Self->{LogObject}->Log(
                        Priority => 'debug',
                        Message => "Does not match email: $_ (QueueID=$SystemAddresses{$_}/MessageID:$GetParam{'Message-ID'})!",
                    );
                }
            }
        }
    }
    if (!$QueueID) {
        return $Self->{QueueObject}->QueueLookup(Queue => $Queue) || 1;
    }
    else {
        return $QueueID;
    }
}
# GetTrustedQueueID
sub GetTrustedQueueID {
    my $Self = shift;
    my %Param = @_;
    my %GetParam = %{$Param{Params}};
    my $QueueID;
    my $Queue;
    # if there exists a X-OTRS-Queue header
    if ($GetParam{'X-OTRS-Queue'}) {
        if ($Self->{Debug} > 0) {
            $Self->{LogObject}->Log(
                Priority => 'debug',
                Message => "There exists a X-OTRS-Queue header: $GetParam{'X-OTRS-Queue'} (MessageID:$GetParam{'Message-ID'})!",
            );
        }
        # get dest queue
        return $Self->{QueueObject}->QueueLookup(Queue => $GetParam{'X-OTRS-Queue'});
    }
    else {
        return;
    }
}

1;
