# -*- mode: Perl; -*- package NewsClipper::Server; # This package contains the Server class. This class will automatically # determine which of its implementations to load and then load it. # Implementations are contained, not inherited. use strict; use Carp; use NewsClipper::Globals; use vars qw( $VERSION ); my $HANDLER_SERVER = 'handlers.newsclipper.com'; #my $HANDLER_SERVER = '192.168.0.1'; $VERSION = 0.10; # ------------------------------------------------------------------------------ sub new { my $implementation = _Load_Implementation(); $implementation->{handler_server} = $HANDLER_SERVER; return $implementation; } # ------------------------------------------------------------------------------ sub _Load_Implementation() { my $implementation; # Try to load the MySQL implementation, which is a lot faster. if (eval "require NewsClipper::Server::MySQL") { $implementation = NewsClipper::Server::MySQL->new(); if (defined $implementation) { dprint "Using MySQL implementation of server class."; } else { dprint "Tried to create MySQL implementation, but failed"; } } # Otherwise fall back on the CGI implementation else { dprint "Tried to load MySQL implementation, but failed: $@"; require NewsClipper::Server::CGI; $implementation = new NewsClipper::Server::CGI; dprint "Using CGI implementation of server class." } return $implementation; } # ------------------------------------------------------------------------------ # These should be overridden by the implementation class sub Get_Handler_Type { die "Get_Handler_Type not overridden by implementation!"; } # ------------------------------------------------------------------------------ sub Get_Handler { die "Get_Handler not overridden by implementation!"; } # ------------------------------------------------------------------------------ sub _Get_Compatible_Working_Handler_Version { die "_Get_Compatible_Working_Handler_Version not overridden by implementation!"; } # ------------------------------------------------------------------------------ sub _Get_Latest_Working_Handler_Version { die "_Get_Latest_Working_Handler_Version not overridden by implementation!"; } # ------------------------------------------------------------------------------ # Checks if a new version of the handler is available, taking consideration of # -n flag into account. # Params: # 1) the handler name # 2) whether you want only a bugfix update, not a functional update too # ('bugfix','functional') # Returns: # 1) status: okay, failed, not found, no update # 2) the version # 3) type of update it is ("bugfix" or "functional") # if $needBugfix == 0, type can be either bugfix or functional. # if $needBugfix == 1, type can be only bugfix. sub Get_New_Handler_Version($$$$$) { my $self = shift; my $handler_name = shift; my $needBugfix = shift; my $localVersion = shift; my $ncversion = shift; dprint "Checking for a new version for handler \"$handler_name\""; my ($status,$newVersion); if ($needBugfix eq 'bugfix' && defined $localVersion) { ($status,$newVersion) = $self->_Get_Compatible_Working_Handler_Version($handler_name, $ncversion, $localVersion); } else { ($status,$newVersion) = $self->_Get_Latest_Working_Handler_Version($handler_name,$ncversion); } if ($status eq 'no update') { dprint "Server reports that handler \"$handler_name\" doesn't have an update.\n"; return 'no update'; } if ($status eq 'not found') { dprint "Server reports that handler \"$handler_name\" doesn't exist.\n"; return 'not found'; } return 'failed' if $status eq 'failed'; if (defined $localVersion && $newVersion <= $localVersion) { dprint "No new version is available"; return 'no update'; } # We actually got a version my $updateType; if (defined $localVersion) { if (int($newVersion * 100) == int($localVersion * 100)) { $updateType = 'bugfix'; } else { $updateType = 'functional'; } dprint "A new version is available.\n New version:$newVersion " . "Old version: $localVersion Update type: $updateType\n"; } else { $updateType = 'functional'; dprint "A new version is available.\n New version:$newVersion " . "Old version: Update type: $updateType\n"; } return ('okay',$newVersion,$updateType); } # ------------------------------------------------------------------------------ 1;