'
' Talk-To-Me: a small program to copy pieces of text from one machine
'               to the other.
'
' September 2014, PvE - GPL v3.
'-------------------------------------------------------------------

CONST ChunkSize = 512

INCLUDE "hug.bac", INIT, HUGOPTIONS, WINDOW, FRAME, ATTACH, TEXT, \
    STOCK, DISPLAY, CALLBACK, QUIT, EDIT, GRAB$, TIMEOUT

' We are using UDP broadcast
OPTION NETWORK BROADCAST

' We create a permanent listening socket
OPEN "*:12345" FOR SERVER AS brcast

'-------------------------------------------------------------------

FUNCTION Check_Data

    LOCAL total$

    WHILE ISTRUE(WAIT(brcast, 50))
        RECEIVE dat$ FROM brcast
        total$ = total$ & dat$
    WEND

    IF LEN(total$) AND GRAB$(txt) != total$ THEN
        CALL Clear_Text
        TEXT(txt, total$)
    ENDIF

    RETURN TRUE

END FUNCTION

'-------------------------------------------------------------------

SUB Send_Text

    LOCAL x
    LOCAL data$

    data$ = GRAB$(txt)

    OPEN "255.255.255.255:12345" FOR NETWORK AS mynet

    FOR x = 1 TO LEN(data$) STEP ChunkSize
        SEND MID$(data$, x, ChunkSize) TO mynet CHUNK ChunkSize
    NEXT

    CLOSE NETWORK mynet

END SUB

'-------------------------------------------------------------------

SUB Clear_Text

    TEXT(txt, "")

END SUB

'-------------------------------------------------------------------

' Initialize HUG, using table
INIT
HUGOPTIONS("TABLE 100 100")

' The GUI
win = WINDOW("Talk To Me", 500, 500)
PROPERTY(win, "icon-name", "gtk-network")

frame = FRAME(98, 89)
ATTACH(win, frame, 1, 1)

txt = EDIT(96, 87)
ATTACH(win, txt, 2, 2)

send_button = STOCK("gtk-network", 25, 8)
ATTACH(win, send_button, 1, 91)
CALLBACK(send_button, Send_Text)

clear_button = STOCK("gtk-clear", 25, 8)
ATTACH(win, clear_button, 27, 91)
CALLBACK(clear_button, Clear_Text)

exit_button = STOCK("gtk-quit", 25, 8)
ATTACH(win, exit_button, 74, 91)
CALLBACK(exit_button, QUIT)

'Check data each 1000ms
TIMEOUT(100, Check_Data)

'Endless loop
DISPLAY