package URLQueue::MainController; use strict; use warnings; use base 'Gtk2::GladeXML::Simple'; use Path::Class; use URI::Find; use URI::Title; use Email::Send; use Encode; use MIME::EncWords; use POSIX 'strftime'; sub new { my ($class,%params)=@_; my $glade_file=file(__FILE__)->parent->file('main.glade'); my $self=$class->SUPER::new($glade_file); my $target_list=Gtk2::TargetList->new(); $target_list->add_uri_targets(1); $target_list->add_text_targets(2); $self->{input}->drag_dest_set('all', [qw(default copy move link private ask)], ); $self->{input}->drag_dest_set_target_list($target_list); $self->{glade_dir}=$params{glade_dir}; return $self; } sub drag_motion { my ($self, $widget, $context, $x, $y, $time) = @_; $context->status($context->suggested_action,$time); if (!$self->{_dragging}) { $self->{input}->set_from_stock('gnome-stock-book-open','large-toolbar'); $self->{_dragging}=1; } return 1; } sub drag_leave { my ($self, $widget, $context, $time) = @_; if ($self->{_dragging}) { $self->{input}->set_from_stock('gnome-stock-book-green','large-toolbar'); $self->{_dragging}=0; } return 1; } sub drag_drop { my ($self, $widget, $context, $x, $y, $time) = @_; if (my $atom=$context->targets) { $self->{input}->set_from_stock('gnome-stock-book-yellow','large-toolbar'); $self->{_dragging}=0; $widget->drag_get_data($context, $atom, $time); return 1; } return 0; } sub drag_data_received { my ($self, $widget, $context, $x, $y, $data, $info, $time) = @_; if ($info==1) { $self->handle_uris($data->get_uris) } elsif ($info==2) { $self->handle_text($data->get_text); } else { warn "What is $info??"; } return 1; } sub paste_clipboard { my ($self,$widget)=@_; my $clipboard=Gtk2::Clipboard->get(); $clipboard->request_text(sub{$self->handle_text($_[1])}); return 1; } sub button_release { my ($self,$widget,$event)=@_; if ($event->button==2) { $self->{input}->set_from_stock('gnome-stock-book-yellow','large-toolbar'); my $clipboard=Gtk2::Clipboard->get(Gtk2::Gdk->SELECTION_PRIMARY); $clipboard->request_text(sub{$self->handle_text($_[1])}); return 1; } return 0; } sub quit { Gtk2->main_quit; } sub handle_text { my ($self,$text)=@_; return unless $text; # stupid hack to avoid double-drop from Firefox return if ($self->{_last_text} and $self->{_last_text} eq $text); $self->{_last_text}=$text; { my @uris; my $tmptext=$text; URI::Find->new(sub { push @uris,$_[0]->as_string; return '' })->find(\$tmptext); if ($tmptext=~/\A \s* \z/smx) { return $self->handle_uris(@uris); } } my ($title)=($text =~ m{ \A ^ (.+?) $}smx); for ($title,$text) { s{\A \s+}{}smx; s{\s+ \z}{}smx; } $title = 'URLQueue paste' if $title eq ''; $self->send_email($title,$text); $self->{input}->set_from_stock('gnome-stock-book-green','large-toolbar'); } sub handle_uris { my ($self,@uris)=@_; @uris=grep {$_} @uris; return unless @uris; my @titles=map {URI::Title::title($_)} @uris; my $title=join ' - ',@titles; my $body=''; while (@uris) { my $uri=shift @uris; my $name=shift @titles; $body.="$title $uri\n"; } $self->send_email($title,$body); $self->{input}->set_from_stock('gnome-stock-book-green','large-toolbar'); } sub send_email { my ($self,$title,$body)=@_; my $date=strftime('%a, %d %b %Y %H:%M:%S %z',localtime(time)); $title=MIME::EncWords::encode_mimewords( Encode::encode('utf-8',$title), Charset=>'utf-8', ); my $message=<<"EOM"; From: urlqueue\@thenautilus.net To: dakkar\@thenautilus.net Subject: $title Date: $date Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit $body EOM my $sender=Email::Send->new({mailer=>'SMTP'}); $sender->mailer_args([Host=>'luxion']); $sender->send(Encode::encode('utf-8',$message)); } 1;