From f9992f25f8eb116a41808e6d91064004dc91f69b Mon Sep 17 00:00:00 2001 From: Damian Minkov Date: Tue, 23 Aug 2011 18:23:28 +0000 Subject: [PATCH] Introduces service for detecting system activity like network changes and detecting idle states. Produced events used for autoaway and reconnect plugin. --- build.xml | 14 + ide/eclipse/.classpath | 3 + ide/nbproject/project.xml | 2 +- lib/felix.client.run.properties | 1 + lib/installer-exclude/hexdump-0.2.jar | Bin 0 -> 1633 bytes lib/installer-exclude/libdbus-java-2.7.jar | Bin 0 -> 128673 bytes lib/installer-exclude/unix-0.5.jar | Bin 0 -> 8323 bytes .../linux-64/libsysactivitynotifications.so | Bin 0 -> 5704 bytes lib/native/linux-64/libunix-java.so | Bin 0 -> 15136 bytes .../linux/libsysactivitynotifications.so | Bin 0 -> 3956 bytes lib/native/linux/libunix-java.so | Bin 0 -> 8180 bytes .../mac/libsysactivitynotifications.jnilib | Bin 0 -> 78192 bytes .../windows-64/sysactivitynotifications.dll | Bin 0 -> 56832 bytes .../windows/sysactivitynotifications.dll | Bin 0 -> 49664 bytes src/native/build.xml | 94 ++++ ..._sysactivity_SystemActivityNotifications.c | 86 ++++ ...ysactivity_SystemActivityNotifications.cpp | 462 +++++++++++++++++ ..._sysactivity_SystemActivityNotifications.h | 83 +++ ..._sysactivity_SystemActivityNotifications.m | 394 +++++++++++++++ .../impl/netaddr/NetaddrActivator.java | 11 + .../netaddr/NetworkConfigurationWatcher.java | 302 ++++++----- .../impl/netaddr/netaddr.manifest.mf | 2 + .../NetworkManagerListenerImpl.java | 153 ++++++ .../sysactivity/SysActivityActivator.java | 108 ++++ .../SystemActivityNotifications.java | 194 +++++++ ...ystemActivityNotificationsServiceImpl.java | 474 ++++++++++++++++++ .../sysactivity/sysactivity.impl.manifest.mf | 13 + .../GeneralConfigPluginActivator.java | 35 +- .../autoaway/AutoAwayWatcher.java | 207 ++++++++ .../autoaway/StatusUpdateThread.java | 4 +- .../generalconfig/generalconfig.manifest.mf | 2 + .../ReconnectPluginActivator.java | 2 +- .../SystemActivityChangeListener.java | 31 ++ .../SystemActivityNotificationsService.java | 58 +++ .../event/SystemActivityEvent.java | 106 ++++ 35 files changed, 2650 insertions(+), 191 deletions(-) create mode 100644 lib/installer-exclude/hexdump-0.2.jar create mode 100644 lib/installer-exclude/libdbus-java-2.7.jar create mode 100644 lib/installer-exclude/unix-0.5.jar create mode 100644 lib/native/linux-64/libsysactivitynotifications.so create mode 100644 lib/native/linux-64/libunix-java.so create mode 100644 lib/native/linux/libsysactivitynotifications.so create mode 100644 lib/native/linux/libunix-java.so create mode 100644 lib/native/mac/libsysactivitynotifications.jnilib create mode 100644 lib/native/windows-64/sysactivitynotifications.dll create mode 100644 lib/native/windows/sysactivitynotifications.dll create mode 100644 src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.c create mode 100644 src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.cpp create mode 100644 src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h create mode 100644 src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.m create mode 100644 src/net/java/sip/communicator/impl/sysactivity/NetworkManagerListenerImpl.java create mode 100644 src/net/java/sip/communicator/impl/sysactivity/SysActivityActivator.java create mode 100644 src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotifications.java create mode 100644 src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotificationsServiceImpl.java create mode 100644 src/net/java/sip/communicator/impl/sysactivity/sysactivity.impl.manifest.mf create mode 100644 src/net/java/sip/communicator/plugin/generalconfig/autoaway/AutoAwayWatcher.java create mode 100644 src/net/java/sip/communicator/service/sysactivity/SystemActivityChangeListener.java create mode 100644 src/net/java/sip/communicator/service/sysactivity/SystemActivityNotificationsService.java create mode 100644 src/net/java/sip/communicator/service/sysactivity/event/SystemActivityEvent.java diff --git a/build.xml b/build.xml index f126f4934..ee88b82dc 100644 --- a/build.xml +++ b/build.xml @@ -908,6 +908,7 @@ bundle-version,bundle-version-impl,bundle-shutdown-timeout, bundle-growlnotification,bundle-swingnotification,bundle-galagonotification, bundle-sparkle, bundle-plugin-branding, + bundle-systemactivitynotifications, bundle-osdependent,bundle-browserlauncher, bundle-zeroconf,bundle-plugin-zeroconfaccregwizz, bundle-pluginmanager,bundle-skinmanager,bundle-notification, @@ -2687,4 +2688,17 @@ javax.swing.event, javax.swing.border"/> prefix="net/java/sip/communicator/plugin/dnsconfig" /> + + + + + + + + + + diff --git a/ide/eclipse/.classpath b/ide/eclipse/.classpath index d1fe5058e..fde1911fa 100644 --- a/ide/eclipse/.classpath +++ b/ide/eclipse/.classpath @@ -75,5 +75,8 @@ + + + diff --git a/ide/nbproject/project.xml b/ide/nbproject/project.xml index 2650b231c..8b252d0a3 100644 --- a/ide/nbproject/project.xml +++ b/ide/nbproject/project.xml @@ -122,7 +122,7 @@ src - lib/felix.jar:lib/jdic-all.jar:lib/bundle/commons-logging.jar:lib/bundle/junit.jar:lib/bundle/log4j.jar:lib/installer-exclude/aclibico-2.1.jar:lib/installer-exclude/apache-ant-1.7.0.jar:lib/installer-exclude/concurrent.jar:lib/installer-exclude/dhcp4java-1.00.jar:lib/installer-exclude/dict4j.jar:lib/installer-exclude/dnsjava.jar:lib/installer-exclude/fmj.jar:lib/installer-exclude/forms-1.2.1.jar:lib/installer-exclude/gdata-client-1.0.jar:lib/installer-exclude/gdata-client-meta-1.0.jar:lib/installer-exclude/gdata-contacts-3.0.jar:lib/installer-exclude/gdata-contacts-meta-3.0.jar:lib/installer-exclude/gdata-core-1.0.jar:lib/installer-exclude/google-collect-1.0-rc1.jar:lib/installer-exclude/httpclient-4.1.1.jar:lib/installer-exclude/httpcore-4.1.jar:lib/installer-exclude/httpmime-4.1.1.jar:lib/installer-exclude/ice4j.jar:lib/installer-exclude/jain-sdp.jar:lib/installer-exclude/jain-sip-api.jar:lib/installer-exclude/jain-sip-ri.jar:lib/installer-exclude/jcalendar-1.3.2.jar:lib/installer-exclude/jdic_misc.jar:lib/installer-exclude/jdom.jar:lib/installer-exclude/jfontchooser-1.0.5.jar:lib/installer-exclude/jmdns.jar:lib/installer-exclude/jmf.jar:lib/installer-exclude/jml-1.0b5.jar:lib/installer-exclude/jmyspell-core.jar:lib/installer-exclude/jna.jar:lib/installer-exclude/jnsapi.jar:lib/installer-exclude/joscar-client.jar:lib/installer-exclude/joscar-common.jar:lib/installer-exclude/joscar-protocol.jar:lib/installer-exclude/jsch-0.1.36.jar:lib/installer-exclude/jsocks-klea.jar:lib/installer-exclude/json-20090723.jar:lib/installer-exclude/jspeex.jar:lib/installer-exclude/junit.jar:lib/installer-exclude/laf-widget.jar:lib/installer-exclude/lcrypto-jdk16-143.jar:lib/installer-exclude/libphonenumber-2.4.jar:lib/installer-exclude/log4j-1.2.8.jar:lib/installer-exclude/lti-civil-no_s_w_t.jar:lib/installer-exclude/mac_widgets-0.9.5.jar:lib/installer-exclude/nist-sdp-1.0.jar:lib/installer-exclude/otr4j.jar:lib/installer-exclude/pircbot.jar:lib/installer-exclude/profiler4j-1.0-beta3-SC.jar:lib/installer-exclude/rome-0.9.jar:lib/installer-exclude/smack.jar:lib/installer-exclude/smackx.jar:lib/installer-exclude/swing-worker-1.2.jar:lib/installer-exclude/transparency.jar:lib/installer-exclude/weupnp-0.1.2-SNAPSHOT.jar:lib/installer-exclude/ymsg_network_v0_67.jar:lib/installer-exclude/zrtp4j-light.jar:lib/os-specific/linux/installer-exclude/jmf.jar:lib/os-specific/linux/jdic_stub.jar:lib/os-specific/mac/growl4j.jar:lib/os-specific/mac/jdic_stub.jar:lib/os-specific/mac/OrangeExtensions.jar:lib/os-specific/mac/installer-exclude/dock.jar:lib/os-specific/mac/installer-exclude/jmf.jar:lib/os-specific/solaris/jdic_stub.jar:lib/os-specific/solaris/installer-exclude/jmf.jar:lib/os-specific/windows/jdic_stub.jar:lib/os-specific/windows/installer-exclude/jmf.jar:lib/os-specific/windows/installer-exclude/jna-platform-win32.jar:lib/os-specific/windows/installer-exclude/sound.jar + lib/felix.jar:lib/jdic-all.jar:lib/bundle/commons-logging.jar:lib/bundle/junit.jar:lib/bundle/log4j.jar:lib/installer-exclude/aclibico-2.1.jar:lib/installer-exclude/apache-ant-1.7.0.jar:lib/installer-exclude/concurrent.jar:lib/installer-exclude/dhcp4java-1.00.jar:lib/installer-exclude/dict4j.jar:lib/installer-exclude/dnsjava.jar:lib/installer-exclude/fmj.jar:lib/installer-exclude/forms-1.2.1.jar:lib/installer-exclude/gdata-client-1.0.jar:lib/installer-exclude/gdata-client-meta-1.0.jar:lib/installer-exclude/gdata-contacts-3.0.jar:lib/installer-exclude/gdata-contacts-meta-3.0.jar:lib/installer-exclude/gdata-core-1.0.jar:lib/installer-exclude/google-collect-1.0-rc1.jar:lib/installer-exclude/httpclient-4.1.1.jar:lib/installer-exclude/httpcore-4.1.jar:lib/installer-exclude/httpmime-4.1.1.jar:lib/installer-exclude/ice4j.jar:lib/installer-exclude/jain-sdp.jar:lib/installer-exclude/jain-sip-api.jar:lib/installer-exclude/jain-sip-ri.jar:lib/installer-exclude/jcalendar-1.3.2.jar:lib/installer-exclude/jdic_misc.jar:lib/installer-exclude/jdom.jar:lib/installer-exclude/jfontchooser-1.0.5.jar:lib/installer-exclude/jmdns.jar:lib/installer-exclude/jmf.jar:lib/installer-exclude/jml-1.0b5.jar:lib/installer-exclude/jmyspell-core.jar:lib/installer-exclude/jna.jar:lib/installer-exclude/jnsapi.jar:lib/installer-exclude/joscar-client.jar:lib/installer-exclude/joscar-common.jar:lib/installer-exclude/joscar-protocol.jar:lib/installer-exclude/jsch-0.1.36.jar:lib/installer-exclude/jsocks-klea.jar:lib/installer-exclude/json-20090723.jar:lib/installer-exclude/jspeex.jar:lib/installer-exclude/junit.jar:lib/installer-exclude/laf-widget.jar:lib/installer-exclude/lcrypto-jdk16-143.jar:lib/installer-exclude/libphonenumber-2.4.jar:lib/installer-exclude/log4j-1.2.8.jar:lib/installer-exclude/lti-civil-no_s_w_t.jar:lib/installer-exclude/mac_widgets-0.9.5.jar:lib/installer-exclude/nist-sdp-1.0.jar:lib/installer-exclude/otr4j.jar:lib/installer-exclude/pircbot.jar:lib/installer-exclude/profiler4j-1.0-beta3-SC.jar:lib/installer-exclude/rome-0.9.jar:lib/installer-exclude/smack.jar:lib/installer-exclude/smackx.jar:lib/installer-exclude/swing-worker-1.2.jar:lib/installer-exclude/transparency.jar:lib/installer-exclude/weupnp-0.1.2-SNAPSHOT.jar:lib/installer-exclude/ymsg_network_v0_67.jar:lib/installer-exclude/zrtp4j-light.jar:lib/os-specific/linux/installer-exclude/jmf.jar:lib/os-specific/linux/jdic_stub.jar:lib/os-specific/mac/growl4j.jar:lib/os-specific/mac/jdic_stub.jar:lib/os-specific/mac/OrangeExtensions.jar:lib/os-specific/mac/installer-exclude/dock.jar:lib/os-specific/mac/installer-exclude/jmf.jar:lib/os-specific/solaris/jdic_stub.jar:lib/os-specific/solaris/installer-exclude/jmf.jar:lib/os-specific/windows/jdic_stub.jar:lib/os-specific/windows/installer-exclude/jmf.jar:lib/os-specific/windows/installer-exclude/jna-platform-win32.jar:lib/os-specific/windows/installer-exclude/sound.jar:lib/installer-exclude/libdbus-java-2.7.jar:lib/installer-exclude/hexdump-0.2.jar:lib/installer-exclude/unix-0.5.jar classes 1.5 diff --git a/lib/felix.client.run.properties b/lib/felix.client.run.properties index f2ee6d40b..eff2f69f9 100644 --- a/lib/felix.client.run.properties +++ b/lib/felix.client.run.properties @@ -48,6 +48,7 @@ felix.auto.start.40= \ reference:file:sc-bundles/resourcemanager.jar \ reference:file:sc-bundles/jfontchooserlib.jar \ reference:file:sc-bundles/netaddr.jar \ + reference:file:sc-bundles/sysactivitynotifications.jar \ reference:file:sc-bundles/browserlauncher.jar \ reference:file:sc-bundles/updateservice.jar diff --git a/lib/installer-exclude/hexdump-0.2.jar b/lib/installer-exclude/hexdump-0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..4fb5ee14a7fcb54670e6736b596aef2754d1a3d8 GIT binary patch literal 1633 zcmWIWW@Zs#-~htlG$DHiB*4kQ!r%L$ z$s^K|ni(w9pK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWQ|nmPj{d-AdK4~Noq?5t3lb~7Yklfk+J zwliY<)7nLM%$oIFbj9PBsosu9LyGRsx)&9_$*6eaQW4!Kv)b#YGvSr z#5)eQQcHHMd)yZjKY2z&qg!Q(!94Ecn>r1;C;3Lmw{PEc@=DqbPnSlEoj=zuWe=NE zT6o;dY|Yoy$o`L;Sw&}T zpAt*1Cht0Pn0d;dn1;M97aiIE3WwZkAgEL}AB`#cWk3`=5oE8$P~%=5Xwm z_IaPO_FpSyJYW8${qFCA`}RhiU334$T{)e~f3>fy>Ssvsx41tNx7zC_1*r3!N~=g% z#G{*X`_xU2kKz~F0$V<+ZIxWK=*1zWzuGmIo|j#uAZyjNX(6yp9V zB-(Xq%2yWCBzLWTMW>>_X8!B6RBnBm^*%MJex6#|r|B$r)HVtVNvm!&6q0tgewV-@ zTp?R-==)pdUP4!RKj+njNBm;UkM3oz;Qr}z`+*hvA90h}{(1^Fr>n9~n7$Es9UePr zO2PX@>)cXjXZ@Wu??mjEw;ii$-oKgie`R26_`9r-&1NS&Z@O!Kwb4HQtT4web2YCX z-}PDT{qZ&{1N|?)eZHk>?j^(1JkKpoe_r#ewk%I>@0)uZ_l}8(y{K%jtr6$k(=Kw) zz0F#Gcg5MnD-SMwpW&Y?3Pr?0Z$4zA7gD34@cGRXpLuk{%Y`YYX$CaBa7jBq7|Hg~O zH~%!A511S-e?G1MRe1C6j$fgcQ;iib&a3y?IeGi?d9{77J{Esj{YvSv_ERnY2RpXi zS{r`z*WRSZza%Yd&gJZT&{BKS$ks`I-yxNKY2Wub_UsF-aX-`hc>g8mG~NBGivKPw z(z__vxoVNJ&{daol~-c16IbZ%QV#6jA=$~b{l&s7M|HjWUo8F7W#=`&BXC-ms+aQ- z&C^GWQg?39&_3ezBs`;azs=46;X9`-cxewRK=0Z;uFPOzU@!+3r2*cIOd<@ZAUq4C I>sUcN0E2*?ng9R* literal 0 HcmV?d00001 diff --git a/lib/installer-exclude/libdbus-java-2.7.jar b/lib/installer-exclude/libdbus-java-2.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..e58e513edfce7cf09d772c7974f99ab70ca42d48 GIT binary patch literal 128673 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 W4jo7ZqM&#J|6pE6L3!K-$NoQ}`zeqB literal 0 HcmV?d00001 diff --git a/lib/installer-exclude/unix-0.5.jar b/lib/installer-exclude/unix-0.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..d9810d98b823702280f67791fc77b54f860abf54 GIT binary patch literal 8323 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 literal 0 HcmV?d00001 diff --git a/lib/native/linux-64/libunix-java.so b/lib/native/linux-64/libunix-java.so new file mode 100644 index 0000000000000000000000000000000000000000..8c4e92c4670e03fffdbdd9ae03ff8df6d54b1e07 GIT binary patch literal 15136 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 T+ZLhe#y^%AyUtR9zpegX3E5b` literal 0 HcmV?d00001 diff --git a/lib/native/linux/libsysactivitynotifications.so b/lib/native/linux/libsysactivitynotifications.so new file mode 100644 index 0000000000000000000000000000000000000000..c2fb161bf826ad9ba6b7a2a31e76d0b47123859c GIT binary patch literal 3956 zcmb_feTY<56u+yhZD!lFO&^xkB!g^}kKNj$B1&5~QN*&l$v)L+Ya}!x#4P+Pf-=V1Yz31=%Gd9A=Up1j2x8B2=G=46 z@0|N}?!9lH?pk?&LqmhmG*iqJ)Cv~}(E<75MKw={NQqgZRm>AtDZj>3K7V12XHiKA z@C*hq5Ubbqj z$USm=e)!|$>`jC3pI*A>#kaqCZ{e+%!bc1VQ&q(Lm&I)g#4XnpJkv2V$Rv@t(1i^m=~vipaZp6cxS zW}*y`+xrWx8`f-zVQj*XA#G(DTT&OT7jhg zV;z9=KYfmV4F?tz{RhtR&(}`K1>leC{2coS;Kf)#u4fBobOQPIUJV755GSJVpzo~H z6NrBRcLobL+A92XbVf?aAyJU2k+ z6Q|!*>d1#_R7NaGi`Ly`txJb*>{}V> z3_5by>>ft;{w1-x%9Bnnp^oSJrf|i=3)9Y8(n2Bk z_^2P2I81IUM@xbHKnteYo$I49a0g-`EYmjEwo1}b1=wYBJs?g zo9PK?-I6qw(MQkw96m}&_T~lFKvefm*0p|M@CpVekjqp+H}0-7c@4EUig5mDiqxXyn{?oQa}Rz$FaTFP2B%Q|(dK4qA8dw`#!< zj;Vw#C7Et2Ek$@TU0qLmpn!`LyMYwH%=wT)wS#@Bcsq;Lj%;3e7n|jG7qXAwcw=-hoDIjoNxklM^_f6ub@Iw4@F7D(;PC zcPx3fSgCx^_&vdQiVw>%a#19`Gvg zqhQ_}T$^Q`op+^Lm)bp!<)%7}4&$~(cidQOAjr@8vM8+{VYr^OjXrn4=oxVG*+ouP zC@p9CIbmdnU4OX0CS|ea!IPjK0tJf|6Fxjp#Mc^yycC9d{S9dkp{>3F3_EA`7Oj3; z7#Y0SJ`&f&rVJ7w*y?vO=*2?-ehigGUAhMDTm<2{w_T~1;6Ekz5lf=>?=U2p_k||b z18D)6wZMI5eUP_-wV#sA+wm0kkT}*4`N7x+p)ka;7T7m&tSjyXU)(?l%k4lrwpIMxxFedzJgPVNG;_Sk0qkyB{b_X}050pmER7}hVjJ|FWofj8FS zSnp(xnSRbs<9gBNSm9RZjc1NHO?sRb3>r5D47s2|ki?PmV2$JdSL7)gVoJoa2&r*A z-{kslYTfTpjN`g&28OJCOr_h;#yD;P{~voEIIe>xjVr;xeu*0eZuDPpqjk8gz-|4P zeqRQTYsY-*e?8!ipv`?Fv0skkRj}@t-vtsEmR<|E6pq;KbvWK%n}JIc5EC)vH^Dj| z?~NV6oo~MH07pB=$Nx8W0>`^m6LXRH{|fW9Q2`NGzaR8zW-d)%0ynM|NMcBT0n^5A AXaE2J literal 0 HcmV?d00001 diff --git a/lib/native/linux/libunix-java.so b/lib/native/linux/libunix-java.so new file mode 100644 index 0000000000000000000000000000000000000000..f4d916591bd4ae5848c0a2f97f48909e4d6547cd GIT binary patch literal 8180 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 literal 0 HcmV?d00001 diff --git a/lib/native/windows-64/sysactivitynotifications.dll b/lib/native/windows-64/sysactivitynotifications.dll new file mode 100644 index 0000000000000000000000000000000000000000..c762f8875d9016b31a9220899b3d7047d1505fea GIT binary patch literal 56832 zcmeFadwf*I`9FS=-6c!Na)PoLKxEaRk%&a2C2>Lbkd2;&jYPQ^6$K1L@PaX%6|{hf zC($h9YFcfJt!-(m{n(2it!*)YVnQGnt^sdBY>oF>*Gs&GaFO$UKQm{Op!W0qyuQDG ze`t2@GtWHp%rnnC^UR!*>l+k@q9{)MS(c(S!li!!@%umja3l{Ozj?UwkD+_cY)lF7 zIdjg^Wh;D@Rd?P}wdf9C`J&~^?=*ZjFY#4Hmiv}1_XTIo_T6#k;w2Y&Jn7kX)wTKm zINo&4o6jcyp3Sa&_A!K?%?>`>0k>mf=-D=re(2f9Mf_dQz9C%g*=FHhDcoz8l`o|_ z{u9Kd#fq}{0hiL-F#D=xo*v~a->}qlMR@=*cgxuIXT!}D{^}HR$e*exF8aa0q^ksw zN=U=MR1uJc?6QdcZdk@-?o*WeQB|;2QA$N=`^T4}Y;X^X$V*Wc3jhYi{cpS*6lJ{x z^#^lbU@Tc>Am!yc{1AxLce@|(iGMytS$IL!;zh3iqdpJrOYV$h`uU7yV5x*6THY5xS(pu?RS2-x2I zUcTuk$Nc}H|5przqrvQ~a5S9l)6GwEbe0m1g|l_5p$Dkf&FwiYyHEb7BddEh^7?e< zeehjH39*BE-2tOmuj`1MsWZ>75U0oHWakykb(gB9G2qu^OHh*}C+)CS#neBj%k(d0C2PHFOO@_UJe#l`^;cZmX z)Y_d?oO%9&1cE&<2zIsZ8IedxW8OuSV-WmmZA~&2efUFz=tC_zq7Qm>b@sw!M_3SM? zB^;m$ySgMI*!=9JI=el)QfEf?D&VD5n-7`-ZL77-sC%|v^GPY;mbuz@!^z*SM{BbK z6ch9O2+-^7P0RbuLlpK77vXlx`!5Qk2e;~Mm(__;U4-0jq*~scGHc5tR1{gCx3iAW zV>8`?Vzovms<%3;w>$v=kZZO(sJ<|Bxcb5{^=D0b^T%1?STH-U=3NUbcYP3@yG#u5 zLlUg~-TVw7Nw3*XaNqEim?7weAS32V-HkNai*Bl&NId_5)<|t}FBPO1qIZh1ycYq! zAg~nF%wsOKPC=cR7||!Pdyt%es5rj^6p())zk^69Pmj9p`Zwx`x~inJLOKQ<%lmIe z)q7`A99p5=H^9$dg(x!Z1N^9U)u>e+k4__*x><(goaVYqo@Lioxf=)g8ZrD zmX+T$7zWpu{}RoAC7rLO^Nnx-pXI$?!mx{CY#82vpO+?KFif4v-s$Y2>~1up1Esr= z43rWQTkif4qj@Q2zvVrSwGj|bLqLq?`xFLz+r>x{Zh)6L;Ic9ApFn{?mDM@8T4PYP zgE=lC(|s-RTXqDqZ5lz#-Xs=@Ij2)Kr9L!sAvet5B!5Nm2G;MVX&nMyp3D`E>fBc~yW~s^R95 zOLM0KfgC&1N3P}lCy^1OH864k-ykNXS3|{Oh!;X`<4i*s4iMl9KS+dUZZBxDCj9+z=;8mEg-MVH)TJ3Hx~zqtZwW16c;iG8Gl-_*w!~(fytyt(XTR^ycQwio?y8 z6-oW7MQ`rNjBiSpOE!8vC_ifsnSJi6+3Lmvp-n0FzmWRuenbbV&d?7ZG~Y=xhJ@(8uaK0-E4M;td7XnB^aOd`VqR-9J1OY zy)EkafI^w@f2ih&a=N0d0H++GN3V9{FB9b;lU&_}ziyO=!|~UHzrILU;xTkFi2kW9 zBk+e3_>o26>7tM*1ea5whkp7ZojuhV*-Cs4(1x)l-b2$iQ!*eeE5BD~2eTbhQzMrj z*0M;{Fn+`ebMMKlv(`@HBTq$pY<6Z4bGMzJbBdz)+af9}%BpR;M>V^@jTU7k(#)Az zK65Xo%FIl&+^w)yn$ZP%bl4!~0*u>o5($?bk#sr07h}BmEdUL8a)I3>e20s&lmLM6 zVtM61LxX5{Bb>usW1AAGm<>c2Ed%`^*&<7uqs`T*M|nXO&+pB*VppZ`#iuDsL;fMn z+-ITJKL5D#qga1p)o3zY{vIZF(Z`B1!<^c!7)wEw-M!PZOyefBdLP(L1Jci?be7TG zt05s@GrvuVoWg$uU^Rc6akkY8G-fBp7T0|m8HFsVMkXIE6E!tx0W2_4@7r;zW8}N2 z_GwgWwZtotM=W@}#S3pe zeVD0VV5gw_X3x7; zh=qXo2+-Gr1|W`rLuK)s&jSlqM$tHZ4o-$KibEbFwgfSX@)&Q0V~ew~9)WZkdauk1 zsC5q@gUt3s_H!_hRc><_rT_tQcn6l315R&)tA7>%5ht{iId=`2LEbikQ(G5^Ac#AfF!A-OW z0dL&24WfahU*_&Xlb>uM6l?TjWDf!n&aF8`S zR_ey!M8~~FiKoiMCOa{$aSRG3?xsb~I}@$x(UB>-xeY6Ovs<@z8ACyjk0Nv8L+U}y zTZBBtG2Ibj?ctbr*$1?1gZwD45@OD6gqbiKnG!OOTE;N^o-kY`bq69t+EPITR>;Cc z+LlK=>Lt`C=M?xXe+80E^|Wrt0gB<`n+Qtg8ADJ4Bk^Sj51Pj@&xU5C_zzZH1|((g zAb;1&i?G$x8~^fW@o%D@yI(*2vEF>tAqGEwc`Q64ledGfsGD!gQthT=GldLugKkZD zs%B6dZ<X{2)e3Y4}@9`w2o6gj6eh2it{Ovma%@`$e%|Xe+oZH|2Z6Nh=_X5 z=RZLJm__uX@F5D@)W^{fZ8U1ALCbqToTwvlzRpZ)3Dg#f+CGy2K!_YHzix;_ZvG~K z=W_u}a$T@xIv==!Hka6G{-F?yhgeULy&HyfhgQA3bVC0u`&Tyh!M{M2{8+A{Y;MO~ zkgVN;pYurRC^H;34(VYZKS7&+ho z?}J!FY>ys&L3AkkEWwX7pXGh(KGX_;##!E$Cc9v(x6_O_ zupK0}3Z_aTtLiRFnn>dTBqZYeE~vyTub*0u zx{kkx9JgTwgTG-v{EwVLx$jBiM<*ipE`Du3g;$N|SLF%MD2U|w;7h1+nB|&_BJr0A zA-QKF`%X;G66U%bv2{)A!}nrTtoEpDGQx%4xd$Q7xcGF`i+yt>llS>h?okB!9|2MW zMXofbeSsNh8O!;-)c!5z(bUL1elz@o2Ig15ij+Rp+EHi%f+X{7rgGl-Ybj|Lh8OvMIE|1(`_Y2@mn$S@oo%>dDIa}LvQwAD3h|7(ARu#T_z#|{g8C{j>w5_ zs)gRNPIM>@Xojl*_gMS^ZGM<}=3#=B)O8qXnzf$>8sK=ttd+eIV!L?=ZOcee_)!$@ zPkRX?!TKoGJeCr<1W3LRY551J-0zUqA8?|QFdO%2H8pg|7?w=XtXB|pna3QFDgCv+ z0e%S4qvPy->Xk35TOQG8A1_C(hdJ>6ku6q$V)TuPJ zxeWL)$*4eR3*`usy2e#(`ztN)(I3-d`abeWuJUtCDB7gGiFjZjAM?=i?m)ntwiTI_ zNV?3o9QiEolStT1O^Mz6!&IhbJHbwCI!T0cN$P>%I1i#@?629KA7EpVHx_g1ms5~8 zw;RAbw;4XtsMPteK<8V`vtwcQ90vam6XFC( z*qXWeG*F>WTNgYnTp!L}q&1=(>A4na=3*ofU<(r=b!!KIT`*7M;t+(f+?J4Ihi>+z zs1HAb`f0x#kVUZ|^7+UK`B1HWp3>ooP>u?ng+lC@miw&(gcB@WoL#0qNu%l z**D93VwJ4B73EM*S&I75^YB_wT3c<2dx>TQ<)lW=P+x#X_5BL7FTDc&325qL+jX-g zH3+H;CtN|aA0CwbQuPHw+C_PaQsGDT$Sr1DYH{8B#+llS9<-pb-4#?cz}5aNXp$Nh zU12R+?hei0y5gMp$6%i89FWU8-UMWA=*+uXeNYX9EZ^1If@!40RKP65@gst=cCJLQ zEB*-rA~pdJFw9Vz5FrR3lzalw`G-o_2ZG{up$in*vwr{Z}A={43ytro39$mF$#`ydvX&>efY?`U3i8Zcn8Fj;IyUQ5ptJH(T-7 zEdDB@LqxFV$O-CU%YW|SnUFL7Z#}HLTlTO7tI~h!Aqh|4?V+D~I06Y`uqr7>BVmB% zXeG4N{R1`m!+OQR(u51&36?U-Z=+i)X74~WaGn!^|WiI9-9Gb^-(E@AU6#rIH z9?#vDe_(%KkYTea2G^e4FGXma`)JU91#n0oLc=YmcllmD_Lzr;wip}gm`B0D5P~QV zxCYME5ON1|TP^P$s0T8^FbCHCp#Q{ujS08q?K6m?Dd^SMaoJ(;0nL9xz25c-!pIR|y>`G*ouVqNG)W${%gpQK~|8`KGBvsf7d#xSjVjWR~9y$D(O3eht3QVOq! z*YqjzX^77S#gj%MM#~`S%zyC-)%Qep{aA!+w$ri+b;V6Ww!Y~`sk0z?CAq{x4)kfX zc)qKbA2F>H&@AN0`ne*Sq|U}4AuM#PTH&Ae;OkJ0-KMj*!|d}=^S4kLTvCfD^F8eO z50%Yi&d=1X;VifLPKr?sxxef}NWm1_8-xza7=ek4jRX=-?E@~lAiMrDs~@G$!i$cX zyDVgAMM>6@7|S1*vHY%qj3-V*MyX;iBT+2bKge>}+mRN=%cqO%qX=R9WcGxEX{RGQ zDJMzJ$V%dYaA5a7lc)DL6aTg7wOU^X*FP=x8hVZ+#J6>JSZ_Xoo=;eZD7)v_+kf5P z^J@YBO<=+e6f1k4i>Nmy)A(Xrc(jTLB9d--E8zngQu7ai$h`a+KpM^B55SRRCULPD zbpaQr@;mwy_)&Dt#sNvPKGKS`;OOnGQ1k}uB5%tIMOXMj(b<^;vXuErpoHDyE@2lk z%^70%6qMv1E@AILaKZ_}(-msnr|4*?{4Sle_$ARIsD)bnQ&h7CJVAFf>9P538LX%; z?C(+Ue;Qd?(Q)#dPrz^f*r}+sKP8_(#Td=7y5KYky)Y3o&CM9X0yFw4K_xh(d$a>IT#@4?Q zZG%!v|4tl~vAfb>{KyB>x9Vp*jaigVBrvn|s+ zmc6>e7TxGjOK6e7$O4k?pkHeNMnY!xc5LhuhwS~-N#{^6V|$D0$F)Ni!t`OeIuJ0{ z{4sa}6v`NC>rOG|{I?)$-8>tAEt$HtH}Wb9{R)Mk#D>k8kXI6SSolMQ6!j29s2klT3@#P3%?n_;}#1Sb}F#iv36?BL5_nm+>avGls4ivj; z9Dnr!>~k!{@rjszIyGucaMw`dks_F8BdTd%40PBuJx;gc29K!H#ASa+jcT69_e*#ty41u*# zRp2HIfUAGpfk=s~)!CUs5AB1Jo3B3#*4@s%=r65mzo1@KevDV;Yb=Li`*8SdPFM&EnvFdh2)w$3^CF17BrIZe}t7{Ch>V-vaW2`uNs~6ck zPRcfvuL1d?ZZ{?MiW*WQBTbPfwY4ZKC6T6PrhcW~2jd#dQrj#?!iWw$H9tX;egEY-XmN6K}F?)&J6XCrtMoo|$3<}JlYRl?|Hm9%;B;ZT|? z#hG`UGYm-Y6ME5X*R1x;J~xCia()(+EeVZN49 zj)I91oM}_?-!A8LW?E<6w})RMk_h>^@CBow&`7^+k&vm2+&VZV+X>~xf_aW-&bq@hI~4^u~FMXhc-HPfYCM2L5ZW*{{kr* z_6*%q%T}HO^~3h*>eh$cc~1fr@2Clf#&+uE+XSB<*^Z>g(o2!leAI~+$`~}aYVA~@ z&FWBVXS${Pl^uTGc7JcXx7uzwT15W35!5moH2W5-kKBe)R%>qqaAu#T)?SF9*;l02 z?gjqMzGAg@yok9Hs$1ciZQO45m8rG+MCf|sG_!A!T02C9%GKJZP%J*dNpj4PklE@c zmE~leVQN4KJV$*Q4R8Kn*ospg$4*IX#dEjq?~C_f8%?MyjeiKA&c?m?464}&zjk;> z9=eBlu5SKxScsj0eT~N2Heqtyrv`C|-s(n{Ok`1OrOn!*WX-x79JdtLk*0EH-zv3k2P$ej7nu@QTkRFW!Vx$M!e$k#N{^nq zOW%Ja;RCv<|HfZM{}bs}d$3@Hkp|5Ja($V*3sX86Cq6v0`=Bu^Cxg1G|SQ; znz6%)A==B74bu;zlxri&ahM|N*5i74FS0gT-c?Ib2&_Da<1utB51PeQI8=Za+W3-2 zs5eR320XxP{e^R868k}D3pA-QA z7y{ZmfTLGlEGUKW5iEpKSgpGP-4Ww>Aq|jwMH_+yOAqP~<~J3BSsBY2G36V(!Hu_FHzKqn>$N5e`O1X2QtF-gGL8-%Y7GJlY!6jlyM z7J$|0&m?e9gkUie2uKg39>S6gJ&X@C8G0BJ9QrqE(8GWrLdF#QE;VxS zd%NMm@5;z;hz5oweo=k-?XbkL+9;Tjs0S;^Ox%xOU;G|0x^-z3uTK3@WMuVyDHlhE zW0RIDqT<&hd1}6hzo+}SOR{B*dRL*e;jU6EaPQbdxNpndT0DW#1ylm@%xhH#%huSf)3_DNQhQY zg1HCwYzY;O%)x$^O2>kFCuNCWAq)Bp4b7fyT!`OX<1GA6f-PM2@jSIITh`!?kF~3c zpCUae@uB1aw$tJkgf=vj8t;XN(6Nes=F`s{`q7KYTKfcfOXCNShrbLSZ%cMzc=MYI zir2^A=pAJ5CHBZkJE?iLxg*Uz9Bz0QLBm`I%8K3E&i3$oF@uUp3ED|JBR7eJB#`J) zm$LNkHeN4+1#t`@nWE@8`{^#cXr?Us+wB7{bQAjj+Z})E!#88r#ck%UDXz31gAg zTdbrQ*OTLp497+?+w%T?fgtN*z5H`M=J^MTie0(Rc94A?M2 zadRt5Zw;V`&iu3sn4*I`F!G6U=6xB8kq$*$rsZ{_b{z^sv#l&ie|=TJ*)aZ7$jG)b z2n*xh2-e+xRR=a}Fc#6Ho(PnBNn1RaJEEj7(S6l{dz5$0vXHT8<77Ja?O zg3V5e3;qYl{D3nu6zatBzsEp1q3X&c1VHifNshb^V5d8h=_5sYzdhQ5L3O+h$V43@ zq3gc_39uAwLmc748IF}^LZG2jIW3BFHK~vJkGc~!ZOuQ>&re~nqM5rPa_r^KNi^0% z1(}0Mmrd%`uIsTnOuGhIgRx(8$Rt7k+Zsz~>Xn~p{!b$9gzy4FI8aZj5YnL7sz7-+ zhe-8@bT|2Ek}eof>}E5U=6*xmb z&)0%{@?aD_D}~R3y0js-zyaM8ETXU8qbO^Z=;dF5bzK4-B9@FE#VFNTMvpLh&g3oV zAgu^PtTwQNZ1dR2)ws>)a#LpH!d5rW^8Oj^1Hi9d6p>$Wk^*62^&Y~|)_(=7=foq@ zGN+S++ha=h8%V((k8JUh^owQjTg-IJ`&+6KbUGUPrbCDkYthZu%19^eb^806EX!X& zvt)jG8_I%Lh|O{QrZ~-G>Awc8C)?taNMZ(mVO{*hWb*Ffqo8pn_d`4Uy6xU7MtPTL zF+L4}-MWA0ib(>&gj=7Wi-WYd0OVAHtp#e?x2rH+l8SDr?~{6R(&T}V4pJ?rVJM-^ z9Y&*_YVA*!1WOwzX`i>qrp#&ALvc&@457C6%z~d!1W!T3ZtDDH6rr7q4#m7A7$MK2 zaQIpv2Tfg%@OwBZ;6Kl!v~jnHEYp_4Neus?4w%!vYD9C!coh5?KK>Gp2GE#_SqSrr zSZS)|J%D)X(*VQ+v`5>htdq_Li&-~&GsupJG2vT30zsP7?tTu&U}|j&WP&!=%@jbR z!TJf;!drJpt$P(gkXR{Nvb@vhQJ{wybsjLT*8V}JP86xxBDGJj@i4~$4rHPF8i zY$2%uLzNO=3=xcO^}uc{C4Maem?!=7=kFjRP=9zN?Esp@Q4|&8lV!gA4y?nU&ynk} zHNis-GS}K)kwIO46X@HTFq%?ntzw=E#FOCTfn5S(P0t)eh-J?E z*i2o99+sgp8LE~cY{MvLl?+wN&|(={B}4N>h*bk^GNM>UY@mpkYZgsLe>*Cfg!q?f zj6k&=?}<@jG)g3zVitE8r}tPxaWENk`5#9tG+{X9Yd41Qub~)fK%vLpO^)I^Sv)z4 zMlP9td&W^q({6%bWQ;*A-v9#L-)9UrFUK(#<#+@+>`~QG7jgRasGCL?j6ulxaxMT( z%=6TGNx<23d;+#G4uiuyk02Hpr*-)JtI4~IKSoHm7hPGNKaRfgu5NLyX(6WjU1E5@ zLV>8OgzCkLst>Ztc0prg)5wL)lPlWj1ivX2to96?ZJ?dqnCh1IH;A)oM4WblP?)$W zn*5qan8z3mlKrHXcza5urbzZM@F@B6b(i zzmsF$<8-Taz3`FA2@=f>&r zHH8gGOh(sGG;$;QCls9_bJrp!ac@oGql4n=D6XQWFg7Ueeu}%MrtpzLaSu@3Wi^FA z9Tc~Y;wIJ<{xfx;4b-C~M%5Jl197ZvGXbFnw?zfC>`{VQ@NAe_L`6?MJ(y2wn#jhGoI30Iv1D0ir z$agHMasGkCsnZ~2K>pgr?*@y5rHvzHoujrX@=@%{6mfS6cbNFfuZbG5Xu1A`!6K2S z3AH_g+N%9RI^4wzP`VnnN|h;%yAr8M1$0IoC&JXM>$n=|}w=fXC5GSeFJ8I??VoR;jpE}WwMA+2fiNhJ)BVR)1v@-SxM9-Vut&$x2xP@@P4nWAoO=V1~uQD7_v zdpOK|trpRFDrn;&F$_sSNDIXY9N_-rbu=8Z9Xf-h==ey)QCD2pE@UGo&Pz_-ony0D zMhq^g1R~i1C;LXWPwZ{XX_x&sumRGa4H*V%!Gb?x%O~DiAa?ggt7{^W0?u2)NM_?S z5SJdE_A%H9orMCkO2k1XchHdOLgP=;Epc5Tx$&1sQY)uj>n1=-|HkY7FILRg%b^L; zA?B>OT91wVLig{l!k%^~|7Q=8Tpvw?f^f{)Gf*#p>96$`)Jo4U1OUopfTCf@n}X4C zs|o0FFg7y<(jlU9DBg$lW(Mjh=jh4RIyStAKBu1bP|q|`gD6hL zV5dQnCEf+d5lFMV#F_bWhI9#IOEIiQjLa-Ua-a%2|ue=P_36~n)oY<9%` z_qHV>!Y>ejE7CnR;0r06eS^!v9bJ)Vm&t{-RUhp~3JvXGp( zn-p@`hQAj=8uj1ucETHEU7`F#co#q)@MpnKx$%6AO#Ce}hEb*0H2(r0@b_C2~YhQJ!z?cFy{t6LdWB|n8Y~q$cab> zzvOJn?m0`wShzMz50l}rO>l9Va4?jI5;J+Z;Y>gU6dzPyz|jxTL#nm`yPite^{mPY zM;H3$>g*G=Rtma@Wskk727fx0j)jK@!RRKCWa)$n`I(Z&Kv@PT3*=Qvw-sogR0?zD zSV=d%El~3&DK2j8E-ow|89AF+!w_|2T1C_mELhSfOl5j(QyD3HJ)>?^adOqoyU}@) zg?>T9$x6C|EK1u)%{-E_Hc#_^u{xKQdn`iO%l@nhQ)Tl|E6@eRY2oP9tw*Z6bPVkW{MOW&EqDA=?J9gTQe4_`HJzMljnK zR5u=iHCh1OosO#r*G*8Wv0lLvP63gU6mJ6xOb5i1PAAoqe}HHFKh}hS&mr>i@U2j4 zNjv7mbeNA{;P>cH!-yKjr*xe<3_q@n({*uSWzt(WP8J^`-8OdL`y+1B6fpO%ZZRxCfswmt_@KV(}^+ot0f*+I7Tr}W#_9|BR3 z9B~?-*53@jMz*X=i*hovK?f73^Gj`rP8rDhTd3m*Z`8d(t2^13fB)a0_d3i^uuT}5 zO$R0J61+DC&XE<)?JQBJzp^CEPM-k2t(5p*Suv_Yt9e)HDT)0GssKxCbx>>scMwn( zO@dEt&$Rh1ltS1q38o7i-R1YBL4a7X4A#1OY|=3JVUA1qX|`adb_fI%{8o_$_c;HY znq?W6!JhYLkXR$aU5r;1wf76QN(`7~s27ZU%O6pOG#y;&#S| zSjqY+=;9BBjflBAKSPOJ9Gf+izwrt-@iL6fc{o3LT6oKJ@wCT*vyWQA{0wQj{Feh{ zPHCt!Sq5HX3XjgTybT&Q-$HK;e9*;MFz^5|a7bSy6^ivi^!O&g@%@VC;(%?m#N^n3?QRp@tP@L)I`c%9sliyTRNKaZuGByvxtf?rxIt!9H zp7;uvYg564!?0v@G~;emU?j|~%7)B{g_W#gEKz5$t24s>16AqRkUO@8{hd{+hI?&h zb55~;SJk`J0&BK`A|Qxw;zR*QR|kGeLRkmD6?BOO^Q@9woIH0@Og&;q$Wd7!yP1za z+-Y{F*srgMH+OI~-+L9wZOD%^ui@f3iA=L^RMi*M-g+H&`YhPw7UM$visqLsu+yDe zoS2rPlhD3hbsro$F|ExGAO>2B4Kzz|)Y1h2)Y{L$ePUNR_@(1PU$_BU8?htKLj+b! zk2&ouur?%+VPK7Q92i$?X?e!X)u0~KUL5Hl*~~R(7B#pBHaffp+t>UKR9`m|8DV5U zgEET!LPhkF;$K6|p$k=;1Bi{S&i)APOhgUuqRZ?J-2C7HQ~>mN2TldWW`yTJGqsyC zIB0uKSm~R3_mvd!C6rI7;uokw+XR3}3@d&SBNNKqq3`e0bNjG0;Kxt@;d(ovufk!Y zD~#f}*hG?eNMwy@*k;=?Q)CS0m$$2g`jhEPp&s*5V{Dblcfq}fs{L-{;=z%!TUS$* zU}l#0waW;NVsC>R4NzpwVy_Dmopr;sdUr)(zA?huCf*lmNv%2hHSk;Y0s5L92-N>0 zJ0C;Lk9i0cq~9Z%4@(TT9-@Am?qA2gpP$@&NfZ93ZbKAbSA&83#en z0;7Bsa10tTPLshj1Tk{s%xOvkvF4GRh&cG|*mlW#7B|zjZeXoHS)bz5W7pxNJie9G z09dE7>_J%B_fJxx;Rf}ZOf5EZ2&Q98FnVJ~IC`VA;;X-4XR;QPUeEn@opU@HAHvvh zZ{#aI78{33Hj_eQowKk$Mcg~xi3G8*e@EXV`7LIQv|XR8$DUp#jSQ+?1c__xYB<8k zpc1?ZC$f+&36-UmHxu~VLe0?BnF<%e3@}|;p8{I6n*A+R->eH}&x09XCHl8IdtTx^ zb>p=ukl~tw{%tEqX}Pd8YyxX>R?-o{^FIFXe-Mt^QrD$HP4o)8A_F3O0frAXfcxdK zE1WoH7gA)bt`ehUYanz)`FPZa0a=_KP>_wy%RpQK%p5Ag5b`KP4pBj6khNgj2q~D~ zj7jso>~(Zi^yCtncy-4vGzo*!bYN{Sem(bns)z=WR5^1f%#f*g&b4x08FOl}d6kgyMCEwG1p&%P@uL=QfJ zBqA7%h}#!+o|_+pF8fs7Y-|GED)a`>`bKyXx688*9EH&&fawv~1F2-f7vQFfdF(`FLYwPd_<>?M9a$|y6_vpHI=jXzu}=ii5jpn2&N=W}-C4iS0P z>0|&zoQ1FX8&2)lI-@sb(8~Zm^?`>(j$rmV1@p7dF(wt1r5HKt#sYPtp5i~U(wn;v zbxs)vfU47-A;+ts+})9H09a~4Rs;_oTye&x6R4ot?G8D%i!^qXvnKu|mK@_;Gw#G~ zxVQ&T++tS@xqM8c6D%ZgYU3&7WHdV6a9oWe5Q<)r5sX&26OQOjuI%tk%BDa z!h-8kjPuovBk%-ZiobK^Xt0Ef#%b$dz5S}@PNCQm$8LY;-N1cwYQgBpzL44EE^)jS z%Kap=1$e9ZoVrGk8fTlIJ8=i%a}R{?eUUL+WY@OHu5FQB+d^Fn=e`bfV{&KCjIEyd z^=9f8wywB4FD{yga$kk|{gz&C}zsM=YnoT~CAz$?t<>?~LJ(&2-pb?$@ zT+Y*Wtx;s@7>n`o!#W&~F>tp~BXW{v(naQnDKoCUeYJ+pK!@TXL?)s_{@pl-d+J}P zJ}N-yu^hb*v?DWK95@Q6*Y)}RBua@3x?8bID?q}yb~=75a^fwb^@u2PM_m(zCnM^b zK%O@sm(>3ZL<~wdkGj_2iME|k+|10Z(4w_^b!v)YZA-k%-k|iFqeSy-PDPe=!O^Er zudhw|0DA981y{SVm9H*#}It3u^q(Mz%LB4 zO2T6~w7H;7DV~dh5G!;I(+-k)2Vw*eZgH~MZF99C3SiPYOM*m?g==y(nTR3j*&(=T zjql`O*2%%V!NHhTCT-Xu!!4~rErq2$q<6}sV+d3SL#S#&!OP){HVV+4C!@ zvFXTIK!DZ6iMjGcGQW@iM(bqZ-S)2X*E{x4FSnfC$RFdv!)YUodC z5h-mxl09K&hV_hO1F>y3p%{<<0qNjb$+PY^iI6lZKNZh)V<(AAVtA62?c^7L(D7)X zF+POAGYDwrrSz_9%(cD-9LC=Xc5E%7W&G$!6Z*!(v8x^1xWt#7tz}?#D%q+ZxiZrwPbF)1auc7{lG`Eq-yzLnP zCod`+!}%r|T1c0ahk-w7P}f5K5De+@GsIv(ZB_colyPftN3tSB2V z!4!1zZ@tsPgq$0PMp9q2W&46SHM5!;LLll($kT# zEs=&Pbv%N8YIs5FG`t|SSG*wgC%{8{Ib47f!#NYea&}&QN@CPY080oldC1Ck@UunJ z{%>*d4LQ|~$R-6sY+?eEdlHQeQa6yw0sjW+TVTz2_@Mr$G}LUU6%Fg4m}#m#U@Uk# zE%H^U(K;dit;L&Q@+saLFc`eD3v9Z>j-C491EKu=p|f8xIJit7%3Y0<)GP6HdM5mZ z@K3h=XTpD)j83oZjcmdpTnaX1_&p(hzZJj7#qTlkdsO@$5x;#WpC6r8jj5haxM0Je z$DIrhnOefk528jw&M>>nggpW@IkG;SL_m9vTfg$;VxhEGCc7Lw zASRD3XeOqfiBsnII%*FghdI;=)%0PQ@4MT}JE2P3f@4m4!DBxB5aaM+fw=)X#NaRE zxnnxP(99o?gmCsevZ*f=7l{3Cg}?dk89I)EPoeWyk2tU+G3VGHv7FtDn&b%rzZ2f- zHGK+GXzA%cX&5B>EL=cuyr3o+?pTrY_%xJ=EjSAR?Sk$uP_PE)6idX!?Jpgli!feV zqBE5?5}OrjLap_RY{kiQmADIGb4d;ic4uN!TP)5JvE5jV6R>csxFGpR7o-Iw8FX}V ze3H*iil2@~%Xp*>|s6H&(=dukY4V==)j#y@jSbI*<;(gzQN% z6$T)ac0M@T0x&+j4N1u+j;6#p!QeIQAWprySFRQ+Pz;~07SlWL&(w>-jQIFWoS|;Q ztXKFuctuC5BBs2C+L)&vnZ&qQ-X#|hvC&Cu|s(9cQuv^~00OthuBy-w>52Kqf;)SsLI|$y0 z+(m=)e4B%yPW;&>2MU}#hX}U8IDHc@69YipR>M-X4yaGuN;4*nzmD-r%-7AM-7AX# z$CZG?29Yk^b_rzS@p;&95mXYNcNV%nj{&Yy!sk!{7i`GPW8HVZL@|f4q2RZ6CUN_H z-0>15Vo`$qAC6;jnDfm(vb;{b#xG7LSU8JA!doJNhGfeieB(uGG2=TTBYCQ5ho&=s z1eu4mC9V*r*O&6rC#jKLtdIY641vCjKL877RQfW^dvKlBg=!L5`)B6R$ffh$7%SZ@ z&r!_stbS#Ak|zP5SQ&9>WUq+_Q5YRdzVkei-;2iWOJr&A;w8&-07t+WVlK*35i(i6?1oa=lVTek=4u6n7faGMp;0*%2zLN$OkU6dW355@#K1f{~@?aSPv@mD; zE%1bMY|fIYM3Zs;E1mbG^FAC}S1`)^DaM*`DGEzEM&EEJXRw)Z9y^#%k8m%{ z?`8YVk5lCfd+-=H(@zQgl$jqpjM?VLPU8ae;~_Y<*=bzD@7mjsh!fCeBm&q$Tu1FO z&oyx3v^_`EJQ+0$PGU8}m&x!H3g6DV#B>&uSD3(6Vb%zt(BX~td{ zPd9htA)jqzb;nN%u5eMdROtU>i}0k<`Pm5{T5H160Dv~ZN#4d?hdQ$ekVH)tV8=3uYM?CE3)D~U#el6i* zyWsfWhCwGl9tx1vx-5`TI4a=vzpaWR>tIws8UI#rZ}9~fy8KNWx#as~g7x zeX^UBiD4$|c?=mW@9XCRZfr&}LGkp!l#wRb%lG76VLca{k;Mx^H1b}7=)rns0~2JTNrQd&>QzhlK*VcVknx9RHiPTkRodz@7x zC{GGthjJTidJH-UE%!X1?ti^1L}?#D+enC*ibGI`9y=W@00-P}pMzSXu12g|A%;6I z`$QP&uwwRZlZlUt#D7zbd5x{ia=Fugw!QeDvo3;VuiJ9~sElV*`%j zp&bhupGHm()~E27cMb?dGvQC}3GhLRlH7J}ol;cqOu>l+4B228w=?o7tsKMaNAL%z zpb+zS;1G5v@s^X;odA871;?nMX$^`T*25QqI!Ps&Lsk!3?P|xk$asiBUZJKOYz1+4 zD^Up0cZdjB;%AUC4leR|hh>W_bdVRA-Twd$ zvI88~)^a3Dbt#@%;9>S99{%PERw>X!;kXAMKr-u7>!iBRvk!n+-i`?rOYBaqeUw;T z%=A>V_rk#*bC~p2$e!VOc{x$m`tDApFT#UFHWZ4Cex2k zq5M=nRip=#=`)c|&!*!Y{yNdNaTc2Ur_647PfzAMo9c`d(&G6v< z(iSQWTdSL40cG4MKx-FeJ-?$A)?;}a5vIuq8kkCxV~X`UITMLyUdL;&M-iD+$~ak1sSnOZ@f^XQr)9fRWb4fC9CXMi1v zW@n%cq|C!SpVkr*&$UzV#g08C;$29QMX)RAF?G^o9{MGS7=a7GYbK);TyO#S_$Gjr+!hrN0x`^BrLZjoBhAR^CAn_`sMLz0sPohio)aaYCX?5q0?^BCTq>V*`YTa_oPEqBsis<~SPvCs0G|@m% zstH>Z$^{pUGUEaHF1`6gri!KtWp!RNy5e6k@)Cx&1F? z6Pt+9W0{ti7_>}EGE%(q}qU5w|b=Hm9&+KEAWzP(wqb_NOx zz=te6`EnrAqnSI=DJ^%K)$VVJm8Gms#Z#$l$trf3t~{mbEG5VmIuHN48tB9!BglCy zo{8N}f{FPqb_Y-xTidYz^I?*ag{qKwdckEvjXgj<{;73MYj2WUn$Te!lJuok&6*ht zPs+q=zlu{)R$`)RD)fshakT-PneHC`n?sl!c>5cNqXF6`|Ftb`_illjkzW$;7YEQQ503lRZasewKmId< z6U50toD9SnTauZS{rcZ4?B82f(zRl-#+TxKIGFkI)z6`}+U!R3J&4nuCb-1TOM~c8 zfKCySNMb3xc{=s0YUm)((4HO#Qi)h{!49R$c45sq`2{qlVFJcD{vb8 zp11=$c#Z{Vj^U8}q&arh{Nx-{SY#=^Mvo7!;oBTXVV)0bt`t`3JbYs%+eXEU&gl)(0V;Vb}c=Rz?QHTXf%o(T_$>Q9mnDYTEcrU*CP_i(HSxKi{ zI8`lyjvTXZFd@7Nbud|lm4Nf?;Z9WgzaRI7{o@{x&j#??|EANpC&YMS9M=O$H13eE zpgEzzrNM3xqicW5PKxQ6xT4M*ouEQ-e48y)qvx3vm|W z#FKt=(%o40eR@>G=L_(`F&0dRW#ydoKJnc$tp|~Pkyp{!`1oDm#DnW=!2K>VuE%4u zs8CU}oat&-Fg>8xG*=@GFh0RS3*~4GARJ~Hvc0g{G8BJgw;WE-q{gxk3}sSW7RC7} zE(c%*D88HGA;5-hz^rzP?V;Gd$e%+soLYcdl^oS1Amx|RHeo=&-+$nsA>?TP?f~gl zM{3jDweSq%Ka&vw{*d(O+?1YD zey{YD@w=pFAzvyzOZfunDd6*@r;?XQ&ng}i9!5Ch1=5cVu)@!m{s!{UA1VDC z$nTbZT2lD&m#8=FIr8^NKdnjped%u^f0y*PlYh7LcapzJ`n$;g59#kF|I^aX$^V4( z_mICq`uoUVEBy-C5nmDS5sr1Y1Pf4%gVk^dp-Ur7FH=_m7jZb(0w)bXX#PgfxLeCe+yf2s7>lRqf^ z4dgG7{`KTPU-~zY-zWV~lYgZ2KSzGI^f!|KICPX)JH_EH?ffbR=K4^4y(SpE6ARNjM*+@aD&lOg)-*I zCegX2h*>UUK9Vt&h*>OSUXwAa5OckZX%R7k0U@$PM*g>qBu<3LfQ)=xMiNUxWWJ27 zrAQm^a*t}coK9FzURNjGI!~sA>Z$agc5Jvn$S0|4% z%8%fHshd=bWRQFvwxib?xOGhpnHIjC6sT<^))`6nABl|X4J?F-F#j8}%llAx>*Gl( z>u-TA{XV{){G^9^FOvjO`h3ELXiFj(7cCVqbOZ;?%Dai*`7XpkGMLQbr%-;M!ax2e;bSPFss=yU zyf5*Oy9=$XfF|k~y)h!c4Y3?i_>7c}uSeP6hA0qU#h8M&r=uqg^4kyvxbQIyQEew6 zGWR8h^L738<0J?PTag!sK4bY$kU#(|>(9V@VFPSmM=2%vB$I|^lQ{Y+K(N=$;@NdrA%Kpa_FVoBJ*H_3w7_c`r+m@ z8u$+z2FwX}LSz!%olikhQ+>Pnc$q~POJU@6-oFNZcK%@4v3kXsK33SaWg-xjKC zG1?NUJ{C%XE~^E197rmL!NIvOGC12dI2cO?2ew~@f0#5raKiY2(X9x(@DIQ*q{_3X z3nO69HfCkpuUcm!-bAu#I8kWjH@taGm>NW&UXfC z|Db`w*T66?CU*}E*xh*Wu*br%*~8VG$RN}tvHrgwt9mN7+nP}8!Cqv-1LBuna7%VA zK!%+@9bYpkFM)%nxx7d2qS-%kC*RKKs0MUSiU#{%e}2Jj_?}-6Wa&@B9=4SG2NfQa z0*k`^%*`i2EJ#*8kZP_8;AISRTJLNCi^o##!vV$jbAcj69e)GU{az|H-Gq~n?ZL zylzlZ64fVH0eZ>rs3~ya`4085W`_Ulkr}87!>Vxqpqd7fNO#YDKa_;Q%Ht15f2iYY z7AoR=mH+AoQu*C~|AAOm65v|LKmwZm|MpMskmd7iH(6WHUg_($-MzNkWV?NKemALy z@NbOmUSPXH+nr;(i*0wc?LKC^zqj2++ikbqF5CUkcKd8MW0!2tXS-8v_j=o1ZoBu} z?i05AobA47y9aFdUEBTIcHL0l(!Wu*dztOdv)u~YU1huVw)=D2ecE;#ZMVsGNi9nM zx^4F}+dXc(L-xq@QMP-Q?H1VXHMV=Z?cQ&@4YvCm+x@HUw%YDnw%cpFL+tT8-F7dq z-OFruj_oeA-CJ$K(q12HK}%a(qs5w1+HPBVo7>hlt=da_ZF~P` zX1-(-5{nhl`@78dJNch^ojG&n%zWQBJG}B`BGUMt~6)M@1-gd&}A!eyi8rsQK_T+lsz6qF-Lp za4kY_S+}vk>v`H(l(1bKNr;K#LyK|o&myk3#l>!$5XZ^7art-~8W+d$&2jNP6XJJF zi1W`t#kR*k6%`xjC)pHG1e6Z)!ul?Zume5UFsd3-yrTbR`93DmBn5>aY$38FcwqD#p_OL4L6iy^NB+WDbZD|vuskQ;vk7$?@Z zQnXwFjz`Td(wamMT1D9w^vnm&hQC~+l^QUf?MSghhF5rWGh!~3U@L4D62@e)$MXzu zAm53<+f_L?(o?C1bop{-IG_c~(Nvpev=$(i&-rGw>lUrDJ|0{wQPyxE#|3{g!$RCk zsdXz-eIm{!w?MAc-H&#;_w1!UNOX!aZfZgr%VVGA7P)1cXj!+@#llW(O9#qmu!5Ni zXfaZqkaiJbO_1k8ocqi=aSD3`+tUU**-|c{BYP6p;<;m1f5&RB6gpKx0_(MC)UWjM zE*u?i7wWPFG?Zg&HKVU)wBSMAM$zjgCEW>>y=7alT$$5~lDhU|9y;E?mW;MHxqq>= z@#D^I=yorKpVlDG$yD_RfUUF6C`Rx{~1+SVK)<|BpG$BFvBOPUbmQ3&`){!Oh z`XJXFUccCP-s)a3=1)sv{E78FSzarw&Z{6>qD72{O{{Hljo30}JG#FAivNsn$u8_~ zn_v}P{@6U_QQ=j?k9C*V+ZNR0J5&RDrQ2Mt;B2Ybu^Y38C1(6i-CtO`^ilR3zTfkm ze|!s4UrWsRow|G*dew|^&?WmO$d1*2Y`t&7xVeSxc$MKhmIra>`7XeBH@;I!i}Bq@ z-W_Be_Qvrx;$2q`=CFLu)SrDKeKO9^J{;;*Tz^0{sW^6BMHtv8%VY0V1gnalqvE9E z(^b6tVOc&`#VsnHr{d9vWIhg}i{MdloGXw)#q(8k;488`4xot8qT+K^yt`NCn^oMR z;`3Cz_yL*UrsBCOF5eP}PTVi^x2yai73Wji90pbVA2Lb#APUw$&wgB||F*Fu!6R2Q#$ zGNm1w^M#Y`xE71_#VUo+R;3VAqL3pi;i0@%@^dFYTkByh`pD0k6Vum;HPSs=x*BEp zxp!j85?Gh#8sEb>tO3u@hI-&QuakNx5q9NgJ{kB)%!{^KRD2c6^62m=>f^&%YY^u* zG(A=J2k(_ae|()@=*!RltS1hSp=`6L$NEUUTtIG*wUc_tI9o%utGB~)_%6nGR9;WV z`m+itj+nF>XwId4F=-HocT`>xxaZ?@YEU{htrGh4yR68nxC2 zZPZcLy0?ytuWR(XIlEf(`1OpEKy$zcW!D6pLin11OALI8$LruRsI++-N5@%f@CIyZ zvjBN(Y%UQ+yVxt(N|4X82{Kt8$c6gt1X(PHR%s1fhpKJ2Nc@;EQjlJ9YQ%m8A3icF&dJB!CQhmgV+#=za@Cfu3&az zB6b9J@7|qAWU&OT!45J~!G+7L8-sY?$EJYQ+JVaEf?!7wwFuh+EiElZV{)6vv(4i< zc|QOiy%w|qBYZx}W1mIs4Qvz}8r6QA-vPalzQLz?*EMX`8nH{$GjQLyL_*{mH%h?WF#*8Ne-Nu>z|zfb(-umAHVzUD`UxcG#`q-0}CYFhfVj7(G3In%RqX3WgZJ9k$8>^XDI z^X8v-{(=iGEV$?cA6$6xqQ#aag-eSrx%9GSA6ow5%Rlnbj}_Y*8tqzBbBkm17H6x= z?YZ9T^9QzWYir+r&8BOwtE-oQ>;Avj?Z0FDm#ipVS+?qm^3`jutf*YO z&bq#;x&~iMtNr-Z(*9HDzc1|nPTgvlhWJU7Mi>EBZ2PoBocT>D%7h@G*StED> z|5!Fo2(T<;92tw|j7!VQi=$-2Tu~>A@`hvsCI5o;iKi69ITQzZ27Iq2p#hnkFF{~d zUMl55w>*0qx^zYo-@;#rvqlv$KanT2T{ zuEVllNB-YIwRg!nS^0^Szalp>!;@2=4PEqdJFpS393L({tYoFIjAk z#OO(`PqNCfGNZp)+)hy%*JN0K&j{} z{7m>cx4rUYI#rr*|#U%OJhZuffk*H&(|mJDq0x z(_o8KnvFirMxSOE=0#@?=0v1#rlFsyqMvdsreQ2Fe=#S-{Pm)o(A6k(6>Cxh>^3Wv zW*y3;S^f-~g*h~g_WA?ufPJ z5PZcCUxAM*Uy15A{`__LEmhEvK0e93j(tI_Av`ykCawt=))QR~BFqoQyo=M&pY=4W z#)>|zqgjSEBu7%Mq3n0r>@y(fmW?sYE;M=a7N^i0|JP`aeLu}9dX(lE2FRrR%>#eS z681NH+sib175e6p{$xiR%ru_4c4DLtUq}ePpq+{ zbFyYL3gdu*E;CEbJ>5o6yWlUNkLc^cOe4*NoS8L1_}0wA=^kOL9L#^{lJiK0XIg!_ zb+UE&nyo|{NMDyH+V*zj-34NKj9D{N(N+f9nMO0KrjO{Wny%YL*m!*$jSWd$HE?`o9ZfItTN3Pg*o(FgcRwNvMyv##z{|n93OM zX=QW$=U~jUpqGiJmuBoq9Wh3e1`{H2YW%pIoGV%IMH6Mdl;%ObOXm7bsF#U)88m%q zhIe8;%V@n!)XSjEN76h$?EcP+7{xIV5* zYj*f>imcRW^ZCkno3Wo(I(#0Rzp+K_J|Zn4zQ${F`J6bqr4otixP{RoE-Do#yQFv) zw4u7JYH6W7Y4-Uzl&x_zZYgyKTz-6SlH;rccR-x1n#C!VZhOF~mD^l)r&fX|cTQV} zgKkcn$D`S+G+)5!$NrdXscb6_q@mQqT%+!tSz8JHiE!Qx9r8N-jz*ia8auGO zB}*TUuh48;wUg4#20r3dBM!C^eV2PxDo?w~wAFST3gb3-$F|Jtb$f~SD;@M&*BDkg zebrFI=ETnQtwM&owG|zyaJbNw?iAhCp+(=C#74unk?1P~~@CQT zw|h&#vnt>crh&P5$3K^IN^KtO+-o>r=-1l(RFt?8X4IepPJ1M7bl5d`o43YYiGgse zX!mQ>E&J;7xt&_6mFSU}IEEAV{cB;HfUkvRtOztUVW5Z>a9dKPvNrl{+-esF%jR@! zpEx`vE_=1d;gW9i68zVx`6rg4@ABs&Xv^w$@W|5+wv_ZDQfS?1bcC>)w>a&M&H!-rxeMiQ!>8b0@UC9Yhvc~*Hf^lJ{+iuG8`lexl|^wGSU zy#j@#SA3jfqH2)!i}9vf&M9#^-Ho_Qk4a_y)RE3+16M3_ZFP9vu2zh#JQC{LNI&PE zOqM}E7P_LPn9m=G9%A`ww&3|ll#%m^=!YVw4uUolC7!iw!!Oj>IkIEd;K_60{vr5C}e*h_FuG=9{7YTUY0k)N%?b@XAR zJ2@q0)XqKGHn4e{(8kKWBp34~?1vxavg^t!nNP>uz!*5}rR*g5JcWKBdMZtRRPa@r zjFrS!xNVrV4PJZ<2I-$uGo2ONh)-Thoo=66p~xe8EDqn@5fg;>U#S zYWOwLm1R|H%PRC0aqLOt&z;q4Ip%*sJ})JKXIh5171RQ<;2F-0!v=#U@F3pTs7L&E zxQRHRCCsyV)IAmPs()@LN z+PKc=@YFS8-3qw4klS15X!SVjVg%Gxi}4koQ9+)#9qIDwZ0y09usoUZDd6c7+$?8{ zxRae$!CovUHlKD{W%@KfuTsre>QAp+Kh~$yEYa;@S2=@0|2Ki(yVm?t(-HhQMWP|d z?@W5o1;S_fwLBP=N5>a!z^uLd}0d|^C!mNZuz%c z|J{~9QJ;zNiS7S?jTi5g=L{_h@pCUC1oeZLr`a$(4l_Xd`p@5YVLkzbM=U%o@poF} z^B125D_Y72=Un$p1Ky+jgq-R-hTg_j7zSgi~qqdp!Ic$@&CAtn*HVyMWx6n?Rg@ zGl=!M9dr@s%PQUjWc~JnxV;BKT<&oY>xXSMk^c&i^K)SowvTQz9!x~fP%upyqypwC z!x>WWU2bOT!vM13sXxtqmlZpM;-_>0^%Oa!3z*NKl4q`||LZO>EbkA7xCCBiX)hM+ z`d#h2<|zw4@H5Hu+%IwGz0o(BE50EpuovZ@x$o$GW|@7`-<^M#NyQ4kc8cXoRQbnH z{)N!-(7E)h&~WIQspa3$BWkS24QBn(>yDbK?&#*Dg(sK)!O%~me<50OgVYSai1Lrp zm{QjL(jFBG%N4FvSgi1Jh07FL6c#8nD>Ny@hNgHAd;L*~!wQcpj4C{)a7f`1g@X#8 zS9nRamTWnL>-g0)=LUxe84RjS5NO ziLWYs6%H$mDjZaJKw+=KE`_@M4i#@x*rL#?uvlS%LX*M-g>Mch|4|rG*sCzs#xdqT z?QGGjQje(wzt{O}hqtmt^pBJ4U;mgI=Wj^#JRz}I@9)U?dfm6l_~}Akk2vUdT?B?n z*LP6qZHkxsI`0&3RN;t{o2}%&UDWN?a6sCFpJ_SRRh-9y`|(y|!sX9~cW41Th0Oz* zo|606-vR&nvvOa14qhm7k!}WF4e~#O_ZeU!UYw#4)B)<}0vZ1bvY|zBFZz?fw--D;6ass2>6EL?Q@Af31ayj!2O`wrzIAd zWjf;p^YHlz(hGpw=i__{_#MD|&VwDmcL84pvCc!l`3qoQ@aF?>UWl;+&)9e|#tv=S zfu9DkZnpv(F{xH^I?!f;&6o!cgF3)7x|c|scK}_5_>>yy9^ifuj|=1OrLZB=JAhAv zhQLRFwj$XVJMbaJ?*sk~G>kI*g8d-qP4K zPYLP0z#oCQFUNpamccgQD}b9p>;wCOM?hSL@pZ*BE?*^eyBzop5bN*+@MBjQI$4+T4Nw7>se|u;YQfh7+d%c;gTS32JNQoE?VuL$=6d)r$jRxz zR~s;Iz>ffzHcI(Lzz9gJON<)E@u0-bO|T_+C-6-W_mS~>2kdwV^?_AeuzrEZZy3=I z5chYV6YHBx`g{TKMo<*v7zDln+Jy2afV(}Y1HKzrem!&q&v*lfZPf+bhekC9HO%Rtq1iU98)4PD@Y?bNR!0n*Dkh24LFX%A03w#p9I*$P7w_{!-{c<2a zq82*iH<{>B#qS3`wH;&hENljR1;llSfFJsVEPpxhaZowRJP%CXf$;*5-*BQ2fVliZ zV9^a2JESvy9mMu|0{EF5CEp929+Z4Gum;3+8Ry)DexR-y_!wv}_yfQhyI~*jxxl+Y z$G{H&k9VMd;2B@K6=Mkg2(b9Ga!p`dbDK=B0Nx8?ef9x=1>$yxfqOqE?aA2OiG9uI z;Ag;lL0rC@5ya(3fZeylXHjMVxNQ&CL-3uzvOCZ=cs{${0XiQx=X2|P-kf>HXBE%L z=fydlG38FlGxAwiPG{t^)66sSxnkxS`J6EGjC{72dBy{Ze-g;&TsfWbHO2EeRzCa5 z>5P2NlX*ryr^!4cpRr_~kBEGVd+e z+Y#;x_l6II4~K`s!{HNQV}EXcLI1M;^8VWXmj1T>j{dIx-u?sqhx>>6Q8|ja4KQ_^ zyG;+|K495b+*jUb?W^sp?`!Gv^tJT``#SnM`?~tN`+EBZ`VRC(`VRLE_6_w#`-b~Q z`cCvw*cdj2bHnCvLD&*r7A_8#hppk-aDBKX>P7!D|2)&}vYy`Sd zzp>v0{mjtN0v(H?r4@SCLsJiQ4MN*a=-UmA2cUBVS`R|+X#a5kNdF1ee+2Ui(9+$} z-P?V*d$_xxr?{uQ$J$fdQ{Ut1Y3m90bo6xgboF%i^!5z&9OxP9iS`WljP#u7p^!0T p3gw2(p@Pt|P;sa{WDV7Z>O(CdPpB;v40VPe_-r_9f%mBe{ufafQ{4an literal 0 HcmV?d00001 diff --git a/lib/native/windows/sysactivitynotifications.dll b/lib/native/windows/sysactivitynotifications.dll new file mode 100644 index 0000000000000000000000000000000000000000..3571b34b5d79156b34f42c77ee854f63cd4d0af7 GIT binary patch literal 49664 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.c b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.c new file mode 100644 index 000000000..00319a972 --- /dev/null +++ b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.c @@ -0,0 +1,86 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +#include "net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h" + +#include +#include +#include +#include + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: setDelegate + * Signature: (Lnet/java/sip/communicator/impl/sysactivity/SystemActivityNotifications/NotificationsDelegate;)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_setDelegate + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jobject m_delegate) +{ +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: allocAndInit + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_allocAndInit + (JNIEnv* jniEnv, jclass clazz) +{ + return -1; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_release + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: getLastInput + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_getLastInput + (JNIEnv* jniEnv, jclass clazz) +{ + static XScreenSaverInfo *mit_info = NULL; + static int has_extension = -1; + int event_base, error_base; + + if(GDK_DISPLAY()) + has_extension = XScreenSaverQueryExtension(GDK_DISPLAY(), &event_base, &error_base); + + if (has_extension != -1) + { + mit_info = XScreenSaverAllocInfo(); + + XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), mit_info); + + return (mit_info->idle); + } + else + return 0; +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: start + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_start + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: stop + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_stop + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ +} diff --git a/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.cpp b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.cpp new file mode 100644 index 000000000..a2017f532 --- /dev/null +++ b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.cpp @@ -0,0 +1,462 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +#include "net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h" + +/** + * \def WIN32_LEAN_AND_MEAN + * \brief Exclude not commonly used headers from win32 API. + * + * It excludes some unused stuff from windows headers and + * by the way code compiles faster. + */ +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include +#include +#include +#include + +// cache for the JavaVM* pointer +JavaVM *jvm; + +// cache for the a generic pointer +jobject delegateObject; + +// thread id +UINT uThreadId; + +// cache for the instance handle +HINSTANCE hInstance; + +void RegisterWindowClassW(); +LRESULT CALLBACK WndProcW(HWND, UINT, WPARAM, LPARAM); +HRESULT callback(UINT Msg, WPARAM wParam, LPARAM lParam); + +void notify(int notificationType); +void notifyNetwork(int family, + long luidIndex, + char* name, + long type, + bool connected); + +typedef void (WINAPI *NIpIfaceChange)(ADDRESS_FAMILY, + PIPINTERFACE_CHANGE_CALLBACK, + PVOID, + BOOLEAN, + HANDLE); +typedef NETIO_STATUS (*FnConvertInterfaceLuidToNameA)( + const NET_LUID *, + PSTR, + SIZE_T); +typedef NETIO_STATUS (*FnGetIpInterfaceEntry)( + PMIB_IPINTERFACE_ROW); + +OVERLAPPED overlap; + +/*static HHOOK hhookSysMsg; + +static LRESULT CALLBACK msghook(int nCode, WPARAM wParam, LPARAM lParam) +{ + if(nCode < 0) + { + CallNextHookEx(hhookSysMsg, nCode, wParam, lParam); + return 0; + } + + LPMSG msg = (LPMSG)lParam; + + if(msg->message == WM_SYSCOMMAND) + { + if(wParam == SC_SCREENSAVE) + { + notify(net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_START); + } + else if(wParam == SC_MONITORPOWER) + { + if(lParam == -1) + { + notify(net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_WAKE); + } + else if(lParam == 2) + { + notify(net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_SLEEP); + } + } + } + + return CallNextHookEx(hhookSysMsg, nCode, wParam, lParam); +} +*/ + +unsigned WINAPI CreateWndThreadW(LPVOID pThreadParam) +{ + hInstance = GetModuleHandle (NULL); + RegisterWindowClassW(); + + /* + hhookSysMsg = SetWindowsHookEx( + WH_MSGFILTER, + (HOOKPROC)msghook, + hInstance, + GetCurrentThreadId()); + if(hhookSysMsg == NULL) + { + fprintf(stderr, "Failed to create hoook %i\n", GetLastError() ); + fflush(stderr); + } + */ + + HWND hWnd = CreateWindowW( L"Jitsi Window Hook", NULL, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, hInstance, NULL); + if( hWnd == NULL) + { + fprintf(stderr, "Failed to create window\n" ); + fflush(stderr); + + return( 0 ); + + }else + { + MSG Msg; + + while(GetMessageW(&Msg, hWnd, 0, 0)) { + + TranslateMessage(&Msg); + + DispatchMessageW(&Msg); + } + + return Msg.wParam; + } +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: setDelegate + * Signature: (Lnet/java/sip/communicator/impl/sysactivity/SystemActivityNotifications/NotificationsDelegate;)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_setDelegate + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jobject m_delegate) +{ + if (delegateObject) + { + if (!jniEnv) + jvm->AttachCurrentThread((void **)&jniEnv, NULL); + jniEnv->DeleteGlobalRef(delegateObject); + delegateObject = NULL; + jvm = NULL; + } + + if (m_delegate) + { + m_delegate = jniEnv->NewGlobalRef(m_delegate); + if (m_delegate) + { + jniEnv->GetJavaVM(&(jvm)); + delegateObject = m_delegate; + } + } +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: allocAndInit + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_allocAndInit + (JNIEnv* jniEnv, jclass clazz) +{ + HANDLE hThread; + + hThread = (HANDLE)_beginthreadex(NULL, 0, &CreateWndThreadW, NULL, 0, &uThreadId); + + if(!hThread) + { + //throwException( env, "_beginthreadex", "initialisation failed" ); + } + + return (jlong)hThread; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_release + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ + if (!jniEnv) + jvm->AttachCurrentThread((void **)&jniEnv, NULL); + jniEnv->DeleteGlobalRef(delegateObject); + delegateObject = NULL; + jvm = NULL; +} + +static void InterfaceChangeCallback( + PVOID CallerContext, + PMIB_IPINTERFACE_ROW Row, + MIB_NOTIFICATION_TYPE NotificationType) +{ + if(Row) + { + FnGetIpInterfaceEntry getIpIfaceEntry; + getIpIfaceEntry = (FnGetIpInterfaceEntry)GetProcAddress( + GetModuleHandle(TEXT("Iphlpapi.dll")), + "GetIpInterfaceEntry"); + + if(getIpIfaceEntry && getIpIfaceEntry(Row) == NO_ERROR) + { + FnConvertInterfaceLuidToNameA convertName; + convertName = (FnConvertInterfaceLuidToNameA)GetProcAddress( + GetModuleHandle(TEXT("Iphlpapi.dll")), + "ConvertInterfaceLuidToNameA"); + + char interfaceName[MAX_PATH]; + if (convertName && + convertName(&(Row->InterfaceLuid), + interfaceName, + sizeof(interfaceName)) + == NO_ERROR) + { + //fprintf( stderr, "Interface LUID Name : %s\n", interfaceName); + } + + notifyNetwork( + Row->Family, + Row->InterfaceLuid.Info.NetLuidIndex, + interfaceName, + Row->InterfaceLuid.Info.IfType, + Row->Connected); + } + } +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: getLastInput + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_getLastInput + (JNIEnv* jniEnv, jclass clazz) +{ + DWORD result = 0; + + LASTINPUTINFO lii; + memset(&lii, 0, sizeof(lii)); + lii.cbSize = sizeof(LASTINPUTINFO); + if (GetLastInputInfo(&lii)) + { + return GetTickCount() - lii.dwTime; + } + + return -1; +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: start + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_start + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ + OSVERSIONINFOEX osVersionInfoEx; + memset( &osVersionInfoEx, 0, sizeof(OSVERSIONINFOEX) ); + osVersionInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + GetVersionEx((OSVERSIONINFO*) &osVersionInfoEx ); + + if( osVersionInfoEx.dwMajorVersion == 5) + { + // XP + while(true) + { + HANDLE hand = NULL; + DWORD ret, bytes; + + hand = NULL; + ZeroMemory(&overlap, sizeof(overlap)); + overlap.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + ret = NotifyAddrChange(&hand, &overlap); + + if(ret != ERROR_IO_PENDING ) + { + //fprintf(stderr, "NotifyAddrChange returned %d, + // expected ERROR_IO_PENDING \n", ret);fflush(stderr); + + // break in case of error. + break; + } + + BOOL success = GetOverlappedResult(hand, &overlap, &bytes, TRUE); + + if(!success) + break; + + notify(net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_NETWORK_CHANGE); + } + } + else if( osVersionInfoEx.dwMajorVersion > 5) + { + // Vista, 7, .... + NIpIfaceChange nIpIfaceChange; + nIpIfaceChange = (NIpIfaceChange)GetProcAddress( + GetModuleHandle(TEXT("Iphlpapi.dll")), + "NotifyIpInterfaceChange"); + + if(nIpIfaceChange) + { + ADDRESS_FAMILY family = AF_UNSPEC; + HANDLE hNotification; + + nIpIfaceChange( + family, + (PIPINTERFACE_CHANGE_CALLBACK)InterfaceChangeCallback, + NULL, + FALSE, + &hNotification); + } + } +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: stop + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_stop + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ + CancelIPChangeNotify(&overlap); +} + +void RegisterWindowClassW() +{ + WNDCLASSEXW wcex; + + wcex.cbSize = sizeof(WNDCLASSEXW); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProcW; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = 0; + wcex.hCursor = 0; + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wcex.lpszMenuName = 0; + wcex.lpszClassName = L"Jitsi Window Hook"; + wcex.hIconSm = 0; + + RegisterClassExW(&wcex); +} + +LRESULT CALLBACK WndProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + long res = callback( Msg, wParam, lParam ); + + if ( res != -1 ) + { + return( res ); + } + + return DefWindowProcW(hWnd, Msg, wParam, lParam); +} + +HRESULT callback(UINT Msg, WPARAM wParam, LPARAM lParam) +{ + JNIEnv *env; + + if ( jvm->AttachCurrentThread((void **)&env, NULL )) + { + fprintf( stderr, "failed to attach current thread to JVM\n" );fflush(stderr); + + return( -1 ); + } + + jlong result = -1; + + if (Msg == WM_POWERBROADCAST) + { + if (wParam == PBT_APMSUSPEND) + { + notify(net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SLEEP); + return TRUE; + } + else if (wParam == PBT_APMRESUMESUSPEND) + { + notify(net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_WAKE); + return TRUE; + } + } + + jvm->DetachCurrentThread(); + + return((HRESULT)result ); +} + +void notify(int notificationType) +{ + JNIEnv *jniEnv; + jclass delegateClass = NULL; + + if (!delegateObject) + return; + + if (0 != jvm->AttachCurrentThreadAsDaemon( (void **)&jniEnv, NULL)) + return; + + delegateClass = jniEnv->GetObjectClass(delegateObject); + if(delegateClass) + { + jmethodID methodid = NULL; + + methodid = jniEnv->GetMethodID(delegateClass,"notify", "(I)V"); + if(methodid) + { + jniEnv->CallVoidMethod(delegateObject, methodid, notificationType); + } + } + jniEnv->ExceptionClear(); +} + +void notifyNetwork(int family, + long luidIndex, + char* name, + long type, + bool connected) +{ + JNIEnv *jniEnv; + jclass delegateClass = NULL; + + if (!delegateObject) + return; + + if (0 != jvm->AttachCurrentThreadAsDaemon( (void **)&jniEnv, NULL)) + return; + + delegateClass = jniEnv->GetObjectClass(delegateObject); + if(delegateClass) + { + jmethodID methodid = NULL; + + methodid = jniEnv->GetMethodID(delegateClass, + "notifyNetworkChange", + "(IJLjava/lang/String;JZ)V"); + + if(methodid) + { + jniEnv->CallVoidMethod(delegateObject, methodid, + family, + luidIndex, + name ? jniEnv->NewStringUTF(name) : NULL, + type, + connected); + } + } + jniEnv->ExceptionClear(); +} + diff --git a/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h new file mode 100644 index 000000000..8b586b859 --- /dev/null +++ b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h @@ -0,0 +1,83 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications */ + +#ifndef _Included_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications +#define _Included_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications +#ifdef __cplusplus +extern "C" { +#endif +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SLEEP +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SLEEP 0L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_WAKE +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_WAKE 1L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_SLEEP +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_SLEEP 2L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_WAKE +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_WAKE 3L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_START +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_START 4L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_WILL_STOP +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_WILL_STOP 5L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_STOP +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_STOP 6L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREEN_LOCKED +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREEN_LOCKED 7L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREEN_UNLOCKED +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREEN_UNLOCKED 8L +#undef net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_NETWORK_CHANGE +#define net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_NETWORK_CHANGE 9L + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: allocAndInit + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_allocAndInit + (JNIEnv *, jclass); + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: release + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_release + (JNIEnv *, jclass, jlong); + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: setDelegate + * Signature: (JLnet/java/sip/communicator/impl/sysactivity/SystemActivityNotifications/NotificationsDelegate;)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_setDelegate + (JNIEnv *, jclass, jlong, jobject); + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: start + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_start + (JNIEnv *, jclass, jlong); + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: stop + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_stop + (JNIEnv *, jclass, jlong); + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: getLastInput + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_getLastInput + (JNIEnv *, jclass); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.m b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.m new file mode 100644 index 000000000..20ee383f3 --- /dev/null +++ b/src/native/sysactivity/net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.m @@ -0,0 +1,394 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +#include "net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications.h" + +#import +#import +#import +#import +#import +#import + +@interface AISleepNotification: NSObject +{ +@private + jobject delegateObject; + JavaVM *vm; +} + +-(void)dealloc; +-(id)init; +-(void)clean; +-(void)start; +-(void)stop; + +-(void) receiveSleepNote: (NSNotification *) notification; +-(void) receiveWakeNote: (NSNotification *) notification; +-(void) receiveDisplaySleepNote: (NSNotification *) notification; +-(void) receiveDisplayWakeNote: (NSNotification *) notification; +-(void) screenIsLocked: (NSNotification *) notification; +-(void) screenIsUnlocked: (NSNotification *) notification; +-(void) screensaverStart: (NSNotification *) notification; +-(void) screensaverWillStop: (NSNotification *) notification; +-(void) screensaverStop: (NSNotification *) notification; +-(void) netChange: (NSNotification *) notification; + +-(void) setDelegate:(jobject)delegate inJNIEnv:(JNIEnv *)jniEnv; + +-(void) notify: (int) notificationType; + + +@end + + +@implementation AISleepNotification +CFRunLoopRef loopRef; +/** Our run loop source for notification used + for network notifications. */ +static CFRunLoopSourceRef rlSrc; + +-(void) notify: (int) notificationType +{ + jobject delegate; + JNIEnv *jniEnv; + jclass delegateClass = NULL; + + delegate = self->delegateObject; + if (!delegate) + return; + + vm = self->vm; + if (0 != (*vm)->AttachCurrentThreadAsDaemon(vm, (void **)&jniEnv, NULL)) + return; + + delegateClass = (*jniEnv)->GetObjectClass(jniEnv, delegate); + if(delegateClass) + { + jmethodID methodid = NULL; + + methodid = (*jniEnv)->GetMethodID(jniEnv, delegateClass,"notify", "(I)V"); + if(methodid) + { + (*jniEnv)->CallVoidMethod(jniEnv, delegate, methodid, notificationType); + } + } + (*jniEnv)->ExceptionClear(jniEnv); +} + +- (void)receiveSleepNote: (NSNotification *) note +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SLEEP]; +} + +- (void)receiveWakeNote: (NSNotification *) note +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_WAKE]; +} + +-(void) receiveDisplaySleepNote: (NSNotification *) note +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_SLEEP]; +} + +-(void) receiveDisplayWakeNote: (NSNotification *) note +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_DISPLAY_WAKE]; +} + +-(void)screenIsLocked: (NSNotification *) notification +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREEN_LOCKED]; +} +- (void) screenIsUnlocked: (NSNotification *) notification +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREEN_UNLOCKED]; +} + +-(void) screensaverStart: (NSNotification *) notification +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_START]; +} + +-(void) screensaverWillStop: (NSNotification *) notification +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_WILL_STOP]; +} + +-(void) screensaverStop: (NSNotification *) notification +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_SCREENSAVER_STOP]; +} + +-(void) netChange: (NSNotification *) notification +{ + [self notify:net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_NOTIFY_NETWORK_CHANGE]; +} + +void scCallback(SCDynamicStoreRef store, CFArrayRef changedKeys, void *info) +{ + NSAutoreleasePool* localPool = [NSAutoreleasePool new]; + + [[NSNotificationCenter defaultCenter] postNotificationName + :@"NetworkConfigurationDidChangeNotification" object:(id)info]; + + [localPool drain]; +} + +- (void)setDelegate:(jobject) delegate inJNIEnv:(JNIEnv *)jniEnv +{ + if (self->delegateObject) + { + if (!jniEnv) + (*(self->vm))->AttachCurrentThread(self->vm, (void **)&jniEnv, NULL); + (*jniEnv)->DeleteGlobalRef(jniEnv, self->delegateObject); + self->delegateObject = NULL; + self->vm = NULL; + } + if (delegate) + { + delegate = (*jniEnv)->NewGlobalRef(jniEnv, delegate); + if (delegate) + { + (*jniEnv)->GetJavaVM(jniEnv, &(self->vm)); + self->delegateObject = delegate; + + // These notifications are filed on NSWorkspace's notification center, + // not the default notification center. You will not receive + // sleep/wake notifications if you file with the default + // notification center. + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveSleepNote:) + name: @"NSWorkspaceWillSleepNotification" object: NULL]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveWakeNote:) + name: @"NSWorkspaceDidWakeNotification" object: NULL]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveDisplayWakeNote:) + name: @"NSWorkspaceScreensDidWakeNotification" object: NULL]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveDisplaySleepNote:) + name: @"NSWorkspaceScreensDidSleepNotification" object: NULL]; + + NSDistributedNotificationCenter * center = + [NSDistributedNotificationCenter defaultCenter]; + + [center addObserver:self + selector: @selector(screenIsLocked:) + name:@"com.apple.screenIsLocked" object:NULL]; + + [center addObserver:self + selector: @selector(screenIsUnlocked:) + name:@"com.apple.screenIsUnlocked" object:NULL]; + + [center addObserver:self + selector: @selector(screensaverStart:) + name:@"com.apple.screensaver.didstart" object:NULL]; + + [center addObserver:self + selector: @selector(screensaverWillStop:) + name:@"com.apple.screensaver.willstop" object:NULL]; + + [center addObserver:self + selector: @selector(screensaverStop:) + name:@"com.apple.screensaver.didstop" object:NULL]; + + + [[NSNotificationCenter defaultCenter] addObserver:self + selector: @selector(netChange:) + name:@"NetworkConfigurationDidChangeNotification" object:NULL]; + + + SCDynamicStoreRef dynStore; + + SCDynamicStoreContext context = {0, NULL, NULL, NULL, NULL}; + + dynStore = SCDynamicStoreCreate(kCFAllocatorDefault, + CFBundleGetIdentifier(CFBundleGetMainBundle()), + scCallback, + &context); + + const CFStringRef keys[1] = { + CFSTR("State:/Network/Interface/.*/Link") + }; + CFArrayRef watchedKeys = CFArrayCreate(kCFAllocatorDefault, + (const void **)keys, + 1, + &kCFTypeArrayCallBacks); + if (!SCDynamicStoreSetNotificationKeys(dynStore, + NULL, + watchedKeys)) + { + CFRelease(watchedKeys); + fprintf(stderr, "SCDynamicStoreSetNotificationKeys() failed: %s", SCErrorString(SCError())); + CFRelease(dynStore); + dynStore = NULL; + + return; + } + CFRelease(watchedKeys); + + + rlSrc = SCDynamicStoreCreateRunLoopSource(kCFAllocatorDefault, dynStore, 0); + CFRunLoopAddSource(CFRunLoopGetCurrent(), rlSrc, kCFRunLoopDefaultMode); + CFRelease(rlSrc); + } + } +} + +- (id)init +{ + if ((self = [super init])) + { + self->delegateObject = NULL; + self->vm = NULL; + } + return self; +} + +- (void)dealloc +{ + [self setDelegate:NULL inJNIEnv:NULL]; + [super dealloc]; +} + +- (void)clean +{ + [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver: self]; + + NSDistributedNotificationCenter * center = + [NSDistributedNotificationCenter defaultCenter]; + + [center removeObserver:self]; + + [self setDelegate:NULL inJNIEnv:NULL]; +} + +- (void)start +{ + loopRef = CFRunLoopGetCurrent(); + CFRunLoopRun(); +} + +- (void)stop +{ + if(loopRef) + CFRunLoopStop(loopRef); +} +@end + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: setDelegate + * Signature: (Lnet/java/sip/communicator/impl/sysactivity/SystemActivityNotifications/NotificationsDelegate;)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_setDelegate + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jobject m_delegate) +{ + AISleepNotification *oDelegate; + + if (m_delegate) + { + oDelegate = (AISleepNotification *) ptr; + [oDelegate setDelegate:m_delegate inJNIEnv:jniEnv]; + } + else + oDelegate = nil; +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: allocAndInit + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_allocAndInit + (JNIEnv* jniEnv, jclass clazz) +{ + AISleepNotification *oDelegate; + NSAutoreleasePool *autoreleasePool; + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + oDelegate = [[AISleepNotification alloc] init]; + + [autoreleasePool release]; + + return (jlong)oDelegate; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_release + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ + AISleepNotification *oDelegate; + NSAutoreleasePool *autoreleasePool; + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + oDelegate = (AISleepNotification *) ptr; + [oDelegate clean]; + + [oDelegate release]; + + [autoreleasePool release]; +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: start + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_start + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ + AISleepNotification *oDelegate; + oDelegate = (AISleepNotification *) ptr; + [oDelegate start]; +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: stop + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_stop + (JNIEnv* jniEnv, jclass clazz, jlong ptr) +{ + AISleepNotification *oDelegate; + oDelegate = (AISleepNotification *) ptr; + [oDelegate stop]; +} + +/* + * Class: net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications + * Method: getLastInput + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_sysactivity_SystemActivityNotifications_getLastInput + (JNIEnv* jniEnv, jclass clazz) +{ + int64_t idlesecs = -1; + io_iterator_t iter = 0; + if (IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IOHIDSystem"), &iter) == KERN_SUCCESS) { + io_registry_entry_t entry = IOIteratorNext(iter); + if (entry) { + CFMutableDictionaryRef dict = NULL; + if (IORegistryEntryCreateCFProperties(entry, &dict, kCFAllocatorDefault, 0) == KERN_SUCCESS) { + CFNumberRef obj = CFDictionaryGetValue(dict, CFSTR("HIDIdleTime")); + if (obj) { + int64_t nanoseconds = 0; + if (CFNumberGetValue(obj, kCFNumberSInt64Type, &nanoseconds)) { + idlesecs = nanoseconds / 1000000; + } + } + CFRelease(dict); + } + IOObjectRelease(entry); + } + IOObjectRelease(iter); + } + return idlesecs; +} diff --git a/src/net/java/sip/communicator/impl/netaddr/NetaddrActivator.java b/src/net/java/sip/communicator/impl/netaddr/NetaddrActivator.java index e70881fe6..d645ef81b 100644 --- a/src/net/java/sip/communicator/impl/netaddr/NetaddrActivator.java +++ b/src/net/java/sip/communicator/impl/netaddr/NetaddrActivator.java @@ -147,4 +147,15 @@ public void stop(BundleContext bundleContext) if (logger.isInfoEnabled()) logger.info("Network Address Manager Service ...[STOPPED]"); } + + /** + * Returns a reference to the bundle context that we were started with. + * + * @return a reference to the BundleContext instance that we were started + * with. + */ + static BundleContext getBundleContext() + { + return bundleContext; + } } diff --git a/src/net/java/sip/communicator/impl/netaddr/NetworkConfigurationWatcher.java b/src/net/java/sip/communicator/impl/netaddr/NetworkConfigurationWatcher.java index bff54db20..ab0a188f5 100644 --- a/src/net/java/sip/communicator/impl/netaddr/NetworkConfigurationWatcher.java +++ b/src/net/java/sip/communicator/impl/netaddr/NetworkConfigurationWatcher.java @@ -9,8 +9,12 @@ import java.lang.reflect.*; import java.net.*; import java.util.*; + import net.java.sip.communicator.service.netaddr.event.*; +import net.java.sip.communicator.service.sysactivity.*; +import net.java.sip.communicator.service.sysactivity.event.*; import net.java.sip.communicator.util.*; +import org.osgi.framework.*; /** * Periodically checks the current network interfaces to track changes @@ -19,7 +23,8 @@ * @author Damian Minkov */ public class NetworkConfigurationWatcher - implements Runnable + implements SystemActivityChangeListener, + ServiceListener { /** * Our class logger. @@ -27,11 +32,6 @@ public class NetworkConfigurationWatcher private static Logger logger = Logger.getLogger(NetworkConfigurationWatcher.class); - /** - * Interval between check of network configuration. - */ - private static final int CHECK_INTERVAL = 3000; // 3 sec. - /** * Listers for network configuration changes. */ @@ -39,9 +39,24 @@ public class NetworkConfigurationWatcher new ArrayList(); /** - * Whether current thread is running. + * The current active interfaces. + */ + private List activeInterfaces + = new ArrayList(); + + /** + * Service we use to listen for network changes. */ - private boolean isRunning = false; + private SystemActivityNotificationsService + systemActivityNotificationsService = null; + + /** + * Inits configuration watcher. + */ + NetworkConfigurationWatcher() + { + checkNetworkInterfaces(false); + } /** * Adds new NetworkConfigurationChangeListener which will @@ -56,15 +71,14 @@ void addNetworkConfigurationChangeListener( listeners.add(listener); } - if(!isRunning) - { - isRunning = true; - Thread th = new Thread(this); - // set to max priority to prevent detecting sleep if the cpu is - // overloaded - th.setPriority(Thread.MAX_PRIORITY); - th.start(); - } + NetaddrActivator.getBundleContext().addServiceListener(this); + + this.systemActivityNotificationsService + = ServiceUtils.getService( + NetaddrActivator.getBundleContext(), + SystemActivityNotificationsService.class); + this.systemActivityNotificationsService + .addSystemActivityChangeListener(this); } /** @@ -81,147 +95,44 @@ void removeNetworkConfigurationChangeListener( } /** - * Main loop of this thread. + * When new protocol provider is registered we add needed listeners. + * + * @param serviceEvent ServiceEvent */ - public void run() + public void serviceChanged(ServiceEvent serviceEvent) { - long last = 0; - boolean isAfterStandby = false; - - List activeInterfaces = - new ArrayList(); + ServiceReference serviceRef = serviceEvent.getServiceReference(); - while(isRunning) + // if the event is caused by a bundle being stopped, we don't want to + // know we are shutting down + if (serviceRef.getBundle().getState() == Bundle.STOPPING) { - long curr = System.currentTimeMillis(); - - // if time spent between checks is more than 4 times - // longer than the check interval we consider it as a - // new check after standby - if(!isAfterStandby && last != 0) - isAfterStandby = (last + 4*CHECK_INTERVAL - curr) < 0; - - if(isAfterStandby) - { - // oo standby lets fire down to all interfaces - // so they can reconnect - Iterator iter = activeInterfaces.iterator(); - while (iter.hasNext()) - { - NetworkInterface niface = iter.next(); - fireChangeEvent(new ChangeEvent(niface, - ChangeEvent.IFACE_DOWN, isAfterStandby)); - } - activeInterfaces.clear(); - - // we have fired events for standby, make it to false now - // so we can calculate it again next time - isAfterStandby = false; - - last = curr; - - // give time to interfaces - synchronized(this) - { - try{ - wait(CHECK_INTERVAL); - } - catch (Exception e){} - } - - continue; - } - - try - { - Enumeration e = - NetworkInterface.getNetworkInterfaces(); - - boolean networkIsUP = activeInterfaces.size() > 0; - - List currentActiveInterfaces = - new ArrayList(); - - while (e.hasMoreElements()) - { - NetworkInterface networkInterface = e.nextElement(); - - if(isInterfaceLoopback(networkInterface)) - continue; - - // if interface is up and has some valid(non-local) address - if(isInterfaceUp(networkInterface) - && hasValidAddress(networkInterface)) - { - currentActiveInterfaces.add(networkInterface); - } - } - - List inactiveActiveInterfaces = - new ArrayList(activeInterfaces); - inactiveActiveInterfaces.removeAll(currentActiveInterfaces); - - // fire that interface has gone down - for (int i = 0; i < inactiveActiveInterfaces.size(); i++) - { - NetworkInterface iface = inactiveActiveInterfaces.get(i); - - if(!containsInterfaceWithName( - currentActiveInterfaces, iface.getName())) - { - fireChangeEvent(new ChangeEvent(iface, - ChangeEvent.IFACE_DOWN, isAfterStandby)); - - activeInterfaces.remove(iface); - } - } - - // now we leave with only with the new and up interfaces - // in currentActiveInterfaces list - currentActiveInterfaces.removeAll(activeInterfaces); - - // calm for a while, we sometimes receive those events and - // configuration has not yet finished (dns can be the old one) - if(currentActiveInterfaces.size() != 0) - { - synchronized(this) - { - try{ - wait(1000); - }catch(InterruptedException ex){} - } - } - - // fire that interface has gone up - for (int i = 0; i < currentActiveInterfaces.size(); i++) - { - NetworkInterface iface = currentActiveInterfaces.get(i); + return; + } - fireChangeEvent(new ChangeEvent(iface, - ChangeEvent.IFACE_UP, isAfterStandby)); - activeInterfaces.add(iface); - } + Object sService = NetaddrActivator.getBundleContext() + .getService(serviceRef); - // fire that network has gone up - if(!networkIsUP && activeInterfaces.size() > 0) - { - isAfterStandby = false; - } - - // save the last time that we checked - last = System.currentTimeMillis(); - } catch (SocketException e) + if(sService instanceof SystemActivityNotificationsService) + { + switch (serviceEvent.getType()) { - logger.error("Error checking network interfaces", e); + case ServiceEvent.REGISTERED: + if(this.systemActivityNotificationsService != null) + break; + + this.systemActivityNotificationsService = + (SystemActivityNotificationsService)sService; + systemActivityNotificationsService + .addSystemActivityChangeListener(this); + break; + case ServiceEvent.UNREGISTERING: + ((SystemActivityNotificationsService)sService) + .addSystemActivityChangeListener(this); + break; } - synchronized(this) - { - try{ - wait(CHECK_INTERVAL); - } - catch (Exception e){} - } + return; } } @@ -251,15 +162,10 @@ private void fireChangeEvent(ChangeEvent evt) /** - * Stop current running thread. + * Stop. */ void stop() { - synchronized(this) - { - isRunning = false; - notifyAll(); - } } /** @@ -361,4 +267,90 @@ public static boolean isInterfaceUp(NetworkInterface iface) return true; } + + public void activityChanged(SystemActivityEvent event) + { + if(event.getEventID() == SystemActivityEvent.EVENT_SLEEP) + { + // oo standby lets fire down to all interfaces + // so they can reconnect + Iterator iter = activeInterfaces.iterator(); + while (iter.hasNext()) + { + NetworkInterface niface = iter.next(); + fireChangeEvent(new ChangeEvent(niface, + ChangeEvent.IFACE_DOWN, true)); + } + activeInterfaces.clear(); + } + else if(event.getEventID() == SystemActivityEvent.EVENT_NETWORK_CHANGE) + { + checkNetworkInterfaces(true); + } + } + + private void checkNetworkInterfaces(boolean fireEvents) + { + try + { + Enumeration e = + NetworkInterface.getNetworkInterfaces(); + + List currentActiveInterfaces = + new ArrayList(); + + while (e.hasMoreElements()) + { + NetworkInterface networkInterface = e.nextElement(); + + if(isInterfaceLoopback(networkInterface)) + continue; + + // if interface is up and has some valid(non-local) address + if(isInterfaceUp(networkInterface) + && hasValidAddress(networkInterface)) + { + currentActiveInterfaces.add(networkInterface); + } + } + + List inactiveActiveInterfaces = + new ArrayList(activeInterfaces); + inactiveActiveInterfaces.removeAll(currentActiveInterfaces); + + // fire that interface has gone down + for (int i = 0; i < inactiveActiveInterfaces.size(); i++) + { + NetworkInterface iface = inactiveActiveInterfaces.get(i); + + if(!containsInterfaceWithName( + currentActiveInterfaces, iface.getName())) + { + if(fireEvents) + fireChangeEvent(new ChangeEvent(iface, + ChangeEvent.IFACE_DOWN, false)); + + activeInterfaces.remove(iface); + } + } + + // now we leave with only with the new and up interfaces + // in currentActiveInterfaces list + currentActiveInterfaces.removeAll(activeInterfaces); + + // fire that interface has gone up + for (int i = 0; i < currentActiveInterfaces.size(); i++) + { + NetworkInterface iface = currentActiveInterfaces.get(i); + + if(fireEvents) + fireChangeEvent(new ChangeEvent(iface, + ChangeEvent.IFACE_UP, false)); + activeInterfaces.add(iface); + } + } catch (SocketException e) + { + logger.error("Error checking network interfaces", e); + } + } } diff --git a/src/net/java/sip/communicator/impl/netaddr/netaddr.manifest.mf b/src/net/java/sip/communicator/impl/netaddr/netaddr.manifest.mf index 6a83aae72..248827827 100644 --- a/src/net/java/sip/communicator/impl/netaddr/netaddr.manifest.mf +++ b/src/net/java/sip/communicator/impl/netaddr/netaddr.manifest.mf @@ -7,6 +7,8 @@ System-Bundle: yes Import-Package: net.java.sip.communicator.service.configuration, net.java.sip.communicator.service.packetlogging, net.java.sip.communicator.util, + net.java.sip.communicator.service.sysactivity, + net.java.sip.communicator.service.sysactivity.event, org.osgi.framework, org.ice4j.stack, org.xml.sax, diff --git a/src/net/java/sip/communicator/impl/sysactivity/NetworkManagerListenerImpl.java b/src/net/java/sip/communicator/impl/sysactivity/NetworkManagerListenerImpl.java new file mode 100644 index 000000000..d13b3271c --- /dev/null +++ b/src/net/java/sip/communicator/impl/sysactivity/NetworkManagerListenerImpl.java @@ -0,0 +1,153 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.sysactivity; + +import net.java.sip.communicator.service.sysactivity.event.*; +import net.java.sip.communicator.util.*; +import org.freedesktop.*; +import org.freedesktop.dbus.*; +import org.freedesktop.dbus.exceptions.*; + +/** + * Responsible for subscribe and dispatch signals from NetworkManager. + * Uses dbus to connect. + * + * @author Damian Minkov + */ +public class NetworkManagerListenerImpl + implements DBusSigHandler +{ + /** + * The logger. + */ + private Logger logger = Logger.getLogger( + NetworkManagerListenerImpl.class.getName()); + + /** + * The only instance of this impl. + */ + private static NetworkManagerListenerImpl networkManagerListenerImpl; + + /** + * Dbus connection we use. + */ + private DBusConnection dbusConn; + + /** + * Make only one instance. + */ + private NetworkManagerListenerImpl() + { + try + { + dbusConn = DBusConnection.getConnection(DBusConnection.SYSTEM); + } + catch(DBusException e) + { + logger.error("Cannot obtain dbus connection", e); + } + } + + /** + * Gets the instance of NetworkManagerListenerImpl. + * @return the NetworkManagerListenerImpl. + */ + public static NetworkManagerListenerImpl getInstance() + { + if(networkManagerListenerImpl == null) + networkManagerListenerImpl = new NetworkManagerListenerImpl(); + + return networkManagerListenerImpl; + } + + /** + * Starts + */ + public void start() + { + try + { + dbusConn.addSigHandler(DBus.NameOwnerChanged.class, this); + dbusConn.addSigHandler(NetworkManager.StateChange.class, this); + } + catch(DBusException e) + { + logger.error("Error adding dbus signal handlers", e); + } + } + + /** + * Stops. + */ + public void stop() + { + try + { + dbusConn.removeSigHandler(DBus.NameOwnerChanged.class, this); + dbusConn.removeSigHandler(NetworkManager.StateChange.class, this); + } + catch(DBusException e) + { + logger.error("Error removing dbus signal handlers", e); + } + } + + /** + * Receives signals and dispatch them. + * @param dBusSignal + */ + public void handle(DBusSignal dBusSignal) + { + if(dBusSignal instanceof DBus.NameOwnerChanged) + { + DBus.NameOwnerChanged nameOwnerChanged = + (DBus.NameOwnerChanged)dBusSignal; + + if(nameOwnerChanged.name.equals(NetworkManager.class.getName())) + { + boolean b1 = nameOwnerChanged.old_owner != null + && nameOwnerChanged.old_owner.length() > 0; + boolean b2 = nameOwnerChanged.new_owner != null + && nameOwnerChanged.new_owner.length() > 0; + + if(b1 && !b2) + { + SystemActivityEvent evt = new SystemActivityEvent( + SysActivityActivator.getSystemActivityService(), + SystemActivityEvent.EVENT_NETWORK_CHANGE); + SysActivityActivator.getSystemActivityService() + .fireSystemActivityEvent(evt); + } + } + } + else if(dBusSignal instanceof NetworkManager.StateChange) + { + NetworkManager.StateChange stateChange = + (NetworkManager.StateChange)dBusSignal; + + SystemActivityEvent evt = null; + switch(stateChange.getStatus()) + { + case NetworkManager.NM_STATE_CONNECTED: + case NetworkManager.NM_STATE_DISCONNECTED: + evt = new SystemActivityEvent( + SysActivityActivator.getSystemActivityService(), + SystemActivityEvent.EVENT_NETWORK_CHANGE); + break; + case NetworkManager.NM_STATE_ASLEEP: + evt = new SystemActivityEvent( + SysActivityActivator.getSystemActivityService(), + SystemActivityEvent.EVENT_SLEEP); + break; + } + + if(evt != null) + SysActivityActivator.getSystemActivityService() + .fireSystemActivityEvent(evt); + } + } +} diff --git a/src/net/java/sip/communicator/impl/sysactivity/SysActivityActivator.java b/src/net/java/sip/communicator/impl/sysactivity/SysActivityActivator.java new file mode 100644 index 000000000..ea60cfc7b --- /dev/null +++ b/src/net/java/sip/communicator/impl/sysactivity/SysActivityActivator.java @@ -0,0 +1,108 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.sysactivity; + +import net.java.sip.communicator.service.sysactivity.*; +import org.osgi.framework.*; + +import net.java.sip.communicator.util.*; + +/** + * Listens for system activity changes like sleep, network change, inactivity + * and inform all its listeners. + * + * @author Damian Minkov + */ +public class SysActivityActivator + implements BundleActivator +{ + /** + * The logger. + */ + private Logger logger = Logger.getLogger( + SysActivityActivator.class.getName()); + + /** + * The OSGi service registration. + */ + private ServiceRegistration sysActivitiesServReg = null; + + /** + * The OSGi BundleContext. + */ + private static BundleContext bundleContext = null; + + /** + * The system activity service impl. + */ + private static SystemActivityNotificationsServiceImpl sysActivitiesServiceImpl; + + /** + * Called when this bundle is started so the Framework can perform the + * bundle-specific activities necessary to start this bundle. + * + * @param context The execution context of the bundle being started. + * @throws Exception If this method throws an exception, this bundle is + * marked as stopped and the Framework will remove this bundle's + * listeners, unregister all services registered by this bundle, and + * release all services used by this bundle. + */ + public void start(BundleContext context) + throws Exception + { + if (logger.isDebugEnabled()) + logger.debug("Started."); + SysActivityActivator.bundleContext = context; + + sysActivitiesServiceImpl = new SystemActivityNotificationsServiceImpl(); + sysActivitiesServiceImpl.start(); + + sysActivitiesServReg = context.registerService( + SystemActivityNotificationsService.class.getName(), + sysActivitiesServiceImpl, + null); + } + + /** + * Returns a reference to the bundle context that we were started with. + * @return a reference to the BundleContext instance that we were started + * witn. + */ + public static BundleContext getBundleContext() + { + return bundleContext; + } + + /** + * Returns a reference to the bundle context that we were started with. + * @return a reference to the BundleContext instance that we were started + * witn. + */ + public static SystemActivityNotificationsServiceImpl + getSystemActivityService() + { + return sysActivitiesServiceImpl; + } + + /** + * Called when this bundle is stopped so the Framework can perform the + * bundle-specific activities necessary to stop the bundle. + * + * @param context The execution context of the bundle being stopped. + * @throws Exception If this method throws an exception, the bundle is + * still marked as stopped, and the Framework will remove the bundle's + * listeners, unregister all services registered by the bundle, and + * release all services used by the bundle. + */ + public void stop(BundleContext context) throws Exception + { + sysActivitiesServReg.unregister(); + + if(sysActivitiesServiceImpl != null) + sysActivitiesServiceImpl.stop(); + } +} diff --git a/src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotifications.java b/src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotifications.java new file mode 100644 index 000000000..6264b4971 --- /dev/null +++ b/src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotifications.java @@ -0,0 +1,194 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.sysactivity; + +import net.java.sip.communicator.util.*; + +/** + * @author Damian Minkov + */ +public class SystemActivityNotifications +{ + /** + * Notify that computers is going to sleep. + */ + public static final int NOTIFY_SLEEP = 0; + + /** + * Notify that computer is wakeing up after stand by. + */ + public static final int NOTIFY_WAKE = 1; + + /** + * Computer display has stand by. + */ + public static final int NOTIFY_DISPLAY_SLEEP = 2; + + /** + * Computer display wakes up after stand by. + */ + public static final int NOTIFY_DISPLAY_WAKE = 3; + + /** + * Screensaver has been started. + */ + public static final int NOTIFY_SCREENSAVER_START = 4; + + /** + * Screensaver will stop. + */ + public static final int NOTIFY_SCREENSAVER_WILL_STOP = 5; + + /** + * Screensaver has been stopped. + */ + public static final int NOTIFY_SCREENSAVER_STOP = 6; + + /** + * Screen has been locked. + */ + public static final int NOTIFY_SCREEN_LOCKED = 7; + + /** + * Screen has been unlocked. + */ + public static final int NOTIFY_SCREEN_UNLOCKED = 8; + + /** + * A change in network configuration has occurred. + */ + public static final int NOTIFY_NETWORK_CHANGE = 9; + + /** + * The logger. + */ + private static Logger logger = Logger.getLogger( + SystemActivityNotifications.class.getName()); + + /** + * The native instance. + */ + private static long notifierInstance = -1; + + /** + * Init native library. + */ + static + { + try + { + System.loadLibrary("sysactivitynotifications"); + + notifierInstance = allocAndInit(); + } + catch(Throwable t) + { + logger.error("Error init native functions", t); + } + } + + /** + * Allocate native resources and gets a pointer. + * @return + */ + private static native long allocAndInit(); + + /** + * Release native resources. + * @param ptr + */ + private static native void release(long ptr); + + /** + * Sets delegate. + * @param delegate + */ + public static void setDelegate(NotificationsDelegate delegate) + { + if(notifierInstance != -1) + { + setDelegate(notifierInstance, delegate); + } + } + + /** + * Sets notifier delegate. + * @param ptr + * @param delegate + */ + public static native void setDelegate(long ptr, NotificationsDelegate delegate); + + /** + * Start processing. + * @param ptr + */ + private static native void start(long ptr); + + /** + * Stop processing. + * @param ptr + */ + private static native void stop(long ptr); + + /** + * Start. + */ + public static void start() + { + if(notifierInstance != -1) + start(notifierInstance); + } + + /** + * Stop. + */ + public static void stop() + { + if(notifierInstance != -1) + { + stop(notifierInstance); + release(notifierInstance); + notifierInstance = -1; + } + } + + /** + * Returns the when was last input in milliseconds. The time when + * there was any activity on the computer. + * @return + */ + public static native long getLastInput(); + + /** + * Delegate class to be notified for changes. + */ + public static abstract class NotificationsDelegate + { + /** + * Callback method when receiving notifications. + * + * @param type + */ + public abstract void notify(int type); + + /** + * Callback method when receiving special network notifications. + * + * @param family family of network change (ipv6, ipv4) + * @param luidIndex unique index of interface + * @param name name of the interface + * @param type of the interface + * @param connected whether interface is connected or not. + */ + public abstract void notifyNetworkChange( + int family, + long luidIndex, + String name, + long type, + boolean connected); + } +} diff --git a/src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotificationsServiceImpl.java b/src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotificationsServiceImpl.java new file mode 100644 index 000000000..4d7c12dbd --- /dev/null +++ b/src/net/java/sip/communicator/impl/sysactivity/SystemActivityNotificationsServiceImpl.java @@ -0,0 +1,474 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.sysactivity; + +import net.java.sip.communicator.service.sysactivity.*; +import net.java.sip.communicator.service.sysactivity.event.*; +import net.java.sip.communicator.util.*; + +import java.util.*; + +/** + * Service implementation listens for computer changes as sleeping, network + * change, inactivity. + * + * @author Damian Minkov + */ +public class SystemActivityNotificationsServiceImpl + extends SystemActivityNotifications.NotificationsDelegate + implements SystemActivityNotificationsService, + Runnable +{ + /** + * The logger. + */ + private Logger logger = Logger.getLogger( + SystemActivityNotificationsServiceImpl.class.getName()); + + /** + * A list of listeners registered for system activity events. + */ + private final List activityChangeListeners = + new LinkedList(); + + /** + * A list of listeners registered for idle events. + */ + private final Map idleChangeListeners = + new HashMap(); + + /** + * Listeners which are fired for idle state and which will be fired + * with idle end when needed. + */ + private final List listenersInIdleState + = new ArrayList(); + + /** + * The time in milliseconds between two checks for system idle. + */ + private static final int idleStateCheckDelay = 10*1000; + + /** + * Whether current service is started or stopped. + */ + private boolean running = false; + + /** + * The time when we received latest network change event. + */ + private long lastNetworkChange = -1; + + /** + * Sometimes (on windows) we got several network change events + * this is the time after which latest event we will skip next events. + */ + private static final long NETWORK_EVENT_SILENT_TIME = 10*1000; + + /** + * Whether network is currently connected. + */ + private Boolean networkIsConnected = null; + + /** + * Init and start notifications. + */ + public void start() + { + running = true; + + // set the delegate and start notification in new thread + // make sure we don't block startup process + Thread notifystartThread = new Thread(new Runnable() { + public void run() + { + SystemActivityNotifications.setDelegate( + SystemActivityNotificationsServiceImpl.this); + SystemActivityNotifications.start(); + } + }, "SystemActivityNotificationsServiceImpl"); + notifystartThread.setDaemon(true); + notifystartThread.start(); + + // a thread periodically checks system idle state and if it pass the + // idle time for a particular listener, will inform it. + Thread idleNotifyThread = new Thread(this, + "SystemActivityNotificationsServiceImpl.IdleNotifyThread"); + idleNotifyThread.setDaemon(true); + idleNotifyThread.start(); + + if(OSUtils.IS_LINUX) + { + NetworkManagerListenerImpl.getInstance().start(); + } + } + + /** + * Stop notifications. + */ + public void stop() + { + SystemActivityNotifications.stop(); + + if(OSUtils.IS_LINUX) + { + NetworkManagerListenerImpl.getInstance().stop(); + } + + running = false; + + synchronized(this) + { + this.notifyAll(); + } + } + + /** + * Registers a listener that would be notified of changes that have occurred + * in the underlying system. + * + * @param listener the listener that we'd like to register for changes in + * the underlying system. + */ + public void addSystemActivityChangeListener( + SystemActivityChangeListener listener) + { + synchronized (activityChangeListeners) + { + if (!activityChangeListeners.contains(listener)) + { + activityChangeListeners.add(listener); + } + } + } + + /** + * Remove the specified listener so that it won't receive further + * notifications of changes that occur in the underlying system + * + * @param listener the listener to remove. + */ + public void removeSystemActivityChangeListener( + SystemActivityChangeListener listener) + { + synchronized (activityChangeListeners) + { + activityChangeListeners.remove(listener); + } + } + + /** + * Registers a listener that would be notified for idle of the system + * for idleTime. + * + * @param idleTime the time in milliseconds after which we will consider + * system to be idle. This doesn't count when system seems idle as + * monitor is off or screensaver is on, or desktop is locked. + * @param listener the listener that we'd like to register for changes in + * the underlying system. + */ + public void addIdleSystemChangeListener( + long idleTime, + SystemActivityChangeListener listener) + { + synchronized (idleChangeListeners) + { + if (!idleChangeListeners.containsKey(listener)) + { + idleChangeListeners.put(listener, idleTime); + } + } + } + + /** + * Remove the specified listener so that it won't receive further + * notifications for idle system. + * + * @param listener the listener to remove. + */ + public void removeIdleSystemChangeListener( + SystemActivityChangeListener listener) + { + synchronized (idleChangeListeners) + { + idleChangeListeners.remove(listener); + } + } + + /** + * Callback method when receiving notifications. + * + * @param type + */ + @Override + public void notify(int type) + { + SystemActivityEvent evt = null; + switch(type) + { + case SystemActivityNotifications.NOTIFY_SLEEP : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_SLEEP); + break; + case SystemActivityNotifications.NOTIFY_WAKE : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_WAKE); + break; + case SystemActivityNotifications.NOTIFY_DISPLAY_SLEEP : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_DISPLAY_SLEEP); + break; + case SystemActivityNotifications.NOTIFY_DISPLAY_WAKE : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_DISPLAY_WAKE); + break; + case SystemActivityNotifications.NOTIFY_SCREENSAVER_START : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_SCREENSAVER_START); + break; + case SystemActivityNotifications.NOTIFY_SCREENSAVER_WILL_STOP : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_SCREENSAVER_WILL_STOP); + break; + case SystemActivityNotifications.NOTIFY_SCREENSAVER_STOP : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_SCREENSAVER_STOP); + break; + case SystemActivityNotifications.NOTIFY_SCREEN_LOCKED : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_SCREEN_LOCKED); + break; + case SystemActivityNotifications.NOTIFY_SCREEN_UNLOCKED : + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_SCREEN_UNLOCKED); + break; + case SystemActivityNotifications.NOTIFY_NETWORK_CHANGE : + { + evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_NETWORK_CHANGE); + break; + } + } + + if(evt != null) + fireSystemActivityEvent(evt); + } + + /** + * Callback method when receiving special network notifications. + * + * @param family family of network change (ipv6, ipv4) + * AF_UNSPEC = 0 (The address family is unspecified.) + * AF_INET = 2 (The Internet Protocol version 4 (IPv4) address family) + * AF_INET6 = 23 (The Internet Protocol version 6 (IPv6) address family) + * @param luidIndex unique index of interface + * @param name name of the interface + * @param type of the interface + * Possible values for the interface type are listed in the Ipifcons.h file. + * common values: + * IF_TYPE_OTHER = 1 (Some other type of network interface.) + * IF_TYPE_ETHERNET_CSMACD = 6 (An Ethernet network interface.) + * IF_TYPE_ISO88025_TOKENRING = 9 (A token ring network interface.) + * IF_TYPE_PPP = 23 (A PPP network interface.) + * IF_TYPE_SOFTWARE_LOOPBACK = 24 (A software loopback network interface.) + * IF_TYPE_IEEE80211 = 71 (An IEEE 802.11 wireless network interface.) + * IF_TYPE_TUNNEL = 131 (A tunnel type encapsulation network interface.) + * IF_TYPE_IEEE1394 = 144 (An IEEE 1394 (Firewire) high performance + * serial bus network interface.) + * @param connected whether interface is connected or not. + */ + @Override + public void notifyNetworkChange( + int family, + long luidIndex, + String name, + long type, + boolean connected) + { + long current = System.currentTimeMillis(); + if(current - lastNetworkChange <= NETWORK_EVENT_SILENT_TIME + && (networkIsConnected != null && networkIsConnected.equals(connected))) + { + networkIsConnected = connected; + return; + } + + lastNetworkChange = current; + networkIsConnected = connected; + + SystemActivityEvent evt = new SystemActivityEvent(this, + SystemActivityEvent.EVENT_NETWORK_CHANGE); + fireSystemActivityEvent(evt); + } + + /** + * The thread run method that handles idle notifies. + * + * @see Thread#run() + */ + public void run() + { + while(running) + { + try + { + if(idleChangeListeners.size() > 0) + { + // check + long idleTime = SystemActivityNotifications.getLastInput(); + + if(idleTime < idleStateCheckDelay + && listenersInIdleState.size() > 0) + { + for(SystemActivityChangeListener l: listenersInIdleState) + { + fireSystemIdleEndEvent(l); + } + listenersInIdleState.clear(); + } + + for(Map.Entry entry : + idleChangeListeners.entrySet()) + { + if(entry.getValue().longValue() <= idleTime) + { + fireSystemIdleEvent(entry.getKey()); + + listenersInIdleState.add(entry.getKey()); + } + } + } + + // wait for the specified time + synchronized(this) + { + this.wait(idleStateCheckDelay); + } + } + catch(UnsatisfiedLinkError t) + { + logger.error("Missing native impl", t); + return; + } + catch(Throwable t) + { + logger.error("Error checking for idle", t); + } + } + } + + /** + * Delivers the specified event to all registered listeners. + * + * @param evt the SystemActivityEvent that we'd like delivered to + * all registered message listeners. + */ + protected void fireSystemActivityEvent(SystemActivityEvent evt) + { + Collection listeners = null; + synchronized (this.activityChangeListeners) + { + listeners = new ArrayList( + this.activityChangeListeners); + } + + if (logger.isDebugEnabled()) + logger.debug("Dispatching SystemActivityEvent Listeners=" + + listeners.size() + " evt=" + evt); + + for (SystemActivityChangeListener listener : listeners) + { + try + { + listener.activityChanged(evt); + } + catch (Throwable e) + { + logger.error("Error delivering event", e); + } + } + } + + /** + * Delivers the specified event to all registered listeners. + * + * @param evt the SystemActivityEvent that we'd like delivered to + * all registered message listeners. + */ + protected void fireSystemIdleEvent(SystemActivityEvent evt) + { + Collection listeners = null; + synchronized (this.idleChangeListeners) + { + listeners = new ArrayList( + this.idleChangeListeners.keySet()); + } + + if (logger.isDebugEnabled()) + logger.debug("Dispatching SystemActivityEvent Listeners=" + + listeners.size() + " evt=" + evt); + + for (SystemActivityChangeListener listener : listeners) + { + try + { + listener.activityChanged(evt); + } + catch (Throwable e) + { + logger.error("Error delivering event", e); + } + } + } + + /** + * Delivers the specified event to all registered listeners. + * + * @param listener listener to inform + */ + protected void fireSystemIdleEvent(SystemActivityChangeListener listener) + { + SystemActivityEvent evt = new SystemActivityEvent( + this, SystemActivityEvent.EVENT_SYSTEM_IDLE); + + if (logger.isDebugEnabled()) + logger.debug("Dispatching SystemActivityEvent evt=" + evt); + + try + { + listener.activityChanged(evt); + } + catch (Throwable e) + { + logger.error("Error delivering event", e); + } + } + + /** + * Delivers the specified event to listener. + * + * @param listener listener to inform + */ + protected void fireSystemIdleEndEvent( + SystemActivityChangeListener listener) + { + SystemActivityEvent evt = new SystemActivityEvent( + this, SystemActivityEvent.EVENT_SYSTEM_IDLE_END); + + if (logger.isDebugEnabled()) + logger.debug("Dispatching SystemActivityEvent evt=" + evt); + + try + { + listener.activityChanged(evt); + } + catch (Throwable e) + { + logger.error("Error delivering event", e); + } + } +} diff --git a/src/net/java/sip/communicator/impl/sysactivity/sysactivity.impl.manifest.mf b/src/net/java/sip/communicator/impl/sysactivity/sysactivity.impl.manifest.mf new file mode 100644 index 000000000..db284f9ef --- /dev/null +++ b/src/net/java/sip/communicator/impl/sysactivity/sysactivity.impl.manifest.mf @@ -0,0 +1,13 @@ +Bundle-Activator: net.java.sip.communicator.impl.sysactivity.SysActivityActivator +Bundle-Name: System Activity Service Implementation +Bundle-Description: System Activity Service Implementation. +Bundle-Vendor: sip-communicator.org +Bundle-Version: 0.0.1 +System-Bundle: yes +Import-Package: org.osgi.framework, + net.java.sip.communicator.service.configuration, + net.java.sip.communicator.service.resources, + net.java.sip.communicator.util, + net.java.sip.communicator.service.version +Export-Package: net.java.sip.communicator.service.sysactivity, + net.java.sip.communicator.service.sysactivity.event diff --git a/src/net/java/sip/communicator/plugin/generalconfig/GeneralConfigPluginActivator.java b/src/net/java/sip/communicator/plugin/generalconfig/GeneralConfigPluginActivator.java index 5b9438778..25c09791f 100644 --- a/src/net/java/sip/communicator/plugin/generalconfig/GeneralConfigPluginActivator.java +++ b/src/net/java/sip/communicator/plugin/generalconfig/GeneralConfigPluginActivator.java @@ -50,22 +50,17 @@ public class GeneralConfigPluginActivator /** * The bundle context. */ - protected static BundleContext bundleContext; + public static BundleContext bundleContext; /** * The user interface service. */ private static UIService uiService; - /** - * The auto away thread. - */ - private static Thread autoAwayThread = null; - /** * The status update thread. */ - private static StatusUpdateThread runner = null; + private static AutoAwayWatcher runner = null; /** * The indicator which determines whether {@link #startThread()} has been @@ -264,27 +259,8 @@ public void serviceChanged(ServiceEvent serviceEvent) */ private static void startThread() { - /* - * FIXME Even if auto away is disabled at this point, it doesn't mean - * that it will not get enabled later on so this method likely has to - * also be called when the configuration property gets changed. - */ - if (!getConfigurationService().getBoolean(Preferences.ENABLE, false)) - return; - if (runner == null) - runner = new StatusUpdateThread(); - if ((autoAwayThread == null) || !runner.isRunning()) - { - autoAwayThread = new Thread(runner); - autoAwayThread.setName(GeneralConfigPluginActivator.class.getName()); - autoAwayThread.setPriority(Thread.MIN_PRIORITY); - autoAwayThread.setDaemon(true); - autoAwayThread.start(); - } else - { - autoAwayThread.interrupt(); - } + runner = new AutoAwayWatcher(getConfigurationService()); } /** @@ -297,11 +273,6 @@ private static void stopThread() runner.stop(); runner = null; } - if (autoAwayThread != null) - { - autoAwayThread.interrupt(); - autoAwayThread = null; - } } /** diff --git a/src/net/java/sip/communicator/plugin/generalconfig/autoaway/AutoAwayWatcher.java b/src/net/java/sip/communicator/plugin/generalconfig/autoaway/AutoAwayWatcher.java new file mode 100644 index 000000000..a90013b01 --- /dev/null +++ b/src/net/java/sip/communicator/plugin/generalconfig/autoaway/AutoAwayWatcher.java @@ -0,0 +1,207 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.plugin.generalconfig.autoaway; + +import net.java.sip.communicator.plugin.generalconfig.*; +import net.java.sip.communicator.service.configuration.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.sysactivity.*; +import net.java.sip.communicator.service.sysactivity.event.*; +import net.java.sip.communicator.util.*; + +import java.beans.*; +import java.util.*; + +/** + * Listens for idle events from SystemActivityNotifications Service. + * @author Damian Minkov + */ +public class AutoAwayWatcher + implements SystemActivityChangeListener +{ + /** + * The states of providers before going to away. + */ + private final Map lastStates + = new HashMap(); + + /** + * Creates AutoAway handler. + * @param configurationService the config service. + */ + public AutoAwayWatcher(ConfigurationService configurationService) + { + // if enabled start + if(configurationService.getBoolean(Preferences.ENABLE, false)) + start(); + + // listens for changes in configuration enable/disable + configurationService.addPropertyChangeListener( + Preferences.ENABLE, + new PropertyChangeListener() + { + public void propertyChange(PropertyChangeEvent evt) + { + if(Boolean.parseBoolean((String)evt.getNewValue())) + start(); + else + stop(); + } + } + ); + + // listens for changes in configured value. + configurationService.addPropertyChangeListener( + Preferences.TIMER, + new PropertyChangeListener() + { + public void propertyChange(PropertyChangeEvent evt) + { + stop(); + start(); + } + } + ); + } + + /** + * Starts and add needed listeners. + */ + public void start() + { + getSystemActivityNotificationsService() + .addIdleSystemChangeListener( + StatusUpdateThread.getTimer()*60*1000, this); + getSystemActivityNotificationsService() + .addSystemActivityChangeListener(this); + } + + /** + * Stops and removes the listeners. + */ + public void stop() + { + getSystemActivityNotificationsService() + .removeIdleSystemChangeListener(this); + getSystemActivityNotificationsService() + .removeSystemActivityChangeListener(this); + } + + /** + * Listens for activities and set corresponding statuses. + * + * @param event the NotificationActionTypeEvent, which is + */ + public void activityChanged(SystemActivityEvent event) + { + switch(event.getEventID()) + { + case SystemActivityEvent.EVENT_DISPLAY_SLEEP: + case SystemActivityEvent.EVENT_SCREEN_LOCKED: + case SystemActivityEvent.EVENT_SCREENSAVER_START: + case SystemActivityEvent.EVENT_SYSTEM_IDLE: + changeProtocolsToAway(); + break; + case SystemActivityEvent.EVENT_DISPLAY_WAKE: + case SystemActivityEvent.EVENT_SCREEN_UNLOCKED: + case SystemActivityEvent.EVENT_SCREENSAVER_STOP: + case SystemActivityEvent.EVENT_SYSTEM_IDLE_END: + changeProtocolsToPreviousState(); + break; + } + } + + /** + * Change protocol to away saving status so it can be set again when + * out of idle state. + */ + private void changeProtocolsToAway() + { + for (ProtocolProviderService protocolProviderService + : GeneralConfigPluginActivator.getProtocolProviders()) + { + OperationSetPresence presence + = protocolProviderService + .getOperationSet( + OperationSetPresence.class); + + PresenceStatus status = presence + .getPresenceStatus(); + + if (status.getStatus() + < PresenceStatus.AVAILABLE_THRESHOLD) + { + // already (manually) set to away or lower + continue; + } + + lastStates.put(protocolProviderService, status); + + PresenceStatus newStatus = + StatusUpdateThread.findAwayStatus(presence); + + try + { + if (newStatus != null) + presence + .publishPresenceStatus( + newStatus, + newStatus.getStatusName()); + } catch (IllegalArgumentException e) + { + } catch (IllegalStateException e) + { + } catch (OperationFailedException e) + { + } + } + } + + /** + * Back to status which was already saved before going to idle. + */ + private void changeProtocolsToPreviousState() + { + for (ProtocolProviderService protocolProviderService + : GeneralConfigPluginActivator.getProtocolProviders()) + { + if (lastStates.get(protocolProviderService) != null) + { + PresenceStatus lastState + = lastStates.get(protocolProviderService); + OperationSetPresence presence + = protocolProviderService + .getOperationSet( + OperationSetPresence.class); + try + { + presence + .publishPresenceStatus(lastState, ""); + } catch (IllegalArgumentException e) + { + } catch (IllegalStateException e) + { + } catch (OperationFailedException e) + { + } + lastStates.remove(protocolProviderService); + } + } + } + + /** + * The SystemActivityNotifications Service. + * @return the SystemActivityNotifications Service. + */ + private SystemActivityNotificationsService + getSystemActivityNotificationsService() + { + return ServiceUtils.getService( + GeneralConfigPluginActivator.bundleContext, + SystemActivityNotificationsService.class); + } +} diff --git a/src/net/java/sip/communicator/plugin/generalconfig/autoaway/StatusUpdateThread.java b/src/net/java/sip/communicator/plugin/generalconfig/autoaway/StatusUpdateThread.java index f34349ef7..5fe02e364 100644 --- a/src/net/java/sip/communicator/plugin/generalconfig/autoaway/StatusUpdateThread.java +++ b/src/net/java/sip/communicator/plugin/generalconfig/autoaway/StatusUpdateThread.java @@ -140,7 +140,7 @@ public void stop() * @param presence * @return */ - private PresenceStatus findAwayStatus(OperationSetPresence presence) + static PresenceStatus findAwayStatus(OperationSetPresence presence) { Iterator statusSet = presence.getSupportedStatusSet(); PresenceStatus status = null; @@ -166,7 +166,7 @@ private PresenceStatus findAwayStatus(OperationSetPresence presence) return status; } - private int getTimer() + static int getTimer() { ConfigurationService configService = GeneralConfigPluginActivator.getConfigurationService(); diff --git a/src/net/java/sip/communicator/plugin/generalconfig/generalconfig.manifest.mf b/src/net/java/sip/communicator/plugin/generalconfig/generalconfig.manifest.mf index 9bbce55b3..592eb19e4 100644 --- a/src/net/java/sip/communicator/plugin/generalconfig/generalconfig.manifest.mf +++ b/src/net/java/sip/communicator/plugin/generalconfig/generalconfig.manifest.mf @@ -15,6 +15,8 @@ Import-Package: org.osgi.framework, net.java.sip.communicator.service.systray, net.java.sip.communicator.util, net.java.sip.communicator.util.swing, + net.java.sip.communicator.service.sysactivity, + net.java.sip.communicator.service.sysactivity.event, com.sun.jna.win32, com.sun.jna, com.sun.jna.ptr, diff --git a/src/net/java/sip/communicator/plugin/reconnectplugin/ReconnectPluginActivator.java b/src/net/java/sip/communicator/plugin/reconnectplugin/ReconnectPluginActivator.java index 8214baf5f..8b6ce0da0 100644 --- a/src/net/java/sip/communicator/plugin/reconnectplugin/ReconnectPluginActivator.java +++ b/src/net/java/sip/communicator/plugin/reconnectplugin/ReconnectPluginActivator.java @@ -118,7 +118,7 @@ public class ReconnectPluginActivator /** * The end of the interval for the initial reconnect. */ - private static final int RECONNECT_DELAY_MAX = 30; // sec + private static final int RECONNECT_DELAY_MAX = 15; // sec /** * Max value for growing the reconnect delay, all subsequent reconnects diff --git a/src/net/java/sip/communicator/service/sysactivity/SystemActivityChangeListener.java b/src/net/java/sip/communicator/service/sysactivity/SystemActivityChangeListener.java new file mode 100644 index 000000000..b2d848126 --- /dev/null +++ b/src/net/java/sip/communicator/service/sysactivity/SystemActivityChangeListener.java @@ -0,0 +1,31 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.sysactivity; + +import net.java.sip.communicator.service.sysactivity.event.*; + +import java.util.*; + +/** + * The SystemActivityChangeListener is notified any time an event + * in the operating system occurs. + * + * @author Damian Minkov + */ +public interface SystemActivityChangeListener + extends EventListener +{ + /** + * This method gets called when a notification action for a particular event + * type has been changed (for example the corresponding descriptor has + * changed). + * + * @param event the NotificationActionTypeEvent, which is + * dispatched when an action has been changed. + */ + public void activityChanged(SystemActivityEvent event); +} diff --git a/src/net/java/sip/communicator/service/sysactivity/SystemActivityNotificationsService.java b/src/net/java/sip/communicator/service/sysactivity/SystemActivityNotificationsService.java new file mode 100644 index 000000000..2faf4f4d5 --- /dev/null +++ b/src/net/java/sip/communicator/service/sysactivity/SystemActivityNotificationsService.java @@ -0,0 +1,58 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.sysactivity; + +/** + * Listens for some system specific events such as sleep, wake, network change, + * desktop activity, screensaver etc. and informs the registered listeners. + * + * @author Damian Minkov + */ +public interface SystemActivityNotificationsService +{ + /** + * Registers a listener that would be notified of changes that have occurred + * in the underlying system. + * + * @param listener the listener that we'd like to register for changes in + * the underlying system. + */ + public void addSystemActivityChangeListener( + SystemActivityChangeListener listener); + + /** + * Remove the specified listener so that it won't receive further + * notifications of changes that occur in the underlying system + * + * @param listener the listener to remove. + */ + public void removeSystemActivityChangeListener( + SystemActivityChangeListener listener); + + /** + * Registers a listener that would be notified for idle of the system + * for idleTime. + * + * @param idleTime the time in milliseconds after which we will consider + * system to be idle. This doesn't count when system seems idle as + * monitor is off or screensaver is on, or desktop is locked. + * @param listener the listener that we'd like to register for changes in + * the underlying system. + */ + public void addIdleSystemChangeListener( + long idleTime, + SystemActivityChangeListener listener); + + /** + * Remove the specified listener so that it won't receive further + * notifications for idle system. + * + * @param listener the listener to remove. + */ + public void removeIdleSystemChangeListener( + SystemActivityChangeListener listener); +} diff --git a/src/net/java/sip/communicator/service/sysactivity/event/SystemActivityEvent.java b/src/net/java/sip/communicator/service/sysactivity/event/SystemActivityEvent.java new file mode 100644 index 000000000..a06f60607 --- /dev/null +++ b/src/net/java/sip/communicator/service/sysactivity/event/SystemActivityEvent.java @@ -0,0 +1,106 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.sysactivity.event; + +import java.util.*; + +/** + * An event class representing system activity that has occurred. + * The event id indicates the exact reason for this event. + * @author Damian Minkov + */ +public class SystemActivityEvent + extends EventObject +{ + /** + * Notify that computers is going to sleep. + */ + public static final int EVENT_SLEEP = 0; + + /** + * Notify that computer is wakeing up after stand by. + */ + public static final int EVENT_WAKE = 1; + + /** + * Computer display has stand by. + */ + public static final int EVENT_DISPLAY_SLEEP = 2; + + /** + * Computer display wakes up after stand by. + */ + public static final int EVENT_DISPLAY_WAKE = 3; + + /** + * Screensaver has been started. + */ + public static final int EVENT_SCREENSAVER_START = 4; + + /** + * Screensaver will stop. + */ + public static final int EVENT_SCREENSAVER_WILL_STOP = 5; + + /** + * Screensaver has been stopped. + */ + public static final int EVENT_SCREENSAVER_STOP = 6; + + /** + * Screen has been locked. + */ + public static final int EVENT_SCREEN_LOCKED = 7; + + /** + * Screen has been unlocked. + */ + public static final int EVENT_SCREEN_UNLOCKED = 8; + + /** + * A change in network configuration has occurred. + */ + public static final int EVENT_NETWORK_CHANGE = 9; + + /** + * A system idle event has occurred. + */ + public static final int EVENT_SYSTEM_IDLE = 10; + + /** + * A system was in idle state and now exits. + */ + public static final int EVENT_SYSTEM_IDLE_END = 11; + + /** + * The type of the event. + */ + private final int eventID; + + /** + * Constructs a prototypical Event. + * + * @param source The object on which the Event initially occurred. + * @param eventID the type of the event. + * @throws IllegalArgumentException if source is null. + */ + public SystemActivityEvent(Object source, int eventID) + { + super(source); + + this.eventID = eventID; + } + + /** + * Returns the type of the event. + * @return + */ + public int getEventID() + { + return this.eventID; + } +}