File Coverage

blib/lib/WWW/PlaceEngine.pm
Criterion Covered Total %
statement 17 113 15.0
branch 0 54 0.0
condition 0 27 0.0
subroutine 6 23 26.0
pod 15 17 88.2
total 38 234 16.2


line stmt bran cond sub pod time code
1             package WWW::PlaceEngine;
2              
3 1     1   23978 use strict;
  1         2  
  1         42  
4 1     1   5 use vars qw($VERSION);
  1         2  
  1         53  
5 1     1   1117 use Readonly;
  1         2770  
  1         53  
6 1     1   1027 use JSON;
  1         17948  
  1         7  
7 1     1   1355 use LWP::UserAgent;
  1         84334  
  1         413  
8             $VERSION = '0.03';
9             $JSON::QuotApos = 1;
10             $JSON::UTF8 = 1;
11              
12             Readonly my $API_HOST => 'http://www.placeengine.com/api';
13             Readonly my $RTAG_DAEMON => 'http://localhost:5448';
14             Readonly my $APKEY_DEFAULT => 'jVX7qKlFTUUcbNOBAnVX7XFhSUm6FyFzapE5oyv4Y.D6asJrrI5w3dUKsBgrpXe8eDIYrAff3WWKtXxnx.SX7OztpPf7SrrcJK-c0fyZKYSNVn-Gp3Kqb-4-VajcTxlFKt12r44C6oK5OPh7UsWLvt-xB3J.TuPHj0ptHJtuGAn1xc.ZA-4R3LBOQyYUsyphZACHrMvKQ1dAlPZPdyiwxpQfFczAZ4AljisHF5eFvjfYk6y5YUNsaT-TOqNCG22UyLTKL4t0bk.43YJU0M2cbdf07TWmDkQOy5JP9NmX1Ea8vbCZTM.DgEqPrsmrOaI9mmvEVppeCxASBz48ON.shw__,cGVybA__,44OR44O844Or44OX44Ot44Kw44Op44Og';
15             Readonly my $TESTED_RTAGD => 'w070606';
16             Readonly my $AGENT_DEFAULT => "WWW::PlaceEngine/$VERSION";
17             Readonly my $ERR_NOT_OCCUR => 0;
18             Readonly my $ERR_WIFI_OFF => 1;
19             Readonly my $ERR_NO_AP => 2;
20             Readonly my $ERR_WIFI_DENY => 4;
21             Readonly my $ERR_WIFI_TO => 5;
22             Readonly my $ERR_NO_APPKEY => 6;
23             Readonly my $ERR_NO_RTAGD => 7;
24             Readonly my $ERR_NO_HOST => 8;
25             Readonly my $ERR_RTAGD_OLD => 9;
26             Readonly my $ERR_NO_LOCAL => 10;
27              
28             Readonly my $ERROR_TABLE => {
29             $ERR_NOT_OCCUR => '',
30             $ERR_WIFI_OFF => 'WiFi device is maybe turned off.',
31             $ERR_NO_AP => 'No APs are found or getting WiFi information is denyed.',
32             $ERR_WIFI_DENY => 'Getting WiFi information is denyed.',
33             $ERR_WIFI_TO => 'Getting WiFi information is timeout.',
34             $ERR_NO_APPKEY => 'Application key is wrong or not found.',
35             $ERR_NO_RTAGD => 'PlaceEngine client not found or cannot accessible.',
36             $ERR_NO_HOST => 'PlaceEngine API host cannot accessible.',
37             $ERR_RTAGD_OLD => "PlaceEngine client's version is old. At least $TESTED_RTAGD version is need",
38             $ERR_NO_LOCAL => 'No APs are found in local DB.',
39             };
40              
41             ##############################################################################
42             # CONSTRCUTOR
43             ##############################################################################
44              
45             sub new {
46 0     0 1   my $class = shift;
47 0           my %opt = @_;
48 0           bless {
49             host => $API_HOST ,
50             rtagd => $RTAG_DAEMON ,
51             appkey => $APKEY_DEFAULT ,
52             errcode => $ERR_NOT_OCCUR ,
53             err => '' ,
54             # overwrite
55             %opt,
56             }, $class;
57             }
58              
59             ##############################################################################
60             # ACCESSOR
61             ##############################################################################
62             BEGIN{
63 1     1   4 for my $name (qw/ua host rtagd appkey err errcode rtag t numap version/)
64             {
65 10 0   0 1 1861 eval qq{
  0 0   0 1    
  0 0   0 1    
  0 0   0 1    
  0 0   0 1    
  0 0   0 1    
  0 0   0 1    
  0 0   0 1    
  0 0   0 1    
  0 0   0 0    
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
66             sub $name { \$_[0]->{$name} = \$_[1] if(defined \$_[1]); \$_[0]->{$name} }
67             };
68             }
69             }
70              
71             ##############################################################################
72             # METHODS
73             ##############################################################################
74              
75             sub get_location {
76 0     0 1   my $self = shift;
77 0 0         $self->check_rtagd or return;
78 0 0         $self->get_rtag or return;
79 0           $self->decode_rtag();
80             }
81              
82             sub get_local_location {
83 0     0 1   my $self = shift;
84 0   0       my $time = shift || $self->t || time;
85 0           my $param = '/locdb?t=' . $time;
86 0           $param .= '&appk=' . $self->appkey;
87              
88 0   0       my $ua = $self->ua || $self->ua(LWP::UserAgent->new(agent=>$AGENT_DEFAULT));
89 0           my $res = $ua->get($self->rtagd . $param);
90 0 0         return $self->set_err($ERR_NO_RTAGD) if !$res->is_success;
91              
92 0           my $cont = $res->content;
93 0           my ($long,$lat,$result,$opt) = @{jsonToObj($cont)};
  0            
94 0           for my $name (qw/long lat result/) {
95 0           $opt->{$name} = eval qq{\$$name};
96             }
97              
98 0 0         if ($result < 0) {
    0          
99 0           return $self->set_err($result * -1);
100             } elsif ($result == 0) {
101 0 0 0       return $self->set_err($ERR_NO_LOCAL) if (($opt->{lat} == 0.0) && ($opt->{long} == 0.0));
102             }
103              
104 0           return $opt;
105             }
106              
107             sub check_rtagd {
108 0     0 1   my $self = shift;
109              
110 0 0         return $self->version if $self->version;
111              
112 0   0       my $ua = $self->ua || $self->ua(LWP::UserAgent->new(agent=>$AGENT_DEFAULT));
113 0           my $origto = $ua->timeout;
114 0           $ua->timeout(30);
115 0           my $res = $ua->get($self->rtagd . '/ackjs?t=' . time);
116 0           $ua->timeout($origto);
117 0 0         return $self->set_err($ERR_NO_RTAGD) if !$res->is_success;
118              
119 0           my ($version) = $res->content =~ /^ackRTAG\("(.*)"\);$/;
120              
121 0 0         return $self->set_err($ERR_RTAGD_OLD) if ($version lt $TESTED_RTAGD);
122              
123 0           $self->version($version);
124             }
125              
126             sub get_rtag {
127 0     0 1   my $self = shift;
128 0           $self->set_err;
129 0           $self->numap(0);
130 0           $self->rtag('');
131 0           $self->t(time);
132 0 0         return $self->set_err($ERR_NO_APPKEY) if !$self->appkey;
133              
134 0   0       my $ua = $self->ua || $self->ua(LWP::UserAgent->new(agent=>$AGENT_DEFAULT));
135 0           my $origto = $ua->timeout;
136 0           $ua->timeout(30);
137 0           my $res = $ua->get($self->rtagd . '/rtagjs?t=' . $self->t . '&appk=' . $self->appkey);
138 0           $ua->timeout($origto);
139 0 0         return $self->set_err($ERR_NO_RTAGD) if !$res->is_success;
140              
141 0           my ($rtag,$numap,$time) = $res->content =~ /^recvRTAG\("(.*)",(.*),(.*)\);$/;
142              
143 0 0         if ($numap < 0) {
    0          
144 0           return $self->set_err($numap * -1);
145             } elsif ($numap == 0) {
146 0           return $self->set_err($ERR_NO_AP);
147             }
148              
149 0           $self->numap($numap);
150 0           $self->t($time);
151 0           $self->rtag($rtag);
152             }
153              
154             sub decode_rtag {
155 0     0 1   my $self = shift;
156 0   0       my $rtag = shift || $self->rtag || '';
157 0   0       my $time = shift || $self->t || time;
158              
159 0           my $param = '/loc?rtag=' . $rtag . '&t=' . $time;
160 0           $param .= '&appk=' . $self->appkey .'&fmt=json';
161              
162 0   0       my $ua = $self->ua || $self->ua(LWP::UserAgent->new(agent=>$AGENT_DEFAULT));
163 0           my $res = $ua->get($self->host . $param);
164 0 0         return $self->set_err($ERR_NO_HOST) if !$res->is_success;
165              
166 0           my $cont = $res->content;
167 0           my ($long,$lat,$range,$opt) = @{jsonToObj($cont)};
  0            
168 0           for my $name (qw/long lat range/) {
169 0           $opt->{$name} = eval qq{\$$name};
170             }
171              
172 0 0         if ($opt->{range} == -113) {
    0          
    0          
173 0           return $self->set_err($opt->{range},'Request format is illegal.');
174             } elsif ($opt->{range} <= -100) {
175 0           return $self->set_err($opt->{range},'AP has no location information.');
176             } elsif ($opt->{range} <= 0) {
177 0           return $self->set_err($opt->{range},'No APs are found.');
178             }
179 0           return $opt;
180             }
181              
182             ##############################################################################
183             # ERROR
184             ##############################################################################
185              
186             sub set_err {
187 0     0 0   my $self = shift;
188 0           my ($errcode,$err) = @_;
189              
190 0   0       $self->errcode($errcode || 0);
191 0   0       $self->err( $err || $ERROR_TABLE->{$errcode} || 'Unkown error occured.');
192              
193 0           return;
194             }
195              
196             1;
197              
198             __END__