From 3beadca0c1141437eb20d3ea3de536875ad42f27 Mon Sep 17 00:00:00 2001 From: GustavoHMDS Date: Tue, 21 Jul 2026 11:06:23 -0300 Subject: [PATCH 01/28] comeco da documentacao --- .idea/misc.xml | 5 + .idea/workspace.xml | 105 ++++++++++++++++++ pitiupi.chat/.idea/.gitignore | 5 + pitiupi.chat/.idea/libraries/pitiupi_chat.xml | 9 ++ pitiupi.chat/.idea/misc.xml | 5 + pitiupi.chat/.idea/modules.xml | 8 ++ pitiupi.chat/.idea/vcs.xml | 6 + pitiupi.chat/build/built-jar.properties | 6 +- pitiupi.chat/dist/pitiupi.chat.jar | Bin 13171 -> 13174 bytes pitiupi.chat/pitiupi.chat.iml | 11 ++ pitiupi.screenCast/build/built-jar.properties | 6 +- .../dist/pitiupi.screenCast.jar | Bin 18079 -> 18053 bytes pitiupi/.idea/.gitignore | 5 + pitiupi/.idea/libraries/pitiupi.xml | 9 ++ pitiupi/.idea/libraries/plugins.xml | 10 ++ pitiupi/.idea/misc.xml | 5 + pitiupi/.idea/modules.xml | 8 ++ pitiupi/.idea/vcs.xml | 6 + ...beans_automatic_build => Documentation.md} | 0 pitiupi/PluginTutorial.md | 2 + pitiupi/build/built-jar.properties | 4 + .../build/classes/.netbeans_update_resources | 0 pitiupi/build/classes/pitiupi/GUI/About.class | Bin 0 -> 1915 bytes pitiupi/build/classes/pitiupi/GUI/Login.class | Bin 3607 -> 3534 bytes .../classes/pitiupi/GUI/MainWindow.class | Bin 3644 -> 3599 bytes .../build/classes/pitiupi/GUI/MenuBar.class | Bin 2699 -> 2955 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/Socket.class | Bin 3474 -> 3360 bytes .../build/classes/pitiupi/plugin/Plugin.class | Bin 383 -> 323 bytes pitiupi/dist/README.TXT | 32 ------ pitiupi/dist/pitiupi.jar | Bin 22983 -> 25327 bytes pitiupi/pitiupi.iml | 11 ++ pitiupi/plugins/pitiupi.chat.jar | Bin 40 -> 13174 bytes pitiupi/plugins/pitiupi.screenCast.jar | Bin 52 -> 18053 bytes pitiupi/src/pitiupi/GUI/About.java | 70 ++++++++++++ pitiupi/src/pitiupi/GUI/MenuBar.java | 13 +++ 38 files changed, 303 insertions(+), 38 deletions(-) create mode 100644 .idea/misc.xml create mode 100644 .idea/workspace.xml create mode 100644 pitiupi.chat/.idea/.gitignore create mode 100644 pitiupi.chat/.idea/libraries/pitiupi_chat.xml create mode 100644 pitiupi.chat/.idea/misc.xml create mode 100644 pitiupi.chat/.idea/modules.xml create mode 100644 pitiupi.chat/.idea/vcs.xml create mode 100644 pitiupi.chat/pitiupi.chat.iml create mode 100644 pitiupi/.idea/.gitignore create mode 100644 pitiupi/.idea/libraries/pitiupi.xml create mode 100644 pitiupi/.idea/libraries/plugins.xml create mode 100644 pitiupi/.idea/misc.xml create mode 100644 pitiupi/.idea/modules.xml create mode 100644 pitiupi/.idea/vcs.xml rename pitiupi/{build/classes/.netbeans_automatic_build => Documentation.md} (100%) create mode 100644 pitiupi/PluginTutorial.md create mode 100644 pitiupi/build/built-jar.properties delete mode 100644 pitiupi/build/classes/.netbeans_update_resources create mode 100644 pitiupi/build/classes/pitiupi/GUI/About.class delete mode 100644 pitiupi/dist/README.TXT create mode 100644 pitiupi/pitiupi.iml create mode 100644 pitiupi/src/pitiupi/GUI/About.java diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6e86672 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..6f880d3 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "associatedIndex": 0 +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1784236888334 + + + + \ No newline at end of file diff --git a/pitiupi.chat/.idea/.gitignore b/pitiupi.chat/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/pitiupi.chat/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/pitiupi.chat/.idea/libraries/pitiupi_chat.xml b/pitiupi.chat/.idea/libraries/pitiupi_chat.xml new file mode 100644 index 0000000..d74edd9 --- /dev/null +++ b/pitiupi.chat/.idea/libraries/pitiupi_chat.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/pitiupi.chat/.idea/misc.xml b/pitiupi.chat/.idea/misc.xml new file mode 100644 index 0000000..8547fc5 --- /dev/null +++ b/pitiupi.chat/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/pitiupi.chat/.idea/modules.xml b/pitiupi.chat/.idea/modules.xml new file mode 100644 index 0000000..0dec8d6 --- /dev/null +++ b/pitiupi.chat/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/pitiupi.chat/.idea/vcs.xml b/pitiupi.chat/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/pitiupi.chat/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pitiupi.chat/build/built-jar.properties b/pitiupi.chat/build/built-jar.properties index 499f65e..4683cca 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 +#Sat, 18 Jul 2026 10:32:46 -0300 -/home/flavio/NetBeansProjects/pitiupi.chat= +C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi.chat= -/home/flavio/NetBeansProjects/pitiupi= +C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi= diff --git a/pitiupi.chat/dist/pitiupi.chat.jar b/pitiupi.chat/dist/pitiupi.chat.jar index 78438b7b633c374e68616d7b4e9635f71c5c60f2..70bd0b0768f503e238f0096578069a397a3f36b3 100644 GIT binary patch delta 623 zcmeyI_AQM!z?+$ci-CcIfk7hV(?nhkLGh4JG3-}2SLHA;Fo3YgKA3!8-&B6iqz^Gb^Wi`U&JtjF>v(dqv4Nrmx*A}J zKmkb2PawM>vm~>$AX7iUn~_O`84_qf&-56`Fv?F}X&{4PjUdbf29Ob6lb;wUB%)h` zs-}_=VNG&IVu^lUY6+Tss6G)vv0?>K`(#ITk;#>YJn|?Z3sj~KSIWS!r193|C5C38 zK%9KnP@2V_38=9_Safne6W3&EBOb7XmXS0|4=@;j64H}Xj6}eK)j+{o9;o0}BO$Qh iDI;k{-pS9548c4pV`-M1YG9YhO%68}W9!ogSq%VsF`QKZ delta 473 zcmeyC_Bo9=z?+$ci-CcIfniJ4hl#uzyql{&#AtQ-&&Xn6V91*2l%i{_ZK-RdYhFr%%#c!E2@yG_ zc7+2ZGI_4P1*#_|Khie^*)M4z!+3nMnSmmR6KNnL^&MzmL1sy2X+b8?QH)F?%&?G{ z+z(VMJ9&+P3`p%MAjf0!a{~n!r+l)SA(-P~D8smHa;l-SJc=KH=BfiR3@mB9F?qS6 z8Q66X45e9Ym>3u)Ut|%TEMf%q#AIC~X_ii46aWRKC#M^UfK}E31*>?Vf;)_az=CIu iq#3y;zcexg^JI;sS+=PGmB?w!O^z}aW9!xj*$DtDI+RTS diff --git a/pitiupi.chat/pitiupi.chat.iml b/pitiupi.chat/pitiupi.chat.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/pitiupi.chat/pitiupi.chat.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/pitiupi.screenCast/build/built-jar.properties b/pitiupi.screenCast/build/built-jar.properties index 6898243..771342c 100644 --- a/pitiupi.screenCast/build/built-jar.properties +++ b/pitiupi.screenCast/build/built-jar.properties @@ -1,6 +1,6 @@ -#Thu, 16 Jul 2026 15:21:39 -0300 +#Sat, 18 Jul 2026 10:33:07 -0300 -/home/flavio/NetBeansProjects/pitiupi.screenCast= +C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi.screenCast= -/home/flavio/NetBeansProjects/pitiupi= +C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi= diff --git a/pitiupi.screenCast/dist/pitiupi.screenCast.jar b/pitiupi.screenCast/dist/pitiupi.screenCast.jar index 06682ea98229a73e6aa63fcf49bd03a038066ac2..a81395ce5b62d0da189a98e4dfdcc9f7d90fbb02 100644 GIT binary patch delta 735 zcmbQ=%h=k>$Q$6z%)-UMz`?+v67p#xuLiGj$fuZf#lO8*FfcHznCO%uZ>Vjd>k|^J zYhTA+Gp@^(j4kmc_j zWf)l}b2}-5IC@Sp=BA7c3u`I-4l~gEVHtYu@%8HU&D6^Ywj+Q`Wb#(1@F}2hfFf8}fL~}bpR14p$oi1d62)2E3=AM_f?_nE z3RE%2WIHY4$pugirp?-acQG?CfH10Ce(A$C?01y`yXBs%G}B*Wps?iRI8(vNs%{V` VTDeIxJu?TZ&T-Ra^K=AR3;+sZ$T$E1 delta 709 zcmZqeWt`v3$Q$6z%)-UMz`?+?|DS%uJ4=SKr)L{++(n}hfm?kSSicG%YtO)k_ zA7^Q%PZ0eZl=vpwxQKy$6!eV!R)shN0|@J)=wCj$(8UIJ*DRE8y z;vxi=;dGT|(oliOs3=a3apeIEX9I;r48X$s4TUDJcNGG=RlBMwX)ZGZ0|@J(*d=ZP gR1C39!A+Wp!2+!JfQ9&EJqxzU`ECMi$&Mfm0AQ%tFaQ7m diff --git a/pitiupi/.idea/.gitignore b/pitiupi/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/pitiupi/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/pitiupi/.idea/libraries/pitiupi.xml b/pitiupi/.idea/libraries/pitiupi.xml new file mode 100644 index 0000000..95cf1ce --- /dev/null +++ b/pitiupi/.idea/libraries/pitiupi.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/pitiupi/.idea/libraries/plugins.xml b/pitiupi/.idea/libraries/plugins.xml new file mode 100644 index 0000000..4c565c7 --- /dev/null +++ b/pitiupi/.idea/libraries/plugins.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/pitiupi/.idea/misc.xml b/pitiupi/.idea/misc.xml new file mode 100644 index 0000000..8547fc5 --- /dev/null +++ b/pitiupi/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/pitiupi/.idea/modules.xml b/pitiupi/.idea/modules.xml new file mode 100644 index 0000000..4c6dc03 --- /dev/null +++ b/pitiupi/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/pitiupi/.idea/vcs.xml b/pitiupi/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/pitiupi/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pitiupi/build/classes/.netbeans_automatic_build b/pitiupi/Documentation.md similarity index 100% rename from pitiupi/build/classes/.netbeans_automatic_build rename to pitiupi/Documentation.md diff --git a/pitiupi/PluginTutorial.md b/pitiupi/PluginTutorial.md new file mode 100644 index 0000000..120dcfd --- /dev/null +++ b/pitiupi/PluginTutorial.md @@ -0,0 +1,2 @@ +# Como criar plugins para o Share my Sheet + diff --git a/pitiupi/build/built-jar.properties b/pitiupi/build/built-jar.properties new file mode 100644 index 0000000..7a88ba5 --- /dev/null +++ b/pitiupi/build/built-jar.properties @@ -0,0 +1,4 @@ +#Mon, 20 Jul 2026 12:23:12 -0300 + + +C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi= 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/About.class b/pitiupi/build/classes/pitiupi/GUI/About.class new file mode 100644 index 0000000000000000000000000000000000000000..e44d7f5b56c5a7fb6677ddaa6ac951b91cf7ae0b GIT binary patch literal 1915 zcmZuyU31e$6g`SVY=j8JDS?ne7g}1|lnCfIaZSNVAi;neJBCpDv9^|E8CmPDWJCHd z`V*Kwbfz<%X&>rznwh@%t#AE9o!*s9;*|PfE$!Yt_uR8*um1Yyk3Rt{;Ts!cNTo6E z;1DJ(WS{aLf9{6QWU%S3E^FQv7AA@^kWtA(Dwl7hk+Cp08uma2o_bbRK^XBM3T@ap zl7{2pC?+jTbz~&F9qHa$UvY0VRX4J5DiqP8c*47WRQ6RU?stUdkyL?&@!U$jVIYn> zm@lV_v75XLV&pLPm%)(&;zNxx_7g{(uL_PpO*oMe?2XEpn zqPr=GZ4eRHDi4UxOfH}BF}utPmx0g=X}nETW1?o^rqZ6!6~0aS*tme4p_HdeiIPch z5$~pP$-z9_(K7b%5~9g|I-U`t$=qEY@J&i3gEvBlbaV^;0ZC2Y7 zA}YExWiwjp#BrsD(Ba?*b*<<&OYF-0Wm<8~(lDax^N2rDy3JYjYLzv4D7eR&XtR#r z-IPJdI$U$6m?uIJ^pxK-=M|ZE#yh@j@xhOS-$ZCLPln|6W_R$j$HRG6*3tmQyLm@R zt{EpVJ$Mn(rjXGZ?Py8D2UupNIk;~Ok)~6xlT*_8{J*Z+H>`~+YUXOz4_<~5r#8qkW#y4`j#cQU-|M!ULe~>7 zWh<)1{RXGAA#V*Q$D=Jt&1JgsN~2t$)*Hq*$-->hME>s%QIjwZSFgnEUj_oQYpSbT zVp$qb+j0M#H&+Me=n9U}w*W|ipfEw>I=wB@tVREmg&kOh@jeb0`Z)G0&5WTzV;18y z9;a~%hw1GortyGgoMaasVk3^FCO$;`9_cvKQX!k|)Rz=XY^^V+S|x6tXw_SS+OaxK+sB>ErG$svD%n q+AncoMuZs>3?yL&=P^kifN5&ovy}Cv5E-1tV|+<57QTvief=+xjOaQ5 literal 0 HcmV?d00001 diff --git a/pitiupi/build/classes/pitiupi/GUI/Login.class b/pitiupi/build/classes/pitiupi/GUI/Login.class index b5380ba81a723f924c6817e970ebcb2e0039ac08..818ffd44cc4aa20e0975d035230691ee41b9e664 100644 GIT binary patch delta 186 zcmXAiOAf(M6o&uX8>-j6sgOv76&M&w#K@p~5PPu*xdQ_OTObXks@|`n9t#qu3{KAX zooBximqqmPLjVrmW6?JC&>Yn~JB77?jg5p4&rV~P*j{4#v!lQXXA>8R2v@h8DKHl6 zo>gT}H?S0EOh>Z8874Zf98OERqw3ii=0MI!PU?YbH4|sxSkQX|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<4ff$?3=9me45v48Enwfgmz|lBao^;F9145~xEKyH9AalU%)=1JaAfj( zj>{~^85vY3f8>p&n_)sXE-_e9p_X=#>p*Q?VF{zmoqZ2V^}}=2#*!(28N{! zjFXvpowzqLY+_&p!p#g@CP(vHF>htqHhBh+-p;UN@>O0t&7BO)47-3%U}D(Kum?zU Y0M+gX;=K$lnichEoiZ0Q6ThFaQ7m delta 219 zcmeB|*(1Ys>ff$?3=9me3}-fSEnpWE@J%hr$WIAKEK1BxElDjZ-n@dHm637(G z0S)G4V&Dc+{0t16zjLi%WM0p(Ve%p#E7pw+OBt9ZKjd)|+r+S$fsp~EmX(oV6OdwL z*ut=NvL3G$^EQU; diff --git a/pitiupi/build/classes/pitiupi/GUI/MenuBar.class b/pitiupi/build/classes/pitiupi/GUI/MenuBar.class index 71aaa0d3321d3ec4214da211e69a9e676e614018..9ee083e13b99f7de73e8ef2819f325834d46bcd9 100644 GIT binary patch delta 1389 zcmZ9L?^9G&7{@>7?vJ}%u85bx4N1`2Vp*V-Fg2Aza!~{V3n7050bcDI?IOFN_G>fy zO@?*L$~V33t&?tzOwIV#nO^j&x6L%YtAC;CId@l}=FXh+Jm)^=`#tCTea=$-Qrx=t z&z+xv3^#6C=T)kT7)hH}wkoQorgIC0Ave1aqfHU+^JZO(S~_eVBkeD%L{q0Cer{@U zDm`_fkaic{Y#}}1Udrgeq|5(RHPt-9E|c9hdw5b&?@t=_zGHMo_u1^H+wV7a#Ge-I z%tfzY5vRkE!}Qub!$JR=F&yo)ImBWAPoq0}#Abj&KN;$-dRB+SilpBes`D?0;+dn0 z=*aBCSuY#odBHpE&d$X+rl=m7ch9)DU%m%Cj4JQ ziQ-F&O>!xzyCc_r^442kN8KU zaX%fc37LHDH=A7>Oi|}iwu&DHt^T;#Q5_ZiBD^YN)?YT8`*ZToAuMBqj9aLpkqtb^ zoUCk?T~Nb$=4IAVHMZ$ks*q-7F@#8JA5>L`E0ug%bVaDV>xU8kc#yGolf6R9R_qo-1P}oY68$LQuvk zC`Fp2HW9$wqQx06m$XR9@%u!&qUAnOlZL%1$2ZVIOi1@avs`nVTz?T34 z2suED04150$CV?+>$LGM9bA>ibe$a(zvXehql??@r*?JjFckIY)}m>kh8aboRYR*TRkPj68aKb0KfZMmDlW!|aW@v5v{5f873hdTOTHTqbhFQm$neP8kw-_YW=G zBlrT^D`vfNbjBOK@Qx7|2WQj^ulNXl0WbXk&N!YY35~O}=k0mU|D5xG&U)ASqt1hW z@Ba!+vVO-|Rgc(oE7C{9V&IU)cj=`s{!ZmpfBZl_rUv7`RIY7^VT-3+p5~c2YfPC3 zT%P4%eAXE3IwaYXSHh}87rrOJ<1Wv0IR4%^X&!NTfywwEW7It6a-6AnEH!Grq|FoY z_0+zDGYYd%T)P;q*c1flcu*|cysT&|RDugZC0IEhL>`K9hgs$<=3QRHRCL~6?Toji zHx*7R+RI@zTq}nI$7ZJnPLu@9VS$tuue-d#S%nh?)wwVV&lLly(tWyTPM| zau}6MksR&pzFpoHf15tlo}CV=mrBcprOMLfpc+)7`0w=B@gJGR{)rNncF-VvYr$Yx4 zj?VkqNqBKy^loojBWSA`$$2Lmn0fD110^pguRKJ_$<=%vr6yKRC$;9Bp+nlsN#l>p zY`fSkUms5}LS7c@N#SV^^X!#jx+&AcRoU1Za$}u-zGQ%J7~}``OT$C_#&De@&4-NK z-~W5p8b}ZByj3WH*T})`^xKXdrV&bV_30 zFDxwFV{y7Kop7cv;muYFuU3E5L$W`k@}Oh1GhVN?tC6}<%WKxMaVW{y#{a7-R;e_r zPKef9_Joz|)W2Q(7#J8_8FV*tO<;R8H!(Ahhe3%!YqB^~ uDrh zFG(!P%+D)kWDxPmN-Rs%&q>Tn*Y__=Eh@@PNu4~MQBPEhk%6Zmvm~>$AXDErF*A>c zL5V?U@-4Ywum(Tq7$@3Tz`?OGH5m1vGR-ibN!+C@CT&Bt%0{{y-`y5Zx*b z2x7osAWra$mjh0CIDnl1#=L$)S_(?+jO~^7?96v&PO;b0dnwcE)f>Ppf66A%)suQr zsiLhp%gIV2#)iS+wMUtXL&KhPC)Jj{>K;<>Y{8vMe^8jy3+FFfx_t3OM#=oP;Uk|k zpFLW%tAE|7@^=ki_^SElahQ&c#JiCnimW{v&&D*r6e%fFHt+(a?3{NdthimxdpWgq zhZQt!j*#Q7RL5y@kNbqV&K2@JAi^!?c}RgMJq(X{EH29BrZ@=c^F&e<$3S&$SIuv9Mp_yN{K#6wDxgEy=Gdd?f4nL1T&f&=71UeiS7Hx&Q>LVa5OcZ rNp6_u(uH`zOL+syZwh-wUG9$fZ-%-#)VD)@&v%(L;&u7SZzlEu_Tyra 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~6xD2}8P*iEz@40scYkv~kKNQbWMgt=w7yL}QmA@ogHGx{N| zsc4#8E_W`M5IzA9;v5q}+4XTXI}t+qd)L1~;}kU0n7l9-bXc&I8kcm%Iqwm}g``!^ F{{tfSGSL74 delta 368 zcmYL@O)mps6ot<_qn%D`F{+W21;K(%E4DTy8Wt5|BsLaa?W?LaBQs-S)tx_JBC)ix zr`l3l-(UR$ev1Tgr<&N@bI(2ZKDj6ThXdi(PrV5sh1OZP66(=Xoda=Fhocg3OIu7X_2+jDr)5WpyCo&kWi<* zizYfc2UWm3h@9%zxS>G9Y-bTz#W~7870YO}F&E@wkiQU6(EP@rf~&5{!EO)bgDPYFmYO3Y0yNi8a7WMC`L%uC5HpSZ}0 zgFQF3xHvIAb>bs8Lq-N}pf*-U1|9|m7DfhM20k#&&mh16ml6c3U}O*il1vQ30Qp1~ A-2eap diff --git a/pitiupi/dist/README.TXT b/pitiupi/dist/README.TXT deleted file mode 100644 index c336b53..0000000 --- a/pitiupi/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.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/dist/pitiupi.jar b/pitiupi/dist/pitiupi.jar index 85ec1b823a9a5e1d01b01f9f8fec4825a5bc7abc..4103d0173c54bab3d79585df340e5a7be6391633 100644 GIT binary patch delta 3706 zcmZu!c}yJF8UGCn>@ps%g_vV83>XZo!3zf4#9(Z|fH@p*&F$c0*d4>T%g%ac7Ta;t z4M~r*uA4fqOUQRJlr`R{5v?qpjp9Z6j5&n_B*(Ql+}zn_Uhc zyPBErz4u-3JAQBG`l9f!-wB!i0Y|C`xPVWl?q15Q$^6IE-N_sOz1jaRfOju-2Fn_^ zw$u*}57lqqCD$A>lt4(8yL2O>8;Ygr;o3_d1|5aNcUX(C+41D;9d=Bpw#Uy4TkYpD zp@{ua$g=61f_Dd*nRMLv$U5%?_*Fo5BATT|Bbu*wq|eterAMu8fskUF@BQzs-_U9| zPO#pbMu!tFb|Y6V6S2VwNkS&F1mr#>%kJe?G>8z9BOw>*0Q?)wvXgFvJD5x2HSV3!oze2)hRI(fSb;1^Q&{^0lq6#%!aV_~niaFa>)HzWv zVHX_l}9I|byBBYs0YsTzhF9MYar@AqfF zHminBN?FpM7734IH-%?fwfctwh8_y}l`si;YHHal?jn)vZj-PF?d)=XQ_P8dq>yj# ztj|27g{OV}-9gRL4K5{OFB~p(Q8+C1tmT`rWI<4Z{ne@L;Ele#gh$o}nqc}g)=C8)^itQ-kN zr?s#tM-)SmbvdY-YIsf$&GD#NG>)mV5(#MmW%;$`tEwr=LCv%bZ7RC_i=bj|le-L! zYqG_ah^{GytdKTi`HDqCrc7%j5zt6Sm`GJVtdb2PL~5tmNYqk-xnk==cdC{L0QhxDisPA)W3cG}=$I0zI?5*C2RP-H-AJW-4q~YUGZ{3@ zL>|UyN=k@f91}J(flyNAB{*$U-Cnmlj(qPD3MU+nT!);SGJXxkacm+J%VqP3#)O~a8xxk3 zUbU0N5j;tLi5vxz{!Q8;04kQScj6j42E6XhIQDxTarAoK192Q&f`5YIarkw6XFLoW z_fpJ2QFNgKSp;!;1ZzcPb|n-p6k`%ciATUOTkQDSp+hIftC=bG>9ClS)05?Hir$%A z`cw2T7d8O=DgwJb<`Gwqg3F5+OHT{U8Dx&Ivlg2OaTI=J98|+m7q$|D@DvmJufpg` znXzXE3i}881d7x-hJKoP))>fIQT6fAqZao)On+tsjWdSU!9gP!w*a+0aZjdRVPk8pe=c7YFwL! zz~XN!oI+Y5k3VbNys;$B&V+zR^(-qZsAivT-q~hlr{T*YPrHu*gKU4Oy1{YS;ZN`_t*sP?{rJU6v&9TCMjW{&GkG{>=D_o-?uJpiRc_cMvRWi zwZauwy%!Oqd$%;Q;l@;zRp>p9Bdb4lu}tJK$t`ZjTiB=;SB7vD$GeHcCY z*Sed>{zmEIS3WV)nY{Q}&Ak-usk^eBAV-Y@4{y)$Xu~4|;|&ZK7iMyx^dB zfA-2q%l+RN?C&ExI1Ae}>hYA(iMw*%`v-)Sd;%H@68M+J`=cJAo9Uw-oBJY-boP_c zGJ8a8tuL>W4Xc)Ky*%lkB)3<8*{f6zZgpH|py=#{|}h}zxW5u%5PzQA%h(stFoEGA03smvjBdTtZ>kCVg9uOR+dv*x8C80&%rf` zh565_=v1t>wLX}c6}E->Up2BF;}v#zj*NR!e&5W5x_owFT(YMwk9$&o-3GAZ%_S_S zIi3AEx$sZoRR-DRE>HG)hj@k>Cp;-XJj9-u*kYUh_a|>(q&I&4)=xmX_FI_$&m?Oc W-n7v_ke1G;bLp?r+mgl4fBYYmnNs`! delta 1705 zcmZWqOHf-?82%1tCC1Q>x&XC5q=?55?J2ZPnEe_mSyu(r@V=B#kmxV>)geotAY$LsD1PEW+A zZT2KBF-a|vKrH6=1>)niwuO6R8iL_2_M}R?S+PnlFsDjyuFF3&hmhaDotiG_(sE8) zdO9(Kzb)TC&`IHRO59jvXV;d>izeAFBkT;?ws0gQ!3>8CCtUpd;zH)({}u0HWjx(( zP4l9{fJzzru%B1i+x68lYEa9s+RJk4$h!4hI4&Uv4h!YgAfpjY{0DoNzD33}Xys=! zY9s-EP{tv&^H52>zC*B`{KFD=)e#20FEV{9JYj^7zz&5XQ6st;(tJ~)lcA~5#AqmH z0Yig?9`qW}C*wKjxy_p^k$Q-H8*qX*II?T{p^?y!AsNH)Gf1&eyf+*R2O}X;w4W&H z6}tf$LFgF_W8qlzOpLY^JD<$o%^&u8`5m+2y7LqMmvg{#IzxwZ5*^-o8DR)%R!A3Q zyg-s37bVQ$k^%EFF5}8lt|gPPt9+rr!CvF5?h2hADJbI1<4)62@H&jrJjQE0`Nbis zk_B3tchj7UROG<~1t)1Go2-CzoWeMt^JJOE0Oo~;Y=OJ{Jx}%AGBPd236waNk!OyX zjh~}Dfhr+co=%`%Fpe*907#&jgiNuJKwF)eZ^|&N@5mTjwVqG z3FX)Zij`CgRg^j6titFvMU(=O%MoPKY(*OKDSjIY=y72$s!&K*;VIfLLLZ7T20NlC z!Fjr4mr3IdcmVmH7Ijel&Xhs=NuDfa`Sp+VLx;sTRw_GGcZ>GD@vMqFJ6IsF( z)s{iigqT{8IHrk;>+%u>aTYJqo8)GQds(<4^;hsJUPtbZMzpk2o~cn=!!MQp7*yt~ zx(_l`W}@>za_d&tF_XHY8=7T;;a7&MclIy-&G0_4bKS2fPP(7ba6CL64VU^lSjsN? z5UE_E@9~fQO8(Jp`v-g4AJd8Y6*kM?^yjOt$bx;uzw;}NqHj?unxpUP3h*xyPjj=fYhm+q3*i?tL91q7S9r5nn&>*@v|7!)m zA1G6mG`fL#iEgKOcSd!wg_j1CKY;$AlCsjq?{wwyw}QzOZv+)>)^SR)X((%tXH@(} Sd>z!0Xqf4-QSVvk5z_yi^?hOh diff --git a/pitiupi/pitiupi.iml b/pitiupi/pitiupi.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/pitiupi/pitiupi.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/pitiupi/plugins/pitiupi.chat.jar b/pitiupi/plugins/pitiupi.chat.jar index b2c6a32acbd99976fb6a22e3e439659c5c7141cf..70bd0b0768f503e238f0096578069a397a3f36b3 120000 GIT binary patch literal 13174 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уu7mbUXkSgC!XT&hwDbCQ8h|^gyi?p0Yg$s@l0$Wsk>|AZ(dn?3>h3^1n z0Y*KYqiZ>O?!6RvdWoK&LZgo`j?#0z?);eY-6u1TNom0;K1JmY0M^C?Qb_3Bx?F--q3vG^+acFbuHvY?r&~sunldvXFg4!3lj8f(m&vMkc z=<0xO2MXRk_O3SQ+rU}|UD28o)y1GDK<^zMP!%qy3b9M<#?XLh#$cal5nOo=pydJ4 zhNlf!r<-x@5$(9Tfo!k*-zV5qB926PL;ggcI3fm%H=st+Jzq$G!+dQ=KPMtA6)qJP zq^YsEAnlCx#9#=^%N%Jao3LWaN#vm=Lo6=dQ&L76${mckBkS`SgN4I757g=E9R;i=9BFom9ML#p#$b~5)rq~Ar^+2!a6uT4j5ByRpN{HyBvL!x@sSYVhK^_mWs3$Mc9JlN1hUs3J%Mw zYGZk15Y!vmKGOK~QMrAn5aKZ$N~(~1N%`z;S%S(Iz}ZU*F$0{PtMVzR#@k9OpQH*w z6tT%vK^t$V7QC6ZXzpR9l`Cqf6Z2UXu42jf+ubzaR#_t1jun^b12S8;RyCBIU&z8d zm97q1b7&m8QGMwxhq)eqEke2gM=#%9(XX-^9((aT*;VgyrmP#XN0mM zIGV~1^5&waczBe0f_&IU9>@#Q2-5Ju#3vuWWThhGv02NwluBAb-kTEG^@#HE!P7wL z=%TIjO5fk03yip>lhS4c)ek);kE%LoaHd4otlR>te=dV!;dOnfKc!BYIl{P1Xo0G1 zm1nyrdo9gSK**PveCPTg71NBg(ba%b+J#YtXCgG3R^C|oYp&1sF5ui5YPEdA#6IY& zUR*A$FDg;n9{{|-hs$b>ZK0VH&}??$f=)^Ah0Sqk`jr!xnXPo<<7h46#3#_KocKm~ z-c87Y@=kn`&frbZop7Oo7(g6-*g-a_(^pGWHPyCA)z^^9!rd-WJ!dH4McR;~P0D>T zeC64uki~`ZA%w$e2(Kg1l15y62sXdF- zJc=N{t*fG;;zf!+Mr#`?UZ7}KfblmVx9)tBB3*%J=pet`mZRP$sm6UD!u!*hNF~z1 zo1ocz@5j!tpP1YZkU_9)mD1a{B6VuR_fGU|N8b)QjOTvn(g0e=kU%oajv=MkjS*+* z99R^_B=4fT0dGHG-GdY?fZqIcFP?CA!=3Ueq-N8YY9%1Vz+NAj_`ZVz-{u|sZ5r)* z4QKtiMaCp9|CUVa9osC8+_odXp`*n^50@Nz0V$v&cpqlP1P7NWikxk%c>I88e9)zuPtp5mZtR5ctwZS^a$oX1 zK6>F-Ltp9TyL*OPozBk>Epw0{Lvhrha3}{&H$EJDV}-*xjVm{Nor7Gm z>%+yv9p~g(?NVp-9UxCU_*p=3m&|3j%?#&UzOtNNvPzxF&jY>PS2QbT3J1yZba9N2 z#ufuBK9iXT_6SzEU~wE^D)@9xXchx3KJ%3a_-15mWdN!Wz8G9_%AN;TwWA1J(Y8uy nc*SW&9^S`y6~VLDl=)}7Fq?xFT&_aSw}w80bnj6<3P;}sUS)&T literal 40 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 + +

Share My Sheet

+ \s +

+ Versão: 1.0 +

+ \s +

+ Plataforma P2P baseada em plugins para o desenvolvimento de aplicações + distribuídas. Criada para apoiar as práticas da disciplina de Redes de + Computadores e servir como base para projetos acadêmicos e TCCs. + \s +

+ \s +

+ Autores:
+ Flávio
+ Tony
+ Gustavo Henrique +

+ \s +

+ Universidade Federal de São João del-Rei (UFSJ) +

+ \s + + + \s"""); + + return new JScrollPane(texto); + } +} \ No newline at end of file diff --git a/pitiupi/src/pitiupi/GUI/MenuBar.java b/pitiupi/src/pitiupi/GUI/MenuBar.java index 2a7e1b1..84d6e60 100644 --- a/pitiupi/src/pitiupi/GUI/MenuBar.java +++ b/pitiupi/src/pitiupi/GUI/MenuBar.java @@ -15,6 +15,7 @@ import javax.swing.JMenuBar; public class MenuBar extends JMenuBar { private javax.swing.JMenuItem setupMenu; + private javax.swing.JMenuItem aboutMenu; private javax.swing.JMenu fileMenu; private javax.swing.JMenu helpMenu; private javax.swing.JMenu pluginMenu; @@ -32,6 +33,7 @@ public class MenuBar extends JMenuBar { helpMenu = new javax.swing.JMenu(); pluginMenu = new javax.swing.JMenu(); setupMenu = new javax.swing.JMenuItem(); + aboutMenu = new javax.swing.JMenuItem(); fileMenu.setText("File"); exitMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK)); @@ -44,9 +46,15 @@ public class MenuBar extends JMenuBar { this.add(pluginMenu); helpMenu.setText("Help"); + setupMenu.setText("Preferences"); setupMenu.addActionListener(this::setupMenuActionPerformed); helpMenu.add(setupMenu); + + aboutMenu.setText("About"); + aboutMenu.addActionListener(this::aboutMenuActionPerformed); + helpMenu.add(aboutMenu); + this.add(helpMenu); } @@ -61,6 +69,11 @@ public class MenuBar extends JMenuBar { login.setVisible(true); login.dispose(); } + + private void aboutMenuActionPerformed(java.awt.event.ActionEvent evt) { + About about = new About(); + about.setVisible(true); + } public void addPlugin(JMenu menu){ this.pluginMenu.add(menu); From cf43f6279395d0041a46798cfe7ccabde3915c37 Mon Sep 17 00:00:00 2001 From: GustavoHMDS Date: Tue, 21 Jul 2026 20:33:28 -0300 Subject: [PATCH 02/28] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20de=20fun=C3=A7?= =?UTF-8?q?=C3=B5es=20e=20arquivo=20Documenta=C3=A7=C3=A3o.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pitiupi/Documentation.md | 0 pitiupi/docs/Documentation.md | 208 ++++++++++++++++++ pitiupi/{ => docs}/PluginTutorial.md | 0 pitiupi/src/pitiupi/GUI/About.java | 2 + pitiupi/src/pitiupi/GUI/Login.java | 4 + pitiupi/src/pitiupi/GUI/MainWindow.java | 32 ++- pitiupi/src/pitiupi/GUI/MenuBar.java | 15 +- pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java | 8 + pitiupi/src/pitiupi/Main.java | 1 - .../src/pitiupi/control/HeartbeatManager.java | 24 ++ pitiupi/src/pitiupi/control/PeerInfo.java | 10 + pitiupi/src/pitiupi/control/PeerListener.java | 11 + pitiupi/src/pitiupi/control/PluginLoader.java | 5 + pitiupi/src/pitiupi/net/HeartbeatMessage.java | 4 + pitiupi/src/pitiupi/net/Message.java | 14 ++ pitiupi/src/pitiupi/net/Socket.java | 37 +++- pitiupi/src/pitiupi/plugin/Plugin.java | 27 +++ 17 files changed, 393 insertions(+), 9 deletions(-) delete mode 100644 pitiupi/Documentation.md create mode 100644 pitiupi/docs/Documentation.md rename pitiupi/{ => docs}/PluginTutorial.md (100%) diff --git a/pitiupi/Documentation.md b/pitiupi/Documentation.md deleted file mode 100644 index e69de29..0000000 diff --git a/pitiupi/docs/Documentation.md b/pitiupi/docs/Documentation.md new file mode 100644 index 0000000..68d9697 --- /dev/null +++ b/pitiupi/docs/Documentation.md @@ -0,0 +1,208 @@ +# Arquitetura da aplicação + +## Visão geral + +O Share My Sheet é uma plataforma P2P baseada em uma arquitetura de plugins, +desenvolvida para permitir a criação de aplicações distribuídas sobre uma +infraestrutura comum de comunicação em rede. + +A aplicação fornece mecanismos de descoberta de usuários, comunicação +multicast, troca de mensagens serializadas e integração de extensões por meio +de plugins. Dessa forma, novos comportamentos podem ser adicionados sem +modificar o núcleo da aplicação. + +O projeto foi desenvolvido como suporte às práticas da disciplina de Redes de +Computadores, servindo também como base para experimentação de aplicações +distribuídas e desenvolvimento de projetos acadêmicos. + +## Arquitetura geral + +A aplicação é dividida em três grupos principais: + +- **Núcleo da aplicação**: A `MainWindow` atua como ponto central da aplicação, + sendo responsável por inicializar e integrar esses componentes durante a + execução. +- **Sistema de plugins**: responsável por adicionar funcionalidades sem + alterar o núcleo. +- **Comunicação de rede**: responsável pela troca de mensagens entre + instâncias da aplicação. + +## Inicialização da aplicação + +1. A MainWindow é criada. +2. O Socket é inicializado e inicia a comunicação multicast. +3. O HeartbeatManager é criado e inicia o envio periódico de heartbeats. +4. O painel de usuários online é registrado como listener do HeartbeatManager. +5. O PluginLoader procura e carrega os plugins disponíveis. + +## Sistema de comunicação + +### Socket + +A classe `Socket` é responsável pela comunicação de rede da aplicação. +Ela utiliza comunicação multicast UDP para permitir que diferentes +instâncias da aplicação troquem mensagens sem a necessidade de um servidor +central. + +A classe estende `Thread`, pois mantém um processo contínuo de recepção de +mensagens enquanto a aplicação continua executando suas demais atividades. + +Durante sua inicialização, o socket: +- obtém o endereço do grupo multicast; +- cria um `MulticastSocket` utilizando a porta configurada; +- configura os buffers de comunicação; +- entra no grupo multicast. + +#### Envio de mensagens + +O método `send()` recebe uma mensagem já serializada em bytes e cria um +`DatagramPacket`, enviando-o para o grupo multicast. + +De forma geral, o socket atua apenas como mecanismo de transporte das mensagens. +A única exceção é o tratamento de HeartbeatMessage, utilizado pela infraestrutura +da aplicação para manter a lista de usuários ativos. + +#### Recepção de mensagens + +O método `receive()` mantém um loop aguardando novas mensagens multicast. + +Ao receber uma mensagem: +1. Os dados são analisados para verificar se correspondem a um + `HeartbeatMessage`. +2. Caso seja um heartbeat, a mensagem é encaminhada ao `HeartbeatManager` + para atualização dos usuários ativos. +3. Caso contrário, a mensagem é enviada para todos os plugins carregados + através do método `receiveMessage()`. + +Esse comportamento permite que a aplicação principal trate mensagens de +infraestrutura (como heartbeat), enquanto mensagens específicas de plugins +são processadas pelas extensões correspondentes. + +### Message + +A classe `Message` representa a estrutura base das mensagens trocadas pela +aplicação. + +Todas as mensagens utilizadas pelo sistema devem herdar dessa classe. Ela +implementa `Serializable`, permitindo que objetos de mensagem sejam +convertidos em vetores de bytes para transmissão pela rede. + +A serialização é realizada pelo método `toByteArray()`, que transforma uma +instância da mensagem em uma representação binária enviada pelo `Socket`. + +Mensagens específicas devem estender essa classe adicionando os atributos e +comportamentos necessários para cada funcionalidade. + +### Heartbeat + +O mecanismo de heartbeat é utilizado para identificar quais usuários estão +ativos na rede. + +A aplicação envia periodicamente uma `HeartbeatMessage` contendo informações +do usuário e um timestamp. Quando outra instância recebe essa mensagem, o +`HeartbeatManager` atualiza o registro do usuário correspondente. + +O fluxo de heartbeat é independente das mensagens dos plugins: + +1. `HeartbeatManager` cria uma `HeartbeatMessage`. +2. A mensagem é serializada utilizando `Message.toByteArray()`. +3. O `Socket` transmite a mensagem pela rede multicast. +4. O `Socket` identifica mensagens de heartbeat recebidas e encaminha ao + `HeartbeatManager`. +5. O `HeartbeatManager` atualiza a lista de usuários ativos e notifica os + listeners. + +## Sistema de plugins + +### Interface Plugin + +A interface `Plugin` define o contrato que deve ser implementado por qualquer +extensão da aplicação. + +Um plugin deve fornecer informações básicas de identificação (`name`, +`author` e `version`), inicializar seu estado através de `createPlugin()` e +participar do sistema de comunicação utilizando mensagens derivadas de +`Message`. + +Os principais métodos são: + +#### Identificação + +Os métodos: +- `getName()` +- `getAuthor()` +- `getVersion()` + +fornecem informações utilizadas pela aplicação para identificar o plugin. + +#### Inicialização + +`createPlugin(MainWindow window)` + +É chamado após o carregamento do plugin e permite que ele registre seus +componentes na aplicação, como menus ou elementos de interface. + +#### Comunicação + +`getMessage()` + +Deve retornar uma mensagem utilizada pelo plugin para comunicação com outras +instâncias da aplicação. + +`receiveMessage(byte[] message)` + +É chamado pela aplicação sempre que uma mensagem é recebida. Cada plugin deve +verificar se a mensagem pertence ao seu tipo e realizar o processamento +correspondente. + +### Descoberta de plugins + +Para serem reconhecidos, os plugins devem possuir os arquivos de configuração +do Java Service Provider Interface (SPI): + +``` +MeusPlugins +| ++---META-INF + | + +---services + | + +---pitiupi.plugin.Plugin +``` + +O arquivo `pitiupi.plugin.Plugin` deve conter o nome completo das classes que +implementam a interface Plugin: + +``` +MeusPlugins.plugins.NomeDaClasse +``` + +Para serem carregados, os plugins devem estar empacotados como arquivos JAR +e colocados no diretório plugins da aplicação. + +### Carregamento + +Ao iniciar a aplicação, o `PluginLoader` executa os seguintes passos: + +1. Procura arquivos `.jar` dentro do diretório `plugins`. +2. Cria um `URLClassLoader` contendo os JARs encontrados. +3. Utiliza `ServiceLoader` para localizar classes que implementam + `Plugin`. +4. Instancia cada plugin encontrado. +5. Chama o método `createPlugin(MainWindow)`. +6. Registra o plugin na lista de plugins ativos da aplicação. + +## Interface gráfica + +A interface gráfica da aplicação é baseada em Swing e é centralizada na +classe `MainWindow`. + +Durante a inicialização, cada plugin recebe uma referência para a +`MainWindow` através do método `createPlugin(MainWindow)`. + +Essa referência permite integrar componentes gráficos à aplicação, sendo a +principal forma de extensão a adição de menus à barra de menus: + +```java +JMenu menu = new JMenu("Meu Plugin"); +window.addMenu(menu); \ No newline at end of file diff --git a/pitiupi/PluginTutorial.md b/pitiupi/docs/PluginTutorial.md similarity index 100% rename from pitiupi/PluginTutorial.md rename to pitiupi/docs/PluginTutorial.md diff --git a/pitiupi/src/pitiupi/GUI/About.java b/pitiupi/src/pitiupi/GUI/About.java index 5526dbc..8e92516 100644 --- a/pitiupi/src/pitiupi/GUI/About.java +++ b/pitiupi/src/pitiupi/GUI/About.java @@ -8,6 +8,8 @@ package pitiupi.GUI; import javax.swing.*; /** + * Janela que exibe informações sobre a aplicação, incluindo versão, + * descrição e autores. * * @author gustavo */ diff --git a/pitiupi/src/pitiupi/GUI/Login.java b/pitiupi/src/pitiupi/GUI/Login.java index 4c9c61c..3bac894 100644 --- a/pitiupi/src/pitiupi/GUI/Login.java +++ b/pitiupi/src/pitiupi/GUI/Login.java @@ -20,6 +20,10 @@ import javax.swing.JSpinner; import javax.swing.JTextField; /** + * Janela de preferencias da aplicação. + * + *

Permite ao usuário informar o nome utilizado na rede e a porta + * multicast que será utilizada pela comunicação.

* * @author flavio */ diff --git a/pitiupi/src/pitiupi/GUI/MainWindow.java b/pitiupi/src/pitiupi/GUI/MainWindow.java index 009f66d..23b0bfc 100644 --- a/pitiupi/src/pitiupi/GUI/MainWindow.java +++ b/pitiupi/src/pitiupi/GUI/MainWindow.java @@ -14,9 +14,18 @@ import pitiupi.plugin.Plugin; import pitiupi.control.HeartbeatManager; /** + * Janela principal da aplicação. + * + *

Responsável por inicializar a interface gráfica e coordenar os + * principais componentes da aplicação, incluindo comunicação de rede, + * gerenciamento de heartbeat e carregamento de plugins.

+ * + *

A instância desta classe é compartilhada com os plugins para permitir + * integração com a aplicação principal.

* * @author flavio * @author tony + * @author Gustavo */ public class MainWindow extends javax.swing.JFrame { @@ -38,7 +47,12 @@ public class MainWindow extends javax.swing.JFrame { private PluginLoader pluginManager; private final List plugins; - + /** + * Cria a janela principal da aplicação. + * + * @param userName nome utilizado para identificação na rede. + * @param port porta utilizada na comunicação multicast. + */ public MainWindow(String userName, int port) { this.userName = userName; this.port = port; @@ -48,6 +62,14 @@ public class MainWindow extends javax.swing.JFrame { } private void initComponents() { + initGUI(); + initSocket(); + initHeartbeat(); + initPlugins(); + this.setSize(new java.awt.Dimension(1024, 768)); + } + + private void initGUI() { this.setJMenuBar(menuBar); this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); this.setTitle("Share My Sheet"); @@ -66,22 +88,26 @@ public class MainWindow extends javax.swing.JFrame { this.getContentPane().add(statusPanel, java.awt.BorderLayout.PAGE_END); this.pack(); + } + private void initSocket() { this.socket = new Socket(this); this.socket.start(); + } + private void initHeartbeat() { 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)); + private void initPlugins() { this.pluginManager = new PluginLoader(this); this.pluginManager.loadPlugins(); } - public void exit() { this.setVisible(false); this.dispose(); diff --git a/pitiupi/src/pitiupi/GUI/MenuBar.java b/pitiupi/src/pitiupi/GUI/MenuBar.java index 84d6e60..88b89ee 100644 --- a/pitiupi/src/pitiupi/GUI/MenuBar.java +++ b/pitiupi/src/pitiupi/GUI/MenuBar.java @@ -9,8 +9,13 @@ import javax.swing.JMenu; import javax.swing.JMenuBar; /** + * Barra de menus principal da aplicação. + * + *

Gerencia os menus padrões da interface e disponibiliza um espaço + * para que plugins adicionem seus próprios menus.

* * @author flavio + * @author Gustavo */ public class MenuBar extends JMenuBar { @@ -58,8 +63,6 @@ public class MenuBar extends JMenuBar { this.add(helpMenu); } - - private void exitMenuActionPerformed(java.awt.event.ActionEvent evt) { mainWindow.exit(); } @@ -74,7 +77,13 @@ public class MenuBar extends JMenuBar { About about = new About(); about.setVisible(true); } - + + /** + * Adiciona um menu fornecido por um plugin à seção de plugins da barra + * de menus. + * + * @param menu menu criado pelo plugin. + */ public void addPlugin(JMenu menu){ this.pluginMenu.add(menu); } diff --git a/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java b/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java index 5821bbd..7d3231e 100644 --- a/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java +++ b/pitiupi/src/pitiupi/GUI/OnlineUsersPanel.java @@ -11,7 +11,10 @@ import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import pitiupi.control.PeerInfo; import pitiupi.control.PeerListener; + /** + * Painel da interface gráfica responsável por exibir os usuários ativos + * na rede. * * @author tony */ @@ -30,6 +33,11 @@ public class OnlineUsersPanel extends JPanel implements PeerListener { add(new JScrollPane(userList), BorderLayout.CENTER); } + /** + * Atualiza a lista de usuários exibida no painel. + * + * @param peers lista atualizada de usuários ativos na rede. + */ @Override public void onPeersChanged(List peers) { SwingUtilities.invokeLater(() -> { diff --git a/pitiupi/src/pitiupi/Main.java b/pitiupi/src/pitiupi/Main.java index 297b61a..584c75f 100644 --- a/pitiupi/src/pitiupi/Main.java +++ b/pitiupi/src/pitiupi/Main.java @@ -14,7 +14,6 @@ import java.util.logging.Logger; * @author flavio */ public class Main { - /** * @param args the command line arguments */ diff --git a/pitiupi/src/pitiupi/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java index b3a83a9..5225000 100644 --- a/pitiupi/src/pitiupi/control/HeartbeatManager.java +++ b/pitiupi/src/pitiupi/control/HeartbeatManager.java @@ -15,6 +15,11 @@ import java.util.logging.Logger; import pitiupi.GUI.MainWindow; import pitiupi.net.HeartbeatMessage; /** + * Gerencia o mecanismo de heartbeat da aplicação. + * + *

Responsável por anunciar a presença da aplicação na rede, receber + * heartbeats de outros usuários, controlar o tempo desde a última atividade + * dos peers e notificar listeners quando a lista de usuários ativos muda.

* * @author tony */ @@ -54,6 +59,17 @@ public class HeartbeatManager { } // Chamado pelo Socket quando um pacote é identificado como heartbeat + /** + * Processa uma mensagem de heartbeat recebida de outro usuário. + * + *

Atualiza a informação do peer correspondente e notifica os listeners + * caso um novo usuário seja identificado.

+ * + *

Mensagens de heartbeat enviadas pela própria aplicação são ignoradas.

+ * + * @param msg mensagem de heartbeat recebida. + * @param from endereço de rede do usuário que enviou a mensagem. + */ public void receiveHeartbeat(HeartbeatMessage msg, InetAddress from) { // ignora o próprio heartbeat if (msg.getUserName().equals(mainWindow.getUserName())) { @@ -86,6 +102,14 @@ public class HeartbeatManager { } } + /** + * Adiciona um listener para receber atualizações sobre os peers conhecidos. + * + *

O listener recebe imediatamente o estado atual dos peers ao ser + * registrado.

+ * + * @param l listener que será notificado sobre alterações. + */ public void addPeerListener(PeerListener l) { listeners.add(l); l.onPeersChanged(new ArrayList<>(peers.values())); diff --git a/pitiupi/src/pitiupi/control/PeerInfo.java b/pitiupi/src/pitiupi/control/PeerInfo.java index 04e6bdd..b798120 100644 --- a/pitiupi/src/pitiupi/control/PeerInfo.java +++ b/pitiupi/src/pitiupi/control/PeerInfo.java @@ -2,6 +2,11 @@ package pitiupi.control; import java.net.InetAddress; /** + * Representa um usuário identificado na rede e as informações necessárias + * para acompanhar sua presença através de mensagens de heartbeat. + * + *

Armazena o nome do usuário, seu endereço de rede e o instante da + * última mensagem recebida.

* * @author tony */ @@ -29,6 +34,11 @@ public class PeerInfo { return lastSeen; } + /** + * Atualiza o instante da última atividade do usuário. + * + * @param timestamp novo instante de atividade. + */ public void touch(long timestamp) { this.lastSeen = timestamp; } diff --git a/pitiupi/src/pitiupi/control/PeerListener.java b/pitiupi/src/pitiupi/control/PeerListener.java index 1b97f8b..679395c 100644 --- a/pitiupi/src/pitiupi/control/PeerListener.java +++ b/pitiupi/src/pitiupi/control/PeerListener.java @@ -1,10 +1,21 @@ package pitiupi.control; import java.util.List; + /** + * Interface para receber notificações sobre alterações nos usuários + * conhecidos na rede. + * + *

Implementações desta interface são notificadas sempre que a lista + * de usuários ativos é modificada.

* * @author tony */ public interface PeerListener { + /** + * Chamado quando a lista de usuários conhecidos na rede é alterada. + * + * @param peers lista atualizada de usuários ativos. + */ void onPeersChanged(List peers); } diff --git a/pitiupi/src/pitiupi/control/PluginLoader.java b/pitiupi/src/pitiupi/control/PluginLoader.java index 386724a..db549e4 100644 --- a/pitiupi/src/pitiupi/control/PluginLoader.java +++ b/pitiupi/src/pitiupi/control/PluginLoader.java @@ -17,7 +17,12 @@ import pitiupi.Main; import pitiupi.plugin.Plugin; /** + * Responsável por localizar, carregar e registrar os plugins + * presentes no diretório {@code plugins}. * + *

Os plugins são descobertos utilizando {@link java.util.ServiceLoader} + * e devem estar empacotados como arquivos JAR contendo a configuração + * {@code META-INF/services} correspondente.

* @author flavio */ public class PluginLoader { diff --git a/pitiupi/src/pitiupi/net/HeartbeatMessage.java b/pitiupi/src/pitiupi/net/HeartbeatMessage.java index f8cf549..04e0cf3 100644 --- a/pitiupi/src/pitiupi/net/HeartbeatMessage.java +++ b/pitiupi/src/pitiupi/net/HeartbeatMessage.java @@ -1,5 +1,9 @@ package pitiupi.net; /** + * Mensagem utilizada para sinalizar a presença de um usuário na rede. + * + *

É enviada periodicamente para permitir que a aplicação identifique + * usuários ativos e mantenha o controle dos participantes conectados.

* * @author tony */ diff --git a/pitiupi/src/pitiupi/net/Message.java b/pitiupi/src/pitiupi/net/Message.java index 3b5966b..db6be65 100644 --- a/pitiupi/src/pitiupi/net/Message.java +++ b/pitiupi/src/pitiupi/net/Message.java @@ -12,11 +12,25 @@ import java.io.ObjectOutputStream; import java.io.Serializable; /** + * Classe base para as mensagens trocadas entre a aplicação e os plugins. + * + *

As mensagens devem estender esta classe para utilizar o sistema de + * comunicação da aplicação. Subclasses podem adicionar os dados e a lógica + * necessários para representar diferentes tipos de mensagens.

+ * + *

Por implementar {@link Serializable}, objetos derivados desta classe + * podem ser convertidos em bytes para transmissão pela rede.

* * @author flavio */ public abstract class Message implements Serializable{ + /** + * Serializa a mensagem para um vetor de bytes. + * + * @return representação serializada da mensagem. + * @throws IOException caso ocorra um erro durante a serialização. + */ public byte[] toByteArray() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(baos); diff --git a/pitiupi/src/pitiupi/net/Socket.java b/pitiupi/src/pitiupi/net/Socket.java index 0a99fde..e60e0ed 100644 --- a/pitiupi/src/pitiupi/net/Socket.java +++ b/pitiupi/src/pitiupi/net/Socket.java @@ -20,6 +20,10 @@ import pitiupi.plugin.Plugin; import pitiupi.net.HeartbeatMessage; /** + * Responsável pela comunicação multicast entre a aplicação e os plugins. + * + *

Esta classe gerencia o envio e o recebimento de mensagens, além de + * manter a conexão com o grupo multicast utilizado pela aplicação.

* * @author flavio * @author tony @@ -31,6 +35,11 @@ public class Socket extends Thread { private MainWindow main; public final static String INET_ADDR = "224.0.0.3"; + /** + * Cria e inicializa a conexão multicast utilizada pela aplicação. + * + * @param main janela principal da aplicação. + */ public Socket(MainWindow main) { this.main = main; try { @@ -50,12 +59,29 @@ public class Socket extends Thread { } } + /** + * Envia uma mensagem para o grupo multicast da aplicação. + * + * @param msg mensagem serializada a ser enviada. + * @throws IOException caso ocorra um erro durante o envio da mensagem. + */ public void send(byte[] msg) throws IOException { DatagramPacket msgPacket; msgPacket = new DatagramPacket(msg, msg.length, this.address, this.main.getPort()); multicastSocket.send(msgPacket); } - + + /** + * Inicia o loop de recepção de mensagens da aplicação. + * + *

As mensagens recebidas são verificadas inicialmente para identificar + * mensagens de heartbeat. Caso não sejam heartbeats, seu conteúdo é + * encaminhado para todos os plugins carregados, que decidem se devem ou + * não processá-lo.

+ * + * @throws IOException caso ocorra um erro durante a recepção da mensagem. + * @throws ClassNotFoundException caso a desserialização de uma mensagem falhe. + */ public void receive() throws UnknownHostException, IOException, ClassNotFoundException { byte[] buf = new byte[256000]; while (true) { @@ -74,7 +100,14 @@ public class Socket extends Thread { } } } - + + /** + * Tenta desserializar os dados recebidos como uma {@code HeartbeatMessage}. + * + * @param data dados serializados da mensagem. + * @return a mensagem desserializada caso os dados representem uma + * {@code HeartbeatMessage}; caso contrário, {@code null}. + */ private HeartbeatMessage tryParseHeartbeat(byte[] data) { try { ByteArrayInputStream bais = new ByteArrayInputStream(data); diff --git a/pitiupi/src/pitiupi/plugin/Plugin.java b/pitiupi/src/pitiupi/plugin/Plugin.java index 7a6b711..a52bdc5 100644 --- a/pitiupi/src/pitiupi/plugin/Plugin.java +++ b/pitiupi/src/pitiupi/plugin/Plugin.java @@ -9,6 +9,10 @@ import pitiupi.GUI.MainWindow; import pitiupi.net.Message; /** + * Interface base para plugins da aplicação. + * + *

Cada plugin deve implementar esta interface para ser carregado + * pela aplicação e participar do sistema de comunicação por mensagens.

* * @author flavio */ @@ -17,7 +21,30 @@ public interface Plugin { public String getName(); public String getAuthor(); public String getVersion(); + + /** + * Inicializa o plugin. + * + *

Este método é chamado pela aplicação após o carregamento do plugin.

+ * + * @param window janela principal da aplicação. + */ public void createPlugin(MainWindow window); + + /** + * Retorna uma mensagem utilizada pelo plugin. + * + * @return mensagem criada pelo plugin. + */ public Message getMessage(); + + /** + * Recebe uma mensagem enviada pela aplicação. + * + *

A mensagem é recebida em formato serializado. O plugin deve verificar + * se a mensagem pertence ao seu tipo e realizar o processamento necessário.

+ * + * @param message mensagem serializada recebida. + */ public void receiveMessage(byte[] message); } \ No newline at end of file From 5c691892938c090a02d338f41605ab789858254e Mon Sep 17 00:00:00 2001 From: GustavoHMDS Date: Tue, 11 Aug 2026 14:30:17 -0300 Subject: [PATCH 03/28] atualizando documentacao depois do merge --- .idea/workspace.xml | 49 ++++++------------- pitiupi/src/pitiupi/GUI/MenuBar.java | 5 ++ .../src/pitiupi/control/HeartbeatManager.java | 26 +++++++++- pitiupi/src/pitiupi/net/Socket.java | 5 +- 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6f880d3..e7c6da3 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,27 +5,10 @@ - - - - - - - - - - - - - - - - - - - - + + + - { + "keyToString": { + "Application.Main.executor": "Run", + "ModuleVcsDetector.initialDetectionPerformed": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", + "RunOnceActivity.git.unshallow": "true", + "git-widget-placeholder": "feature/help-and-documentation", + "ignore.virus.scanning.warn.message": "true", + "kotlin-language-version-configured": "true", + "last_opened_file_path": "C:/Users/extre/OneDrive/Documentos/Faculdade/2026_02/Monitoria/Pitiupi", + "settings.editor.selected.configurable": "preferences.keymap" } -}]]> +} diff --git a/pitiupi/src/pitiupi/GUI/MenuBar.java b/pitiupi/src/pitiupi/GUI/MenuBar.java index 1e3a4a8..db4ca35 100644 --- a/pitiupi/src/pitiupi/GUI/MenuBar.java +++ b/pitiupi/src/pitiupi/GUI/MenuBar.java @@ -29,6 +29,11 @@ public class MenuBar extends JMenuBar { private javax.swing.JMenuItem exitMenu; private final MainWindow mainWindow; + /** + * Cria a barra de menus principal da aplicação. + * + * @param mainWindow mainWindow janela principal da aplicação utilizada para executar + */ public MenuBar(MainWindow mainWindow) { this.mainWindow = mainWindow; this.initComponents(); diff --git a/pitiupi/src/pitiupi/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java index 4de8a4b..725cede 100644 --- a/pitiupi/src/pitiupi/control/HeartbeatManager.java +++ b/pitiupi/src/pitiupi/control/HeartbeatManager.java @@ -35,16 +35,28 @@ public class HeartbeatManager { private ScheduledExecutorService scheduler; private final String instanceId = UUID.randomUUID().toString(); + /** + * Cria um gerenciador de heartbeat associado à janela principal da aplicação. + * + * @param mainWindow janela principal utilizada para obter o nome do usuário + * e o socket de comunicação. + */ public HeartbeatManager(MainWindow mainWindow) { this.mainWindow = mainWindow; } + /** + * Inicia o mecanismo de heartbeat. + */ 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); } + /** + * Para o mecanismo de heartbeat e encerra as tarefas agendadas. + */ public void stop() { if (scheduler != null) { scheduler.shutdownNow(); @@ -64,8 +76,8 @@ public class HeartbeatManager { /** * Processa uma mensagem de heartbeat recebida de outro usuário. * - *

Atualiza a informação do peer correspondente e notifica os listeners - * caso um novo usuário seja identificado.

+ *

Atualiza o momento da última atividade do peer correspondente e notifica os listeners + * caso outra instância da aplicação seja identificada.

* *

Mensagens de heartbeat enviadas pela própria aplicação são ignoradas.

* @@ -118,10 +130,20 @@ public class HeartbeatManager { l.onPeersChanged(new ArrayList<>(peers.values())); } + /** + * Remove um listener previamente registrado. + * + * @param l listener que deixará de receber atualizações. + */ public void removePeerListener(PeerListener l) { listeners.remove(l); } + /** + * Retorna uma cópia da lista atual de peers conhecidos. + * + * @return lista contendo os peers atualmente conhecidos. + */ public List getPeers() { return new ArrayList<>(peers.values()); } diff --git a/pitiupi/src/pitiupi/net/Socket.java b/pitiupi/src/pitiupi/net/Socket.java index 139484a..91c2c89 100644 --- a/pitiupi/src/pitiupi/net/Socket.java +++ b/pitiupi/src/pitiupi/net/Socket.java @@ -20,7 +20,7 @@ import pitiupi.plugin.Plugin; import pitiupi.net.HeartbeatMessage; /** - * Responsável pela comunicação multicast entre a aplicação e os plugins. + * "Responsável pela comunicação multicast da aplicação e pelo encaminhamento de mensagens aos plugins." * *

Esta classe gerencia o envio e o recebimento de mensagens, além de * manter a conexão com o grupo multicast utilizado pela aplicação.

@@ -72,6 +72,9 @@ public class Socket extends Thread { multicastSocket.send(msgPacket); } + /** + * Encerra a comunicação multicast e interrompe a recepção de mensagens. + */ public void close() { running = false; if (multicastSocket != null) { From 81c37225fac91d24e8651da729d0282cc09af6a2 Mon Sep 17 00:00:00 2001 From: GustavoHMDS Date: Tue, 11 Aug 2026 14:35:51 -0300 Subject: [PATCH 04/28] atualizando o arquivo documentation.md --- .idea/workspace.xml | 7 +------ pitiupi/docs/Documentation.md | 16 +++++++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e7c6da3..fa1cc34 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,12 +4,7 @@
- - - - - - + \ No newline at end of file diff --git a/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java b/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java index 3b707fa..c963334 100644 --- a/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java +++ b/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java @@ -91,7 +91,7 @@ public class ChatWindow extends javax.swing.JDialog { } private void sendMessage() { - if (jTextArea1.getText().trim().length() == 0) { + if (jTextArea1.getText().trim().isEmpty()) { return; } ChatMessage message = new ChatMessage(mainWindow.getUserName(), jTextArea1.getText()); @@ -101,7 +101,7 @@ public class ChatWindow extends javax.swing.JDialog { public void sendChatMessage(Message message) { try { - mainWindow.getSocket().send(message.toByteArray()); + mainWindow.getSocketUDP().sendMulticast(message.toByteArray()); } catch (IOException ex) { Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/pitiupi.screenCast/.idea/ant.xml b/pitiupi.screenCast/.idea/ant.xml new file mode 100644 index 0000000..a2a4769 --- /dev/null +++ b/pitiupi.screenCast/.idea/ant.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pitiupi.screenCast/.idea/misc.xml b/pitiupi.screenCast/.idea/misc.xml new file mode 100644 index 0000000..59ad060 --- /dev/null +++ b/pitiupi.screenCast/.idea/misc.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/pitiupi.screenCast/.idea/vcs.xml b/pitiupi.screenCast/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/pitiupi.screenCast/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pitiupi.screenCast/.idea/workspace.xml b/pitiupi.screenCast/.idea/workspace.xml index 96dbbb3..61262cc 100644 --- a/pitiupi.screenCast/.idea/workspace.xml +++ b/pitiupi.screenCast/.idea/workspace.xml @@ -5,14 +5,24 @@ - - - - - - + + - + + + + + + + + + + + + + + +