From 75d6df7789a1047e618b42bb9ca45b7250ad7157 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Thu, 5 May 2016 13:13:44 +0000 Subject: [PATCH] DesktopGui: - Remove all static log, context, and instance fields - Make Main class a RouterApp - Remove unused ConfigurationManager class - Translate tooltip, disable tooltip on linux - Use safer exec call to start i2p - Remove all images, use itoopie - Don't start spinner thread in router context - Handle various startup errors better - Synchs, finals, javadocs, cleanups --- apps/desktopgui/build.xml | 6 +- apps/desktopgui/resources/images/logo.jpg | Bin 1105 -> 0 bytes apps/desktopgui/resources/images/logo.png | Bin 34366 -> 0 bytes .../resources/images/logo_green.jpg | Bin 1309 -> 0 bytes .../resources/images/logo_orange.jpg | Bin 1289 -> 0 bytes apps/desktopgui/resources/images/logo_red.jpg | Bin 1312 -> 0 bytes .../i2p/desktopgui/ExternalTrayManager.java | 17 +- .../i2p/desktopgui/InternalTrayManager.java | 23 ++- .../src/net/i2p/desktopgui/Main.java | 172 ++++++++++++++---- .../src/net/i2p/desktopgui/TrayManager.java | 78 ++++---- .../gui/DesktopguiConfigurationFrame.java | 13 +- .../desktopgui/i18n/DesktopguiTranslator.java | 17 +- .../i2p/desktopgui/router/RouterManager.java | 50 +---- .../desktopgui/util/ConfigurationManager.java | 103 ----------- .../net/i2p/desktopgui/util/I2PDesktop.java | 5 +- 15 files changed, 239 insertions(+), 245 deletions(-) delete mode 100644 apps/desktopgui/resources/images/logo.jpg delete mode 100644 apps/desktopgui/resources/images/logo.png delete mode 100644 apps/desktopgui/resources/images/logo_green.jpg delete mode 100644 apps/desktopgui/resources/images/logo_orange.jpg delete mode 100644 apps/desktopgui/resources/images/logo_red.jpg delete mode 100644 apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml index 7e25f38977..3f6256b899 100644 --- a/apps/desktopgui/build.xml +++ b/apps/desktopgui/build.xml @@ -5,7 +5,6 @@ <property name="build" value="build"/> <property name="dist" location="dist"/> <property name="jar" value="desktopgui.jar"/> - <property name="resources" value="resources"/> <property name="javadoc" value="javadoc"/> <property name="javac.compilerargs" value=""/> <property name="javac.version" value="1.6" /> @@ -36,9 +35,6 @@ <pathelement location="../../router/java/build/router.jar" /> </classpath> </javac> - <copy todir="${build}/desktopgui/${resources}"> - <fileset dir="${resources}" /> - </copy> </target> <target name="bundle" unless="no.bundle"> @@ -76,6 +72,8 @@ <target name="jar" depends="compile, bundle, listChangedFiles" unless="jar.uptodate" > <!-- set if unset --> <property name="workspace.changes.tr" value="" /> + <!-- ideal for linux: 24x24, but transparency doesn't work --> + <copy tofile="${build}/desktopgui/resources/images/logo.png" file="../../installer/resources/themes/console/images/itoopie_xsm.png" /> <jar basedir="${build}" excludes="messages-src/**" destfile="${dist}/${jar}"> <manifest> <attribute name="Main-Class" value="net.i2p.desktopgui.Main"/> diff --git a/apps/desktopgui/resources/images/logo.jpg b/apps/desktopgui/resources/images/logo.jpg deleted file mode 100644 index f1b5ccfc8728618281387d7a4b8ed11dedb8f39e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1105 zcmex=<NpH&0WUXCHwH#VMur521O|rxw;7y4JVr_Y$Ph~OgZ2JDz#z!MAi^NY%&5e` zB*@4t$oT&VgA@Y;BP$~VGGJxr;N)Wde}q9_fPs;PiHVVsg^L-YfR&krjh%^uk&{74 zSVUA(P)tfWJR)-Pv>BJL-S~fmL6VVykrkp6O0qIAGBLCKKf<6a$jHdR$jrjT46}@p zNsw7ck%7f9P}osPxp3nDTMRtRj0{YI%z_N|3?A3>4lceFx4+u*=F0g|w>Yz+XI<WK z(Mmo}@$0im*K^rdJjx2$u;u(Y*N*;q8aXvS#o|SiW|{<q@kh6x$=8!i`OhG(X=z)2 zZ`wcUzhN)c(`3`WZjroq_SH_=zNM$arIxz2nM%p`*m;`tKUdE&>}lN=_wSaxDx*U0 zWRJoIwV7K&)%_)PU&n5IF}r+WZRv~SWzyMZ@+Yrk*DjU1r!8_YXZC924NLWw1nv;= z7rlJYReHOjn#w_={$O99b~c}hdWBz%PtOyzlG$teJNJ9v;rp_;?i5T5PqXHf+P+}d z$2Ca@BI92Ag(og9nx1y?$E=GYs~=R<`mkhk{gaal_)?Hzyu3*HNN2?4#XQUp=en15 zyxP6u+*MBB1JCEITBs&ddE7PME3JCUg=s2Gjrp~inF|%H)hc%_wK!+@Yt0J#4C@Ww zW6r<Vx|>{TYjM?T)5rcx(;~}eWqLQ%9=Wh#!6dhdsgg@#&uqzdPU7!Ox|MLu%E#l; zQt1VcuWgf5o_g)ik6pZfEmzpTuG{^eVO^!~UB!~AiDfrehXrq%z2AJX=_<jkE891G zePzj6sg`OxsePUH=dK&hURE2Nk2d*C={+Ub)uoijsQW<u;BAp_DI0?Y*KX(k#Q*B^ zr`xiBzsEoQwAOrAl2)m3iL1R*yw0g*{Kw*g;v9>fH)e+?iw9Ok&s;VCO4v+=Hf@u< z^_K4WGHjJcuf=vA`MfsW<Xdds*WG6mQ*S)dz4=DFYt@ejGOJE8+_-FTnd$A1n|4M8 z5!so7OJ+SiG-JVhmhk5{K2Kk)V-fVX<<Qn^C;RV+v`6jDzP7C-&{)%5ZQ`tHU$b(Y ziUd*?yM0XCwOeHy=LZkYqNF>2HB-;|%B^pgd3-Kz9X~(Eo1W)6Pd>ags{Qqi-?`4$ zNBv}lkJ_t4RX(5Ut0r0<zWaCg(u<rt%%NYNJH7akvMylFC0Ci|YumdOTT{I`L^y-< z0*g2L{rrBFg+=7B&g7FOKV7@*%U^$eK4t3ffa>o*oR|M+IFQ%>i}~>3<G0m2?GLY5 RwQAL#RZruye!l*H698CJregpA diff --git a/apps/desktopgui/resources/images/logo.png b/apps/desktopgui/resources/images/logo.png deleted file mode 100644 index ad89a98643d2fd0a323a9beadd1a70f05de9d159..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34366 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 L{an^LB{Ts5mrPb^ diff --git a/apps/desktopgui/resources/images/logo_green.jpg b/apps/desktopgui/resources/images/logo_green.jpg deleted file mode 100644 index d558efcea3a319fdea21fd624fe5b72813d37918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmex=<NpH&0WUXCHwH#VMur521O|rxw;7y4JVr_Y$Ph~OgZ2JDz#z!MAi^NY%&5e` zB*@4t$oT&VgCqk36Eh<NGGJ%n;9~uMgh5Aufsuuofr){Ig&iW#%EZjV#>mdWz$qjm zDk&xv9uYZl+KkKBuKz#6APVv_L>ZK1<NSYwL0*u786<<Sgo&Ajm645Ih(TCH^#3ge z9%e=cCP8LF2787*v$_|Q-h5~NCiY2n^AD%<n@m&Bb-G+>K3Zh9t2eg6>&we+Dl*%7 zq{KXhm9#Fj+tda~Yw)`6oBbucpYzu=E|-L&*w%_yfAi1o?S1{c?Raw4%g*2KF&^uS z-t|jl=!9pQdEYJBIPLhMc{4twxh#v!Zqs&cciq%yb4PvJjKi}^Pu}^@5OP<Cd*V*> z8+<=3+1bPcc3qgUF8tG{#Yx8tEY8lbjZoeso%uc4c}84J>696l`FArov#2keUM#M0 zW`20Ie`Nl;750~G{V#6N|GRM0>*-b77F}*CJ$I%-s_lr?+(of7HkU;n@Ca-=QZ}7s z#xGe9*KHwIZ}S3|M&y*u-n(9Tb+P-=mzl4;KYHJO$Gcl3aM|rm`6VCHKTGA8?w9qs zb#doc_T@J&bs3yJd_1LNor|WeD}zt({>kx2Gc&V%KgRNWdv>==<4W$$@SOtB|1<R4 z@4Vl)_}0a3UCx(YzjT#&_9#WBbCt_lmo71%iSwuQZND@-@^7U6;yGVGzdm(zu~xN+ z-@a{g^Cz3EQ43C+&80bQ^`?c#%0Gs%o#38!NOHp_$qOHsp6L}0o^E@@sp!$)8-LCJ zGw@{H|CYFV|K&dpzwUfpn)+VWG+EbviO#J1p&{R+4RWkDF>pR_m(^uj9Y5>uhN8F~ zyz6+j+Hm~odZTQ->X=Gz;+7qICbYe7`g2kL=JD&>-@aP=XYPLn_0E0PpZ+tLzJ5}i zeRiwQ=}S?brN8#p^zy$-Ilq?I=IHCn{|x><oy<(^?cwu(OCJ6HzMQ4n$iIKj@v~Mp zZEk+fjW+r+ZBlI9@@TbxAt&dCytTRd>L*CcN+z(D?{<u}?|${Cov5l^B;;!IY@a)S zL2}7%*)_gTu2$|X-W@G(b%T%dVB%R#jTbIE&NMDwldkBTXWerw&Cs(~wZHLd@=2-d zw<6d27x8W|Juh4^*Xs$V$|Si%`tkWP{_;(Smb0jS`Z@8!`K>*th1^Qmi<V8DKYhxp z;3-cd!ua_mR-gFka+%ljvs`7!vq}C|t&g6q{UEi{Iwa5}?XjxrjceC7IqEO;miYKy zDy24Uzv@$=A1nQ5em=F_WLo7FeQ^_c##NKIx(mDI83o1mre>=M{Sw)5&-SrT|Jt+K z@1^UCXE0sORX%ekd0qB#U%ev{9$ad#Tq2iEXOlQOq0s32pQTHmI>>XG1>L%E{h+Mm z;fkm^QFr#w)Zc0EWoiFQx}g5<9vhqB>7fx9e5dz&e=1H9ikW$HU5ddemh(3pZ6-}x z?jbC3Oki#DxtTM|=O?|dT5PteaN&Gox%Q`NCsc%<KifIsuz}!Y4)sYvK|(5r&A=)r Kf>c)jzX<@HH4?u7 diff --git a/apps/desktopgui/resources/images/logo_orange.jpg b/apps/desktopgui/resources/images/logo_orange.jpg deleted file mode 100644 index d131f21b6297f0955632ab353844db0c4a8c587f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1289 zcmex=<NpH&0WUXCHwH#VMur521O|rxw;7y4JVr_Y$Ph~OgZ2JDz#z!MAi^NY%&5e` zB*@4t$oT&VgCqk36Eh<NGT>lg=VJYTgh5Aufsuuofsv7g8!FAp%)-Xb$i%_PAS5gq zE+Q(W965E`j4M~K|3AVY!N|bG3{?lA*f<ziIR77EP!R;lFfp>g<(ZfnSy<VG1lff} z6d6Q0lvMuTV&GwBWMC3x7G$tzNYnh+xsJE+d{XQtIlc!!L#IZ1XLp1;9jI3eKeIU5 z!+)N1p39xB9UJmJ!~{h|439Jl{!rpqn=ZSg_DqKxcSdY$?+GK9kJqNoH~nVbe@;HV z``w)SjBst1r?*@@53IS?;;p`M)6-Hh(_bD2HRsqh`)Bk>%ANBwxs?+h{=z5dKFfoO zd9MU&Do@^X(x1#c$?Bc9%33K`Wv{iHYgINI|D49!-5PnyV^_h2>ZW(MR%QM!TQ^;T zbEi}0ws@UQ^X|%vZfi}g{hBg)iPi4K66bz9o#eOcy>#V8*Qax7Y62IhxcNNuijB11 zak+y*?A75YNy+%bEvMrR7=;TwBUvT|+f2<f(rbQ@8M|#Aqw#5vt#V=V>1MZAUt9a@ z!tH(C>~&X{&3Sci$JTZ0YBd-)tcWo*{`!4U%;esu7xcr^Y;D%X)HS^hJ%4+lx6`vp z+vguG$h)|9VpP+?2+7DC>#E(m`rZbeiRQXyBiM7uQtrj?z^J|F-SQ8}*)B1e5_d#8 z&Wrc;$t|nHex1C#A*ayd^EO@4Yhg#l7u{XBDu~79jU;=%^yZuYo`_zY)GvNi`|$gR zt!#f+2kyW4E3PK<$Fa%fPpwsTzAsS;T^lK|D<D;I^^N26Pq0gCozj*s+q0!?wU6s@ zH?Qd|wMR-PPM=uJ=WgzQFMsp5tUP@yhaZLo@+TAT&yxCAzj}{2`_;2^7G6JAIIs5U zitEXFPq_<ISEWuho#Ht4t<@&>RR^v;j1*?`Qf+>`<ZH42kMGBSGF$vRm#H7F_VmcE z`5X(E_J7DS+ZLUroV#vA*DUiVr!G%TYnkM<o7IOQ#nV_?s?xH4iNo9a<$?vX3SP>r z@p*AV<n`}^YWb>(k}?ts`|p0yTWubY@Kf-b&ur6BHs9M~HC?`2FV=oNv+DRM%~g|9 zq>iq$*xsI0>|mj~p!jjZ_ib_f2MhfVPWmoUdXZ1?SZt@l&#s+!bw9Vn>h>D1yImb& zE7vo*y<>Zb>Eox2*Hr%$^ZaTG{k3P7-AS&b(5p*)<tEulxD@_fmj1EEF8may`GlCs zHIr++pQ~&$Ne#C>b#m4DX*)M7Chtwv+xh!K?Su`1l@T0AFS`6Z{X#E|Ax+n{I9>X> z;Y-H7Pg0Mvw8ZY-R+Z_d)0X$2p?-}O<D*%c)0AhLeG|HCQn<Lb>`+8-s`<T-zrF81 z{<MFJz0>Xc@8<QpFZP*k)ynl%W9ybxE7C-x7ISSaJt#8M>C#Nr7C}LguM(evjqQt# ye;6(mTwZ$p%i?e1YbMO?p1%Kj?lXf0LZ#huk7oriDYB#mGbtI`DJj|izX<?B0QT+x diff --git a/apps/desktopgui/resources/images/logo_red.jpg b/apps/desktopgui/resources/images/logo_red.jpg deleted file mode 100644 index c1a60b8bbe680066069f5db62318055542c75958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmex=<NpH&0WUXCHwH#VMur521O|rxw;7y4JVr_Y$Ph~OgZ2JDz#z!MAi^NY%&5e` zB*@4t$oT&VgA@Y;BP$~VGGJrp;N)WYe}q9xfPs;PiHVVsofRt2%FM#X&cwmU$si&m zDkdovK0R{A)oVBYA7PMWWME=OF^7$VnT3_}{}BddL9i4PGXoPd#2hAOMiy2!K_Lcq zVGa>dCBy%>7<iZ&8JGl_1sUuavRCjPUd@r2_AX9LKK^dS8J$!2JYAeKp3Hn1>Y``B z@bti^BL^N@HZdlx)^p(r;n6I1ylq=$=ydef_P+fSmERwcGpgKT7xBIKz^c;aWxt+X zNY^oQ>oLy1=6C6eZce{va^ux?%chwq`RxjLv3lB0ezRL_C5$_K);8>{SpH5zpkzS} z`x>2B@k`bo>3cD6>9^F4Y^@8Gw59XcIxg7gI@ME7)%d0L=?;?wr&SuOv>q9%pQ|ud z37xJrAyZr^r&;V>%w}I!@xRVDL-rlc6WO1&ojYUFhV9!fa;LX1d|4Qvox0*jzs2=Q zPnNQsIc?PWF|y6oLb`aNc80{x><fV>y3UDf`5bw$o6#`zyuR1v<_VuK8kxkZ+!lGW zRdZd*^wouCT$k5K&iy^DAv~-%u>WR#r(v<6TwPiA_QwWAZ~rqWdDi<~&6l4n`Xc#D z#m!q*vrVhIW5f-YPK;-_R@)VP^7D?c=<NKJFJfHhXa8w>d6U0*;?EetyYqKXS}k_7 zbc_7jou<;#TiC8X_t|;zZJt9}aQH*xDO<Y5WE3Y$ZcgiWTs~>Oz^1elZhWE+^=y;0 zo^DpnS^ezw<>fD)de`0En*3wF(tn1KTDLRSy35tv#BM$gwGC$4EnztETJEDGOLh39 zas`E6dNv#pnbp$AJGEGT!rtDEM!#$VFMQj%`mNT-Nw0d&2h{uBkNnS&;alfA?>|Gr zC%?GmH=<0K{&GA2jrI=YF5}yJqnfdgP1aCQ?V1md4v(yWOOlJRp&Z-vdwbbGeD8a$ zQxsb!{Jfg$>y_>Hud`;?TzML_(O>SU)n4UWUoPIdlsI?#wXHK;T0$}wb_dr?F4)+g z&TH6kO6!f)e})So3npu>;1+UX<v4apVfM|En4BdhC0+UxZaq2Kmn9N%DZ-|}aeWk1 z)-{Jfkz<9;YkquQH1n<SET+SZIai`Y7k+rnWHhs-@kBJ^txZ}R4tz)wd~_$_#JQV- zQrlPa1T^dHEIOMPbnu+l!c*RlX6=xZlV?lI@aiyL(Wrj;lj6#l)VO6j^5+r@6<-}v zb6?-j78LmJvhhd%&3C?C3tg~Vwms<U3+80Uycedk#20S8=((|g?<VhzR8zgh_8In7 zr&+|OGPHQw#=QTYRC35zr7hcT)l1n}$>}GHr+c*Wcjk01IdNjD%mJ^KqC&M>%>Dw; z6(36~zKphToo1;zyC=Hf<>{r<C*KeAPrje=<^0F1xBqo~`0zPsp=gS(>9c^TKO2J5 zLKbuy&TNRNYB+M{%o!K=nKS4Awr3~{+q+iVs+yZOS38A0+u4Wh?`t)NrHm2Vv!oM` UXfZ@gmIzW%5;Ra2l>dJd0LYl~jsO4v diff --git a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java index 2a3a16b63e..e15e5c08b5 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java @@ -8,14 +8,21 @@ import java.awt.event.ActionListener; import javax.swing.SwingWorker; +import net.i2p.I2PAppContext; import net.i2p.desktopgui.router.RouterManager; -import net.i2p.util.Log; -public class ExternalTrayManager extends TrayManager { +/** + * When started before the router, e.g. with + * java -cp i2p.jar:desktopgui.jar net.i2p.desktopgui.Main + * + * No access to context, very limited abilities. + * Not fully supported. + */ +class ExternalTrayManager extends TrayManager { - private final static Log log = new Log(ExternalTrayManager.class); - - protected ExternalTrayManager() {} + public ExternalTrayManager(I2PAppContext ctx) { + super(ctx); + } @Override public PopupMenu getMainMenu() { diff --git a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java index 1cb464308c..90017c0353 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java @@ -11,13 +11,24 @@ import net.i2p.desktopgui.gui.DesktopguiConfigurationFrame; import net.i2p.desktopgui.router.RouterManager; import net.i2p.desktopgui.util.BrowseException; import net.i2p.desktopgui.util.I2PDesktop; +import net.i2p.router.RouterContext; import net.i2p.util.Log; -public class InternalTrayManager extends TrayManager { +/** + * java -cp i2p.jar:desktopgui.jar net.i2p.desktopgui.Main + * + * Full access to router context. + */ +class InternalTrayManager extends TrayManager { - private final static Log log = new Log(InternalTrayManager.class); + private final RouterContext _context; + private final Log log; - protected InternalTrayManager() {} + public InternalTrayManager(RouterContext ctx) { + super(ctx); + _context = ctx; + log = ctx.logManager().getLog(InternalTrayManager.class); + } @Override public PopupMenu getMainMenu() { @@ -56,7 +67,7 @@ public class InternalTrayManager extends TrayManager { @Override protected Object doInBackground() throws Exception { - new DesktopguiConfigurationFrame().setVisible(true); + new DesktopguiConfigurationFrame(_context).setVisible(true); return null; } @@ -73,7 +84,7 @@ public class InternalTrayManager extends TrayManager { @Override protected Object doInBackground() throws Exception { - RouterManager.restart(); + RouterManager.restart(_context); return null; } @@ -91,7 +102,7 @@ public class InternalTrayManager extends TrayManager { @Override protected Object doInBackground() throws Exception { - RouterManager.shutDown(); + RouterManager.shutDown(_context); return null; } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/Main.java b/apps/desktopgui/src/net/i2p/desktopgui/Main.java index c07e03f446..4592ae7b16 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/Main.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/Main.java @@ -7,8 +7,15 @@ package net.i2p.desktopgui; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; + +import net.i2p.I2PAppContext; +import net.i2p.app.ClientAppManager; +import net.i2p.app.ClientAppState; +import static net.i2p.app.ClientAppState.*; import net.i2p.desktopgui.router.RouterManager; import net.i2p.desktopgui.util.*; +import net.i2p.router.RouterContext; +import net.i2p.router.app.RouterApp; import net.i2p.util.Log; import net.i2p.util.Translate; import net.i2p.util.I2PProperties.I2PPropertyCallback; @@ -16,22 +23,57 @@ import net.i2p.util.I2PProperties.I2PPropertyCallback; /** * The main class of the application. */ -public class Main { - - ///Manages the lifetime of the tray icon. - private TrayManager trayManager = null; - private final static Log log = new Log(Main.class); +public class Main implements RouterApp { + + private final I2PAppContext _appContext; + private final RouterContext _context; + private final ClientAppManager _mgr; + private final Log log; + private ClientAppState _state = UNINITIALIZED; + private TrayManager _trayManager; + /** + * @since 0.9.26 + */ + public Main(RouterContext ctx, ClientAppManager mgr, String args[]) { + _appContext = _context = ctx; + _mgr = mgr; + log = _appContext.logManager().getLog(Main.class); + _state = INITIALIZED; + } + + /** + * @since 0.9.26 + */ + public Main() { + _appContext = I2PAppContext.getGlobalContext(); + if (_appContext instanceof RouterContext) + _context = (RouterContext) _appContext; + else + _context = null; + _mgr = null; + log = _appContext.logManager().getLog(Main.class); + _state = INITIALIZED; + } + /** * Start the tray icon code (loads tray icon in the tray area). - * @throws Exception + * @throws AWTException on startup error, including systray not supported */ - public void startUp() throws Exception { - trayManager = TrayManager.getInstance(); + private synchronized void startUp() throws Exception { + final TrayManager trayManager; + if (_context != null) + trayManager = new InternalTrayManager(_context); + else + trayManager = new ExternalTrayManager(_appContext); trayManager.startManager(); + _trayManager = trayManager; + changeState(RUNNING); + if (_mgr != null) + _mgr.register(this); - if(RouterManager.inI2P()) { - RouterManager.getRouterContext().addPropertyCallback(new I2PPropertyCallback() { + if (_context != null) { + _context.addPropertyCallback(new I2PPropertyCallback() { @Override public void propertyChanged(String arg0, String arg1) { @@ -45,26 +87,36 @@ public class Main { } public static void main(String[] args) { - beginStartup(args); + Main main = new Main(); + main.beginStartup(args); } /** * Main method launching the application. + * + * @param args unused */ - public static void beginStartup(String[] args) { - try { - String headless = System.getProperty("java.awt.headless"); - boolean isHeadless = Boolean.parseBoolean(headless); - if(isHeadless) { - log.warn("Headless environment: not starting desktopgui!"); - return; - } - } - catch(Exception e) { + private void beginStartup(String[] args) { + changeState(STARTING); + String headless = System.getProperty("java.awt.headless"); + boolean isHeadless = Boolean.parseBoolean(headless); + if (isHeadless) { + log.warn("Headless environment: not starting desktopgui!"); + changeState(START_FAILED, "Headless environment: not starting desktopgui!", null); return; } try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + //UIManager.LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); + //for (int i = 0; i < lafs.length; i++) { + // System.out.println("LAF " + i + ": " + lafs[i].getName() + ' ' + lafs[i].getClassName()); + //} + String laf = UIManager.getSystemLookAndFeelClassName(); + //System.out.println("Default: " + laf); + UIManager.setLookAndFeel(laf); + //laf = UIManager.getCrossPlatformLookAndFeelClassName(); + //System.out.println("Cross-Platform: " + laf); + //UIManager.setLookAndFeel(laf); + //UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); } catch (ClassNotFoundException ex) { log.log(Log.ERROR, null, ex); } catch (InstantiationException ex) { @@ -73,23 +125,28 @@ public class Main { log.log(Log.ERROR, null, ex); } catch (UnsupportedLookAndFeelException ex) { log.log(Log.ERROR, null, ex); + } catch (Error ex) { + // on permissions error (different user) + // Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable. + log.log(Log.ERROR, "No permissions? Different user?", ex); + changeState(START_FAILED, "No permissions? Different user?", new RuntimeException(ex)); + return; } - ConfigurationManager.getInstance().loadArguments(args); - - final Main main = new Main(); + // TODO process args with getopt if needed - main.launchForeverLoop(); + if (_context == null) + launchForeverLoop(); //We'll be doing GUI work, so let's stay in the event dispatcher thread. SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { - main.startUp(); - } - catch(Exception e) { + startUp(); + } catch(Exception e) { log.error("Failed while running desktopgui!", e); + changeState(START_FAILED, "Failed while running desktopgui!", e); } } @@ -102,7 +159,7 @@ public class Main { * Avoids the app terminating because no Window is opened anymore. * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown */ - public void launchForeverLoop() { + private static void launchForeverLoop() { Runnable r = new Runnable() { public void run() { try { @@ -114,9 +171,60 @@ public class Main { } } }; - Thread t = new Thread(r); + Thread t = new Thread(r, "DesktopGUI spinner"); t.setDaemon(false); t.start(); } - + + /////// ClientApp methods + + /** @since 0.9.26 */ + public synchronized void startup() { + beginStartup(null); + } + + /** @since 0.9.26 */ + public synchronized void shutdown(String[] args) { + if (_state == STOPPED) + return; + changeState(STOPPING); + if (_trayManager != null) + _trayManager.stopManager(); + changeState(STOPPED); + } + + /** @since 0.9.26 */ + public synchronized ClientAppState getState() { + return _state; + } + + /** @since 0.9.26 */ + public String getName() { + return "desktopgui"; + } + + /** @since 0.9.26 */ + public String getDisplayName() { + return "Desktop GUI"; + } + + /////// end ClientApp methods + + /** @since 0.9.26 */ + private void changeState(ClientAppState state) { + changeState(state, null, null); + } + + /** @since 0.9.26 */ + private synchronized void changeState(ClientAppState state, String msg, Exception e) { + _state = state; + if (_mgr != null) + _mgr.notify(this, state, msg, e); + if (_context == null) { + if (msg != null) + System.out.println(state + ": " + msg); + if (e != null) + e.printStackTrace(); + } + } } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java index 227050735c..ac0242dd67 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java @@ -8,58 +8,65 @@ import java.awt.Toolkit; import java.awt.TrayIcon; import java.net.URL; +import net.i2p.I2PAppContext; import net.i2p.desktopgui.i18n.DesktopguiTranslator; -import net.i2p.desktopgui.router.RouterManager; -import net.i2p.util.Log; +import net.i2p.util.SystemVersion; /** * Manages the tray icon life. */ -public abstract class TrayManager { +abstract class TrayManager { - private static TrayManager instance = null; + protected final I2PAppContext _appContext; ///The tray area, or null if unsupported - protected SystemTray tray = null; + protected SystemTray tray; ///Our tray icon, or null if unsupported - protected TrayIcon trayIcon = null; - private final static Log log = new Log(TrayManager.class); - + protected TrayIcon trayIcon; + /** * Instantiate tray manager. */ - protected TrayManager() {} - - protected static TrayManager getInstance() { - if(instance == null) { - boolean inI2P = RouterManager.inI2P(); - if(inI2P) { - instance = new InternalTrayManager(); - } - else { - instance = new ExternalTrayManager(); - } - } - return instance; + protected TrayManager(I2PAppContext ctx) { + _appContext = ctx; } - + /** * Add the tray icon to the system tray and start everything up. */ - protected void startManager() { + public synchronized void startManager() throws AWTException { if(SystemTray.isSupported()) { + // TODO figure out how to get menu to pop up on left-click + // left-click does nothing by default + // MouseListener, MouseEvent, ... tray = SystemTray.getSystemTray(); - trayIcon = new TrayIcon(getTrayImage(), "I2P", getMainMenu()); + // Windows typically has tooltips; Linux (at least Ubuntu) doesn't + String tooltip = SystemVersion.isWindows() ? _t("I2P: Right-click for menu") : null; + trayIcon = new TrayIcon(getTrayImage(), tooltip, getMainMenu()); trayIcon.setImageAutoSize(true); //Resize image to fit the system tray - try { - tray.add(trayIcon); - } catch (AWTException e) { - log.log(Log.WARN, "Problem creating system tray icon!", e); - } + tray.add(trayIcon); + // 16x16 on Windows, 24x24 on Linux, but that will probably vary + //System.out.println("Tray icon size is " + trayIcon.getSize()); + } else { + throw new AWTException("SystemTray not supported"); + } + } + + /** + * Remove the tray icon from the system tray + * + * @since 0.9.26 + */ + public synchronized void stopManager() { + if (tray != null && trayIcon != null) { + tray.remove(trayIcon); + tray = null; + trayIcon = null; } } - protected void languageChanged() { - trayIcon.setPopupMenu(getMainMenu()); + public synchronized void languageChanged() { + if (trayIcon != null) + trayIcon.setPopupMenu(getMainMenu()); } /** @@ -71,14 +78,17 @@ public abstract class TrayManager { /** * Get tray icon image from the desktopgui resources in the jar file. * @return image used for the tray icon + * @throws AWTException if image not found */ - private Image getTrayImage() { + private Image getTrayImage() throws AWTException { URL url = getClass().getResource("/desktopgui/resources/images/logo.png"); + if (url == null) + throw new AWTException("cannot load tray image"); Image image = Toolkit.getDefaultToolkit().getImage(url); return image; } - protected static String _t(String s) { - return DesktopguiTranslator._t(s); + protected String _t(String s) { + return DesktopguiTranslator._t(_appContext, s); } } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java index a697c5779f..98e513eb37 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java @@ -13,8 +13,10 @@ package net.i2p.desktopgui.gui; import java.util.logging.Level; import java.util.logging.Logger; + import net.i2p.desktopgui.i18n.DesktopguiTranslator; import net.i2p.desktopgui.router.RouterManager; +import net.i2p.router.RouterContext; /** * @@ -22,9 +24,12 @@ import net.i2p.desktopgui.router.RouterManager; */ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { + private final RouterContext _context; + /** Creates new form ConfigurationFrame */ - public DesktopguiConfigurationFrame() { + public DesktopguiConfigurationFrame(RouterContext ctx) { initComponents(); + _context = ctx; } /** This method is called from within the constructor to @@ -98,8 +103,8 @@ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { configureDesktopgui(); }//GEN-LAST:event_okButtonMouseReleased - protected static String _t(String s) { - return DesktopguiTranslator._t(s); + private String _t(String s) { + return DesktopguiTranslator._t(_context, s); } private void configureDesktopgui() { @@ -114,7 +119,7 @@ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { System.out.println("Enabling desktopgui"); } try { - RouterManager.getRouterContext().router().saveConfig(property, value); + _context.router().saveConfig(property, value); } catch (Exception ex) { Logger.getLogger(DesktopguiConfigurationFrame.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java index 3778c4ad93..9fae60ed14 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java @@ -7,20 +7,11 @@ public class DesktopguiTranslator { private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages"; - private static I2PAppContext ctx; - - private static I2PAppContext getRouterContext() { - if(ctx == null) { - ctx = I2PAppContext.getCurrentContext(); - } - return ctx; - } - - public static String _t(String s) { - return Translate.getString(s, getRouterContext(), BUNDLE_NAME); + public static String _t(I2PAppContext ctx, String s) { + return Translate.getString(s, ctx, BUNDLE_NAME); } - public static String _t(String s, Object o) { - return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME); + public static String _t(I2PAppContext ctx, String s, Object o) { + return Translate.getString(s, o, ctx, BUNDLE_NAME); } } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java index 82b36938ac..9267bcef08 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java @@ -16,29 +16,9 @@ import net.i2p.util.Log; */ public class RouterManager { - private final static Log log = new Log(RouterManager.class); - private static I2PAppContext context = I2PAppContext.getCurrentContext(); - - public static I2PAppContext getAppContext() { - return context; - } - - public static RouterContext getRouterContext() throws Exception { - if(context.isRouterContext()) { - return (RouterContext) context; - } - else { - throw new Exception("No RouterContext available!"); - } - } - - private static Router getRouter() { - try { - return getRouterContext().router(); - } catch (Exception e) { - log.error("Failed to get router. Why did we request it if no RouterContext is available?", e); - return null; - } + /** @return non-null */ + private static I2PAppContext getAppContext() { + return I2PAppContext.getGlobalContext(); } /** @@ -53,9 +33,10 @@ public class RouterManager { //TODO: set/get PID String separator = System.getProperty("file.separator"); String location = getAppContext().getBaseDir().getAbsolutePath(); - - Runtime.getRuntime().exec(location + separator + "i2psvc " + location + separator + "wrapper.config"); + String[] args = new String[] { location + separator + "i2psvc", location + separator + "wrapper.config" }; + Runtime.getRuntime().exec(args); } catch (IOException e) { + Log log = getAppContext().logManager().getLog(RouterManager.class); log.log(Log.WARN, "Failed to start I2P", e); } } @@ -63,17 +44,14 @@ public class RouterManager { /** * Restart the running I2P instance. */ - public static void restart() { - if(inI2P()) { - getRouter().restart(); - } + public static void restart(RouterContext ctx) { + ctx.router().restart(); } /** * Stop the running I2P instance. */ - public static void shutDown() { - if(inI2P()) { + public static void shutDown(RouterContext ctx) { Thread t = new Thread(new Runnable() { @Override @@ -83,14 +61,6 @@ public class RouterManager { }); t.start(); - getRouter().shutdown(Router.EXIT_HARD); - } - } - - /** - * Check if we are running inside I2P. - */ - public static boolean inI2P() { - return context.isRouterContext(); + ctx.router().shutdown(Router.EXIT_HARD); } } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java b/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java deleted file mode 100644 index cc0516bd61..0000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.i2p.desktopgui.util; - -import java.util.HashMap; -import java.util.Map; - -/** - * Manage the configuration of desktopgui. - * @author mathias - * - */ -public class ConfigurationManager { - - private static ConfigurationManager instance; - ///Configurations with a String as value - private Map<String, String> stringConfigurations = new HashMap<String, String>(); - ///Configurations with a Boolean as value - private Map<String, Boolean> booleanConfigurations = new HashMap<String, Boolean>(); - - private ConfigurationManager() {} - - public static ConfigurationManager getInstance() { - if(instance == null) { - instance = new ConfigurationManager(); - } - return instance; - } - - /** - * Collects arguments of the form --word, --word=otherword and -blah - * to determine user parameters. - * @param args Command line arguments to the application - */ - public void loadArguments(String[] args) { - for(int i=0; i<args.length; i++) { - String arg = args[i]; - if(arg.startsWith("--")) { - arg = arg.substring(2); - if(arg.length() < 1) { - continue; - } - int equals = arg.indexOf('='); - if(equals != -1 && equals < arg.length() - 1) { //String configuration - loadStringConfiguration(arg, equals); - } - else { //Boolean configuration - loadBooleanConfiguration(arg); - } - } - else if(arg.startsWith("-")) { //Boolean configuration - loadBooleanConfiguration(arg); - } - } - } - - /** - * Add a boolean configuration. - * @param arg The key we wish to add as a configuration. - */ - public void loadBooleanConfiguration(String arg) { - booleanConfigurations.put(arg, Boolean.TRUE); - } - - /** - * Add a String configuration which consists a key and a value. - * @param arg String of the form substring1=substring2. - * @param equalsPosition Position of the '=' element. - */ - public void loadStringConfiguration(String arg, int equalsPosition) { - String key = arg.substring(0, equalsPosition); - String value = arg.substring(equalsPosition+1); - stringConfigurations.put(key, value); - } - - /** - * Check if a specific boolean configuration exists. - * @param arg The key for the configuration. - * @param defaultValue If the configuration is not found, we use a default value. - * @return The value of a configuration: true if found, defaultValue if not found. - */ - public boolean getBooleanConfiguration(String arg, boolean defaultValue) { - Boolean value = booleanConfigurations.get("startWithI2P"); - System.out.println(value); - if(value != null) { - return value; - } - return defaultValue; - } - - /** - * Get a specific String configuration. - * @param arg The key for the configuration. - * @param defaultValue If the configuration is not found, we use a default value. - * @return The value of the configuration, or the defaultValue. - */ - public String getStringConfiguration(String arg, String defaultValue) { - String value = stringConfigurations.get(arg); - System.out.println(value); - if(value != null) { - return value; - } - return defaultValue; - } -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java b/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java index 6ddfc4a970..696088cfb6 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java @@ -3,12 +3,9 @@ package net.i2p.desktopgui.util; import java.awt.Desktop; import java.awt.Desktop.Action; import java.net.URI; -import net.i2p.util.Log; public class I2PDesktop { - private final static Log log = new Log(I2PDesktop.class); - public static void browse(String url) throws BrowseException { if(Desktop.isDesktopSupported()) { Desktop desktop = Desktop.getDesktop(); @@ -27,4 +24,4 @@ public class I2PDesktop { throw new BrowseException(); } } -} \ No newline at end of file +} -- GitLab