package POPFile::API;
# ----------------------------------------------------------------------------
#
# API.pm -- The API to POPFile available through XML-RPC
#
# Copyright (c) 2001-2006 John Graham-Cumming
#
# This file is part of POPFile
#
# POPFile is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# POPFile is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with POPFile; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# ----------------------------------------------------------------------------
sub new
{
my $type = shift;
my $self;
# This will store a reference to the classifier object
$self->{c} = 0;
bless $self, $type;
return $self;
}
# I'm generally against doing obscure things in Perl because it makes the code
# hard to read, but since this entire file is a bunch of wrappers for the
# API in Classifier::Bayes I'm going to do something really odd looking for the
# sake of readability here.
#
# Take for example the get_session_key wrapper for get_session_key.
# It contains the line:
#
# shift->{c}->get_session_key( @_ )
#
# What this does is the following:
#
# 1. The parameters for get_session_key are as usual in @_. The first
# parameter (since this is an object) is a reference to this object.
#
# 2. We use 'shift' to get the reference to us (in all other places I
# would call this $self).
#
# 3. We have a object variable called 'c' that contains a reference to the
# Classifier::Bayes object we need to make the real call in.
#
# 4. So shift->{c} is a reference to Classifier::Bayes and hence we can do
# shift->{c}->get_session_key() to call the real API.
#
# 5. shift has also popped the first parameter off of @_ leaving the rest of
# the parameters for get_session_key in @_. Hence we can just pass in @_
# for all the parameters.
#
# 6. return is optional in Perl, so for the sake of horizontal space here I
# omit it.
sub get_session_key { shift->{c}->get_session_key( @_ ); }
sub release_session_key { shift->{c}->release_session_key( @_ ); }
sub classify { shift->{c}->classify( @_ ); }
sub is_pseudo_bucket { shift->{c}->is_pseudo_bucket( @_ ); }
sub is_bucket { shift->{c}->is_bucket( @_ ); }
sub get_bucket_word_count { shift->{c}->get_bucket_word_count( @_ ); }
sub get_word_count { shift->{c}->get_word_count( @_ ); }
sub get_count_for_word { shift->{c}->get_count_for_word( @_ ); }
sub get_bucket_unique_count { shift->{c}->get_bucket_unique_count( @_ ); }
sub get_unique_word_count { shift->{c}->get_unique_word_count( @_ ); }
sub get_bucket_color { shift->{c}->get_bucket_color( @_ ); }
sub set_bucket_color { shift->{c}->set_bucket_color( @_ ); }
sub get_bucket_parameter { shift->{c}->get_bucket_parameter( @_ ); }
sub set_bucket_parameter { shift->{c}->set_bucket_parameter( @_ ); }
sub create_bucket { shift->{c}->create_bucket( @_ ); }
sub delete_bucket { shift->{c}->delete_bucket( @_ ); }
sub rename_bucket { shift->{c}->rename_bucket( @_ ); }
sub add_messages_to_bucket { shift->{c}->add_messages_to_bucket( @_ ); }
sub add_message_to_bucket { shift->{c}->add_message_to_bucket( @_ ); }
sub remove_message_from_bucket { shift->{c}->remove_message_from_bucket( @_ ); }
sub clear_bucket { shift->{c}->clear_bucket( @_ ); }
sub clear_magnets { shift->{c}->clear_magnets( @_ ); }
sub create_magnet { shift->{c}->create_magnet( @_ ); }
sub delete_magnet { shift->{c}->delete_magnet( @_ ); }
sub magnet_count { shift->{c}->magnet_count( @_ ); }
sub add_stopword { shift->{c}->add_stopword( @_ ); }
sub remove_stopword { shift->{c}->remove_stopword( @_ ); }
sub get_html_colored_message { shift->{c}->get_html_colored_message( @_); }
# These APIs return lists and need to be altered to arrays before returning
# them through XMLRPC otherwise you get the wrong result.
sub get_buckets { [ shift->{c}->get_buckets( @_ ) ]; }
sub get_pseudo_buckets { [ shift->{c}->get_pseudo_buckets( @_ ) ]; }
sub get_all_buckets { [ shift->{c}->get_all_buckets( @_ ) ]; }
sub get_buckets_with_magnets { [ shift->{c}->get_buckets_with_magnets( @_ ) ]; }
sub get_magnet_types_in_bucket { [ shift->{c}->get_magnet_types_in_bucket( @_ ) ]; }
sub get_magnets { [ shift->{c}->get_magnets( @_ ) ]; }
sub get_magnet_types { [ shift->{c}->get_magnet_types( @_ ) ]; }
sub get_stopword_list { [ shift->{c}->get_stopword_list( @_ ) ]; }
sub get_bucket_word_list { [ shift->{c}->get_bucket_word_list( @_ ) ]; }
sub get_bucket_word_prefixes { [ shift->{c}->get_bucket_word_prefixes( @_ ) ]; }
# This API is used to add a message to POPFile's history, process the message
# and do all the things POPFile would have done if it had received the message
# through its proxies.
#
# Pass in the name of file to read and a file to write. The read file
# will be processed and the out file created containing the processed
# message.
#
# Returns the same output as classify_and_modify (which contains the
# slot ID for the newly added message, the classification and magnet
# ID). If it fails it returns undef.
sub handle_message
{
my ( $self, $session, $in, $out ) = @_;
# Convert the two files into streams that can be passed to the
# classifier
open IN, "<$in" or return undef;
open OUT, ">$out" or return undef;
my @result = $self->{c}->classify_and_modify(
$session, \*IN, \*OUT, undef );
close OUT;
close IN;
return @result;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1