Hamsoft is a reader for new hamradio linux software at radio.linux.org.au.
When you select an entry in the list and click on read, the link will be
opened in a netscape window. Netscape has to be running already.
You need to have gtk and libgtk-perl installed on your system, this comes
with most distributions.
The client will show packages which have been entered in the last month.
Hope you like it.
Joop
--
Joop Stakenborg PA4TU, ex-PA3ABA
<[EMAIL PROTECTED]>
Linux Amateur Radio Software Database
http://radio.linux.org.au
#!/usr/bin/perl -w
################################################################################
# hamsoft, version 0.1.1, Oct 29, 1999
#
# Copyright (c) 1999 Joop Stakenborg <[EMAIL PROTECTED]>
# This code is distributed under the terms of the GNU General Public License.
#
# This is a hacked up script from Alex Shnitman <[EMAIL PROTECTED]>, who
# wrote 'slashes.pl' for reading slashdot news, I fixed a couple of things
# and wrote support for the hamsoft db.
#
# You need to have gtk and libgtk-perl installed on your system, this comes
# with most distributions.
#
# Hamsoft is a reader for new hamradio linux software at radio.linux.org.au.
# When you select an entry in the list and click on read, the link will be
# opened in a netscape window. Netscape has to be running already.
#
# If you leave the program idle, it will refresh every 'REFRESH_TIMEOUT'
# seconds. You might also have to set the $PROXY string and the path to your
# netscape executable in the configuration section below.
#
# TODO:
# - Make window come up before the connection is made
# - Detect if netscape is running
# - Distribute with debian
#
# Send me your remarks/improvements, I will try to add them!
################################################################################
use Gtk;
init Gtk;
use Socket;
use IO::Handle;
use strict;
############ Start of configuration ###########################################
# You can tell the script to use a proxy. If $PROXY is empty it will not use
# one. By default the script takes the value of the http_proxy environment
# variable.
my $PROXY = "";
my $PROXYPORT = 0;
if($ENV{http_proxy}) {
$ENV{http_proxy} =~ m$http://(.*?):(.*?)/$;
$PROXY = $1;
$PROXYPORT = $2;
}
# Number of seconds before a refresh is performed.
my $REFRESH_TIMEOUT = 3600;
# Path to netscape executable.
my $BROWSER_CMD = "/usr/X11R6/bin/netscape -remote 'OpenURL(##, new_window)'";
############ End of configuration #############################################
# $clist and $status hold the references to the Gtk CList holding the
# articles, and the status line which is actually a label. @articles
# holds the URLs of the articles.
my($clist, $status, @articles);
sub MainWindow {
my $mainwin = new Gtk::Window;
$mainwin->set_title("Linux Hamsoft Database");
$mainwin->signal_connect("destroy", \&Gtk::main_quit);
$mainwin->signal_connect("delete_event", \&Gtk::false);
$mainwin->set_usize(640,200);
$mainwin->set_policy(1,1,1);
# vertical box with scrolled window and clist
my $scrolled_win = new Gtk::ScrolledWindow(undef, undef);
$scrolled_win->set_policy('automatic', 'automatic');
my $vbox = new Gtk::VBox(0,5);
$vbox->border_width(5);
$clist = new_with_titles Gtk::CList("Link", "Title", "Version", "Date");
$clist->column_titles_passive;
$clist->set_selection_mode("browse");
$clist->set_column_width(0, 290);
$clist->set_column_width(1, 150);
$clist->set_column_width(2, 65);
$clist->set_column_width(3, 65);
$clist->signal_connect("button_press_event",
sub {
my $event = $_[1];
if ($event->{button} == 2) {
$event->{button} = 1;
Gtk::Gdk::event_put($clist, $event);
}
return 1;
});
$clist->signal_connect("button_release_event",
sub {
my $event = $_[1];
my $button = $event->{button};
my $x = $event->{"x"};
my $y = $event->{"y"};
my ($r, $c) = $clist->get_selection_info($x, $y);
if ($button == 2 && defined $r && defined $c && $r!=-1 && $c!=-1) {
$clist->select_row($r, $c);
&Browse($articles[$clist->selection]);
}
return 1;
});
$scrolled_win->add($clist);
$vbox->pack_start($scrolled_win, 1, 1, 0);
$clist->show;
$scrolled_win->show;
$mainwin->add($vbox);
$vbox->show;
# horixontal box with 3 buttons
my $hbox = new Gtk::HBox(0,0);
my $but;
$but = new_with_label Gtk::Button(" Refresh ");
$but->signal_connect("clicked", \&Refresh);
$hbox->pack_start($but, 0,0,0);
$but->show;
$but = new_with_label Gtk::Button(" Read ");
$but->signal_connect("clicked",
sub {
return unless(defined $clist->selection);
&Browse($articles[$clist->selection]);
});
$hbox->pack_start($but, 0,0,0);
$but->show;
$status = new Gtk::Label("Refreshing...");
$hbox->pack_start($status, 0,0,10);
$status->show;
$but = new_with_label Gtk::Button(" Quit ");
$but->signal_connect("clicked", \&Gtk::main_quit);
$hbox->pack_end($but, 0,0,0);
$but->show;
$vbox->pack_start($hbox, 0,0,0);
$hbox->show;
# Add a timeout to refresh the list automatically.
Gtk->timeout_add(1000*$REFRESH_TIMEOUT, \&Refresh, undef);
$mainwin->show;
}
sub Browse {
my($url) = @_;
$url =~ s/\.shtml$/_F.shtml/;
my $cmd = $BROWSER_CMD;
$cmd =~ s/\#\#/$url/;
system($cmd);
$status->set("Sent URL to the browser");
# If I don't return 1 explicitly then timeout_add won't reschedule
# the event again.
return 1;
}
sub Refresh {
my($iaddr, $proto, $port, $paddr, $url);
if($PROXY) {
$iaddr = gethostbyname($PROXY);
$port = $PROXYPORT;
$url = "http://radio.linux.org.au/recent.phtml";
}
else {
$iaddr = gethostbyname("radio.linux.org.au");
$port = 80;
$url = "/recent.phtml";
}
$proto = getprotobyname("tcp");
$paddr = sockaddr_in($port, $iaddr);
$status->set("Connecting to radio.linux.org.au..."); # this actually
# won't show...
socket(RADIO, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
connect(RADIO, $paddr) or die "connect: $!";
autoflush RADIO 1;
# Do not break up this string:
print RADIO "GET $url HTTP/1.0\r\nHost: radio.linux.org.au\r\nUser-Agent:
Hamsoft/0.1.1\r\n\r\n";
$status->set("Connected; waiting for reply...");
# Skip HTTP header
local $/ = "\r\n\r\n";
my $http_header = <RADIO>;
my @http_headerlist = split(/\r\n/, $http_header);
my $http_status = shift @http_headerlist;
my($httpver, $nstatus, $vstatus) = ($http_status =~ /(.*?) (.*?) (.*)/);
if ($nstatus !~ /^2/) {
$status->set("HTTP error $nstatus: $vstatus");
return;
}
$status->set("Data arriving...");
$clist->clear;
undef @articles;
# Get text data
local $/ = "\n";
foreach (<RADIO>) {
my($link, $title, $version, $date) = split(/\t/);
if ($link !~ /\n/) { # just in case of empty lines
$clist->append($link, $title, $version, $date);
push(@articles, $link);
}
}
close RADIO;
$status->set("New software entries retrieved ".(localtime));
}
&MainWindow;
&Refresh;
main Gtk;