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