1# $Id: Glib.pm,v 1.4 2009-04-22 10:53:51 joern Exp $ 2 3#----------------------------------------------------------------------- 4# Copyright (C) 2002-2006 J�rn Reder <joern AT zyn.de>. 5# All Rights Reserved. See file COPYRIGHT for details. 6# 7# This module is part of Event::RPC, which is free software; you can 8# redistribute it and/or modify it under the same terms as Perl itself. 9#----------------------------------------------------------------------- 10 11package Event::RPC::Loop::Glib; 12 13use base qw( Event::RPC::Loop ); 14 15use strict; 16use Glib; 17 18sub get_glib_main_loop { shift->{glib_main_loop} } 19sub set_glib_main_loop { shift->{glib_main_loop} = $_[1] } 20 21sub add_io_watcher { 22 my $self = shift; 23 my %par = @_; 24 my ($fh, $cb, $desc, $poll) = @par{'fh','cb','desc','poll'}; 25 26 my $cond = $poll eq 'r' ? 27 ['G_IO_IN', 'G_IO_HUP']: 28 ['G_IO_OUT','G_IO_HUP']; 29 30 return Glib::IO->add_watch ($fh->fileno, $cond, sub { &$cb(); 1 } ); 31} 32 33sub del_io_watcher { 34 my $self = shift; 35 my ($watcher) = @_; 36 37 Glib::Source->remove ($watcher); 38 39 1; 40} 41 42sub add_timer { 43 my $self = shift; 44 my %par = @_; 45 my ($interval, $after, $cb, $desc) = 46 @par{'interval','after','cb','desc'}; 47 48 die "interval and after can't be used together" 49 if $interval && $after; 50 51 if ( $interval ) { 52 return Glib::Timeout->add ( 53 $interval * 1000, 54 sub { &$cb(); 1 } 55 ); 56 } 57 else { 58 return Glib::Timeout->add ( 59 $after * 1000, 60 sub { &$cb(); 0 } 61 ); 62 } 63 64 1; 65} 66 67sub del_timer { 68 my $self = shift; 69 my ($timer) = @_; 70 71 Glib::Source->remove($timer); 72 73 1; 74} 75 76sub enter { 77 my $self = shift; 78 79 Glib->install_exception_handler(sub { 80 print "Event::RPC::Loop::Glib caught an exception: $@\n"; 81 1; 82 }); 83 84 my $main_loop = Glib::MainLoop->new; 85 $self->set_glib_main_loop($main_loop); 86 87 $main_loop->run; 88 89 1; 90} 91 92sub leave { 93 my $self = shift; 94 95 $self->get_glib_main_loop->quit; 96 97 1; 98} 99 1001; 101 102__END__ 103 104=head1 NAME 105 106Event::RPC::Loop::Glib - Glib mainloop for Event::RPC 107 108=head1 SYNOPSIS 109 110 use Event::RPC::Server; 111 use Event::RPC::Loop::Glib; 112 113 my $server = Event::RPC::Server->new ( 114 ... 115 loop => Event::RPC::Loop::Glib->new(), 116 ... 117 ); 118 119 $server->start; 120 121=head1 DESCRIPTION 122 123This modules implements a mainloop using Glib for the 124Event::RPC::Server module. It implements the interface 125of Event::RPC::Loop. Please refer to the manpage of 126Event::RPC::Loop for details. 127 128=head1 AUTHORS 129 130 J�rn Reder <joern at zyn dot de> 131 132=head1 COPYRIGHT AND LICENSE 133 134Copyright (C) 2002-2006 by Joern Reder, All Rights Reserved. 135 136This library is free software; you can redistribute it 137and/or modify it under the same terms as Perl itself. 138 139=cut 140