291 lines
7.1 KiB
Plaintext
291 lines
7.1 KiB
Plaintext
#
|
|
# FOURJS_START_COPYRIGHT(U,2000)
|
|
# Property of Four Js*
|
|
# (c) Copyright Four Js 2000, 2021. All Rights Reserved.
|
|
# * Trademark of Four Js Development Tools Europe Ltd
|
|
# in the United States and elsewhere
|
|
#
|
|
# Four Js and its suppliers do not warrant or guarantee that these samples
|
|
# are accurate and suitable for your purposes. Their inclusion is purely for
|
|
# information purposes only.
|
|
# FOURJS_END_COPYRIGHT
|
|
#
|
|
|
|
IMPORT com
|
|
|
|
#
|
|
# USER GLOBALS VARIABLES
|
|
#
|
|
|
|
GLOBALS
|
|
DEFINE
|
|
add_in RECORD
|
|
a INTEGER,
|
|
b INTEGER
|
|
END RECORD,
|
|
add_out RECORD
|
|
r INTEGER
|
|
END RECORD
|
|
|
|
DEFINE
|
|
subtract_in RECORD
|
|
a INTEGER,
|
|
b INTEGER
|
|
END RECORD,
|
|
subtract_out RECORD
|
|
r INTEGER
|
|
END RECORD
|
|
|
|
DEFINE
|
|
multiply_in RECORD
|
|
a INTEGER,
|
|
b INTEGER
|
|
END RECORD,
|
|
multiply_out RECORD
|
|
r INTEGER
|
|
END RECORD
|
|
|
|
DEFINE
|
|
divide_in RECORD
|
|
a INTEGER,
|
|
b INTEGER
|
|
END RECORD,
|
|
divide_out RECORD
|
|
quotient INTEGER,
|
|
remainder INTEGER
|
|
END RECORD
|
|
|
|
DEFINE
|
|
divide_by_zero String ATTRIBUTES (XMLName="DividedByZero")
|
|
|
|
END GLOBALS
|
|
|
|
DEFINE serverURL STRING
|
|
DEFINE screen BOOLEAN
|
|
|
|
&define display_status(status) \
|
|
IF NOT screen THEN \
|
|
DISPLAY status \
|
|
ELSE \
|
|
DISPLAY status TO MSG \
|
|
MENU ON idle 1 EXIT MENU ON ACTION close EXIT PROGRAM END MENU \
|
|
END IF
|
|
|
|
#
|
|
# MAIN
|
|
#
|
|
MAIN
|
|
DEFINE ret INTEGER
|
|
|
|
DEFER INTERRUPT
|
|
|
|
LET screen = false
|
|
#
|
|
# Check arguments
|
|
#
|
|
IF num_args() = 2 and arg_val(1) = "-W" THEN
|
|
LET serverURL = arg_val(2)
|
|
CALL CreateCalculatorService(true)
|
|
EXIT PROGRAM
|
|
ELSE
|
|
IF num_args() = 2 and arg_val(1) = "-S" THEN
|
|
LET screen = true
|
|
CALL fgl_setenv("FGLAPPSERVER",arg_val(2))
|
|
CLOSE WINDOW SCREEN
|
|
OPEN WINDOW w WITH FORM "server" ATTRIBUTES(TEXT = "Calculator service", STYLE="naked")
|
|
display_status("Calculator service startup")
|
|
ELSE
|
|
IF num_args() <> 0 THEN
|
|
CALL exitHelp()
|
|
EXIT PROGRAM
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
#
|
|
# Create Calculator service
|
|
#
|
|
CALL CreateCalculatorService(false)
|
|
|
|
#
|
|
# Start the server
|
|
#
|
|
display_status("Starting server...")
|
|
#
|
|
# Starts the server on the port number specified by the FGLAPPSERVER environment variable
|
|
# (EX: FGLAPPSERVER=8090)
|
|
#
|
|
CALL com.WebServiceEngine.Start()
|
|
display_status("The server is listening.")
|
|
|
|
IF screen THEN
|
|
MENU
|
|
ON idle 1
|
|
LET ret = com.WebServiceEngine.ProcessServices(1)
|
|
CASE ret
|
|
WHEN 0
|
|
DISPLAY "Request processed." TO msg
|
|
WHEN -1
|
|
DISPLAY "No request..." TO msg
|
|
WHEN -2
|
|
DISPLAY "Disconnected from application server." TO msg
|
|
EXIT PROGRAM # The Application server has closed the connection
|
|
WHEN -3
|
|
DISPLAY "Client Connection lost." TO msg
|
|
WHEN -4
|
|
DISPLAY "Server interrupted with Ctrl-C." TO msg
|
|
WHEN -9
|
|
DISPLAY "Unsupported operation." TO msg
|
|
WHEN -10
|
|
DISPLAY "Internal server error." TO msg
|
|
OTHERWISE
|
|
DISPLAY "Unexpected server error " || status || "." TO msg
|
|
EXIT MENU
|
|
END CASE
|
|
ON ACTION close
|
|
EXIT program
|
|
END MENU
|
|
ELSE
|
|
WHILE TRUE
|
|
LET ret = com.WebServiceEngine.ProcessServices(-1)
|
|
CASE ret
|
|
WHEN 0
|
|
DISPLAY "Request processed."
|
|
WHEN -1
|
|
DISPLAY "Timeout reached."
|
|
WHEN -2
|
|
DISPLAY "Disconnected from application server."
|
|
EXIT PROGRAM # The Application server has closed the connection
|
|
WHEN -3
|
|
DISPLAY "Client Connection lost."
|
|
WHEN -4
|
|
DISPLAY "Server interrupted with Ctrl-C."
|
|
WHEN -9
|
|
DISPLAY "Unsupported operation."
|
|
WHEN -10
|
|
DISPLAY "Internal server error."
|
|
OTHERWISE
|
|
DISPLAY "Unexpected server error " || status || "."
|
|
EXIT WHILE
|
|
END CASE
|
|
IF int_flag<>0 THEN
|
|
LET int_flag=0
|
|
EXIT WHILE
|
|
END IF
|
|
END WHILE
|
|
DISPLAY "Server stopped"
|
|
END IF
|
|
END MAIN
|
|
|
|
#
|
|
# Create Calculator RPC/Literal service
|
|
#
|
|
FUNCTION CreateCalculatorService(generateWSDL)
|
|
DEFINE serv com.WebService # WebService
|
|
DEFINE op com.WebOperation # Operation of a WebService
|
|
DEFINE serviceNS STRING
|
|
DEFINE generateWSDL SMALLINT
|
|
DEFINE ret INTEGER
|
|
|
|
LET serviceNS = "http://tempuri.org/"
|
|
|
|
TRY
|
|
|
|
#
|
|
# Create Calculator Web Service
|
|
#
|
|
LET serv = com.WebService.CreateWebService("Calculator",serviceNS)
|
|
CALL serv.setFeature("Soap1.1",TRUE)
|
|
CALL serv.setFeature("Soap1.2",TRUE)
|
|
|
|
#
|
|
# Create a Soap Fault
|
|
#
|
|
CALL serv.createFault(divide_by_zero,FALSE)
|
|
|
|
#
|
|
# Publish the functions
|
|
#
|
|
|
|
# Add
|
|
LET op = com.WebOperation.CreateRPCStyle("add","Add",add_in,add_out)
|
|
CALL serv.publishOperation(op,NULL)
|
|
|
|
# Subtract
|
|
LET op = com.WebOperation.CreateRPCStyle("subtract","Subtract",subtract_in,subtract_out)
|
|
CALL serv.publishOperation(op,NULL)
|
|
|
|
# Multiply
|
|
LET op = com.WebOperation.CreateRPCStyle("multiply","Multiply",multiply_in,multiply_out)
|
|
CALL serv.publishOperation(op,NULL)
|
|
|
|
# Divide
|
|
LET op = com.WebOperation.CreateRPCStyle("divide","Divide",divide_in,divide_out)
|
|
CALL op.addFault(divide_by_zero, NULL)
|
|
CALL serv.publishOperation(op,NULL)
|
|
|
|
IF generateWSDL THEN
|
|
#
|
|
# Generate WSDL
|
|
#
|
|
LET ret = serv.saveWSDL(serverURL)
|
|
IF ret=0 THEN
|
|
DISPLAY "WSDL saved"
|
|
ELSE
|
|
DISPLAY "ERROR: Unable to save WSDL"
|
|
END IF
|
|
ELSE
|
|
#
|
|
# Register service
|
|
#
|
|
CALL com.WebServiceEngine.RegisterService(serv)
|
|
display_status("Calculator Service registered")
|
|
END IF
|
|
|
|
CATCH
|
|
display_status("Unable to create 'Calculator' Web Service :"||STATUS)
|
|
EXIT PROGRAM
|
|
END TRY
|
|
|
|
END FUNCTION
|
|
|
|
|
|
|
|
FUNCTION exitHelp()
|
|
DISPLAY "Usage: "
|
|
DISPLAY " ", arg_val(0)
|
|
DISPLAY " Start the server on port defined by FGLAPPSERVER"
|
|
DISPLAY " ", arg_val(0), " -W serverurl"
|
|
DISPLAY " Generate the WSDL file for the given url"
|
|
DISPLAY " ", arg_val(0), " -S port"
|
|
DISPLAY " Start service in graphical mode and on given port"
|
|
EXIT PROGRAM
|
|
END FUNCTION
|
|
|
|
|
|
#
|
|
# USER PUBLIC FUNCTIONS
|
|
#
|
|
|
|
FUNCTION add()
|
|
LET add_out.r = add_in.a + add_in.b
|
|
END FUNCTION
|
|
|
|
FUNCTION subtract()
|
|
LET subtract_out.r = subtract_in.a - subtract_in.b
|
|
END FUNCTION
|
|
|
|
FUNCTION multiply()
|
|
LET multiply_out.r = multiply_in.a * multiply_in.b
|
|
END FUNCTION
|
|
|
|
FUNCTION divide()
|
|
IF divide_in.b != 0 THEN
|
|
LET divide_out.quotient = divide_in.a / divide_in.b
|
|
LET divide_out.remainder = divide_in.a MOD divide_in.b
|
|
ELSE # Handle divided by zero
|
|
LET divide_by_zero = "Cannot divide "||divide_in.a||" by zero"
|
|
CALL com.WebServiceEngine.SetFaultDetail(divide_by_zero) # Throw error
|
|
END IF
|
|
END FUNCTION
|