From fe1c8d24b9550ecd34127c63f78f1e0ad52479ec Mon Sep 17 00:00:00 2001 From: tonyhcj Date: Thu, 1 Oct 2026 11:18:10 -0300 Subject: [PATCH] Implementa facade --- .gitignore | 7 ++ pitiupi.chat/build/built-jar.properties | 6 +- .../classes/pitiupi/chat/GUI/ChatMenu.class | Bin 1552 -> 1552 bytes .../pitiupi/chat/GUI/ChatWindow$1.class | Bin 944 -> 848 bytes .../classes/pitiupi/chat/GUI/ChatWindow.class | Bin 5713 -> 5713 bytes .../pitiupi/chat/net/ChatMessage.class | Bin 876 -> 876 bytes .../pitiupi/chat/plugin/ChatPlugin.class | Bin 2195 -> 2195 bytes pitiupi.chat/dist/pitiupi.chat.jar | Bin 13171 -> 13072 bytes pitiupi.chat/nbproject/project.properties | 4 +- .../src/pitiupi/chat/GUI/ChatWindow.java | 20 ++-- .../src/pitiupi/chat/plugin/ChatPlugin.java | 16 ++- pitiupi.screenCast/build/built-jar.properties | 6 +- .../screenCast/GUI/ScreenCastMenu.class | Bin 1644 -> 1644 bytes .../screenCast/GUI/ScreenCastWindow.class | Bin 6008 -> 6008 bytes .../screenCast/control/AlarmClock.class | Bin 629 -> 629 bytes .../control/ImageTransformation.class | Bin 2970 -> 2970 bytes .../screenCast/control/ScreenShot.class | Bin 954 -> 954 bytes .../screenCast/net/ScreenCastMessage.class | Bin 925 -> 925 bytes .../screenCast/plugin/ScreenCastPlugin.class | Bin 2325 -> 2325 bytes pitiupi.screenCast/dist/README.TXT | 32 ------ pitiupi.screenCast/dist/lib/pitiupi.jar | Bin 22983 -> 0 bytes .../dist/pitiupi.screenCast.jar | Bin 18079 -> 18047 bytes .../nbproject/project.properties | 4 +- .../build/classes/.netbeans_automatic_build | 0 .../build/classes/.netbeans_update_resources | 0 pitiupi/build/classes/pitiupi/GUI/Login.class | Bin 3607 -> 3534 bytes .../classes/pitiupi/GUI/MainWindow.class | Bin 3644 -> 4101 bytes .../build/classes/pitiupi/GUI/MenuBar.class | Bin 2699 -> 2636 bytes pitiupi/build/classes/pitiupi/Main$1.class | Bin 813 -> 740 bytes pitiupi/build/classes/pitiupi/Main.class | Bin 2015 -> 1985 bytes .../pitiupi/control/PluginLoader.class | Bin 3974 -> 3944 bytes .../build/classes/pitiupi/net/Message.class | Bin 778 -> 778 bytes .../build/classes/pitiupi/net/Socket.class | Bin 3474 -> 6378 bytes .../build/classes/pitiupi/plugin/Plugin.class | Bin 383 -> 323 bytes pitiupi/dist/pitiupi.jar | Bin 22983 -> 38807 bytes pitiupi/nbproject/private/private.properties | 2 +- pitiupi/nbproject/private/private.xml | 5 +- pitiupi/nbproject/project.properties | 4 +- pitiupi/plugins/pitiupi.screenCast.jar | 1 - pitiupi/src/pitiupi/GUI/MainWindow.java | 13 +++ pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java | 39 +++++++ .../src/pitiupi/control/HeartbeatManager.java | 98 ++++++++++++++++++ pitiupi/src/pitiupi/control/PeerInfo.java | 37 +++++++ pitiupi/src/pitiupi/control/PeerListener.java | 7 ++ pitiupi/src/pitiupi/control/PluginLoader.java | 17 +-- pitiupi/src/pitiupi/net/HeartbeatMessage.java | 20 ++++ pitiupi/src/pitiupi/net/Message.java | 2 +- pitiupi/src/pitiupi/net/Socket.java | 72 ++++++++++++- pitiupi/src/pitiupi/plugin/PitiupiFacade.java | 35 +++++++ pitiupi/src/pitiupi/plugin/Plugin.java | 7 +- 50 files changed, 366 insertions(+), 88 deletions(-) create mode 100644 .gitignore delete mode 100644 pitiupi.screenCast/dist/README.TXT delete mode 100644 pitiupi.screenCast/dist/lib/pitiupi.jar delete mode 100644 pitiupi/build/classes/.netbeans_automatic_build delete mode 100644 pitiupi/build/classes/.netbeans_update_resources delete mode 120000 pitiupi/plugins/pitiupi.screenCast.jar create mode 100644 pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java create mode 100644 pitiupi/src/pitiupi/control/HeartbeatManager.java create mode 100644 pitiupi/src/pitiupi/control/PeerInfo.java create mode 100644 pitiupi/src/pitiupi/control/PeerListener.java create mode 100644 pitiupi/src/pitiupi/net/HeartbeatMessage.java create mode 100644 pitiupi/src/pitiupi/plugin/PitiupiFacade.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53d2375 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/pitiupi/build/ +/pitiupi/dist/ +/pitiupi.chat/build/ +/pitiupi.chat/dist/ +/pitiupi.chat/nbproject/private/ +/pitiupi.screenCast/build/ +/pitiupi.screenCast/dist/ diff --git a/pitiupi.chat/build/built-jar.properties b/pitiupi.chat/build/built-jar.properties index 499f65e..8290d48 100644 --- a/pitiupi.chat/build/built-jar.properties +++ b/pitiupi.chat/build/built-jar.properties @@ -1,6 +1,6 @@ -#Thu, 16 Jul 2026 15:21:36 -0300 +#Fri, 17 Jul 2026 17:31:55 -0300 -/home/flavio/NetBeansProjects/pitiupi.chat= +/home/perolanegra/facul/pitiupi/pitiupi.chat= -/home/flavio/NetBeansProjects/pitiupi= +/home/perolanegra/facul/pitiupi/pitiupi= diff --git a/pitiupi.chat/build/classes/pitiupi/chat/GUI/ChatMenu.class b/pitiupi.chat/build/classes/pitiupi/chat/GUI/ChatMenu.class index e78acc994fa3a5f5656aebb47946a22944d40069..de16c2373808ba9c62964bf0c91f38df3ac13df5 100644 GIT binary patch delta 17 ZcmbQhGl7TW)W2Q(7#J8FH*#>W0RTE|1&IIv delta 17 ZcmbQhGl7TW)W2Q(7#J8_H*#>W0RTFH1&sgz diff --git a/pitiupi.chat/build/classes/pitiupi/chat/GUI/ChatWindow$1.class b/pitiupi.chat/build/classes/pitiupi/chat/GUI/ChatWindow$1.class index 254570a23ac208393b71cf8cb134d27e000c826d..3d5ef320b13ddf1a03812f5e273def8434087cf0 100644 GIT binary patch delta 348 zcmYk1-7dsX6otRjcG{Wts8eb%V~qcwHp3f8L_)lPcokRNxK|#4M<5u93)kYx6N%Ll zagwvwIy-BBJLf+740|76uW!IUWd{#GBCxaw4TI{oUtNuoHl2vrl3=U%QIawl;VcAc*YwC==3`HU%Eh#s0u zPc_7-9?)0q{-ju7pqKIu&9ErnQtZMhJY-3=#-99Qv+``rgp2RA;0ZHky2ks|_*4pq sbU4Cs{BKS6w^vS^?Y&KkR82{}Q+uT)G*4heQ+2|UHL zXs3HeaP3Nhoo&-?8MheD1A3c*PJMt;(YQFQ5oH~VP5z#-f1k0LVOBcl{9DQ*h$B%W V%e;7yG&x*kDZVJ+J@( diff --git a/pitiupi.chat/build/classes/pitiupi/chat/GUI/ChatWindow.class b/pitiupi.chat/build/classes/pitiupi/chat/GUI/ChatWindow.class index 4d4bde24b1457d32fe3713a0edd3bd467f67fea0..6b441178d4af5bff0da6ad314fc9954ceeb6b1ac 100644 GIT binary patch delta 17 Zcmcbpb5V!m)W2Q(7#J8FH*$E20RTqc2Alu@ delta 17 Zcmcbpb5V!m)W2Q(7#J8_H*$E20RTqw2A}`{ diff --git a/pitiupi.chat/build/classes/pitiupi/chat/net/ChatMessage.class b/pitiupi.chat/build/classes/pitiupi/chat/net/ChatMessage.class index de14b13bc396d0d254efbf2b05ab996a250453af..869eaed596db1a9a71f7a52717dd2024e4fe7834 100644 GIT binary patch delta 17 ZcmaFE_J)n))W2Q(7#J8FH*%yf0{}(s295v# delta 17 ZcmaFE_J)n))W2Q(7#J8_H*%yf0{}(=29f{( diff --git a/pitiupi.chat/build/classes/pitiupi/chat/plugin/ChatPlugin.class b/pitiupi.chat/build/classes/pitiupi/chat/plugin/ChatPlugin.class index b5d0c5d83f8ef566308584cd980069098e27b0b3..7e4c905ae5f691ba6e56b3f1292e38da9ff29059 100644 GIT binary patch delta 17 ZcmbO%I9ZV6)W2Q(7#J8FH*$1y002B{1|9$a delta 17 ZcmbO%I9ZV6)W2Q(7#J8_H*$1y002CG1|k3e diff --git a/pitiupi.chat/dist/pitiupi.chat.jar b/pitiupi.chat/dist/pitiupi.chat.jar index 78438b7b633c374e68616d7b4e9635f71c5c60f2..5ddc2424633eab15a54d0bea4ab0a0266846161c 100644 GIT binary patch delta 1087 zcmZWoOH30{6g_XI&~`e5Qz)&{VoUk7fc*`k;zF%Ng&<1APhxO^e6$M+(YnA5G%;?_ zM0g7mS0pwu8aImI!Wd%W!kru4xN$?G2_f33F-8~OH>F_lCGXxlch0*f@1FanUUeh;mQ30BN2^9 z+glTf$nn$tfpBtc@cMW9sKHfyg^?ROEG9JjD~)3>m&>CdoTroXZ7 z7g$Wn^zs#U(U$4`I`AU+V}_rQ43=ETN|oiB$i4J+E%nJjAD_1+s*-56LxOCDMMW9P z8EW}-m6xBlM;tcTtx!}rpz=9;q@n`btk6|BQOV%pdBww5?A3M`s;zLV@XTq!g$54;8AqBCH+E-F(b(RN@v`5hD;ATKgXOY0(7%X3(tn3x)}^KG;-T%-y zH)x!wLy&6Lo2Qr#3mPbt(1<4T7Pt^Xvzc+Bg}g#waUWU*?No7n(eg)KtBw4Yx|?Kp zrS`i`X*v!62kxtHr`)Ofv~1?4aOf9*)3lc*pN8(*WSS{{FSbuB87lrU*6ycK7$`6m zY~{v>jEQaiM+{X%4Iu99~$p!J}xQTYp5oC<3Z3&2(gPRm%T|nGhf57 z;W7m>g`76r7LU6AXVIwKl=H3OmL3H8CnLTor@zf@>8F9ATkPcL+T7*gm>~EI0e<1b delta 1177 zcmZvbOH30{6o&shgMCbA%CyuXAW#dIQf#NKJbV!45fwuOjPaEq31E#i4PtF$Bu41Y zN220g=!R%abzxj!K-87G(TxjTn7A_0y+LE5i5oq4ieRIYoX5TM-T$<6&b@Z*+c9mR zS1wTi8!$idWm*fm<|e)jhA#ErJOMzMhhH(ur;oIBwP{LsIx(C{91VA!-QtV4M52+6 zO`F5e<}DaG<{!!lLjjMbU3fd$Q&V>Nu7IhXPcW}Ib) zG(W*VvJo2{84SrY9lTeHvmJBiCAUQrd-yji&%?wbMVhTcN0MK;<87y$&Zzt`1eRD7EK_*9N@l}aT+Tf&5#&liCQ6`bOP(!hn zvTn%cPHCv=@Ds3uk6;ZwhW5||edH}*Cbo{ew}8TrI$8mxrX)i><*Nvr(g|LV0C}N( zfN*J&5?9j#%5>#6l+Zk^3#btCGJNEn6oH+vV;6Mn#!4C2av2vI5G2h;^Ayujf)J$= zny`Ul2`UkWVeV8SN>L%0rbj#juD^$AFnwXv$s5&X>e-OG&ujK^PkP%Y{?y+>dyD=t z*)96mcDLsWCkbKoxE}NJ*CB;p4QK?-1a8>Od1x~>X+@*S&lxSX;&`EU!Mm3iIzD&4 z;%|&~|1e8GmPo<;;Ci&&tPqM;wO7-J9ZzPG+3}R|BQIZ&qGGP1Vm&+; z_5D+D=SLqIIUuv&G~C(OO{*%M6guz2}{=)|GoP8S_f*5+7z|{C=#` zS9CY1%~QMnvJ|Q=}}+ p|A(fS&nb2MMYN1}R5)W2Q(7#J8FH*)ZD0suSB1*ZT2 delta 17 ZcmbO#G*yV>)W2Q(7#J8_H*)ZD0suSV1*-r6 diff --git a/pitiupi.screenCast/dist/README.TXT b/pitiupi.screenCast/dist/README.TXT deleted file mode 100644 index 28b99c7..0000000 --- a/pitiupi.screenCast/dist/README.TXT +++ /dev/null @@ -1,32 +0,0 @@ -======================== -BUILD OUTPUT DESCRIPTION -======================== - -When you build an Java application project that has a main class, the IDE -automatically copies all of the JAR -files on the projects classpath to your projects dist/lib folder. The IDE -also adds each of the JAR files to the Class-Path element in the application -JAR files manifest file (MANIFEST.MF). - -To run the project from the command line, go to the dist folder and -type the following: - -java -jar "pitiupi.screenCast.jar" - -To distribute this project, zip up the dist folder (including the lib folder) -and distribute the ZIP file. - -Notes: - -* If two JAR files on the project classpath have the same name, only the first -JAR file is copied to the lib folder. -* Only JAR files are copied to the lib folder. -If the classpath contains other types of files or folders, these files (folders) -are not copied. -* If a library on the projects classpath also has a Class-Path element -specified in the manifest,the content of the Class-Path element has to be on -the projects runtime path. -* To set a main class in a standard Java project, right-click the project node -in the Projects window and choose Properties. Then click Run and enter the -class name in the Main Class field. Alternatively, you can manually type the -class name in the manifest Main-Class element. diff --git a/pitiupi.screenCast/dist/lib/pitiupi.jar b/pitiupi.screenCast/dist/lib/pitiupi.jar deleted file mode 100644 index 85ec1b823a9a5e1d01b01f9f8fec4825a5bc7abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22983 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 delta 935 zcmaJ<&u|L^Y7`G9J=&!9(x@@%rRl*xpz-Xb(Gc(cm^X`*I{D)c^~XF`cCW zOhp>PM1@gM%zf~VnsK{JC$;JXrkD`JR28cBE!N`3f%RdfpAd{7+@@~WNH}crJSy+~ z-2TA2&uktStNlhqU-@F#ho`0sG_$#HYIu0faWZ=X=KNEv_S}C*;I*sunja1aE{Yk_ zgm^r(34vP!Trc_{_+win1Vhv7*o@H548l3Zz~B=czM`y&oG92>ErKbcGV)xcEpm!x z{AI~yA_PO>Ezf3;fE+h4P%J)d!s}gD6M6^Wi5kTppHwgP!GY?>jVmb%t?kMx-n#x0mwL&%DU)eENT4 zdLowqXVRm{a6Ro6W(2ScE?7$sVdYiYOIP82I_CSw&0aHvyuSZkJH^a}(agI{ z2}9C>*G*hPF+1V$wBxVKZ>HVCf}j8E*c|Y!ON4Ge8z2NDq9Ym$biqbAdTI#r8BJL? z1iAxGrFWp6@$xot1YWRd!H{)ePlSPoVJd2eLs_j&oDCSsx&;#FM6+3`e_q8?zX6r) B1e*W= diff --git a/pitiupi.screenCast/nbproject/project.properties b/pitiupi.screenCast/nbproject/project.properties index 59c1b5f..38e2f1b 100644 --- a/pitiupi.screenCast/nbproject/project.properties +++ b/pitiupi.screenCast/nbproject/project.properties @@ -45,8 +45,8 @@ javac.modulepath= javac.processormodulepath= javac.processorpath=\ ${javac.classpath} -javac.source=25 -javac.target=25 +javac.source=21 +javac.target=21 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/pitiupi/build/classes/.netbeans_automatic_build b/pitiupi/build/classes/.netbeans_automatic_build deleted file mode 100644 index e69de29..0000000 diff --git a/pitiupi/build/classes/.netbeans_update_resources b/pitiupi/build/classes/.netbeans_update_resources deleted file mode 100644 index e69de29..0000000 diff --git a/pitiupi/build/classes/pitiupi/GUI/Login.class b/pitiupi/build/classes/pitiupi/GUI/Login.class index b5380ba81a723f924c6817e970ebcb2e0039ac08..2488cd0ae4e5d375c47e656335fb87b8f0189db1 100644 GIT binary patch delta 186 zcmXAiOAf(M6o&uX8>-j6sgOv76&M&w#Ha&%5PPu*xdQ_OTObXks@|`n9t#qu3{KAX zooBximqqmPLjVrmW6?JC&>Yn~JB77?jg5p4&rV~P*j{4#v!lQXXA>8R2v@h8DKHl6 zo>gT}H?S0EOh>Z8874ZfTAY@2N7b`4%z>PdoYVv5G!tjwSkQX|0hW}DLnJza+D)W2Q(7#J8_8Ln*PieR@^&M!*W%S$auN=?iw)(g%rElN)HNi9pwam>rh zFG(!P%+D)kWDxPmN-Rs%&q>Tn*Y__=Eh@@PNwuDwz`jXuCqFC0Aua}fhQmAzdl+`| zvoRb6@s9B@>;Usla50=@IK|Fznup;G!`aOa9Kwt&7Z@2-CvW5spWM&E$IQ-fX>&a% zFEb<4opDvGFA1>YT@;wzhMceu?td_}}pe8X4Z576)jXgs&KY_%@&ho0v=&pF@o@;&Ev zdd0S=e)R9j8K9NZqxycW5FN1c*5H8Ea$6>y&t_6BZDul??=_S8jmdPf-^}XV%Q+Fk z+-Gn<4=5JjUg4o=?D)SZi4YGeR-AR)(AD0uDV?&?1+yz>W^3Igw*L$t5B#QBW1orC>#I95nL7ptLY%b!h^$qH-KaNL$u7tm`P@m_ zZTiXvX<6>IoJSPJRM9p~M0AaJMb6kmdSc6a@?K9!{}69WnT1lF zwL&m#7HV!1n!BXd?)i{Hx<{?z13vU-KHzU%`tVnML^Ywhh$CcoM zphK1DTNXrr!ej~ED!F_TKO*3|W`~J+zV)IZDSY=9gVcGBbE^^I2%kzA#Zf+U&l!75 zbzQ+7l~=jBVD4jlUdmnG_T80*TML4};7h5({U0p{uPg(%NpNKRvm*aZn)hjZB@6zw b*nE7$aXG`{|GoUaqW#M6oMPEO%G*Z< delta 1026 zcmZva>2FM76vlsdX6{^b=gw3|qaoCYqOLHZf~I1LR$@yUL2MBtCNZL|mx%IH`^q1!bo#&Tv-4OeNCGld0tT%?S-($*Nqg^A;EIYZx1nsV%js zgvli?8(gtyP~VKG|C+^h8kKLr`}~266X}h$8>-@4(MAuSIk1S(=^oTU_>)jO>lhKPBPMZgdmnH^B5@7<22yv zBZ#7L!?oR%-lTt;#NVvG2g^%a#9o9UcQHOj6JQKs#xj%=(Za4q&d>{E<9An3v4vt0c{ z#dIA@Wjf2;B!hE-zmf=qdvr)?=UsG76sOZp?q@{&ODxnX-oCt6^vf$Nul7H<&grTz zcul|Hhdh#~X4d~bli~lO*Y$(W?doIMxGuNW6P}86Hur^`XS@^5l)r91@R1=u0ayF5 A8vpff$?3=9m83|$+!7O+g-%kot(i=UODf{THJp^}FolL5r52Jvcm7;=F; zHikMbhI)nuc7{eCh9-vQ%@0_G8ClvG8B`|+vWZXDXX9gLXXuzL&z{T3IJuWSbn{zw zCq`DFISh=GO*kESvl((27#WyAW&uTdIfKO^A{-1{40#OsKp94c0)|4M921wbbrFLY tkk8Ce40IzCLkUAEkQM{7YJp;94CO!!VO0THEkHRgpz2nJc7{#{NdVIOD`5Zt delta 287 zcmX>j(k;q$>ff$?3=9me4BZ>K7O+SN_@3Ntdc zPkzXz#n?HShdq~(X>t{NC|4%XN>)Y&ZU%_Joz|)W2Q(7#J8F8FV*tO<;R8H!(Ahhe3%!YqB^~ uDrh zFG(!P%+D)kWDxPmN-Rs%&q>Tn*Y__=Eh@@PNu4~MQBPEhk%6Zmvm~>$AXDErF*A>c zL5V?U@-4@+PH&w0@%0 zye&E}VuffEpA8OQJn|GA%JzYKTYazjQL?-v%u5EDCPyO|7~V4@F3M#>9E8-El@vt_=gcur0}H}E zA=jIWvbiLr2j@R+nj4zsXpIvi4auS^>8svL1b>m~53VvPU* delta 499 zcmXw#%TH556opPx*)E!BrG7B_y>?1dQ%&e+qA{4I~K;> z=tf10PZUw{`b5PiKJW!1s2dY^E_Gqz#@0iLlgxR1zw^kW~MSZ1$6Rt!ld-d zrXIhvFUaii3f=*~xe=wUHNanr1elP2HB$dN6do;eOby{J%122;s$O@HNFAcAFt(kFo!`tv%Jf;%w z4Ih}*%(-mjqy1&(>lPFn>~6E#mQ8&_G1VOe{eyYUXZy3EQ$_4{wZPN(#cf#`<&I<#?s89jN>;xRHpzXt??j)f*~c~ev}T_( OFO^2LPb~6tf?L^>5cc1_lPljT}tO066IdXaE2J delta 17 YcmeBT>tf?L^>5cc1_lP#jT}tO066^xYybcN diff --git a/pitiupi/build/classes/pitiupi/net/Socket.class b/pitiupi/build/classes/pitiupi/net/Socket.class index d182b433fead8cece327f740698754dc49c7384e..9a1e1bbe22c6f58951a38860823f5cb82a72b19a 100644 GIT binary patch literal 6378 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 delta 1432 zcmYk6`BPg}6vw|e+s$&>A_US-0fAyjD52xjT9_(O+73!eZ7NuC3*?ao(>#1hkX9w` zbzitvTlc!*j$nP1F1T;};y9!Kfd1w$`l~ZmJU39rAM)fnkIrcMLG8!9?g_C-?r*G%P zur`)W>S-71&@V868|0F;+UmrO(r^YnH{oWETLf;!ZPK*0`J)&T7)C9FGpk3lMlzk? z&=@LZ#8p}5MjQzNI}S2z2n=@hP*SpfBj}k#p5tDD`*6SPa9rk` z#DfA4;bEyes;wN4$P&-G;y4}?cpOhKxD#4dUa&UoDaDZDeOlldJWHwRygQbSG1vl4 zgIyjRg%o%W$0*|}RYc2VVhK`fCvpYu#0v`C!Er*Ci~1rrUc$>9uLx|!t8z?4O7J>P za=an%Cf-t2`b$*G-$i2)Ild!sIi?wQ1mvH>FT+JY$>!o+Wu*}jTx~+T2?bM za;#VjSch^W9P6-y_=Yb|W&_)4BEscNs+jYLaY%MNL=bfzV$=Zs;k zR~y$-o$0imjj48L7|Q<_qi58{_a-(40lR_>6Atj9f`4 z4el`_CCQZ4QIK477V!h2(4rDdKW-wwbsi%TRRofooF!jNL0fUbe+ywwfnJ^=FIDX5MG%t?m>M*?R3N|7wVl=hZ}&N8FVW-`&O8oXL>ODa z$}HechCQ1Wa1X-?G?DQD!xuQ(W?SjZqb8oD=J;)d{nP@cESO&YWqMf&SZPij%{b6T z*|t-guA-V^+YCmZ|PLe-glYE4ts#f}gCZ3&5{!EO)bgDPYFmYO3Y0yNi8a7WMC`L%uC5HpSZ}0 zgFQF3xHvIAb>bs8Lq-N}pf*-U1|9|m7DfhM20k#&&mh16ml6c3U}O*il1vQ30Qp1~ A-2eap diff --git a/pitiupi/dist/pitiupi.jar b/pitiupi/dist/pitiupi.jar index 85ec1b823a9a5e1d01b01f9f8fec4825a5bc7abc..f4b836537b294c88859e80928ba55beeecb7aefd 100644 GIT binary patch delta 15355 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 - - file:/home/flavio/NetBeansProjects/pitiupi/src/pitiupi/control/PluginManager.java - file:/home/flavio/NetBeansProjects/pitiupi/src/pitiupi/control/ImageTransformation.java - + diff --git a/pitiupi/nbproject/project.properties b/pitiupi/nbproject/project.properties index 19c843c..8b9f096 100644 --- a/pitiupi/nbproject/project.properties +++ b/pitiupi/nbproject/project.properties @@ -46,8 +46,8 @@ javac.modulepath= javac.processormodulepath= javac.processorpath=\ ${javac.classpath} -javac.source=25 -javac.target=25 +javac.source=21 +javac.target=21 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/pitiupi/plugins/pitiupi.screenCast.jar b/pitiupi/plugins/pitiupi.screenCast.jar deleted file mode 120000 index e6a0dc7..0000000 --- a/pitiupi/plugins/pitiupi.screenCast.jar +++ /dev/null @@ -1 +0,0 @@ -../../pitiupi.screenCast/dist/pitiupi.screenCast.jar \ No newline at end of file diff --git a/pitiupi/src/pitiupi/GUI/MainWindow.java b/pitiupi/src/pitiupi/GUI/MainWindow.java index bcd03fe..54e561d 100644 --- a/pitiupi/src/pitiupi/GUI/MainWindow.java +++ b/pitiupi/src/pitiupi/GUI/MainWindow.java @@ -11,6 +11,7 @@ import java.util.List; import javax.swing.JMenu; import pitiupi.control.PluginLoader; import pitiupi.plugin.Plugin; +import pitiupi.control.HeartbeatManager; /** * @@ -23,6 +24,8 @@ public class MainWindow extends javax.swing.JFrame { private javax.swing.JLabel status; private javax.swing.JPanel statusPanel; private javax.swing.JTabbedPane tabbedPane; + private HeartbeatManager heartbeatManager; + private OnlineUsersPanel onlineUsersPanel; private Socket socket; @@ -63,6 +66,12 @@ public class MainWindow extends javax.swing.JFrame { this.socket = new Socket(this); this.socket.start(); + + this.heartbeatManager = new HeartbeatManager(this); + this.onlineUsersPanel = new OnlineUsersPanel(); + this.heartbeatManager.addPeerListener(this.onlineUsersPanel); + this.getContentPane().add(this.onlineUsersPanel, java.awt.BorderLayout.LINE_END); + this.heartbeatManager.start(); this.setSize(new java.awt.Dimension(1024, 768)); this.pluginManager = new PluginLoader(this); @@ -76,6 +85,10 @@ public class MainWindow extends javax.swing.JFrame { System.exit(0); } + public HeartbeatManager getHeartbeatManager() { + return heartbeatManager; + } + public String getUserName(){ return this.userName; } diff --git a/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java b/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java new file mode 100644 index 0000000..690a362 --- /dev/null +++ b/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java @@ -0,0 +1,39 @@ +package pitiupi.GUI; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import pitiupi.control.PeerInfo; +import pitiupi.control.PeerListener; + +public class OnlineUsersPanel extends JPanel implements PeerListener { + + private final DefaultListModel listModel; + private final JList userList; + + public OnlineUsersPanel() { + setLayout(new BorderLayout()); + setBorder(BorderFactory.createTitledBorder("Online")); + setPreferredSize(new Dimension(160, 0)); + + listModel = new DefaultListModel<>(); + userList = new JList<>(listModel); + add(new JScrollPane(userList), BorderLayout.CENTER); + } + + @Override + public void onPeersChanged(List peers) { + SwingUtilities.invokeLater(() -> { + listModel.clear(); + for (PeerInfo peer : peers) { + listModel.addElement(peer.toString()); + } + }); + } +} \ No newline at end of file diff --git a/pitiupi/src/pitiupi/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java new file mode 100644 index 0000000..865cb73 --- /dev/null +++ b/pitiupi/src/pitiupi/control/HeartbeatManager.java @@ -0,0 +1,98 @@ +package pitiupi.control; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import pitiupi.GUI.MainWindow; +import pitiupi.net.HeartbeatMessage; + +public class HeartbeatManager { + + private static final long HEARTBEAT_INTERVAL_MS = 5000; + private static final long PEER_TIMEOUT_MS = 15000; // ~3 batimentos perdidos + + private final MainWindow mainWindow; + private final Map peers = new ConcurrentHashMap<>(); + private final List listeners = new CopyOnWriteArrayList<>(); + private ScheduledExecutorService scheduler; + + public HeartbeatManager(MainWindow mainWindow) { + this.mainWindow = mainWindow; + } + + public void start() { + scheduler = Executors.newScheduledThreadPool(1); + scheduler.scheduleAtFixedRate(this::announce, 0, HEARTBEAT_INTERVAL_MS, TimeUnit.MILLISECONDS); + scheduler.scheduleAtFixedRate(this::checkTimeouts, HEARTBEAT_INTERVAL_MS, HEARTBEAT_INTERVAL_MS, TimeUnit.MILLISECONDS); + } + + public void stop() { + if (scheduler != null) { + scheduler.shutdownNow(); + } + } + + private void announce() { + try { + HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName()); + mainWindow.getSocket().send(msg.toByteArray()); + } catch (IOException ex) { + Logger.getLogger(HeartbeatManager.class.getName()).log(Level.WARNING, "Falha ao enviar heartbeat", ex); + } + } + + // Chamado pelo Socket quando um pacote é identificado como heartbeat + public void receiveHeartbeat(HeartbeatMessage msg, InetAddress from) { + // ignora o próprio heartbeat (multicast normalmente ecoa pro remetente) + if (msg.getUserName().equals(mainWindow.getUserName())) { + return; + } + + String key = from.getHostAddress() + "#" + msg.getUserName(); + boolean isNew = !peers.containsKey(key); + + PeerInfo peer = peers.computeIfAbsent(key, k -> new PeerInfo(msg.getUserName(), from, msg.getTimestamp())); + peer.touch(System.currentTimeMillis()); + + if (isNew) { + notifyListeners(); + } + } + + private void checkTimeouts() { + long now = System.currentTimeMillis(); + boolean changed = peers.values().removeIf(p -> now - p.getLastSeen() > PEER_TIMEOUT_MS); + if (changed) { + notifyListeners(); + } + } + + private void notifyListeners() { + List snapshot = new ArrayList<>(peers.values()); + for (PeerListener l : listeners) { + l.onPeersChanged(snapshot); + } + } + + public void addPeerListener(PeerListener l) { + listeners.add(l); + l.onPeersChanged(new ArrayList<>(peers.values())); + } + + public void removePeerListener(PeerListener l) { + listeners.remove(l); + } + + public List getPeers() { + return new ArrayList<>(peers.values()); + } +} diff --git a/pitiupi/src/pitiupi/control/PeerInfo.java b/pitiupi/src/pitiupi/control/PeerInfo.java new file mode 100644 index 0000000..ce855fc --- /dev/null +++ b/pitiupi/src/pitiupi/control/PeerInfo.java @@ -0,0 +1,37 @@ +package pitiupi.control; + +import java.net.InetAddress; + +public class PeerInfo { + + private final String userName; + private final InetAddress address; + private volatile long lastSeen; + + public PeerInfo(String userName, InetAddress address, long lastSeen) { + this.userName = userName; + this.address = address; + this.lastSeen = lastSeen; + } + + public String getUserName() { + return userName; + } + + public InetAddress getAddress() { + return address; + } + + public long getLastSeen() { + return lastSeen; + } + + public void touch(long timestamp) { + this.lastSeen = timestamp; + } + + @Override + public String toString() { + return userName + " (" + address.getHostAddress() + ")"; + } +} diff --git a/pitiupi/src/pitiupi/control/PeerListener.java b/pitiupi/src/pitiupi/control/PeerListener.java new file mode 100644 index 0000000..aa9ed74 --- /dev/null +++ b/pitiupi/src/pitiupi/control/PeerListener.java @@ -0,0 +1,7 @@ +package pitiupi.control; + +import java.util.List; + +public interface PeerListener { + void onPeersChanged(List peers); +} diff --git a/pitiupi/src/pitiupi/control/PluginLoader.java b/pitiupi/src/pitiupi/control/PluginLoader.java index 386724a..d7440c4 100644 --- a/pitiupi/src/pitiupi/control/PluginLoader.java +++ b/pitiupi/src/pitiupi/control/PluginLoader.java @@ -15,10 +15,11 @@ import java.util.Vector; import pitiupi.GUI.MainWindow; import pitiupi.Main; import pitiupi.plugin.Plugin; - +import pitiupi.plugin.PitiupiFacade; /** * * @author flavio + * @author tony */ public class PluginLoader { @@ -55,12 +56,14 @@ public class PluginLoader { // 4. Locate and instantiate all classes implementing the Plugin interface ServiceLoader serviceLoader = ServiceLoader.load(Plugin.class, pluginClassLoader); - System.out.println("\n--- Executing Discovered Plugins ---" + serviceLoader.findFirst()); - for (Plugin plugin : serviceLoader) { - System.out.println("Loading: " + plugin.getName()); - plugin.createPlugin(this.mainWindow); - this.mainWindow.getPlugins().add(plugin); - } + PitiupiFacade facade = new PitiupiFacade(this.mainWindow); + + System.out.println("\n--- Executing Discovered Plugins ---" + serviceLoader.findFirst()); + for (Plugin plugin : serviceLoader) { + System.out.println("Loading: " + plugin.getName()); + plugin.createPlugin(facade); + this.mainWindow.getPlugins().add(plugin); + } } catch (MalformedURLException e) { System.out.println(e.toString()); diff --git a/pitiupi/src/pitiupi/net/HeartbeatMessage.java b/pitiupi/src/pitiupi/net/HeartbeatMessage.java new file mode 100644 index 0000000..3b2c371 --- /dev/null +++ b/pitiupi/src/pitiupi/net/HeartbeatMessage.java @@ -0,0 +1,20 @@ +package pitiupi.net; + +public class HeartbeatMessage extends Message { + + private final String userName; + private final long timestamp; + + public HeartbeatMessage(String userName) { + this.userName = userName; + this.timestamp = System.currentTimeMillis(); + } + + public String getUserName() { + return userName; + } + + public long getTimestamp() { + return timestamp; + } +} diff --git a/pitiupi/src/pitiupi/net/Message.java b/pitiupi/src/pitiupi/net/Message.java index 3b5966b..b53b034 100644 --- a/pitiupi/src/pitiupi/net/Message.java +++ b/pitiupi/src/pitiupi/net/Message.java @@ -1,4 +1,4 @@ -/* + /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. diff --git a/pitiupi/src/pitiupi/net/Socket.java b/pitiupi/src/pitiupi/net/Socket.java index 8710697..8c85fe2 100644 --- a/pitiupi/src/pitiupi/net/Socket.java +++ b/pitiupi/src/pitiupi/net/Socket.java @@ -17,10 +17,13 @@ import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; import pitiupi.plugin.Plugin; - +import java.net.NetworkInterface; +import java.net.InetSocketAddress; +import pitiupi.net.HeartbeatMessage; // lib /** * * @author flavio + * @author tony */ public class Socket extends Thread { @@ -41,7 +44,45 @@ public class Socket extends Thread { multicastSocket.setSendBufferSize(256000); multicastSocket.setReceiveBufferSize(256000); multicastSocket.setReuseAddress(true); - multicastSocket.joinGroup(address); + System.out.println("Endereço local: " + multicastSocket.getLocalAddress()); + System.out.println("Interface: " + multicastSocket.getNetworkInterface()); + //InetAddress local = InetAddress.getLocalHost(); + + NetworkInterface nif = null; + + for (NetworkInterface ni : java.util.Collections.list( + NetworkInterface.getNetworkInterfaces())) { + + if (ni.isUp() + && ni.supportsMulticast() + && !ni.isLoopback()) { + + nif = ni; + break; + } + } + if (nif != null) { + System.out.println("Interface escolhida:"); + System.out.println("Nome: " + nif.getName()); + System.out.println("Descrição: " + nif.getDisplayName()); + System.out.println("Ativa: " + nif.isUp()); + System.out.println("Multicast: " + nif.supportsMulticast()); + + System.out.println("Endereços IP:"); + + for (InetAddress ip : java.util.Collections.list(nif.getInetAddresses())) { + System.out.println(" " + ip.getHostAddress()); + } + } else { + System.out.println("Nenhuma interface multicast encontrada"); + } + multicastSocket.joinGroup( + new InetSocketAddress(address, main.getPort()), + nif + ); + System.out.println("nif: " + nif); + + // multicastSocket.joinGroup(address); } catch (IOException ex) { System.out.println("There is no socket connection. Sorry."); System.out.println(ex.toString()); @@ -51,15 +92,27 @@ public class Socket extends Thread { public void send(byte[] msg) throws IOException { DatagramPacket msgPacket; msgPacket = new DatagramPacket(msg, msg.length, this.address, this.main.getPort()); + + System.out.println("Enviando pacote"); + System.out.println("Destino: " + address); + System.out.println("Porta: " + this.main.getPort()); + System.out.println("Bytes: " + msg.length); + multicastSocket.send(msgPacket); } - +//------------------------------------------------------------------------------------------------------- public void receive() throws UnknownHostException, IOException, ClassNotFoundException { byte[] buf = new byte[256000]; while (true) { - // Receive the information and print it. DatagramPacket msgPacket = new DatagramPacket(buf, buf.length); multicastSocket.receive(msgPacket); + + HeartbeatMessage heartbeat = tryParseHeartbeat(msgPacket.getData()); + if (heartbeat != null) { + main.getHeartbeatManager().receiveHeartbeat(heartbeat, msgPacket.getAddress()); + continue; + } + for (Plugin plugin : main.getPlugins()) { System.out.println(msgPacket.getAddress().toString()); plugin.receiveMessage(msgPacket.getData()); @@ -67,6 +120,17 @@ public class Socket extends Thread { } } + private HeartbeatMessage tryParseHeartbeat(byte[] data) { + try { + ByteArrayInputStream bais = new ByteArrayInputStream(data); + ObjectInput in = new ObjectInputStream(bais); + Object obj = in.readObject(); + return (obj instanceof HeartbeatMessage) ? (HeartbeatMessage) obj : null; + } catch (IOException | ClassNotFoundException | ClassCastException ex) { + return null; + } + } +//------------------------------------------------------------------------------------------------------------------ @Override public void run() { try { diff --git a/pitiupi/src/pitiupi/plugin/PitiupiFacade.java b/pitiupi/src/pitiupi/plugin/PitiupiFacade.java new file mode 100644 index 0000000..f68508d --- /dev/null +++ b/pitiupi/src/pitiupi/plugin/PitiupiFacade.java @@ -0,0 +1,35 @@ +package pitiupi.plugin; + +import java.io.IOException; +import javax.swing.JMenu; +import pitiupi.GUI.MainWindow; +import pitiupi.net.Message; + +public class PitiupiFacade { + + private final MainWindow mainWindow; + + public PitiupiFacade(MainWindow mainWindow) { + this.mainWindow = mainWindow; + } + + public void addMenu(JMenu menu) { + mainWindow.addMenu(menu); + } + + public void send(Message message) { + try { + mainWindow.getSocket().send(message.toByteArray()); + } catch (IOException ex) { + System.out.println("Falha ao enviar mensagem: " + ex); + } + } + + public String getUserName() { + return mainWindow.getUserName(); + } + + public int getPort() { + return mainWindow.getPort(); + } +} diff --git a/pitiupi/src/pitiupi/plugin/Plugin.java b/pitiupi/src/pitiupi/plugin/Plugin.java index 7a6b711..f2a6e78 100644 --- a/pitiupi/src/pitiupi/plugin/Plugin.java +++ b/pitiupi/src/pitiupi/plugin/Plugin.java @@ -4,20 +4,19 @@ */ package pitiupi.plugin; -import javax.swing.JMenu; -import pitiupi.GUI.MainWindow; import pitiupi.net.Message; /** * * @author flavio + * @author tony */ public interface Plugin { public String getName(); public String getAuthor(); public String getVersion(); - public void createPlugin(MainWindow window); + public void createPlugin(PitiupiFacade pitiupi); public Message getMessage(); public void receiveMessage(byte[] message); -} \ No newline at end of file +}