REPORT ZPOPUP NO STANDARD PAGE HEADING.
************************************************************************
* The programs ZPOPUP and ZPOPUPDE implement a talk utility -
* - similar to the UNIX talk or write commands. When zpopup is
* started via a transaction (i.e. ZPOP) it displays the active users.
* By double-clicking on the username the remote user will receive
* a popup window inviting him for a chat. The remote user starts ZPOP
* as well, and the two instances of zpops will negotiate the
* communication parameters and call zpopupde, the terminal module.
* The terminal module will enable them to send and receive the messages.
* To make these programs work, you have to assign zpopup to transaction
* code ZPOP and create status ZCLEAR for zpopupde with only the
* enter(AAAA), green arrow(BBBB), yellow arrow(CCCC) and red cross(DDDD)
************************************************************************
DATA: ESTABLISHED.
DATA: I_AM.
DATA: LINE(90).
DATA: A_NAME(22), B_NAME(22), AB_NAME(22), BA_NAME(22), MY_NAME(22).
DATA: INDXKEY LIKE INDX-SRTFD.
TABLES INDX.
DATA: CURR_TIM LIKE SY-UZEIT.
DATA: TEMP_TIM TYPE T.
DATA: MESSAGE(128).
DATA: OPCODE TYPE X VALUE 2.
DATA: BEGIN OF USR_TABL OCCURS 10.
INCLUDE STRUCTURE UINFO.
DATA: END OF USR_TABL.
DATA: A(61).
DATA: TIM LIKE SY-UZEIT, N TYPE I VALUE 30, DTIM LIKE SY-UZEIT.
START-OF-SELECTION.
* Find out, if I am an initializator (A) or a responder (B)
MY_NAME = SY-UNAME.
INDXKEY = MY_NAME.
IMPORT LINE FROM DATABASE INDX(ST) ID INDXKEY.
IF SY-SUBRC <> 0. "Nothing there: I am an initializator
I_AM = 'I'.
A_NAME = SY-UNAME.
* Get the list of logged on users
CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
ID 'TAB' FIELD USR_TABL-*SYS*.
WRITE: / 'Recently no one is waiting for you to connect.'.
WRITE: / 'Doubleclick on a name of an active user, to establish'.
WRITE: / 'a conversation or choose the green arrow to exit.'.
SKIP.
WRITE: /2(8) 'CLIENT',
10(14) 'USER NAME',
24(14) 'TRANSACTION',
38(24) 'LAST DIALOG STEP(AGO)'.
SKIP.
SORT USR_TABL BY MANDT BNAME.
LOOP AT USR_TABL.
IF NOT USR_TABL-BNAME IS INITIAL AND USR_TABL-BNAME <> SY-UNAME
AND USR_TABL-MANDT = SY-MANDT.
TEMP_TIM = USR_TABL-ZEIT.
CURR_TIM = SY-UZEIT - TEMP_TIM.
WRITE: /2(8) USR_TABL-MANDT,
10(14) USR_TABL-BNAME,
24(14) USR_TABL-TCODE,
38(24) CURR_TIM.
HIDE: USR_TABL-BNAME, USR_TABL-MANDT.
ENDIF.
ENDLOOP.
CLEAR USR_TABL.
ELSE. "I am a responder
I_AM = 'R'.
A_NAME = LINE.
B_NAME = SY-UNAME.
AB_NAME = A_NAME.
AB_NAME+11 = B_NAME.
CONDENSE AB_NAME NO-GAPS.
BA_NAME = B_NAME.
BA_NAME+11 = A_NAME.
CONDENSE BA_NAME NO-GAPS.
* B sends an answer to A
DELETE FROM INDX WHERE RELID = 'ST' AND
SRTFD = B_NAME.
CLEAR LINE.
EXPORT LINE TO DATABASE INDX(ST) ID AB_NAME.
LINE = 'How are you?'.
EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
COMMIT WORK AND WAIT.
* B calls the display program
EXPORT I_AM A_NAME B_NAME AB_NAME BA_NAME TO MEMORY ID 'AAA'.
SUBMIT ZPOPUPDE VIA SELECTION-SCREEN.
ENDIF. "responder/initializator
* When a user is selected:
AT LINE-SELECTION.
* Double click
IF NOT USR_TABL-BNAME IS INITIAL. " When a partner is selected
* Set up my variables
B_NAME = USR_TABL-BNAME.
AB_NAME = A_NAME.
AB_NAME+11 = B_NAME.
CONDENSE AB_NAME NO-GAPS.
BA_NAME = B_NAME.
BA_NAME+11 = A_NAME.
CONDENSE BA_NAME NO-GAPS.
* Construct the popup message
MESSAGE = 'User'.
MESSAGE+5(12) = SY-UNAME.
MESSAGE+18(44) = 'would like to start a conversation with you.'.
MESSAGE+63(34) = 'Please run transaction ZPOP. Time:'.
MESSAGE+98(2) = SY-UZEIT.
MESSAGE+100(1) = ':'.
MESSAGE+101(2) = SY-UZEIT+2(2).
MESSAGE+103(1) = ':'.
MESSAGE+104(2) = SY-UZEIT+4(2).
MESSAGE+106(10) = ' (Pacific)'.
* A sends the popup window to B
CALL FUNCTION 'TH_POPUP'
EXPORTING
CLIENT = USR_TABL-MANDT
USER = USR_TABL-BNAME
MESSAGE = MESSAGE
EXCEPTIONS
USER_NOT_FOUND = 1.
* A initializes the comunication: write to B, AB, BA.
LINE = A_NAME.
EXPORT LINE TO DATABASE INDX(ST) ID B_NAME.
LINE = 'HELLO'.
EXPORT LINE TO DATABASE INDX(ST) ID AB_NAME.
CLEAR LINE.
EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
COMMIT WORK AND WAIT.
* Wait for the reply for 60 seconds, display a status and check INDX
TIM = SY-UZEIT.
TIM = TIM + 60.
DO.
GET TIME.
DTIM = TIM - SY-UZEIT.
IF TIM < SY-UZEIT.
* No answer from B: clean INDX
DELETE FROM INDX WHERE RELID = 'ST' AND
SRTFD = B_NAME.
DELETE FROM INDX WHERE RELID = 'ST' AND
SRTFD = AB_NAME.
DELETE FROM INDX WHERE RELID = 'ST' AND
SRTFD = BA_NAME.
COMMIT WORK AND WAIT.
EXIT.
ENDIF.
* A displays a progress indicator while waiting
A = 'Waiting for'.
A+12(12) = USR_TABL-BNAME.
A+25(27) = 'to respond. Remaining time:'.
A+53(8) = DTIM.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = ''
TEXT = A.
* A waits for the answer of B: reading BA
IMPORT LINE FROM DATABASE INDX(ST) ID BA_NAME.
* An answer has come from B
IF NOT LINE IS INITIAL.
CLEAR LINE.
EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
COMMIT WORK AND WAIT.
ESTABLISHED = '1'.
EXIT.
ENDIF.
ENDDO.
* Answer has come: wait for 4 seconds, the start the terminal module
IF ESTABLISHED = '1'.
TIM = SY-UZEIT.
TIM = TIM + 4.
DO.
GET TIME.
DTIM = TIM - SY-UZEIT.
IF TIM < SY-UZEIT.
EXIT.
ENDIF.
ENDDO.
EXPORT I_AM A_NAME B_NAME AB_NAME BA_NAME TO MEMORY ID 'AAA'.
SUBMIT ZPOPUPDE VIA SELECTION-SCREEN.
* No answer has come
ELSE.
WRITE: / 'Partner does not answer.'.
ENDIF.
ENDIF.
CLEAR USR_TABL.