Download as pdf or txt
Download as pdf or txt
You are on page 1of 144

COPYRIGHT 2001 Michael D. Brooks. Portions copyright 2001 by SoftVelocity Incorporated.

This publication is protected by copyright and all rights are reserved by Michael D. Brooks. It may not, in whole or part, be copied, photocopied, reproduced, translated, or reduced to any electronic medium or machine-readable form without prior consent, in writing, from Michael D. Brooks.. This publication supports ClarioNET and Clarion 5.0 & 5.5. It is possible that it may contain technical or typographical errors. The author provides this publication as is, without warranty of any kind, either expressed or implied. SoftVelocity Inc. is the exclusive worldwide distributor of the ClarioNET Web Enabling Thin Client Technology for Clarion. All information regarding this product can be obtained directly from: SoftVelocity Inc. 2769 East Atlantic Boulevard Pompano Beach, Florida 33062 (954) 785-4555 www.softvelocity.com

Trademark Acknowledgments: SoftVelocity is a trademark of SoftVelocity Incorporated. Clarion is a trademark of SoftVelocity Inc. ClarioNET is a trademark of Michael D. Brooks. Microsoft and Windows are registered trademarks of Microsoft Corporation. All other products and company names are trademarks of their respective owners.
Printed in the United States of America (06/2001)

CONTENTS

CONTENTS
1 - INTRODUCTION AND OVERVIEW Documentation . . . . . . . . . . . . . . . . . . . . . . . 5 What to Read First. . . . . . . . . . . . . . . . . . . . 5 Manual Conventions . . . . . . . . . . . . . . . . . . 6 Technical Support . . . . . . . . . . . . . . . . . . . . 6 Licensed vs. Trial Status . . . . . . . . . . . . . . . . 7 2 - PRODUCT OVERVIEW Thin Client Computing . . . . . . . . . . . . . . . . . . . 9 Architecture . . . . . . . . . . . . . . . . . . . . . . . . 10 3 - SETUP Running the Setup Program. . . . . . . . . . . . . . . . 13 ClarioNET Deployment Requirements . . . . . . . . . . 13 Server Deployment Requirements. . . . . . . . . . . 14 3 - QUICKSTART . . . . . . . . . . . . . . . . . . . . . . . 15 5 - APPLYING CLARIONET TO YOUR APPLICATION . . . 18 Template Options . . . . . . . . . . . . . . . . . . . . . 21 Enable ClarioNET . . . . . . . . . . . . . . . . . . . . . 21 License Password . . . . . . . . . . . . . . . . . . . . . 21 Application Visible on Server (EXE Broker Only) . . . . . 22 Windows HELP Sent to Client . . . . . . . . . . . . . . . 22 INI Files Default to Client . . . . . . . . . . . . . . . . . 22 Reports Use a Progress Bar. . . . . . . . . . . . . . . . 23 56 bit Blowfish Encryption. . . . . . . . . . . . . . . . . 23 Implement as Continuous Connection . . . . . . . . . . 23 Client Refresh Interval (minutes) . . . . . . . . . . . . . 23 ________________________________________________________ClarioNET

2
Client Auto Shut Down . . . . . . . . . . . . . . . . . . 23 Server Auto Shut Down . . . . . . . . . . . . . . . . . . 24 Use ABC Toolbar . . . . . . . . . . . . . . . . . . . . . 24 CPCS Report Generation Compatibility Server . . . . . . 25 LoadStar RPM Templates Compatibility . . . . . . . . . 25 6 - PROGRAMMING CONSIDERATIONS Introduction . . . . . . . . . . . . . . . . . . . . . . . . 27 Design Guidelines . . . . . . . . . . . . . . . . . . . . . 28 Defines . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Window Management . . . . . . . . . . . . . . . . . . . 30 File and INI File Management . . . . . . . . . . . . . . . 31 Help Files . . . . . . . . . . . . . . . . . . . . . . . . . 32 Graphics Statements . . . . . . . . . . . . . . . . . . . 33 Security . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Encryption . . . . . . . . . . . . . . . . . . . . . . . 33 User Access . . . . . . . . . . . . . . . . . . . . . . 34 Server Access . . . . . . . . . . . . . . . . . . . . . 34 IIS Patches . . . . . . . . . . . . . . . . . . . . . . . 34 User Interface Considerations. . . . . . . . . . . . . . . 34 Application Design Notes . . . . . . . . . . . . . . . . . 35 7 - CONVERSION CONSIDERATIONS Reviewing Source Code Procedures . . . . . . . . . . . 37 Searching USE Attributes on Controls . . . . . . . . 38 ABC vs. Clarion Template Chain . . . . . . . . . . . . . 38 8 - REPORTING Server Printing Setup Considerations . . . . . . . . . . 39 ClarioNET Server Sire Rreport Programming. . . . . . . 40

CONTENTS

ClarioNET________________________________________________________

CONTENTS
Client Side Processing . . . . . . . . . . . . . . . . . . 41 9 - SERVER SETUP Print Setup . . . . . . . . . . . . . . . . . . . . . . . . . 43 Database . . . . . . . . . . . . . . . . . . . . . . . . . . 44 10 - CLIENT PROGRAM Include Files . . . . . . . . . . . . . . . . . . . . . . . . 45 Deployment Requirements . . . . . . . . . . . . . . . . 46 Client Size and Download . . . . . . . . . . . . . . . . . 46 11 - SERVER DEPLOYMENT Testing and Developing with the Application Broker . . . 47 Performance . . . . . . . . . . . . . . . . . . . . . . . . 50 File Locations . . . . . . . . . . . . . . . . . . . . . . . 51 Graphics Files : ICO, JPG, GIF, & Other image files . . . 52 12 - ADVANCED TASKS/HOW-TO How to Transfer Files . . . . . . . . . . . . . . . . . . . 53 How to Use Command Line Parameters . . . . . . . . . 59
How to Call a Client Procedure To Execute on the Client . . . 60

How to Place a HyperLink in the Server Program . . . . 62 How to Change a Client Side Cursor . . . . . . . . . . . 62 How to Display a Splash Screen at Startup. . . . . . . . 63 APPENDIX Files Installed . . . . . . . . . . . . . . . . . . . . . . . 65 ClarioNET Report Functions. . . . . . . . . . . . . . . . 68 Other Server Side ClarioNET Procedures . . . . . . . . 70 Server Class Defined. . . . . . . . . . . . . . . . . . 70 Initialization and Closedown . . . . . . . . . . . . . . 70 Responding to Client Queries . . . . . . . . . . . . . 72 ________________________________________________________ClarioNET

4
Window Management . . . . . . . . . . . . . . . . . 73 Miscellaneous . . . . . . . . . . . . . . . . . . . . . 76 PushWindow . . . . . . . . . . . . . . . . . . . . . . 77 Client Class Properties . . . . . . . . . . . . . . . . . . 80 Windw Structures Properties Support . . . . . . . . . . 88 Window Complexity Limitations . . . . . . . . . . . . 89 WINDOW and APPLICATION Properties . . . . . . . 90 Control Properties . . . . . . . . . . . . . . . . . . . 91 General Property and Control Notes . . . . . . . . . 104 Forced Closedown . . . . . . . . . . . . . . . . . . . . 112 Notes for Hand Coders. . . . . . . . . . . . . . . . . . 113 Problems and Limitations . . . . . . . . . . . . . . . . 117 Additional Programming Guidelines . . . . . . . . . . . 122 Clarion Library Source Code Changes . . . . . . . . . 123 Changing the BUILTINS.CLW file . . . . . . . . . . 123 Clarion LEGACY Template Changes . . . . . . . . 124 Template Registry Setup . . . . . . . . . . . . . . . . . 125 Error Messages. . . . . . . . . . . . . . . . . . . . . . 125 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

CONTENTS

ClarioNET________________________________________________________

1 - Introduction

1 - Introduction
Documentation
What to Read First
Everything you need to know to apply ClarioNET to a Clarion Application should be in this book. If one of your questions is not answered we want to know! Please email documentation@softvelocity.com and tell us how we can make this document even more useful for you. To enjoy the fastest way to get acquainted with ClarioNET we suggest that you:

Skim the Product Overview section in this chapter and be sure you
read the white papers located at www.softvelocity.com/clarionet.

Run the Setup program for ClarioNET to install the development


system on your computer. The README.TXT file is also the only location where you can review the most up-to-date information not included in the manual.

Have the Clarion Application Broker installed on the computer youre


using to develop your ClarioNET application, even if you intend to deploy on another machine (see chapter 10 for additional information).

Follow the steps in the QuickStart chapter for a brief but instantly
gratifying experience in applying ClarioNET to a Clarion .APP file and then running it over IP (using localhost). After those initial steps we sincerely hope that you read through this entire document. Weve designed it as a reference and a users guide to assist you in answering the How Do I...? and What parameter does this function take? questions.

________________________________________________________ClarioNET

6
Manual Conventions
Symbols are used in the syntax diagrams as follows:
Symbol
[]

1 - Introduction

Meaning
Brackets enclose an optional (not required) attribute or parameter.

( )

Parentheses enclose a parameter list.

| |

Vertical lines enclose parameter lists, where one, but only one, of the parameters is allowed.

Coding example conventions used throughout this manual:


IF NOT SomeDate SomeDate = TODAY() END ! IF and NOT are keywords ! SomeDate is a data name
! TODAY and END are keywords

Any word in ALL CAPS is a Clarion language keyword. DataNames use mixed case with caps for readability. comments are predominantly in lower case. The purpose of these conventions is to make the code examples readable and clear.

Technical Support
You can receive unlimited free technical support for ClarioNET on the Internet.

Access the comp.lang.clarion newsgroup through any USENET


server.

Access the SoftVelocity.products.ClarioNET newsgroup which is


hosted only on the news.softvelocity.com news server.

Visit SoftVelocitys Web page at http://www.softvelocity.com for


further Clarion and ClarioNET resources. Paid telephone technical support is also available from SoftVelocity Incorporated at (954) 785-4556. Call Customer Service at (954) 785-4555 for more information on the various support programs SoftVelocity offers.

ClarioNET________________________________________________________

1 - Introduction
Licensed vs. Trial Status
The ClarioNET programming package is supplied as a complete system with one exception....it operates in a Trial mode until you enter your ClarioNET license number. All of the functionality is available with the Trial mode....you can use it to completely develop your web enabled application or test a conversion of an existing application. At the trial level the client program will ALWAYS display a Unlicensed Demonstration Version banner as a starting window after launching the server based program and at regular intervals throughout the client session. When your ClarioNET license is purchased you are assigned a LicensePassword. You can enter this license password into the main template parameter screen -or- as the first parameter to the ClarioNETServer:Init procedure call. When a valid License Password is specified the Unlicensed Demonstration messages will be removed.

________________________________________________________ClarioNET

1 - Introduction

ClarioNET________________________________________________________

2 - Product Overview

2 - Product Overview
Thin Client Computing
Thin Client computing has become the vision of the future for distributing application software to users desktops. Thin Client refers to a small, self-contained program that resides on the users (client) computer that displays screens and processes only keyboard and screen input. It is directly linked to the real program that is running at a remote location....on a powerful server. The two programs operate by exchanging information. The client tells the server what mouse and keyboard actions the user has performed. The server tells the client what to display to the user. This type of software design has many advantages over the early method of software distribution and usage:

The software and data are installed just once on a centralized server.
There are no large installation tasks on the client systemjust a simple single file executable program.

The database is held on a high speed, secure file server with a quality
backup plan in place.

When updates are released there is no distribution; only the server


files need to be changed.

The program is available from many locations available to the user.


No need to manage multiple installations and mirrored databases.

Access to the software can be easily controlled, both at startup and at


the lowest procedure access level.

In any company, configuration and management strategies for


departmental usage are trivialized and client hardware requirements are vastly simplified. There are many, many more advantages that come to light when a specific business model or need is analyzed. Uses from application hosting/rental, WAN program distribution, and support for field personnel are all within the realm of what ClarioNET offers.

________________________________________________________ClarioNET

10

2 - Product Overview

Clarion in the Thin-Client World


ClarioNETTM provides thin-client and n-tier solutions for ClarionTM development. With Clarion for Windows and the ClarioNET extension library, programmers can create a single code base for both native Windows applications and Intranet/Internet applications which duplicate them. An end user of Clarion applications now has TWO options for deployment:

The application can run as the normal Microsoft Windows


executable from their desktop.

The user can run its User Interface only. The application itself
executes on an Intranet or Internet server connected to the User Interface over the HTTP (web) protocol. The user experiences the same rich Windows interface with speedy performance and full functionality....with zero additional programming or capability loss.

Architecture
For a ClarioNET deployment you actually create two different executables programs 1) One is the actual Clarion application which is the program that contains the full functionality. These are the EXE and DLL files that can run as a standalone desktop application -or- can reside and run on a server running either Microsoft Internet Information Server or the Clarion Application Broker. This executable communicates with the database, gathers data for all displayed windows, takes care of updates, and formats the reports. The only thing it doesnt do is display on the server console when running as a ClarioNET application. The second program is the Client application which is also a Windows executable program. This program contains no logic except the ClarioNET remote User Interface system. As a Windows program it has full access to normal Windows controls and resources such as local printers. When the ClarioNET client application is started it contacts the server via HTTP protocol and requests that the server run a particular application. The server then starts a new instance of the program and provides the client with

2)

ClarioNET________________________________________________________

2 - Product Overview
an identifier so that it can be uniquely identified for future communication with the same instance of the server application.

11

The server application will send the client encrypted, compressed data that tells it the full structure of all windows to display and what data to display in the controls. The client is simply an intelligent assistant that receives instructions from the server to render and manage a user interface. The user operates the program as presented by the client EXACTLY as they would be running the program locally. The ClarioNET client and server subsystems handle all user interactions and window updates throughout the session and for all aspects of the application running on the server.

Once the application instance on the server is started and it opens a window, the Client then opens an identical window and controls. To the end user it appears that a normal Windows program executes...the only difference being a small green/yellow/red LED control on the title bar which indicates when the client is communicating with the server. Typically when a new window is displayed the client and server exchange between 1,000 to 9,000 bytes of data. Thereafter only instructions to update data are exchanged, usually less than one kilobyte per exchange (and most of the time less than 200 bytes!). ClarioNET does not use constant communication streams like other remote client products, helping to keep bandwidth requirements down and server activity to a minimum. This small communications overhead results in a snappy and fast interface for the end user. The client application itself is a one-time download of a single EXE file of as little as 500KB, and may be used for as many sessions or applications as the end user has access to.

________________________________________________________ClarioNET

12

2 - Product Overview
If the user selects to print a report, the report is formatted and created as a WMF file on the server and sent to the client application. The client application then displays a preview and prints the metafile to the local printer. This means the exact report that is designed for the application is what the client gets....a superior solution to browser-based report layout capabilities. As the client continues to open windows, manipulate controls, or create reports, these actions are executed on the server. Encrypted & compressed communications convey the results to the end user and send new data or commands back to the server. When the end user shuts down the application, both the client program and the instance on the server are terminated. If the end user loses a connection, the server application is terminated when it reaches a timeout value set by the developer.

ClarioNET________________________________________________________

3 - Setup

13

3 - Setup
Running the Setup Program
To install ClarioNET you must have already installed Clarion Version 5.0 or later. We strongly recommend that you apply all patches (which are freely downloadable) from www.softvelocity.com to your copy of Clarion. Locate SETUP.EXE, double-click the icon, follow the directions, and read the README.TXT files to install ClarioNET.
Note: The setup program will back up your BUILTINS.CLW file and replace it. If you have customized the BUILTINS.CLW file you must compare the old and new files to merge previous changes into the new file.

ClarioNET Deployment Requirements


ClarioNET supports 32 bit compiled Clarion Version 5.0 and 5.5 applications. To allow your Clarion Applications to run over an Intranet or the Internet using ClarioNET you will need SoftVelocitys Clarion Application Broker and, for convenience, a static IP address for the server.

Minimum Requirements for the Client


In general, if the client can run a recent release of a browser such as Microsoft Internet Explorer or Netscape Navigator, the ClarioNET client should work. This indicates the Microsoft WININET.DLL file of internet procedures is present on the computer.

Microsoft Windows 95,98,NT,2000, or ME TCP/IP Internet Connection using HTTP 4-16 MB RAM of available ram (depends on application complexity)

________________________________________________________ClarioNET

14
Suggested Server Specifications
These suggestions assume you will be deploying a normally complex Clarion application and expect a normal load of 20 to 50 simultaneous instances on the server. More users will require additional RAM and multiple processors for optimal performance.

3 - Setup

Microsoft Windows NT or 2000 server 512 MB Ram Recommended Pentium 733MHz or better recommended. 256kbps high quality internet TCP/IP Internet Connection using HTTP with a static IP address.

Clarion ISAPI or EXE Application Broker

ClarioNET________________________________________________________

4 - Quick Start

15

4 - Quick Start
This section shows you a quick way to get an example application up and running. In just minutes you will add the ClarioNET template, recompile, copy some files, and run your first ClarioNET application that you created More complete explanations of all the steps appear later in this manual. For the QuickStart, you will open an example.app file, apply the ClarioNET template, and run it through the Application Broker.
Note: The Clarion Application Broker must have already been installed. Please consult the documentation for that product.

Just follow these steps: 1. 2. 3. If you have not run the Application Broker setup, do so, accepting the default file locations. Start the Application Broker. Open your browser and type the URL http://localhost (or http://localhost:8080 if youre using an alternate port) to verify that your IP sockets are set up correctly. You should see a standard SoftVelocity default.htm web page that was installed with the Clarion Application broker in your browser. If you do not then either TCP/IP is not installed, the localhost id is not established on your computer, or some other problem exists that you will need to correct. 4. 5. Open the Clarion for Windows development environment. Open a small application weve installed for you:
(Clarion directory)\Examples\Clarionet\Quick\Quick.app

The following # 6, 7, 8, 9, and 10 is required for Clarion 5.0 applications and any hand-coded projects. The template for Clarion 5.5 applications adds the project define automatically. 6. 7. Press the [Project] button in the Application Tree dialog. Press the [Properties] button in the Project Properties dialog.

________________________________________________________ClarioNET

16
8. 9. Click the Defines tab. Add ClarioNETUsed to your defines.

4 - Quick Start

10. Press OK twice to return to the Application Tree.


Note: ClarioNET applications must be 32-bit stand-alone applications.

11. Press the [Global] button. 12. Press the [Extensions] button in the Global Properties dialog. 13. Press the [Insert] button in the Extension and Control Templates ialog. 14. Select ClarioNET(Server) in the ClarioNET class to add it, accepting all the default settings. 15. Press [OK] twice to return to the Application Tree. 16. Compile your application. 17. Make a directory under the CWICWEB tree named \CWICWEB\CWEXEC\QUICK. 18. Copy the files QUICK.EXE and STATES.TPS from the directory
(Clariondirectory)\Examples\Clarionet\Quick\

to the directory
\CWICWEB\CWEXEC\QUICK.

19. Copy the files C55RUNX.DLL, C55DOSX.DLL and C55TPSX.DLL from the directory
(Clarion directory)\bin

to the directory
\CWICWEB\CWEXEC

20. Copy the files CLRNT55S.DLL, and LSCOMP.DLL from the directory
(Clarion directory)\bin

to the directory
\CWICWEB\CWEXEC\QUICK.

ClarioNET________________________________________________________

4 - Quick Start
Client screen showing round LED indicator at upper-right

17

21. Run the pre-compiled client: and press the [Connect] button.
Note:
(Clarion directory)\Examples\Clarionet\Quick\Qwikclnt.exe

If port 80 is already used and you will be using port 8080 for the application broker, youll see a Port box in the client; please change this from 80 to 8080 before connecting.

You should be running a small application for browsing and editing a small list of state abbreviations. Note the LED indication on the caption bar. This is the only indication on the client side that this is different than a normal application. The LED alerts when your client is ready & waiting for your actions (green), processing an outgoing or incoming task (yellow), or sending & receiving instructions from the server (red). If you input anything from the client side by mouse or keyboard while its yellow or red it will beep to inform you that it couldnt process the input....you should make the request again.

________________________________________________________ClarioNET

18

4 - Quick Start

ClarioNET________________________________________________________

5 - Applying ClarioNET To Your Application

19

5 - Applying ClarioNET To Your Application


Before applying the template, you must add a define to your project: 1. 2. 3. 4. Press the [Project] button in the Application Tree dialog. Press the [Properties] button in the Project Properties dialog. Click the Defines tab. Add ClarioNETUsed to your defines. (C5.0 only; template will add it automatically for 5.5)

Note:

Many programs will appear to run, at first glance, without adding the ClarioNETUsed define. You must still add the define, for its possible that you will encounter problems when you explore your program running under ClarioNET. The POPUP, HELP, INI, ALERT, SELECT, and all graphics capabilities will not work unless this define is added.

After adding the define, apply the ClarioNET global template to your application:

________________________________________________________ClarioNET

20
1. 2. 3. 4. 5. 6.

5 - Applying ClarioNET To Your Application


Press the [Global] button in the Application Tree dialog. Press the [Extension] button. Press the [Insert] button. Select the ClarioNET(Server) extension. Change any of the template options (as described below) and press to close the previously opened dialog boxes

[OK]

Compile your application.

Important ! The template needs to be added to ALL application files, including


APP files that generate LIB and DLL modules. (Hand coded and 3rd party code must also be reviewed and ClarioNET calls included)

For your Clarion application to run successfully on the web with


ClarioNET, all procedures that display windows that require user interaction to close must have ClarioNET procedure calls added to them.

Applying the template and recompiling will in most cases create a web
enabled application ready for immediate testing. However, it is sometimes impossible for ClarioNET to locate every window or control that awaits user interaction in the embed code that you may have added to the template generated code. Therefore it is necessary to examine the behavior of all the windows, reports, and commands within your application to verify that they work properly. The next chapter will provide you with detailed information on the considerations you as a programmer must keep in mind so that you can convey all the functionality of a normal application to the remote user using ClarioNET.

When compiling your server application, remember that it must be


32-bit standalone program.

ClarioNET________________________________________________________

Template Options

21

Template Options
Enable ClarioNET
This checkbox enables or disables the inclusion of ClarioNET code in your ABC or Clarion (legacy) generated application.

License Password
This password is provided with your purchased copy of ClarioNET. The ClarioNET programming package is supplied as a complete system; you must, however, enter your license code when you develop an application. If you do not specify a License Password your applications will display Unlicensed Demo banners and licensing reminder messages.

________________________________________________________ClarioNET

22

Template Options
The License Password is assigned to you at the time the license is purchased. All of the functionality is available without entering a License Password...this is called Trial mode. You can use it to completely develop your web enabled application or test a conversion of an existing application. This is useful to show work in progress to a client, provide a web demo to prospects, or just to educate yourself of the groundbreaking capabilities of ClarioNET. Hand coders will need to enter the valid License Password as the first parameter to the ClarioNETServer:Init function.

Application Visible on Server (EXE Broker Only)


Use this setting with the standalone EXE Application Broker only. This flag enables display of the running application on the server. You should always set this to Off for a deployment build. By displaying the screen on the server you can both detect messages that prevent the application from starting when you are becoming familiar with server deployment -and- to view the behavior of the program if something does not look quite right on the client. The two should be identical. The ISAPI version of the Application Broker inherently prevents any screen display from a running application launched through the ISAPI extension.

Windows HELP Sent to Client


ClarioNET has the ability to transfer your standard Windows HLP files to the client and access them there with the same commands. Check this box to enable HELP functionality. ClarioNET:EnableHelp(1) will be added to your program_name.CLW. file. A call to HELP is redirected to an internal ClarioNET function which sends the specified help file to the client (or without parameters instructs the client to display the help system). You can use the ClarioNET:EnableHelp method to change this behavior at any time.

INI Files Default to Client


ClarioNET has the ability to automatically redirect all GETINI and PUTINI calls to the client. Check this box to enable this redirection. Investigate this option before turning it on.....it is possible for numerous

ClarioNET________________________________________________________

Template Options
INI calls to be made that will severely effect the performance of your program because of network lag time.

23

Reports Use a Progress Bar


You have the option of enabling a Progress Bar on the client while a report is being generated. Checking this item will activate code that sends a message to the client at intervals during report creation when the progress thermometer value reaches 7% intervals. This means that a maximum of 14 updates will happen to the client progress bar during a report generation process. In general, only use a progress bar for reports expected to exceed 100 pages because printing speed will be effected for small reports.

56 bit Blowfish Encryption


Check this box to instruct ClarioNET to encrypt all datastreams sent between client and server with a 56-bit blowfish encryption algorithm. We recommend always using encryption because the internal program code is very highly optimized and there will be essentially no time penalty.

Implement as Continuous Connection


ClarioNET must have a way of detecting user inactivity so that it can shut itself down to free server resources. Continuous Connection can be used for always-on systems, such as point-of-sale or equipment monitoring systems. This checkbox turns continuous connection mode on and requests a Client Refresh Interval. This means that as long as the client program is running it will contact the server program at regular intervals to tell it Im still here...dont shut down.

Client Refresh Interval (minutes)


(Used with Continuous Connection). This specifies the time interval for the client to automatically send the server a message. A message will be sent every Client Refresh Interval minutes to tell it that the client is still alive.
Note: The Server Auto Shutdown time will still be used in case the client stops automatically responding to the server, as in the case of a client location computer hang, power outage, or Internet service interruption.

________________________________________________________ClarioNET

24
Client Auto Shut Down

Template Options

This value is the number of minutes the Client will wait for any type of user activity (keypress, mouse control selection, etc.) before automatically shutting down both the server and client programs. For example, if the end user forgets to shut down the server based program (goes off to lunch or leaves for the day), it is good practice to have it shut down so as not to consume server resources. A value of zero (0) disables the inactivity check.
Note: The Client shut down time must always be less than the server shut down time. If your entries specify otherwise the Server Auto Shut Down time will be internally set to one minute longer than the Client Auto Shut Down time.

Throughout the ClarioNET session the server program waits for client commands, except when Push Window calls are executed. The server has no way to tell the client it is shutting down. By setting the client time shorter than the server time the client will always shut down first. The server time is only used when the client and server have lost contact and the server program must shut itself down to rid the server of a hung program instance.

Server Auto Shut Down


This value is the number of minutes the server will wait for any type of contact from the client before posting a HALT() command. Normally the Client will automatically send a signal to the server at time intervals equal to (Client Auto Shut Down Time / 3) to tell the server program that the client is still alive. If the Client program ceases to continue functioning the server will not receive these signals. When no signal has been received for longer than the minute value specified, the server program will shut itself down. A value of zero (0) disables the inactivity check.

Use ABC Toolbar


Clarion ABC programs offer the option of using a toolbar and/or buttons to control listbox behavior. For thread and window management purposes, in ClarioNET the Button window design is more efficient and reliable than the Toolbar design. In a strictly local execution of a program Clarion uses MDI to route toolbar events to procedures.

ClarioNET________________________________________________________

Template Options

25
Web applications cannot use MDI, and so ClarioNET must duplicate the toolbar on each window. This is a complex process, made harder because the template must automatically detect when a toolbar is to be used.

CPCS Report Generation Compatibility Server


This flag signals the template to generate slightly different code into REPORT procedures that are generated with the CPCS templates that contain their own unique template identification.
Note: It is imperative that no windows are present in CPCS reports that require user interaction. The PREVIEW attribute on reports (or the equivalent property assignment) must always be used. DO NOT PREFORM WINDOWED PRINT PREVIEW IN THE SERVER PROGRAM.

LoadStar RPM Templates Compatibility


This flag signals the template to generate slightly different code for use with these templates.

________________________________________________________ClarioNET

26

Template Options

ClarioNET________________________________________________________

6 - Programming Considerations

27

6 - Programming Considerations
Introduction
In general, the internal workings of a Clarion application easily lends itself to separating the user interface from the application. Clarion programs create controls, customize their appearance, and fill them with data before displaying them on screen. The complete description of a window is a data structure. During program operation, all data structures are created before the ACCEPT loop is started, The ACCEPT loop starts and displays the data structure, and then the ACCEPT loop awaits user interaction. ClarioNET replicates the data structures that the server application creates on the client and the client uses the local copy of Windows to render the identical window (data structure). The client then begins its ACCEPT loop, and transfers any messages regarding user interaction back to the server based program. The server processes these events, keypresses, and data changes, and sends back just the changes to the data structures to the client. The client again asks the local copy of Windows to make any changes to the relevant controls.

________________________________________________________ClarioNET

28

6 - Programming Considerations
If you understand this it should be easy to debug any programs that youve applied the ClarioNET template to. Keeping this workflow in mind when you create new applications will enable you to easily design new programs with ClarioNET in mind as an option, whether you implement the new application as a ClarioNET application or a normal desktop application. In general, just about everything in wizard-generated template code transfers to ClarioNET without modification. Any logic that you place in embeds should also transfer easily providing you observe the basic design guidelines (see next section). Any user interface code that you place in embed code that creates windows, utilizes timers, or awaits user interaction, however, will need to be checked. The ClarioNET template generally finds all the user interface code in the windows and reports that the templates generate, but it cant always guarantee the same for your embeds.

Design Guidelines
These items should be carefully checked during your program design stage to avoid hard to find problems in the later stages of development.
IMPORTANT ! It is ESSENTIAL that the design guidelines below are followed before you test or deploy your ClarioNET web enabled program.

If your program needs to operate both as a local program and web deployed program use ClarioNETServer:Active() to test if the application was launched by the Clarion Application Broker and is running as a web deployment.

Add ClarioNETUsed as a project define. Make the required source code changes to BUILTINS.CLW Disable all Edit In Place usage. This is automatically done for you in
the ABC templates.

Disable or remove all ABC Query By Example (QBE) usage (the


ABC classes create complete windows for QBE control at runtime that are not manageable by ClarioNET without rewriting the ABC classes).

Your server program must be StandAlone. Your client program must be Local.

ClarioNET________________________________________________________

6 - Programming Considerations
Check your WINDOW and APPLICATION structure to be sure all
controls have USE attributes. If you need to add them you can use a dummy field equate label.

29

Your application will run as Single Document Interface (SDI). Make


sure your program is designed or modified to run properly as a SDI program by checking the expected results from START and POST Clarion statements.

Do not allow ANY processing or procedures calls to be performed on


EVENT:Timer.

For best results controls should have X, Y, Width and Height


specified.

Disable Clarions INI file strategy of saving window sizes in INI files. Do not use windows in report procedures. Gather all data needed to
generate a report THEN call the procedure that generates the report.

Always use the PREVIEW attribute on reports. If using the ISAPI Clarion Application Broker make the entries in the
Windows registry to specify a system default printer.

The following limits to screen controls should be checked:


a) Maximum of 40 total LIST and COMBO controls per window. b) Maximum of 200 fields in a LIST QUEUE. c) Maximum of 1000 total ENTRY, SPIN, CHECK, SHEET, OPTION, PROGRESS, ITEM, LIST and COMBO controls per WINDOW. d) Maximum of 25 TEXT controls per window. e) Maximum of 40 ICONs within each LIST control. f) Maximum of 25 ALRT keys per window and per control. No aggregate limit. g) After opening and closing the first APPLICATION or WINDOW you can not use another. ClarioNET is designed assuming the server program will exit after the first top level window is closed.

Both Client and Server programs must be 32 bit. Disable all Drag & Drop usage. Disable or remove all OCX controls. Delete Clarion Internet Connect or Web Builder templates from the application.

Do not use EVENT:Last 3 to EVENT:Last Use ClarioNETWindow.MouseX and ClarioNETWindow.MouseY to


inspect mouse locations on the client window when an action took place.

________________________________________________________ClarioNET

30

6 - Programming Considerations
Windows API calls are not transferred through to client. Disable all
calls to write to the window, play sounds, etc..

If runtime tabbing order changes are used with a PROP:Follows


assignment, substitute a call to CLARIONET:SetPropFollows.

The client ClarioNET library requires Microsoft WININET.DLL to


provide the HTTP communication capability.

Defines
Always add ClarioNETUsed as a project define. For Clarion 5.0 applications do the following: 1. 2. 3. 4. Press the [Project] button in the Application Tree dialog. Press the [Properties] button in the Project Properties dialog. Click the Defines tab. Add ClarioNETUsed to your defines.
Many programs will appear to run, at first glance, without adding the ClarioNETUsed define. You must still add the define, for its possible that you will encounter problems when you explore your program running under ClarioNET further.

Note:

Window Management
Your program running on the server is using the Client as the user interface. The two must always be aligned, that is the client is displaying the window exactly as it exists on the server. Most of this is automatic however you must keep in mind:

Hidden BREAK commands that exit a Windows ACCEPT loop


without posting an EVENT:CloseWindow will misalign the client and server. Replace BREAK from a window with POST(EVENT:CloseWindow).

Do not use TIMER events to call procedures that open windows or


call any ClarioNET procedures.

Your program cannot use Multiple Document Interface (MDI). This is


a restriction placed on the program by the Clarion Application Broker. ClarioNET uses the property assignment SYSTEM{PROP:Threading} = 0 to forcefully turn off threading capability.

ClarioNET________________________________________________________

6 - Programming Considerations

31

INI File Management


In general, you will probably prefer to store .INI files on the client to tailor the application specifically to the connected user. You can easily do this in the ClarioNET template options in the global template. If you choose to store the .INI file on the server, please turn off storing window positioning due to the possibility of differing screen resolutions from session to session. Its possible that a client may run the application on a 1024 by 768 desktop, close the application in the lower right hand corner of that desktop, and then the next user tries to run it from a 640 by 480 desktop. That user may wonder where the window is. You may wish to set the window height and width for your first window to default, and place the CENTER attribute on it. This is an attractive option for most installations.
Warning! If you choose to send all INI file access to the client your programs performance could suffer badly. Please test first and check your source code for potentially numerous INI calls. It might be easier to send small configuration files between client and server at startup.

________________________________________________________ClarioNET

32

6 - Programming Considerations

Help Files
ClarioNET supports Windows help that is implemented in Clarion using the HELP() statement to specify the help file to be used. ClarioNET redefines the HELP Clarion procedure call to ClarioNETs own internal procedure. When your application is not being used in ClarioNET mode then the standard Clarion help system on the local computer is used. ClarioNET supports help by transferring the entire HELP file to the client along with the HLP attributes on all screen controls. The help file is transferred at startup and, if your server application has specified a new help, when the client window is being updated. The help file on the client follows the same usage as the icon and image files.
Note: All files are loaded from server to client once and are deleted when the client worksession is complete.

Because the entire help file is sent to the client, it is strongly recommended that you keep the help file(s) small. You can use multiple calls to HELP in your application to bring the proper one of multiple

ClarioNET________________________________________________________

6 - Programming Considerations
.HLP files into scope. The file is only sent once during a session; repeated calls will not cause another file transfer.

33

In a hand coded program you must explicitly add a line of code to enable help, at the start of your application, following ClarioNETServer:Init:
ClarioNET:EnableHelp( SHORT Mode),SHORT

This function turns on and off the help system usage. The Mode parameter should be 1 to enable the transfer of the help file to the client and 0 to prevent the transfer of the help file to the client. This also effects the call to HELP without parameters!

Graphics Statements
ClarioNET supports all the Clarion language statements: ARC, BLANK, BOX, LINE, CHORD, ELLIPSE, ROUNDBOX, SHOW, TYPE, PIE, AND POLY. This is done by redirecting the standard Clarion graphics calls to ClarioNET procedures by using the ClarioNETUsed define and the revisions to the BUILTINS.CLW file. ClarioNET automatically detects whether the application is running on a local desktop or was launched by a remote ClarioNET client and will redirect the graphics as needed (graphics sent to reports are not effected). Windows API calls that draw to the window are not captured.

Security
There are three general areas of security for consideration: encryption, user access, and server access.

Encryption
All communications between client and server are encrypted, and up to 56 bit encryption is provided. This provides a very high level of security for your data against compromise by potential crackers with packet sniffers. In certain cases higher encryption might be needed (financial institutions for example). Should this be the case, please contact SoftVelocity.

________________________________________________________ClarioNET

34
User Access

6 - Programming Considerations

Although ClarioNET encrypts the data it cant prevent remote users from leaving client program icons on their desktop which, with just a double-click, can be used to access the data by anyone passing by. We encourage you to add a password procedure to the client application. By initially disabling the Connect button before password verification you can prevent initial unauthorized access. In this case you will probably not want to store user IDs and passwords in a data file, which would then have to be downloaded to the client along with the drivers. An alternative would be to store user IDs and passwords in an array in the client EXE and check against that as a simple and straightforward first line of protection.

Server Access
We strongly encourage you to build password checking into the server side application. Because the client cannot access any data files on the server unless you specifically download them to the client with code in the server program, its simple enough to use a local data file for verification of access rights. This also allows you to collect the user ID and password to forward to the database server.

Microsoft IIS Patches


In addition to ClarioNET security considerations, we highly recommend that sites keep their IIS software updated with the latest security patches from Microsoft, and that the administrator regularly monitor Microsofts site for security announcements.

User Interface Considerations


In general, the end user will perceive a ClarioNET application no differently than a normal Windows application. You can design the windows for your applications the same as a normal application. Display of normal windows and report components will be very quick, resulting in an application with a very fast feel.

ClarioNET________________________________________________________

6 - Programming Considerations

35

Application Design
You are in charge of the application programs design. Because there will be 50 or so copies of the same application running on the server each coding efficiency or coding mistake will be magnified 50 times. ALWAYS be thinking about these items:

Execution speed for a given user event


The efficiency of the program from the users perspective is how quickly their actions are completed. Aim for less than one second.

Thoroughly examine your file usage


Use a fast and large caching disk controller. Test your queries and VIEWs and tune them for the usage. Huge queries will effect all users on your server. Examine using a separate DBMS server.

Memory usage
Dont hog RAMyou will be taking it from all the other instances of your program.

Limit use of INI files on the client


.each PUT or GET requires a round-trip.

Put more controls on a screen


ClarioNET and Clarion can handle huge screens.1,500 controls are common. Doing this and hiding/unhiding groups is far faster than constantly sending new small screens. The time to scan, compress, send, uncompress, and build the screen on the client is small compared to opening and closing lots of windows.

Use larger QUEUES for LISTs


Constant LIST updates because of small QUEUE record counts requires more round trips. Because ClarioNET uses advanced compression it is faster to use larger data sets.

Always put most of the functionality into DLLs


Because the DLL is only loaded once and your EXE is loaded for each new instance you can be far more memory efficient using DLLs.

Examine your LOOP processes thoroughly


For example, using the INSTRING procedure is notoriously slow compared to using string slicing in a loop. Adding many bitmapped graphics to your windows adds to the amount of information that the end user will need to download before displaying the window. ClarioNET compression is good, but be sure to test performance over the type of connection you expect your remote users to use when using many IMAGEs. Always try to precompress GIF and JPG graphics with a good compression tool like uLead Smart Saver.

________________________________________________________ClarioNET

36

6 - Programming Considerations
Your end users may be running in different resolutions, and have
different fonts on their systems. Try to keep your windows from growing overly large, and stick to basic fonts such as Arial, Times New Roman, and MS Sans Serif.

Because MDI is not supported in ClarioNET, consider redesigning


those applications where users typically open several browses during the normal course of work.

Providing thin client versions of your application is often a good


opportunity to discuss with your end users the creation of a cleaner redesign of existing applications. Many Clarion applications began life as DOS applications, and when ported to Windows, developers minimized interface changes to maintain familiarity for experienced users.

ClarioNET________________________________________________________

7 - Conversion Considerations

37

7 - Conversion Considerations
Reviewing Source Code Procedures
We strongly encourage you to review your source code module by module, specifying that the development environment show you all filled embed points. This will allow you to identify any windows, timers, or other user interface features which were not template generated. Clarion makes it easy to do this. You may select the Category tab in the application tree to view all source code type procedures. You can just right-click each, choose Source, and then review all your code. Additionally, you can check any procedure by double-clicking the procedure to view its properties dialog, pressing the Embed button to view embed code, and then the [Show Filled Only] button to see only those embeds that have custom code attached. When creating future projects, we encourage you to create procedures for every window using templates, and calling the procedure whenever you wish to open that window, so that all your user interface elements will be accessible to ClarioNET. In other words, dont put WINDOW structures in source code.

________________________________________________________ClarioNET

38

7 - Conversion Considerations
Searching USE attributes on Controls
Any time a control appears in your application running locally BUT DOES NOT appear in a ClarioNET client, the first item to check is that the control contains field equate labels. For example:
USE(?Label1)

Each control MUST have a USE variable otherwise the ClarioNET client will not receive enough information to duplicate the control correctly. Menus (in particular those imported from older DOS applications) may lack USE attributes. TAB controls should also be checked carefully.

ABC vs. Clarion Template Chain


The ClarioNET template will correctly add calls to your applications whether you use the Clarion or ABC chain in your application. Certain features within the ABC chain, such as Edit-in-Place or Query-by-Example are not supported by ClarioNET due to windows and control management issues.

ClarioNET________________________________________________________

8 - Reporting

39

8 - Reporting
When Clarion for Windows was first developed, the developers copied a printing feature which was specific to Windows NT at that time. This involved creating a metafile, which is a series of instructions to the Windows GDI (Graphics Device Interface) that describes how Windows should draw the elements on a page. (This is not a generic page description language like postscript) These instructions, in conjunction with the device settings and driver for the printer, allow Windows to provide complete instructions to the printer to create a complex report. When your program creates a report, it does so on the server. ClarioNET compresses and encrypts the metafile (WMF file) created on the server and sends it to the client. WMF files are created when the PREVIEW attribute is implemented for a report, which is why you MUST always enable print preview in your ClarioNET applications. The client places the received metafiles on the client disk and calls the Print Preview display procedure. Depending on the user selections the metafiles are then sent to the local printer driver and then on to the locally connected printer. Because just the GDI instructions for the report are sent to the client, and they are highly compressible, this provides for highly efficient communication speed and complete support for reports as designed.

Server Printing Setup Considerations


The copy of Windows on the server requires that there be a device that is capable of printing before a metafile can be generated correctly. It needs to be able to agree to the page size. If not, the only device that the system knows of is the screen console. The only page size it knows of is a rectangle of the proportions 4:3....your screens proportions. If you attempt to create a portrait oriented, letter sized page on a server installation with no printer installed, it will reshape the graphic to the 4:3 proportion, and the resulting metafile will not print properly. You can immediately spot this problem if you print a report on the client: the lower portions of the page will not print. The ClarioNET client attempts to fit this odd size GDI drawing into the common paper size selected and cant. All it can do is try to compensate by not cutting off the right side of the report, but it cannot compensate enough to print the rest of the report properly.

________________________________________________________ClarioNET

40
Note!

8 - Reporting
You must install a printer on the server, even if you do not intend to physically connect any printer at all to the server.

In general, we recommend installing an industry standard driver such as the HP LaserJet Series II, or any of the HP Postscript drivers. The servers printer driver should be able to support any size of paper or device options (such as color) that you wish to define for any of your reports.
Note! There are additional very important instructions in the chapter entitled Server Setup which specifically apply to ISAPI deployment. Microsoft Internet Information Server (IIS) handles the printer device differently than Application Broker.

ClarioNET Server Side Report Programming


The ClarioNET server side extensions to the printing program code add calls to display a message on the client, optionally update a progress bar, manage the WMF filenames, add the WMF names to an internal QUEUE, send report properties to internal variables, and then send the report to the client.
Note: Do not execute visual Print Preview of your report in the server side code. If you need this ability in the local version, use ClarioNETServer:Active() to test if ClarioNET is handling the user interface and skip around the code. The template does this automatically in standard ABC and Legacy reports.

Although Report Preview mode must be enabled (using the PREVIEW attribute on the report) to generate the WMF files, the actual visual report previewing code must be disabled (the template code does this for you). If you use third party tools you must disable server side previewing and add your third party code to replace the supplied previewer code in the client. Performance Tip..... Clarion ABC and Legacy templates both control printing by opening a progress window with a TIMER attribute which is set 1. This means a timer event is generated every 1/100th of a second. The report generation process is driven by these timer events, thus triggering record processing and PROGRESS window updating.

ClarioNET________________________________________________________

8 - Reporting

41
For very large reports you may wish to rewrite the procedure to eliminate the timer generated process which can cause performance degradation and consume server processing time in an environment where the processor is shared among many instances of a program. Plan on testing.

Client Side Report Processing


The metafile is almost but not completely device independent. Therefore, we cannot guarantee there will never be printing incompatibilities between server printer and client printer. In general, following these guidelines should minimize any problems:

Be sure that both the server and the client have printer drivers installed
that can print the size of the paper specified in the report.

If you need to specify manual feed, or other device specific settings,


instruct your users to use the Printer Setup dialog on the client. PRINTERDIALOG calls are redirected to the client.

When both a Microsoft or OEM driver is available for a printer,


choose the OEM driver, unless the OEM driver is very old and hasnt been updated in years.

________________________________________________________ClarioNET

42
bubblejet printers from 1993.

8 - Reporting
Do not expect perfect output on old or oddball equipment such as In general, test all reports thoroughly with the printer the reports are to
be printed on.

ClarioNET________________________________________________________

9 - Server Setup

43

9 - Server Setup
Print Setup
The IIS ISAPI Application Broker on Windows NT/Windows 2000 requires a default printer to be assigned. For the EXE Application Broker deployment, whichever user account is logged in when starting the broker must have a default printer. You must manually edit the registry in order to print properly when you run server applications using IIS/ISAPI. The setup program copies .reg files to make this easier. On NT based systems, when you choose a default printer it does not create a default printer for all users....only the user account you logged in under. The default for all users, except those who choose a default printer, is still no printer. This lack of a printer setting is what IIS sees because IIS doesnt log in under a normal user account. When your Clarion application (launched by the application broker running under IIS) creates a report, it requires a printer device capable of setting the page size. Therefore, if no default printer is set for IIS account in the registry, the Clarion application creates a metafile based on the screen dimensions. The screen settings are the wrong proportions and dont support different paper sizes or orientation. The ClarioNET client will attempt to resize the metafile that results from this, but the printed results will be unsatisfactory, and in most cases, incomplete. The steps below will help you install a default printer for the default user on Windows NT. 1. Install one of the following printer drivers, telling Windows NT its a local printer attached to LPT 3 (whether the printer physically exists or not) and specifying its the default printer. Windows NT administrators should have their Windows NT install CD handy. It doesnt matter whether the printer exists, is connected or not, nor does it matter whether the printer is local or network. HP LaserJet Series II HP LaserJet 2100 Series PS Optionally if youve already installed a printer and the printer name as it appears in the printer settings window is exactly the same as it appeared when you selected from the Windows NT Printer Setup

________________________________________________________ClarioNET

44

9 - Server Setup
wizard dialog, edit the file YourPrinterName.reg.renameme (see below). Replace the three instances of YourPrinterName with the actual printer name, exactly as it appeared in the Printer Setup dialogs list of printers. 2. In the (Clarion)\examples\ClarioNET\reg directory, locate the printername.reg.renameme file corresponding to the printer you selected. Copy it to a floppy disk, or over the network to your server. On the server, rename the file to filename.reg, and execute the .reg file. This will have no effect on your printer settings for current users. It will, however, set this printer as the default printer for any new user accounts local to this machine. Note that the .reg file has set the port to LPT3, to minimize any possible conflicts.

3.

Database Considerations
For any installation for which you expect more than ten users simultaneously, try to use a DBMS residing on another server. Short of using carrier pigeon to relay IP packets, local file management is the biggest drag on connecting your remote clients. Note that this does not mean placing Clarion or Topspeed files on a separate file server, and letting the server application manage them.

ClarioNET________________________________________________________

10 - Client Program

45

10 - Client Program
To use a ClarioNET application, the end user requires a client program that:

Gathers the server, program, and other information. Makes calls to ClarioNET procedures in the clrnt50c.lib or clrnt55c.lib
static library to start the server program and implement remote user interface. A fully functional sample client program is supplied with your install of ClarioNET. This program consists of the following component files

CONNECT.CLW is the main program. It displays a connection


window and allows the user to specify server URL, program name, parameters, proxy information, etc.

CLRNT50C.LIB -or- CLRNT55C.LIB The static libraries contain


all of the ClarioNET code to communicate with the server and display the duplicate Windows user interface.

PRNTPRVW.LIB This is a static library file that contains the Print


Preview program. This LIB file was created from the PRNTPRVW.PRJ source files that are included in your installation. You are free to substitute your own print preview code.

LSDECOMP.LIB. This is a static library file that contains a specially


developed data decompression and decoding system. The intent of supplying the sample client connection program is that you can easily modify the CONNECT.CLW file with your own screens, logos, etc and have a client program up and running as quick as possible. The CONNECT.PRJ example can be found in the \examples\clarionet\connect directory under your Clarion installation directory.

Include Files
Two include files are needed in the client program.
INCLUDE(CLIENT.INC) INCLUDE(CLIENT.CLW) Contains TYPE definitions & EQUATEs
Contains PROCEDURE prototypes

________________________________________________________ClarioNET

46
Deployment Requirements

10 - Client Program

The main requirement for your Client application is that you need to author the client application shell that will display your logo, gather client data, assign ClarioNET variables, and call the ClarioNET client procedures to launch the server based application, and exit when the ClarioNET session is finished. There is no requirement to display a Client window first before launching the server based application. The ClarioNET launching procedures can be called directly to make it look as if the server program was launched locally simply by selecting the program icon.
Note! The client application must have the project Runtime Library set to Local. ClarioNET requires that WININET.DLL is present. This library is part of the operating system. This library takes care of all HTTP and Proxy calls. If the workstation can successfully browse the web using a recent browser, it should be fine for running a ClarioNET application.

Note:

Client Size and Download


Those familiar with Clarion program know the client program, compiled as a local or one-piece executable, will probably be approximately 1MB in size. This provides connection to the server, the runtime function library that will allow the client to create and display windows, and the report engine. If you plan to deploy over the web, you may optionally use compression products to shrink the executable. In creating or modifying the client connect program, we recommend that you: 1. 2. Create a single file client EXE (which is actually the only option because the client must be a Localruntime library) . Optionally compress the EXE with an executable file compression like Shrinker from Blink, Inc. The latter step will result in a single file client program in the neighborhood of 500KB.

ClarioNET________________________________________________________

11 - Server Deployment

47

11 - Server Deployment
ClarioNET works with both Microsoft Internet Information Server, via ISAPI (Information Server Application Programming Interface) Application Broker, or with the EXE Clarion Application Broker. In general, any moderately busy site will wish to use IIS because of its superior logging, security, and management tools. EXE Application Broker is perfectly fine for small sites and developer testing. It is very important that you set up Application Broker properly.

Testing and Developing with the EXE Application Broker


Assuming that youve kept the Clarion Application Broker defaults, your executable files and any necessary .DLL files will go into either \CWICWEB\EXEC or a subdirectory thereof. If during testing you wish to work with local database access, your database files will also go in this directory. Typically EXEC will have multiple subdirectories, one for each of your web-deployed programs. During testing, you may also put graphics files into this directory, though later you may place common files in the \CWICWEB\PUBLIC directory. In general, place images specific to an application in the applications executable directory, and

________________________________________________________ClarioNET

48

11 - Server Deployment
place images common to more than one application in the public directory. 1. Start the EXE Clarion Application Broker. For Clarion 5.0 the Application Broker EXE file is in the \CWICWEB directory and is called CWBROKR1.EXE for the limited test version, and CWBROKER.EXE for the unlimited version. For Clarion 5.5 the Application Broker exe file is C55APS.EXE. 2. Check App Broker Settings for HTTP Port and Public Directory In some cases your default HTTP port 80 might already be used. This is the case with the typical operating Web server. In this case you can use the EXE broker with an alternate Port. After you start the EXE broker there will be an icon in your System tray at the lower right side of your status bar. Click on it once, then select Setup from the menu of the window that is displayed. You will need to review the Public Directory and Port Number. The other items are not that important. Port Number is the port on your computer that the EXE broker will listen to for the incoming messages from the ClarioNET client. Public Directory must be the full drive/directory path to a directory under CWICWEB. The most common entry is C:\CWICWEB\PUBLIC.
Note: If the application broker started without any error or warning messages the Port shown on the Setup screen will work fine.

3.

Determine the PORT and IP ADDRESS that the Application Broker will respond to. This is the single most troublesome area of using the Application Broker for most developers. When testing on a single machine, simply use http://localhost as your address. If you wish to provide access for someone outside, via the Internet, open a command prompt and type IPCONFIG if you are using Windows NT or Windows 2000, or WINIPCFG, if you are using Windows 95 or Windows 98. These utilities will display your external IP address. Substitute the external IP address for localhost.

4.

Determine the full URL that you need to use in the ClarioNET Client.

ClarioNET________________________________________________________

11 - Server Deployment

49
The URL is the Uniform Resource Locator that all Internet TCP/IP connections use. This consists of your IP address, directory name, program name, and a .0 to indicate specifically that the request should be routed through the Application Broker. Thus, if your application is MYAPP.EXE, and its located in the \CWICWEB\EXEC\MYDIR directory, the full URL will be:
http://localhost/exec/mydir/myapp.exe.0

5. Test your Clarion Application Broker Installation with a Browser Before creating the client application, and after creating and placing a ClarioNET server application in the proper location, launching the URL in your browser should return the following message:
ClarioNET( 1 JUN 2001, 10:35:26) ServerVersion = 00000000057 Unrecognized command line, process error = 0

Note that the dates and version might be different; but receiving this message indicates you have specified everything correctly and the application broker and all the pieces appear to be in place and working correctly. If you did not receive the message, it may be because:

Your Clarion EXE may not be in the directory. Your Clarion program does not have the ClarioNET calls added to it.
This is either because you did not add the ClarioNET template to your application or your hand coded program does not have the ClarioNETServer:Init call in the proper location (which can mean that there are other deficiencies also).

The Clarion program cannot find the necessary .DLL.s. The Clarion program has tried to open a file, an error occurred, and a
message is displayed on the server that has paused the programs execution.

Your Clarion program has calls to windows, messages, or ClarioNET


functions BEFORE the ClarioNETServer:Init procedure is called.

You are using the Clarion 5.0 Application Broker with a program
compiled with Clarion 5.5, or the opposite combination

Your computer did not resolve localhost to 127.0.0.1.

________________________________________________________ClarioNET

50

11 - Server Deployment

Performance
Because the communication between client and server is remarkably streamlined, and compression and encryption are both very efficient, ClarioNET has virtually no effect on your application performance, other than the fact that you will now have many instances of the application running on a single server. The best programming guidelines for optimizing server performance are as follows:

Put the database on a DBMS on another server, allowing the server to


concentrate on the application logic, and serving up the application.

In general, additional CPU power on the server will provide more


bang than additional memory, though youll want lots of both.

The best programming practice is to place as much application logic


as possible in .DLL.s, which will increase the efficiency of the overall memory usage.

The chart above chronicles the opening of twenty clients, using a local database, on a Windows 2000 Advanced Server system with 512MB of RAM. This shows the loading of each client successively, each loading the same application, each loading a browse window.

ClarioNET________________________________________________________

11 - Server Deployment

51

File Locations
Consult your Application Broker documentation for more detailed information. In general you can use the following map for placing your files to deploy a ClarioNET application. The server portion of a ClarioNET web deployment requires the files:
ClarioNET Files: CLRNT55S.DLL LSCOMP.DLL Clarion Files: C55RUNX.DLL C55DOSX.DLL -orCLRNT50S.DLL

-or-or-

C5RUNX.DLL C5DOSX.DLL

A typical directory structure of a web deployment would resemble the following:


CWICWEB (directory) PUBLIC (directory) (common icon, wallpaper, other graphic files) EXEC (directory) C55RUNX.DLL -or- C5RUNX.DLL C55DOSX.DLL -or- C5DOSX.DLL CLRNT55S.DLL or- CLRNT50S.DLL LSCOMP.DLL (any other file drivers required by your application) YourAppDirectory (directory) YourApp.EXE (program required DLLs) (program required data files) (program specific ICO, GIF, JPG or other images

Your application program can also use the Path to find files, but we cant give you guidelines on this as the EXE and ISAPI version environments might impose other requirements.

File Specification in your Server Based Program


Please note that your application program thinks it is running the same way as if it were just a desktop application. When you specify file locations, whether they are icon, image, or data files, your path and filename are the same.

________________________________________________________ClarioNET

52

11 - Server Deployment

Graphic Files : ICO, GIF, WMF, JPG, etc.


One of the biggest areas of confusion is where to put all the graphic files. There is a 100% chance that at least once you will have missing icons or graphics on your client screen.

Graphics assigned at Compile Time


The icon and graphic files that you use in your program (ICO, JPG, WMF, GIF, etc) all must be available to ClarioNET to ship off to the client. ClarioNET ALWAYS looks FIRST in your program starting directory. This is found by issuing a COMMAND(0) call. If they are not found there, the PUBLIC directory is searched. All graphics that are specified at compile time can be placed in either the EXEC directory or PUBLIC directory.

If you have multiple server applications being deployed that have


icons or images with duplicate file names, place these files in the EXEC directory.

Place files that are used in multiple applications in either the EXEC or
program directory.

Graphics assigned at Runtime


Many times IMAGE controls will be assigned a graphic image at runtime, either by assigning a filename to the IMAGE controls using PROP:Text or by assigning them from a MEMO or BLOB field of a file. In either case the image file or file containing the BLOB or MEMO must be available to your program. Be sure to carefully specify the filename and include directory path if needed. At runtime when your program logic is finished doing the image assignments ClarioNET uses the Clarion PROP:TempImage capabilities to extract the image to a file. This assures you that the assigned graphic will be the one sent to the client.

ClarioNET________________________________________________________

12 - Advanced Tasks, How-Tos

53

12 - Advanced Tasks, How-Tos


All the ClarioNET code which is applied to your application when you apply the ClarioNET template is for user interface management. In addition to this, the ClarioNET library supports many additional procedures that allow you to customize the system to perform tasks beyond just a remote user interface. You can transfer files, do remote procedure calling to the client, use command line parameters, create screen hyperlinks, etc.

How to Transfer Files


ClarioNET allows you to transfer files in both directions....server to client and client to server. There are two important items to remember:

Implementing file transfer means using two matching


procedures...one on the server side and one on the client side.

Any file transfers must be managed by knowing beforehand the fully


qualified path of the source file beforehand, or by implementing a variable, which you may input through a file dialog, and/or store in an .INI file. To implement a file transfer with a fully qualified file name from the server to the client:

Locate the user interface component in the server application you wish
the end user to use to begin the transfer.

Place the code in the Accepted embed (on a button for example). Server to Client File Transfers
The following code places a fully qualified file name in the file QUEUE provided by ClarioNET (you do not have to declare the QUEUE), adds the QUEUE item, declares a variable to store the return value from ClarioNET file transfer procedure, calls the ClarioNET procedure with a parameter of your choice, and then displays a message box with the result:
! Download PDF File FLQ:FileName = c:\cwicweb\public\ClarioNETProductSheet.PDF ADD(FileListQueue) ReturnString = ClarioNET:SendFilesToClient(1) MESSAGE(ReturnString)

________________________________________________________ClarioNET

54

12 - Advanced Tasks, How-Tos


The above code (already included in the sample server application) will automatically invoke the complementary procedure on the client, and the file will be downloaded to the temporary directory that was set up when the client connected to the server application. By using the sample client programs provided with ClarioNET, you do not have to add any code to the client side application other than optionally doing something with the file once its received. For file transfers from server to client, ClarioNET provides two functions. ClarioNET:SendFIlesToClient is used in the server program to send all of the files added to FileListQueue to the client. ClarioNET:ClientFIlesReceivedFromServer is used in the client program to handle whatever tasks need to be done with the received files. The following QUEUE is contained in the ClarioNET client DLL. When files are received from the server, FLQ:Filename has the complete file specification on the client where the received files have been placed. By default these are always placed in the Temporary directory that was used or specified at client startup.
FileListQueue Filename QUEUE,PRE(FLQ),EXTERNAL STRING(512) END

You must add your own code to the ClarioNET:ClientFilesReceivedFromServer procedure to perform any tasks with the newly received files.These files ARE NOT AUTOMATICALLY DELETED from the temporary directory when the client program exits. Server Side Procedure:
ClarioNET:SendFilesToClient(SIGNED Flag)

Flag

This value will be sent through to the ClarioNET:ClientFilesReceivedFromServer procedure on the client. It is a user defined flag that is sent to the client side procedure once all files have been transferred.

Returns: STRING(256) The above procedure sends the files to the client and calls ClarioNET:ClientFilesReceivedFromServer client procedure with the same Flag parameter. Within the client procedure you can check the

ClarioNET________________________________________________________

12 - Advanced Tasks, How-Tos


Flag to control the logic of what to do with the files received, or optionally display a complete Window and program logic. Client Side Procedure...
ClarioNET:ClientFilesReceivedFromServer(SIGNED Flag)

55

Flag

This value will be the parameter of the server procedure ClarioNET:SendFilesToClient. STRING(255). This value will be the return value from your call to ClarioNET:SendFilesToClient.

Returns

The ClarioNET client will call this function in response to the server program calling ClarioNET:SendFilesToClient. This procedure (which you must write) is responsible for examining the FileListQueue and determing what to do with the files received. FileListQueue will be FREEd immediately after returning from this procedure. You do not need to FREE it yourself.

Client to Server File Transfers


Note: The method of transmitting files from client to server is somewhat slow because it requires many client/server/client conversations. We recommend keeping file size as small as possible. (This does not apply to server->client transfers)

For transfers from the client side to the server, ClarioNET provides two functions. ClarioNET:GetFilesFromClient is used in the server program to call the client to gather files to be sent. ClarioNET:SendClientFilesToServer is used in the client program to identify the transferred files, and is called immediately after the server procedure. The client must assign a valid path/filename of the files to FLQ:FileName and ADD it to the QUEUE. The following QUEUE is contained in the ClarioNET server DLL. When files are received from the client, FLQ:Filename has the complete file specification on the server where the received files have been placed.
FileListQueue QUEUE,PRE(FLQ),EXTERNAL,DLL(1) Filename STRING(512) END

________________________________________________________ClarioNET

56

12 - Advanced Tasks, How-Tos


The files received are ALWAYS initially placed in the temporary work directory for the program instance, which is a subdirectory of the Public directory. Your server program must move and delete them as needed and FREE the QUEUE. It is not really required to delete them as they will be deleted automatically when the session terminates but is recommended as good housekeeping practice. The following QUEUE is contained in the ClarioNET client LIB file. This QUEUE needs to be loaded with the full drive/directory/name of the files received.
FileListQueue QUEUE,PRE(FLQ),EXTERNAL Filename STRING(512) END

The following code is the ClarioNET:SendClientFilesToServer procedure as illustrated in the sample handcoded client program. This procedure is called indirectly...when your server program calls ClarioNET:GetFilesFromClient the message is passed through to the client which in turn calls the ClarioNET:SendClientFilesToServer procedure in the client connect source code portion.
Note: ClarioNET:SendClientFilesToServer must be defined on your client program source code. It is defined as EXTERNAL within the ClarioNET client LIB files and this EXTERNAL must be resolved to create the client EXE.

! ClarioNET:SendClientFilesToServer PROCEDURE(SHORT Flag, STRING ServerFileInfo) ! FileList STRING(5000) Extension STRING(*.*) PathName Pos1 Pos2 CODE FREE(FileListQueue) RetVal# = FILEDIALOG(Select Files To Send, FileList, Extension, 11000b) IF RetVal# = 0 THEN RETURN(no files selected) END CSTRING(FILE:MaxFilePath) SHORT SHORT

ClarioNET________________________________________________________

12 - Advanced Tasks, How-Tos

57

Pos1 = INSTRING(|, FileList, 1, 1) IF Pos1 = 0 FLQ:Filename = CLIP(FileList) ADD(FileListQueue) ELSE PathName = FileList[1 : Pos1-1] & \ LOOP Pos2 = INSTRING(|, FileList, 1, Pos1+1) IF Pos2 = 0 FLQ:Filename = PathName & FileList[Pos1+1 : Pos2 - 1] ADD(FileListQueue) Pos1 = Pos2 ELSE Pos2 = LEN(CLIP(FileList)) FLQ:Filename = PathName & FileList[Pos1+1 : Pos2] ADD(FileListQueue) BREAK END END END ! This code just to displays the queue !LOOP I# = 1 TO RECORDS(FileListQueue) ! GET(FileListQueue, I#) ! MESSAGE(File & i# & : & CLIP(FLQ:Filename)) !END RETURN(ok)

Upon receipt of the files, the server applications QUEUE will contain the fully qualified file specification and the ClarioNET:GetFilesFromClient procedure will return ok. The server program must move or delete the file(s) as necessary and FREE the QUEUE. Note that after a normal session closedown the files on the server will be deleted. Server Side Procedure...
ClarioNET:GetFilesFromClient(SIGNED Flag, STRING Info)

Flag

This value will be sent through to the ClarioNET:SendClientFilesToServer procedure on the client. This string (maximum 1024 chars) will be sent through to the ClarioNET:SendClientFilesToServer procedure on the client.

Info

________________________________________________________ClarioNET

58
Returns: STRING(256)

12 - Advanced Tasks, How-Tos

The above procedure sends the parameters directly to the ClarioNET:SendClientFilesToServer procedure on the client. Within the client procedure you can check the Flag and Info string to control the logic of selecting the files to send to the server. The sample client programs supplied with ClarioNET contain these procedures. Use the search function in the editor to find ClarioNET:SendClientFilesToServer, then insert whatever code you wish within the procedure. Client Side Procedure...
ClarioNET:SendClientFilesToServer(SIGNED Flag, STRING Info)

Flag

This value will be the parameter of the server procedure ClarioNET:GetFilesFromClient. This string will be the parameter of the server procedure ClarioNET:GetFilesFromClient. STRING(255). This value will also be the return value from your call to ClarioNET:GetFilesFromClient.

Info

Returns

The ClarioNET client will call this function in response to the server program calling ClarioNET:GetFilesFromClient. This procedure is responsible for loading the FileListQueue with the fully qualified file specification for the files to be sent to the server. This means Drive:\Directory\Filename. At this point your client program procedure has control and can inspect or move the files, display windows, use FILEDIALOG locally, or call other procedures you have created. FileListQueue will be FREEd immediately after returning from this procedure. You do not need to FREE it yourself.

ClarioNET________________________________________________________

12 - Advanced Tasks, How-Tos

59

How to Use Command Line Parameters


The Client program can specify up to five values that the server program will receive as command line parameters. These variables are
ClarioNET:Global.Param1 ClarioNET:Global.Param2 ClarioNET:Global.Param3 ClarioNET:Global.Param4 ClarioNET:Global.Param5 STRING(200) STRING(200) STRING(200) STRING(200) STRING(200)

You can use the EMBED location:


ClarioNET:Client ParametersAvailableforInspection

in the server application to check these parameters received from the client.
These values will be available for inspection after the call to ClarioNETServer:Init.

Startup server information sent to client


The Server program can specify up to three (3) values that the server program can send to the client at program startup. These variables are.
ClarioNET:Global.ServerString1 STRING(128) ClarioNET:Global.ServerString2 STRING(128) ClarioNET:Global.ServerString3 STRING(128)

You can use the EMBED location


ClarioNET:SetServerStringsSenttoClient

to assign strings to these variables


These values must be set prior to calling ClarioNETServer:Init. Note: These values will be available for inspection on the client after the call to ClarioNET:StartServerProgram on the client.

________________________________________________________ClarioNET

60

Calling Procedures in the Client

Calling Procedures in the Client


All the application logic in your server program executes on your server. Sometimes you may wish to take advantage of the CPU available on the client since it too has all the power to run complete Clarion Windows applications. While this takes you out of the thin client world, it certainly provides additional n-tier computing and distributed processing capabilities to you. ClarioNET makes it easy to implement this. You may create complementary functions and procedures between server and client, implementing code on the server to call a procedure on the client. This allows you to optionally use the processing power of the client. In short, you can include a procedure to do anything you want on the client system, and then call that procedure from the server. The ClarioNET:CallClientProcedure allows up to fifteen parameters, which you may optionally use to pass the names of the procedure(s) you wish to call on the client. For example, you may place a button in the server application, and in the ACCEPTed event for the button embed code such as:
! Call Client Procedure P1" = PlayMovie ! Procedure name on client for passing parameter ReturnString = ClarioNET:CallClientProcedure(P1")

On the client side, locate the ClarioNET:ClientProcedure (by using the search function in the editor on the example client code). This procedure MUST be defined in the client....it is defined as an EXTERNAL procedure in the ClarioNET client library and must be found to finish linking the client EXE. The following code examines the P1 parameter and calls the function:
!ClarioNET:ClientProcedure PROCEDURE(*WINDOW WinPtr, STRING P1, STRING P2, ......, STRING P15) !CODE WinHandle = WinPtr{PROP:HANDLE} IF P1 = PlayMovie IF NOT FileDialog(Select video file,AVIFileName,AVI Files |*.avi,0) RETURN(0) END

ClarioNET________________________________________________________

Calling Procedures in the Client


PlayMovie(CLIP(AVIFileName)) END RETURN(Successful) ! PlayMovie is another ! user defined PROC

61

The code above first examines the pointer to the window passed in the procedure and assigns it to a global variable, which the PlayMovie procedure will call later. It then takes care of other client side processing (a file dialog), which has to be done before calling the procedure.
Note: The above PlayMovie procedure is a simple demo of using Clarion to display a file dialog and play a movie, and can be found at the SoftVelocity web site, in the Clarion FAQ section.

The full description of the client side procedure is as follows:


ClarioNET:ClientProcedure PROCEDURE(*WINDOW WinPtr, STRING P1, <STRING P2>,......., <STRING P15>)

The first parameter is a pointer to the currently open client window. Then the additional string parameters, of which only one P1 is necessary, are for passing whatever you wish the server to pass. Pass procedure names on the client for example.
Note: We advise that when placing client procedures in your client programs that you use a single client with multiple client procedures for more than one customer. In other words, if you have, for example, a backup procedure for client As application, it may be inappropriate to leave that code in for client B, even though you dont expect to call it!

________________________________________________________ClarioNET

62

Calling Procedures in the Client

How to Place a HyperLink in the Server Program


Hyperlinks (e.g., one click shortcuts such as http://, ftp://, mailto:) which may be automatically handled by the operating system on the client side are simply placed using the window formatter or by editing the window structure. The hyperlinks are easily implemented as attributes on a button, using MSG for the link and KEY for a special ClarioNET define. Note that they work in ClarioNET mode only! If you run the server .EXE file from a desktop, no link will be implemented. MSG This property will contain the command to be executed. The Windows API call ShellExecute is used on the client and passed this as the parameter. This property will contain a special ClarioNET EQUATE ClarioNET:WEBLINK. When the client is rendering the window and comes across this attribute it will trigger a different mode of handling an EVENT:Accepted for this button.

KEY

The following provides BUTTON structures for sample hypertext and email links:
BUTTON(Open the SoftVelocity Home Page...), AT(198,50),USE(?Button25), FLAT, FONT(Arial,9,,FONT:underline,CHARSET:ANSI), MSG(http://www.softvelocity.com), KEY(ClarioNET:WEBLINK), | #ORIG(?Button25) BUTTON(Send E-Mail to SoftVelocity Sales),AT(206,81), USE(?Button26),FLAT, FONT(Arial,9,,FONT:underline,CHARSET:ANSI), MSG(mailto:sales@softvelocity.com), KEY(ClarioNET:WEBLINK), | #ORIG(?Button26) | | | |

| | | |

How to Change a Client Side Cursor


Changing client side cursors are limited to the Clarion standard (STD) cursor equates. You canot use .CUR files for use with ClarioNET. When you wish to change the cursor place, the ClarioNET:SetCursor procedure call in some event in the server application.The following example embed code changes the client cursor to an hourglass:

ClarioNET________________________________________________________

Calling Procedures in the Client


ClarioNET:SetCursor(CURSOR:Wait)

63

Changing the cursor back to normal is as simple as:


ClarioNET:SetCursor(CURSOR:None)

Note that the cursor changes work in ClarioNET mode only! If you run the server .EXE file from a desktop, the cursor change will not work.

How to Display a Splash Screen at Startup


To incorporate a Splash screen or any code execution before the APPLICATION window is displayed in an ABC application use the following embed locations to execute the code:

Local Objects/ABC Objects/WindowManager/Init/Code/AfterPrepareAlertKeys embed


point

Window Events/OpenWindow
Note! Standard ABC template generated Splash windows should work fine as is. ClarioNET was designed for them, including the timer used to close the window automatically.

In Legacy template generated code use the following as a guide to implement splash screens:

Remove the Splash procedure specification that is normally entered on


the Properties screen for the Main application Frame.

In the EMBED location Accept Loop, Before CASE EVENT()


handling, Priority(1), embed the code:
IF EVENT() = EVENT:OpenWindow ClarioNET:OpenWindow(ClarioNETWindow) (YourSpashProcedure) END

________________________________________________________ClarioNET

64

Calling Procedures in the Client

ClarioNET________________________________________________________

APPENDIX

65

APPENDIX
Files Installed
The SETUP.EXE installation program will install the following files in the locations shown. The directories noted refer to directories under the main Clarion install directory. \bin clrnt50s.dll Clarion 5.0. Server side DLL that gives the ClarioNET functionality to your server application. Clarion 5.5. Server side DLL that gives the ClarioNET functionality to your server application. Server side DLL that provides data compression, encryption, and encoding for communicating with the ClarioNET client. Independent of Clarion version.

clrnt55s.dll

lscomp.dll

\lib clrnt50s.lib Clarion 5.0. Name resolution library for your server application to resolve the ClarioNET functions in the clrnt50s.dll file. Clarion 5.5. Name resolution library for your server application to resolve the ClarioNET functions in the clrnt55s.dll file. Clarion 5.0 & 5.5. Name resolution library for your server application to resolve the ClarioNET functions. We have provided this for Third Party Developer usage. As 3rd parties add ClarioNET code permanently into their compiled DLLs they will ship this LIB file to resolve external names when ClarioNET is not licensed by the final end user. Clarion 5.0. Client side static link library that contains all communication and functional code to communicate to the server based ClarioNET enhanced application.

clrnt55s.lib

clntstub.lib

clrnt50c.lib

________________________________________________________ClarioNET

66
clrnt55c.lib

APPENDIX
Clarion 5.5. Client side static link library that contains all communication and functional code to communicate to the server based ClarioNET enhanced application.

lsdecomp.lib Clarion 5.x. Client side static link library that contains data decompression and decoding procedures. prntprvw.lib Clarion 5.x. Client side static link library that contains the print preview system. This is the compiled prntprvw.prj project that is also supplied with this package. Please note: this print preview source code is provided for your convenience so you have print preview automatically in your client. You can replace this entire source code as needed \libsrc clarionet.clw Module definitions to be included in the server based applications global MAP. clarionet.inc Class and type definitions for Server module. client.clw Module definitions to be included in the client side program that will call the ClarioNET client. Class definitions and equates for client module

client.inc \template

clarionet.tpl Template for web enabling your Clarion application using the ABC -or- legacy template. This template also includes provisions for 3rd party template generated code and will change as 3rd party support is improved or we receive information from them. \examples\clarionet\ (This directory contains subdirectories that contain example code.)

ClarioNET________________________________________________________

APPENDIX
\prntprvw

67

prntprvw.prj & prntprvw.clw This is the source code for the ClarioNET client print preview procedures supplied as prntprvw.lib. You can modify the print preview system to suit your needs \connect connect50.prj, connect55.prj, and connect.clw Client side launching program shell that can be customized/replaced to provide your own specific startup interface to the ClarioNET client. Use the proper project file to match your Clarion version. connect55.app Client side launching application for Clarion 5.5. \Abc abc.app & example.dct Simple example application using an ABC template generated program. \invoice web examples from the softvelocity.com site. \legacy legacy.app & example.dct Simple example application using an Legacy Clarion generated program. \handcode handcode.prj& handcode.clw Simple example application in a single handcoded .CLW. file. \doc\ClarioNET clarionet.pdf Adobe Acrobat documentation for ClarioNET

________________________________________________________ClarioNET

68
readme.txt

APPENDIX
Contains the latest information on the most recent installation of the ClarioNET development system. Please read this information as it contains information not covered in this manual

ClarioNET Report Functions


The following is a brief review of the ClarioNET procedures used to capture the Clarion generated WMF files and send them to the client. To see how these are used you can review the Hand Code section of this documentation.
Report{PROP:TempNameFunc} = ADDRESS(ClarioNET:GetPrintFileName)

This statement allows ClarioNET to generate its own filenames for the WMF files generated by the report. All subsequent calls by internal Clarion routines to get WMF names are routed to this function. ClarioNET erases these files automatically after they are sent to the client.
ClarioNET:StartReport

This method is called near the starting point of the report. It causes a Generating Report window to appear on the client. The client then waits for the server to start transmission of the WMF report files.
ClarioNET:UpdateReportProgress(BYTE Pct)

This method creates a progress bar on the Generating Report window that is being displayed on the client. The progress bar is displayed on the first call and the percentage complete (Pct) is updated on each subsequent call. The progress bar percentage on the client is only sent at 7% increments to minimize bandwidth (regardless of how many times you call this procedure). Pct represents the percentage of report completion. This value ranges from 0 to 100.
Note! Only use this for long reporting processes. Because of the server->client->server communication it can cause small reports to print much slower.

ClarioNET________________________________________________________

APPENDIX
ClarioNET:EndReport

69

This procedure is called after the report is prepared, ClarioNET has been notified of the WMF file names and the report properties have been set. It is preferable that this should be the LAST procedure called before exiting the REPORT procedure and returning to the calling procedure. When this procedure is called the following tasks take place: 1. 2. 3. The client is notified that it will be receiving the report WMF files in compressed form. The client closes the Generating Report status window and opens the Downloading Report status window. The server side prepares and sends a compressed file containing al the WMF files to the client and waits until the client side printing process is finished. The client side receives the compressed file, uncompresses it, places the WMF files into the client temporary directory, and calls the ReportPreview procedure.
The server program will be waiting for the client to finish printing before program execution after ClarioNET:EndReport continues. This means that while the user is reviewing the report in the ReportPreview procedure and while the report is printing on the client (or being sent to a spooler) the server program is waiting. This is necessary because the server program could execute other code that sends commands to the client and it would not be listeningit still would be managing the printing process.

4.

Note:

ClarioNET:GetPrintFileName(SIGNED PageNo)

This procedure is added to the main application CLW file and is used as a call point for the ClarioNET:GeneratePrintFileName procedure from anywhere in your application.
ClarioNET:AddMetafileName(STRING Filename)

This procedures assigns the WMF filenames to an internal ClarioNET QUEUE for use by the EndReport procedure.
ClarioNET:SetReportProperties(REPORT)

________________________________________________________ClarioNET

70

APPENDIX
This procedure sends the report structure, which must not be closed, to ClarioNET so the properties can be scanned and sent to the client. This includes landscape, paper size, measurement type, etc.

Other Server Side Class Information


Server Class Defined
The ClarioNET:GlobalClass TYPE class is used to hold strings that can be passed between client and server. This class is instantiated in the clrnt5xs.dll file and needs to be defined as EXTERNAL,DLL(1) in your code. This class is defined in CLARIONET.INC.
ClarioNET:GlobalClass Param1 Param2 Param3 Param4 Param5 ServerString1 ServerString2 ServerString3 ClientQueryRequestString CLASS STRING(200) STRING(200) STRING(200) STRING(200) STRING(200) STRING(128) STRING(128) STRING(128) STRING(200) END ClarioNET:Global ClarioNET:GlobalClass,EXTERNAL,DLL(1)

Initialization and Closedown


The methods discussed in this section form the core procedure calls that provide the ClarioNET web deployment capability. They are to be placed in specific locations in relation to the opening, processing, and closing of windows and are all placed in relation to the ACCEPT loop code.
Note ! You may not call these methods to force any behavior. They are designed as a set with many internal variables, flag, and data structures being used to coordinate the window processing tasks. The descriptions given below are for informational purposes only.

ClarioNETServer:Init( <STRING> LicensePassword, LONG ServerNoActivityShutDown, LONG ClientNoActivityShutDown, USHORT DisplayServerScreen STRING BlowfishFlag)

ClarioNET________________________________________________________

APPENDIX

71
LicensePassword Specifies the License Password assigned to the licensed ClarioNET developer and turns off Demonstration mode. ServerNoActivityTimeOut Sets the maximum number of minutes between activity received from client to keep the server based application running. If no client events are received for more than ServerNoActivityTimeOut minutes ClarioNET will issue a HALT(). This is the safeguard check to stop a running application that has lost contact with the client.
Note: Server time out needs to be greater than the Client time out. If not it will be internally set to one minute longer than the Client time out

ClientNoActivityTimeOut Sets the maximum number of minutes the client will wait for end-user keyboard or mouse interaction before signaling the server to close the application, and then the client itself will close. When this value is negative it signals continuous connection by the client. In this case the client simply contacts the server at this time interval to let the server know the session should not be dropped. DisplayServerScreen When the EXE broker is used, setting this value non-zero provides display of the server application screen on the server when being run with ClarioNET. BlowFishFlag Set to 0 to disable 56 bit blowfish encryption Any non-zero value turns encryption on. This function initializes the ClarioNET server component and must be the first ClarioNET function to be called. We recommend that it is the first procedure called in your program, if you are hand coding.

________________________________________________________ClarioNET

72

APPENDIX
ClarioNETServer:Init performs all the initialization of the ClarioNET server side system. If certain command line parameters are not found then the program is assumed to be launched locally and all further ClarioNET calls are disabled. This function returns a zero (0) in all cases except when a Query was sent from a client program using the ClarioNET:QueryServerProgram procedure call. In this case you must respond to the query with the ClarioNETServer:SendClientQueryResponse procedure.
ClarioNETServer:Kill

This disconnects the application from the Clarion Application Broker, disposes of created data, and performs final housecleaning. This must be called to deallocate memory when ClarioNETServer:INIT was called and a successful ClarioNET session was started.
ClarioNETServer:Active

This is used to determine if the ClarioNET server system is active. Returns 1 for active, 0 for inactive.

Responding to Client Queries


A ClarioNET client has the ability to call a server procedure immediately upon connection. On the client side, before any other calls to start a server program, the ClarioNET:QueryServerProgram procedure can send a single STRING to the server in order to get a fast response of some specific information. ClarioNET:QueryServerProgram can be called as many times as you wish BUT ONLY BEFORE THE SESSION STARTS.
Note! On the server side VERY LITTLE initialization is done and so you can build special procedures into the server program to handle queries very, very quickly.

ClarioNET________________________________________________________

APPENDIX
On your server program, the ClarioNET template adds the following code:

73

IF ClarioNETServer:Init(., 20*60, 15*60, 0,1) ClarioNETServer:SendClientQueryResponse(ClarioNET:HandleClientQuery()) RETURN END

When ClarioNETServer:Init is called the procedure examines the way in which the program was launched. If it was launched with a Query from a client it returns non-zero. In this case your server code must respond back to the client using the ClarioNET:SendClientQueryResponse procedure. In addition the program must immediately exit. In the example source code shown above, the template automatically adds the ClarioNET:HandleClientQuery call, prototype, and procedure to your application source code. The ClarioNET:HandleClientQuery procedure is a placeholder where YOU need to add code to inspect the query string sent from the client which is contained in ClarioNET:Global.ClientQueryRequest. When finished you can return a string from this procedure to return to the client.

Window Management
The Window Management procedures provide initialization, maintenance, and closing of the client window. These methods must be used in each procedure that provides WINDOW display processing.
Note! These procedures work as a coordinated set and SHOULD NOT be called thinking that you can force some manner of functionality.

ClarioNET:OpenWindowInit( ClarioNETWindowClass CW)

CW

An instance of the ClarioNETWindowClass for this procedure.

This function is called at the beginning of each procedure and is used by the ClarioNET system to detect if the current procedure was called from EVENT:OpenWindow in the calling procedure. This is important to determine how to continue when returning to the calling procedure.

________________________________________________________ClarioNET

74
This must be called after OPENing the window and before ClarioNET:InitWindow.
ClarioNET:InitWindow( ClarioNETWindowClass CW, *Window ThisWindow, SHORT WindowType, <LONG DisplayTime> )

APPENDIX

CW

An instance of the ClarioNETWindowClass for this procedure.

ThisWindow The label of the WINDOW structure that will be used for the ACCEPT loop. Type A window type number; 1 =WINDOW, 3 = APPLICATION

DisplayTime The display time in seconds for the window. A non-zero number indicates the window on the client will close automatically. This results in an EVENT:CloseWindow being posted to the ACCEPT loop. This is used primarily for Splash windows that need to close automatically. This function registers the window with the ClarioNET system. It should be called after the window is OPEN()ed and before the ACCEPT loop.
ClarioNET:OpenWindow( ClarioNETWindowClass CW)

CW

An instance of the ClarioNETWindowClass for this procedure.

This function is called during the EVENT:OpenWindow event. It causes some housekeeping and status monitoring to be performed.
ClarioNET:TakeEvent( ClarioNETWindowClass CW)

CW

An instance of the ClarioNETWindowClass for this procedure. A non-zero return value indicates the Window should be closed by POST(Event:CloseWIndow).

Returns

ClarioNET________________________________________________________

APPENDIX

75
ClarioNET:TakeEvent is the most important ClarioNET function that controls the Client. It must be called as the first item in the ACCEPT loop. It performs the following actions: 1. On return from this function, if there has been client activity, the affected controls USE variable is updated, keycode PRESSed, and the EVENT Posted to the ACCEPT loop. Your code can continue as usual without knowing that the data entry and/or event had not occurred on the local machine. After your code has performed all its tasks and the window has been modified as needed and is ready for display, this procedure will scan the window and send the changes to the client.

2.

ClarioNET:CloseWindow( ClarioNETWindowClass CW)

CW

An instance of the ClarioNETWindowClass for this procedure.

This procedure MUST BE CALLED on EVENT:CloseWindow in ALL ACCEPT LOOPS. This procedure does not forcefully close the client window; it simply sets internal variables to prepare for the ClarioNET:KillWindow call that contacts the client as needed.
ClarioNET:KillWindow( ClarioNETWindowClass CW)

CW

An instance of the ClarioNETWindowClass for this procedure.

This function is used to finish up window processing after the CLOSE(Window) call is executed.
Note! This procedure call should be the last code to execute before returning from the procedure.

ClarioNET:RegisterBrowse( ClarioNETWindowClass CW, BrowseClass BRW)

CW

An instance of the ClarioNETWindowClass needs to be defined in the DATA area for the WINDOW being used. An instance of the BROWSE class that has been instantiated in the module to handle all browse activities for the LIST control in the window.

BRW

________________________________________________________ClarioNET

76
This procedure is only used in ABC template generated programs to support toolbars.

APPENDIX

Miscellaneous Procedures
The following procedures are also available for use by programmers:
ClarioNET:ClientBeep(SHORT Sound)

Sound

A standard Clarion sound defined using a BEEP: equate.

This function creates a BEEP tone on the clients computer.


ClarioNET:SetUpdateExtents

This procedure is used to set the extent to which ClarioNET scans the window and its controls for changes at runtime. See the appendices for further details.
ClarioNET:GetTempDir, STRING

Returns the full drive and directory specification for the temporary directory being used for the unique server program execution instance.
Note: If you place files here you need to REMOVE them when exiting the program.

ClarioNET:GetINI( Section1, Entry, | Default |, | Filename |) ClarioNET:PutINI( Section1, Entry, | Default |, | Filename |)

ClarioNET allows setting and retrieving of INI file values on the client or server. There are five procedure calls that you can use (two of them being the standard GETINI and PUTINI Clarion procedures). These two procedures always reference the client INI files. The parameters and return values for these functions are identical to the Clarion GETINI and PUTINI procedure. These two methods should only be called: 1) 2) After the call to ClarioNETServer:Init and before ClarioNET:OpenWindowInit. AFTER the main window has closed.

ClarioNET________________________________________________________

APPENDIX
3)

77
Any other time when the server is responding to an event sent from the client.

The Client must be waiting for a response from the server when you call these procedures.
ClarioNET:INIMode( SHORT Mode), SHORT

Mode

Specifies the mode used in the standard Clarion GetINI and PutINI functions. A 1 directs all standard Clarion GETINI and PUTINI calls to the remote client computer. A 0 directs all GETINI and PUTINI calls to the server.

This function returns the last INIMode used. ClarioNET redfines a number of standard Clarion procedures to its own internal ones. The standard Clarion GETINI and PUTINI procedures have been redefined to trap all INI file activity and the redirect it to either the server or client computer.
Note: Enabling all GETINI and PUTINI to be directed to the client may have performance penalties. In a web deployment each call requires a roundtrip communication which may lessen the perceived speed of your client. CLASS,TYPE CSTRING(512) CSTRING(512) LONG END RunCallClass,EXTERNAL,DLL(1)

RunCallClass ProgramName Parameter Frequency

RunCall

RunCall is defined in the ClarioNET server extension DLL. This class allows you to specify an EXE program file to run at Frequency second intervals during the execution of the server application. The Clarion RUN command is used with NoWaitFlag. The parameter is sent as the command line parameter.

________________________________________________________ClarioNET

78
PushWindow : Forced Client Window Display

APPENDIX

The PushWindow set of procedures give you the ability to forcefully display a window on the client, update the displayed information, and close it down. You may only call these procedures when the server program has been notified of a client action (button press, menu selection, entry change, etc).
Note: The Push Window system is a separate code area in the client and will not respond to ANY control messages from the server EXCEPT ClarioNET:UpdatePushWindow and ClarioNET:ClosePushWindow. Therefore, you must NOT call any procedures, open windows, read INI files, or anything elseor the system will hang.

This PushWindow system was designed for you to display continuously changing status screens when a long process is being performed. The window that you define is only opened briefly.... long enough to read the layout and get the USE variable contents. You cannot write to the Push Window screen because it is not open. If you OPEN it yourself the ClarioNET code will try opening it again and the program will GPF. Simply define a window and specify static USE variables for any controls that will be changed as part of your updating process. These procedures take a Clarion WINDOW structure as the parameter. Any data that will change on this window MUST be assigned to a static USE variable. The PushWindow procedures work as follows:

Calling ClarioNET:OpenPushWindow(YourWindow) causes


YourWindow to be opened, scanned, closed, and the client then sent a data structure and instructions to draw the window. The client then responds to the server and waits for either a UpdatePushWindow or ClosePushWindow call.

On the server you can proceed to perform programming tasks, most


likely some kind of process. During this process you can change the values in the USE for the controls in YourWindow and call ClarioNET:UpdatePushWindow. Calling ClarioNET:UpdatePushWindow causes YourWindow to be opened, scanned, closed, the screen compared to the previous, and only the changes sent to the client. The client then responds to the server and again waits for either a ClarioNET:UpdatePushWindow or ClarioNET:ClosePushWindow.

ClarioNET________________________________________________________

APPENDIX
Using this design never leaves YourWindow open but provides a display framework for quick scan and send. No user interaction can occur on the client. The window is simply displayed and does not respond as the client waits for the next instruction from the server.
Note:

79

Do not call any other ClarioNET procedures between the OPEN and CLOSE calls except the PushWindows UPDATE procedure.

The following provides the PushWindow declarations:


ClarioNET:OpenPushWindow (Window)

Window A Clarion WINDOW structure. This procedure displays the Window on the client.
ClarioNET:UpdatePushWindow(Window)

Window A Clarion WINDOW structure. This procedure updates Window on the client with and changes to the Window control USE variables.
ClarioNET:ClosePushWindow(Window)

Window A Clarion WINDOW structure. This procedure updates Window on the client with and changes to the Window control USE variables.

PushWindow Example....
The following ROUTINE will cause a small window to appear on the client and the progress bar to advance in 5% steps with each LOOP cycle. When the LOOP is complete the window will be cleared on the client and the client will again await further instructions.
SomeProcess ROUTINE DATA Progress1 LONG window WINDOW,AT(,,216,38),GRAY,DOUBLE
STRING(Process Completion Status....),AT(11,8) PROGRESS,USE(Progress1),AT(17,22,190,5),RANGE(0,100) END

CODE

________________________________________________________ClarioNET

80
Progress1 = 0 ClarioNET:OpenPushWindow(window) LOOP I# = 1 TO 100 BY 5 -Process LogicProgress1 = I# ClarioNET:UpdatePushWindow(window) END ClarioNET:ClosePushWindow(window)

APPENDIX

Client Application Class


This section will be of greatest interest to those who wish to create a ClarioNET client from scratch. ClarioNETSession CLASS

A CLASS named CLRNT_C of type ClarioNETSession is defined in the clrnt50c.lib and clrnt55c.lib files. You must reference this class in the main program portion of your client program as: CLRNT_C ClarioNETSession, EXTERNAL

This class provides the properties (variables) that you define to connect to the server application and is defined in CLIENT.INC.
ClarioNetSession CLASS,TYPE HostProgramName CSTRING(128) HostProgramDirectory CSTRING(128) ServerName CSTRING(128) ServerPort UNSIGNED(80) UserAgent CSTRING(50) UseProxy SHORT UsePreconfig SHORT ProxyServer CSTRING(256) ProxyUserName CSTRING(128) ProxyPassword CSTRING(128) GraphicDownloadFlag UNSIGNED ConnectionTimeout UNSIGNED CharSet SHORT ProgressUpdateFrequency SHORT PingFlag SHORT LaunchingWindow &WINDOW UseLaunchingWindow SHORT ClientTempDirectory CSTRING(512) Param1 STRING(200) Param2 STRING(200)

ClarioNET________________________________________________________

APPENDIX
Param3 Param4 Param5 HostSessionID ServerString1 ServerString2 ServerString3 EventSelectedAllowed END STRING(200) STRING(200) STRING(200) CSTRING(128) STRING(128) STRING(128) STRING(128) SHORT

81

Class Properties
CLRNT_C .HostProgramName CSTRING(128) The HostProgramName property is a CSTRING(128) that holds the program name to execute on the server. For example, INVOICE.EXE. Be sure to add the EXE extension. CLRNT_C .HostProgramDirectory CSTRING(128) Holds the virtual directory path on the server where the program is located. For ISAPI broker this is typically the cws/cwlaunch.dll/yourappdir or cws/ c5launch.dll/yourappdir. For EXE broker this is exec/yourappdir. CLRNT_C .ServerName CSTRING(128) This is the proper Internet address of the application server. The fully qualified name can be either an IP address or a domain name, i.e.www.softvelocity.com or 216.237.145.63.
Note: When testing with the EXE broker on the same machine you might be using localhost as the server name. Be sure to test this with a browser to make sure the Clarion Application Broker can be reached.

CLRNT_C .ServerPort UNSIGNED(80) Holds the server port. Default is port 80. Next most common HTTP port is 8080. CLRNT_C .UserAgent CSTRING(50) This identifies the client to the server and is set to Clarionet when not assigned a string in the client startup program.

________________________________________________________ClarioNET

82
CLRNT_C .UseProxy SHORT Set this to 1 to enable use of data that specifies a proxy server. CLRNT_C .UsePreconfig SHORT

APPENDIX

Instructs client HTTP communications system to retrieve proxy server settings from the Windows registry. Internally this uses INTERNET_OPEN_TYPE_PRECONFIG as the dwAccessType parameter for a call to wininet function InternetOpen. CLRNT_C .ProxyServer CSTRING(256) Allows you to specify the proxy server. Setting CLRNT_C.UsePreconfig to 1 will ignore this value. CLRNT_C .ProxyUserName CSTRING(128) Holds the user name for client proxy authentication. CLRNT_C .ProxyPassword CSTRING(128) Holds the password for client proxy authentication. CLRNT_C .GraphicDownloadFlag UNSIGNED In a thin client design you probably want as few files on the client as possible, and those files do not need to be persistent between client working sessions. In most programs there are many little graphic items used as icons and images in the form of ICO, GIF, JPG, WMF, and other format files. ClarioNET transfers these files, as specified in your server program, to the client during the worksession. However, you may wish to cache these files so that they only need to be downloaded once or download them every time they occur in a new window, and you need to decide whether they should be erased after every session or be left on the hard disk to be used next time. GraphicDownloadFlag allows you specify which will be the best for your application. We use a two-digit number to specify the method. The lower digit instructs when to get the file from the server, and the upper digit is a flag that instructs ClarioNET to erase the files when the client session has finished.

ClarioNET________________________________________________________

APPENDIX
Flag values that do not erase after the session: 1 Always download the file with every new window or window update.

83

2 Download the file once each session, even if it already exists on the disk, and use it for all future occurrences of the same file name. 3 Download the file regardless if it exists and use it for all future occurrences of the same file name. Adding ten (10) to these values causes the download files to be erased after the client session ends. CLRNT_C .ConnectionTimeout UNSIGNED Specifies the time in seconds that the HTTP function waits for a response from the server before returning and posting a No response from server message. We advise setting this to a high value, perhaps 30, until such a time as your typical server response time is known. 10 seconds would be typical. CLRNT_C .CharSet SHORT Specifies the default character set to use for the Client when none is specified from the server. This value is a Clarion CHARSET: equate from the EQUATES.CLW file. Typically CHARSET:ANSI would be used , but if in doubt, do not assign any value. If none specified the value is zero, which equates to CHARSET:ANSI. The availability of this setting can help non-English clients display the characters correctly. CLRNT_C .ProgressUpdateFrequency SHORT When a PROGRESS control is placed on a window this indicates that the server program might be performing processing that will update the window contents. When a PROGRESS control is used on a window the client will automatically contact the server every ProgressUpdateFrequency/100 seconds and request a refresh of its status. Depending on your program, the window will be updated, closed, or a newly opened window will appear. It is recommended to set this value to double the average client/server/client communication time. The default value is three

________________________________________________________ClarioNET

84
seconds, however, we recommend smaller time intervals for faster TCP/IP connections. CLRNT_C .PingFlag SHORT

APPENDIX

If this flag is set to 1 before the client procedure call ClarioNET:StartServerProgram, the server programs simply returns the date and time on the server and version of the ClarioNET server DLL. This can be used to test the existence of the program in a quiet way. CLRNT_C .LaunchingWindow &WINDOW CLRNT_C .UseLaunchingWindow SHORT When the two procedures to launch the server program are called there is usually a wait time where the client window will disappear. These two properties allow you to design a window that will be displayed during this period. Although the display may be rather brief, if the Internet connection is slow this will fill the time with at least some indication of activity. CLRNT_C.LaunchingWindow should be assigned a WINDOW name using the &= operator. CLRNT_C.UseLaunchingWindow should be set to 1 to instruct ClarioNET to actually display the window. CLRNT_C .ClientTempDirectory CSTRING(FILE:MaxFilepath) A temporary directory where ClarioNET can store swap files, icons, images, and print files. If unassigned ClarioNET will get the Windows temporary path from the Windows API. CLRNT_C .Param1 CSTRING(200) CLRNT_C .Param2 CSTRING(200) CLRNT_C .Param3 CSTRING(200) CLRNT_C .Param4 CSTRING(200) CLRNT_C .Param5 CSTRING(200) These are command line parameters that you can specify, which will be passed to the server based application when the ClarioNET:StartServer procedure is called.

ClarioNET________________________________________________________

APPENDIX
Note:

85
The server receives all five parameters. If unassigned they will be sent as zero length strings.

The Following values are available AFTER calling ClarioNET:StartServerProgram: CLRNT_C .HostSessionID CSTRING(128) This is the session ID of the instance of the server program. It is used by ClarioNET to identify which session of your server program is linked to the current client session.
Note : HostSessionID is assigned by the server-based program.

CLRNT_C .ServerString1 CLRNT_C .ServerString2 CLRNT_C .ServerString3

STRING(128) STRING(128) STRING(128)

Three strings received from the server when the application is launched, that is after ClarioNET:StartServer returns.
Note: ServerString1 and ServerString3 will be blank when running in demonstration mode.

CLRNT_C .EventSelectedAllowed SHORT Normally EVENT:Selected is not sent from the client to the server. The main reason is that EVENT:Selected is usually always followed by EVENT:Accepted and sending both creates two Client/Server/Client communications. This would double the perceived response time for each change. If EVENT:Selected is not sent then there is no lag time as users often click controls for no real reason. However, there will be times when your program code needs to trigger on EVENT:Selected. There are two ways you can change this property: 1. 2. At client startup set this property accordingly. Use ClarioNET:CallClientProcedure with a flag set so that your client side logic is triggered to set this value.

________________________________________________________ClarioNET

86
ClarioNET Client Startup Procedures
ClarioNET:StartServerProgram

APPENDIX

Only two procedures are needed by the ClarioNET client library to implement the entire ClarioNET client system. ClarioNET:StartServerProgram is the first procedure, takes no parameters, and returns 0 if completed without problems. A non-zero return value indicates a problem occurred. If ClarioNET:StartServerProgram returns zero (0) then the server program has been started and the values for ClarioNET:Global. ServerString1, ClarioNET:Global. ServerString2, and ClarioNET:Global.ServerString3 have been received from the server. The next step is to hide your launching program screen and hand control over to the ClarioNET client system. After this is done your client program will have no interaction with the system (except if the client side file transfer procedures of Call Client procedure functinalities are used). In our demo programs we simply use HIDE(0) to hide the current screen. Do not call this procedure with START(). Returns SHORT. The following EQUATES are specified in the client.inc file can be used to test the return value from ClarioNET:StartSession:
No errors
Could not create temporary file Could not initialize Http System

CLRNT_ERR_NONE CLRNT_ERR_NO_CREATE_TEMP CLRNT_ERR_HTTP_FAILURE CLRNT_ERR_SESSION_FAILURE

Could not start session, server problem CLRNT_ERR_DECOMP_INIT_FAILURE Could not initialize decompression library CLRNT_ERR_NO_HOSTNAME No HostProgramName was specified CLRNT_ERR_NO_HOSTDIR No HostProgramDirectory was specified CLRNT_ERR_NO_SERVERMAME No ServerName was specified CLRNT_ERR_VERSION_MISMATCH Client/Server version mismatch

ClarioNET________________________________________________________

APPENDIX
ClarioNET:StartClientSession

87

This procedure begins the remote client session and will handle the entire communication and user interface display process. It will not return until you have exited the program or a Client Time Out forced automatic closing of the application. This should only be called after a successful return from ClarioNET:StartServerProgram. Returns SHORT. The following can be returned from ClarioNET:StartClientSession:

CLRNT_ERR_NONE CLRNT_ERR_INACTIVE

No errors Client was inactive and closed automatically CLRNT_ERR_HTTP_TIMEOUT HTTP System timed out CLRNT_ERR_PING CLIENT_C.PingFlag is set

ClarioNET:ClientProcedure(*WINDOW WinPtr, STRING P1, <STRING P2>,.....,<STRING P15>) WinPtr P1 - P15 Pointer to the currently OPEN window on the client. These are the same parameters passed to ClarioNET:CallClientProcedure.

ClarioNET:ClientProcedure is a client function that is called from the server using ClarioNET:CallClientProcedure. The parameters are passed directly to this procedure. Calling this procedure from the server enables you to access whatever functionality you desire to add on the client side. WinPtr is provided so you can access all the details of the window currently being used. This means you can do API calls.....hence, virtually any functionality can be added. Our intent was to use parameter P1 as a CASE parameter to decide what should be done.You can return up to 100 characters.
Note: If the server calls ClarioNET:CallClientProcedure then the ClarioNET:ClientProcedure (see below) will be called. The server will be waiting for a response from that procedure before servers normal ACCEPT processing continues.

This procedure must be defined in your client program. It is defined as an EXTERNAL procedure in the ClarioNET client program library file.

________________________________________________________ClarioNET

88
Returns

APPENDIX
STRING Returns string os sent to the server and is the return value from ClarioNET:CallClientProcedure.

ClarioNET:QueryServerProgram(STRING),STRING,PROC This method call allows you to send a message to the server program and have specific tasks performed. Use this function only before starting a client session. This is useful, for example, to get a list of the available programs the client can connect to. For example:
DelimitedProgramList STRING(200) DelimitedProgramList = ClarioNET:QueryServerProgram(getprogramlist)

On the server the ClarioNETServer:Init procedure returns a one (1) when a query has been received. This allows you to call specific procedures in the server program to respond to the query by examining the passed string parameter. In the case of this example you could read a database of the ClarioNET server programs available and send back that information as a delimited string such as:
INVOICE.EXE:PAYABLES.EXE:RECEIVABLES.EXE

The ClarioNET:QueryServerProgram procedure would then return this string to the DelimitedProgramList STRING and from there your client program could parse the information (looking for a : ), assign it to a drop combo, and let the user select which program to launch on the server.

ClarioNET________________________________________________________

APPENDIX

89

Window Properties Management


ClarioNET performs the work of duplicating the user interface to a Clarion program on a remote client by inspecting the attributes (or properties) of the window and its component controls. There are three significant times when ClarioNET must insure that the client and server windows and controls are synchronized

When building a client window


When a server program window is first being displayed, your Clarion code takes whatever steps are required to prepare the window for display, then the ClarioNET code takes over. This happens when ClarioNET:TakeEvent is called and there are no pending EVENTS in the ACCEPT loop. At this time the window is ready for display and ClarioNET scans the entire WINDOW or APPLICATION structure and extracts information to build the remote window.

When a user action on the client has changed a control or window


property This most commonly occurs when an event occurs on the client to change a data entry, press a button, select a radio or checkbox, or a list/combo box item is selected. The client system detects the changes and sends them to the server-based programs ClarioNET extension code. ClarioNET then replicates the users action within the server program and the ACCEPT loop logic can process the user actions. The accept loop sees an event or keypress just as if it happened locally.

When the server based program has made changes to the window
or its controls After the server based program receives the changes from the client it continues to execute your program code just as if a local user had made the change. The program code does whatever it is designed to do and updates the screen control USE variables or makes changes to icons, images, or the properties of the window or its controls. After screen updating is finished and the internal Clarion ACCEPT processing sees that no additional events are waiting to be processed (i.e. the window is ready for redisplay), ClarioNET sends just the changes to the client.

________________________________________________________ClarioNET

90
WINDOW Complexity Limitations

APPENDIX

Although ClarioNET has enormous capacity to replicate a Clarion user interface there are some limitations that apply. Within the items below the word total means that for the sum of all the type of controls listed the quantity cant exceed the maximum given. However, this is per window and so you can see that the windows can be tremendously complex before the limits are exceeded.

Maximum of 40 total LIST and COMBO controls per window. Maximum of 200 fields in a LIST QUEUE. Maximum of 1000 total ENTRY, SPIN, CHECK, SHEET,
OPTION,PROGRESS, ITEM, LIST and COMBO controls per WINDOW.

Maximum of 25 TEXT controls per window. Maximum of 40 ICONs within each LIST control. Maximum of 25 ALRT keys per window and per control. No
aggregate limit.

WINDOW Properties Supported


Attributes Supported Modify at Runtime Attributes
Maximize MaxWidth

Supported
. . . Y . . . Y

Modify at Runtime

Alrt* . . . . . . Y At . . . . . . . Y Auto . . . . . Y . . . . Y Center

. . . . N . . . . Y . . . . N . . . . N . . . . Y . . . . Y . . . . N . . . . N . . . . N . . . . N . . . . N . . . . N . . . . Y . . . . Y . . . . Y . . . . Y . . . . Y . . . . Y . . . . N . . . . Y . . . . Y . . . . N . . . . Y

. . . . N . . . . N . . . . N . . . . N . . . . N . . . . N . . . . Y . . . . N . . . . Y . . . . N . . . . Y . . . . N . . . . N . . . . N . . . . N . . . . N . . . . Y . . . . Y . . . . N . . . . N . . . . N

MDI . . . . . . . N MinHeight . . . Y MinWidth Msg . . . Y Modal . . . . . . N . . . . . . Y NoFrame . . . . N NoTips . . . . . Y Palette . . . . . Y Pixels . . . . . Y Resize . . . . . Y SelectedColor . Y SnapHeight SnapWidth Status** System . . Y . . Y

Centered . . . Y Color . . . . . Y Cursor . . . . N Dock . . . . . N Docked . . . N Double . . . . N DropId . . . . N FillColor . . . Y Font . . . . . Y . . Y . . Y . . Y Fontcharset . Y Fontcolor Fontname Fontstyle Gray Height

SelectedFillColor Y . . . . N

Fontsize . . . Y . . . . . Y . . . . Y

. . . .

Y . . . . Y

. . . . Y

Text*** . . . . . Y Tiled . . . . . . Y Timer . . . . . N . . . . N Toolbox

Hlp . . . . . . Y Hscroll . . . . Y HscrollPos . . Y

Vscroll . . . . . Y

ClarioNET________________________________________________________

APPENDIX
Icon Imm Max . . . . . Y . . . . . Y . . . . . Y . . . . Y . . . . N . . . . N . . . . Y . . . . N . . . . N VScrollPos Wallpaper Width . . Y . . . Y . . . . Y . . . . Y . . . . Y . . . . Y . . . . Y Iconize . . . . Y Mask . . . . . Y MaxHeight . . Y

91

. . . . . Y

Xpos . . . . . . Y Ypos . . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft **Zones 1 to 4 only Note: If a WINDOW or APPLICATION has a RESIZE and NOFRAME and there is no text then it will appear without a title bar

The following events in the client side ClarioNET program are sent to the server.
EVENT:Accepted EVENT:AlertKey EVENT:NewSelection EVENT:ScrollUp EVENT:ScrollDown EVENT:PageUp EVENT:PageDown EVENT:ScrollTop EVENT:ScrollBottom EVENT:Locate EVENT:ScrollDrag EVENT:MouseIn EVENT:MouseOut EVENT:Expanded EVENT:Contracted EVENT:Expanding EVENT:Contracting EVENT:Sized EVENT:Selected ( only when flag in client is set)

Controls Property Support


The following tables indicate the supported attributes (properties) for each Clarion control supported by ClarioNET. This is indicated in the Supported column. The Modify at Runtime column indicates if the attribute is allowed to be modified with property syntax code (i.e. ?Item{PROP:XPos} = 12 ) at runtime. A value of 1 or 2 indicates the extent level for the attribute value to be sent to the server (see CLARIONET:SetUpdateExtents). A N in this column indicates the attribute is not scanned for changes throughout the lifetime of the procedure.

BOX
Attributes Supported Modify at Runtime At . . . . . . . Y Color . . . . . Y Disable . . . . Y . . . . 2 . . . . 2 . . . . 1,2 Hide . . . . . . Y Attributes Supported Modify at Runtime . . . . 1,2 . . . . 2 . . . . 2

LineWidth . . . Y Round . . . . . Y

________________________________________________________ClarioNET

92
Fill . . . . . . Y . . . . 2 . . . . 2 Scroll . . . . . Y . . . . 2 Full . . . . . . Y

APPENDIX

The BOX control does not generate any events, therefore no update to the server will occur.

BUTTON
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . 2 . . . . N . . . . 1,2 . . . . N . . . . 1,2 . . . . N . . . . N . . . . 2 . . . . 2 . . . . 1,2 . . . . Y . . . . 2 Imm . . . . . . N Attributes Supported Modify at Runtime . . . . N . . . . N . . . . N . . . . 2 . . . . N . . . . N . . . . N . . . . 2 . . . . N . . . . N . . . . 2 . . . . 2

At . . . . . . . Y Cursor . . . . N Default . . . . Y Delay . . . . . N Disable . . . . Y DropId . . . . N Flat . . . . . . Y Font Hide Icon . . . . . Y . . . . . Y . . . . . Y Full . . . . . . Y Hlp . . . . . . Y

Key . . . . . . . Y Left . . . . . . . Y Msg Req Skip Scroll Text . . . . . . Y . . . . . . Y . . . . . . Y . . . . . Y . . . . . . Y . . . . Y Repeat . . . . . N Right . . . . . . Y

Std . . . . . . . Y ToolTip

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The BUTTON control generates the following events which cause updates to the control on the server:
EVENT:Accepted EVENT:AlertKey

Also see How to Place a Hyperlink in the Server Program for additional BUTTON capabilities.

CHECK
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . 2 . . . . 2 . . . . 1,2 . . . . N . . . . 1,2 . . . . N . . . . 2 . . . . 2 . . . . 2 Icon . . . . . . Y . . . N Attributes Supported Modify at Runtime . . . . 2 . . . . N . . . . N . . . . N . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2

At . . . . . . . Y Color . . . . . Y CONTENTS . Y Cursor . . . . N Disable . . . . Y DropId . . . . N FalseValue . . Y Flat . . . . . . Y Font . . . . . Y

InToolBar

Key . . . . . . . Y Left . . . . . . . Y Msg Scroll Skip Text . . . . . . Y . . . . . Y . . . . . . Y . . . . . . Y . . . . Y Right . . . . . . Y

ToolTip

ClarioNET________________________________________________________

APPENDIX
Full . . . . . . Y Hide . . . . . Y Hlp . . . . . . Y . . . . 2 . . . . 1 . . . . Y Trn . . . . . . . Y TrueValue . . . Y Value . . . . . . Y . . . . 2 . . . . 2 . . . . N

93

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The CHECK control generates the following events which triggers sending update information to the server:
EVENT:Accepted EVENT:AlertKey EVENT:Selected, (client property EventSelectedAllowed is set to 1)

The true and false values of the CHECK, KEYCODE, and EVENT are also sent to the server.

COMBO
COMBO controls have the following constraints: 1. 2. 3. 4. 5. 5. Anything that can be specified as a FORMAT that controls the COMBO appearance is supported. Up to 200 QUEUE fields are recognized. This includes the invisible extra queue fields used for formatting. Scroll bars and VCRs jump to a record on a keystroke and double mouse click. Trees, including the expand and contract icons are supported. Up to 30 ICONs in the list tree is supported. Up to 40 total LIST and COMBO controls are supported per WINDOW.
Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . N . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . N . . . . 2 IconList Imm . . . . Y Attributes Supported Modify at Runtime . . . . Y . . . . N . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . N

Attributes

AlwaysDrop . Y At . . . . . . . Y Cap . . . . . . N Center . . . . Y . . . N . . . Y . . . Y Color . . . . . Y ColStyle Column Decimal

. . . . . . Y

Key . . . . . . . Y Left . . . . . . . Y LineHeight . . . Y Mark . . . . . . Y Mask . . . . . . N Msg Nobar . . . . . . Y . . . . . Y

Cursor . . . . N

Ovr . . . . . . . Y

________________________________________________________ClarioNET

94
Disable . . . . Y DragId Drop Font . . . . N . . . . . Y . . . . . Y . . . . 1 . . . . N . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . 1 . . . . Y . . . . 1 . . . . N ReadOnly Req Scroll Skip Text . . . Y . . . . N . . . . N . . . . 2 . . . . N . . . . 2 . . . . N . . . . N . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . 1 . . . . 1 . . . . . . N . . . . . Y . . . . . . Y . . . . . . Y . . . . Y

APPENDIX

Right . . . . . . Y

DropId . . . . N Format . . . . Y From . . . . . Y Full . . . . . . Y Grid Hide Zhlp . . . . . Y . . . . . Y . . . . . Y

Style . . . . . . N ToolTip

Trn . . . . . . . Y Upr . . . . . . . N Vcr . . . . . . . Y Vscroll . . . . . Y VScrollPos . . Y

Hscroll . . . . Y HVScroll . . . N

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The COMBO control generates the following events which triggers sending update information to the server:
EVENT:AlertKey EVENT:Contracted EVENT:Expanded

The values of the following properties are sent to the server:


PROPLIST:MouseDownRow PROPLIST:MouseDownZone PROPLIST:MouseDownField PROPLIST:MouseUpRow PROPLIST:MouseUpZone PROPLIST:MouseUpField EVENT:ScrollDrag

The value of PROP:VScrollPos is sent to the server.


EVENT:Selected

The value of PROPLIST:MouseDownRow is sent to the server.


EVENT:NewSelection

The values of PROPLIST:MouseDownRow and PROPLIST:MouseDownZoneare set for the next property inspection.
EVENT:Accepted EVENT:Expanding EVENT:PageDown EVENT:PreAlertKey EVENT:ScrollDown EVENT:ScrollUp EVENT:Contracting EVENT:Locate EVENT:PageUp EVENT:ScrollBottom EVENT:ScrollTop

ClarioNET________________________________________________________

APPENDIX
ELLIPSE
Attributes Supported Modify at Runtime At . . . . . . . Y Color . . . . . Y Disable . . . . Y Fill . . . . . . Y . . . . 2 . . . . 2 . . . . 1,2 . . . . 2 Full . . . . . . . Y Hide Scroll . . . . . . Y . . . . . Y LineWidth . . . Y Attributes Supported

95

Modify at Runtime

. . . . 2 . . . . 1,2 . . . . 2 . . . . 2

The ELLIPSE control does not generate any events, therefore no update to the server will occur.

ENTRY
Attributes Supported Modify at Runtime Attributes Supported Modify at Runtime

Alrt*

. . . . . Y

. . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 1,2 . . . . N . . . . 2 . . . . 1,2 . . . . N . . . . 2 . . . . 2 . . . . 1,2 . . . . Y . . . . N . . . . 2

InToolbar

. . . N

. . . . N . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . N . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . 2

At . . . . . . . Y Cap . . . . . . Y Center . . . . Y . Y Color . . . . . Y CONTENTS Decimal Cursor . . . . N . . . Y Disable . . . . Y DropId . . . . N Font Hide Imm Ins . . . . . Y . . . . . Y . . . . . Y . . . . . . Y Full . . . . . . Y Hlp . . . . . . Y

Key . . . . . . . Y Left . . . . . . . Y Mask . . . . . . Y Msg . . . . . . Y . . . Y . . . Y Ovr . . . . . . . Y Password ReadOnly Req Scroll Skip Text

. . . . . . Y . . . . . Y . . . . . . Y . . . . . . Y . . . . Y

Right . . . . . . Y

ToolTip

Trn . . . . . . . Y Upr . . . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The ENTRY control generates the following events which triggers sending update information to the server:
EVENT:Accepted EVENT:AlertKey EVENT:Selected, (client property EventSelectedAllowed is set to 1) EVENT:NewSelection, (only if IMM is set)

After one of these events the CONTENTS of the control, the EVENT, and KEYCODE are sent to the server.

________________________________________________________ClarioNET

96

APPENDIX
For all EVENTs, the contents of the server ENTRY controls USE variable is changed, the EVENT is posted, and PROP:Touched is set to TRUE. If EVENT:NewSelection and EVENT:AlertKey is the EVENT then PRESSKEY(Keycode) is used to insert the keycode. The server program can examine KEYCODE or EVENT to retrieve the values sent from the client.

GROUP
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . N . . . . 1,2 . . . . N . . . . 2 Full . . . . . . . Y Hide . . . . . . Y Hlp . . . . . . . Y Key . . . . . . . Y Msg Scroll Skip Text . . . . . . Y . . . . . Y . . . . . . Y . . . . . . Y . . . . Y Attributes Supported Modify at Runtime . . . . 2 . . . . 1,2 . . . . Y . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2

At . . . . . . . Y Bevel . . . . . Y Boxed . . . . Y ChildIndex . . Y Color . . . . . Y Cursor . . . . N Disable . . . . Y DropId . . . . N Font . . . . . Y

ToolTip

Trn . . . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The GROUP control does not generate any events, therefore no update to the server will occur.

IMAGE
IMAGE controls have the following constraints: 1. 2. Image controls can have an image specified at compile time or runtime. Image controls are unique in that the image contents must be extracted and written to a file at runtime. This file is then transferred to the client and assigned to the image control. PROP:TempImagePath and PROP:TempImage properties are used to control the location and name of the temporarily extracted image. If the image is assigned at runtime, the image file must be located in the executables directory or in the PATH.

3. 4.

ClarioNET________________________________________________________

APPENDIX
Note: At runtime, ClarioNET uses PROP:TempImage to extract the image to a file.
Supported Modify at Runtime At . . . . . . . Y Centered . . . Y Disable . . . . Y Full . . . . . . Y Hide . . . . . Y Hscroll . . . . Y . . . . 2 . . . . 2 . . . . 1,2 . . . . 2 . . . . 1,2 . . . . 2 HVScroll . . . . Y Scroll Text . . . . . Y . . . . . . Y Attributes Supported

97

Attributes

Modify at Runtime

. . . . 2 . . . . N . . . . 1,2 . . . . 2 . . . . 2

Tiled . . . . . . Y Vscroll . . . . . Y

The IMAGE control does not generate any events, therefore no update to the server will occur.

ITEM
Attributes Supported Modify at Runtime At . . . . . . . Y Check . . . . Y . Y Color . . . . . Y CONTENTS First Font Hide Disable . . . . Y . . . . . Y . . . . . N . . . . . Y . . . . N . . . . N . . . . N . . . . N . . . . 1 . . . . N . . . . N . . . . 1 Hlp . . . . . . . Y Icon Last Msg . . . . . . Y . . . . . . Y . . . . . . Y . . . Y Key . . . . . . . Y Attributes Supported Modify at Runtime . . . . Y . . . . 2 . . . . N . . . . N . . . . 2 . . . . N . . . . 2

Separator Text

Std . . . . . . . Y* . . . . N . . . . . . Y

*STD:Close and STD:PrinterSetup are supported. All other STD window actions are not supported.

When an ITEM is selected, EVENT:Accepted is posted to the server program.

LINE
Attributes Supported Modify at Runtime At . . . . . . . Y Color . . . . . Y Disable . . . . Y Full . . . . . . Y . . . . 2 . . . . 2 . . . . 1 . . . . 2 Hide Scroll . . . . . . Y . . . . . Y Attributes Supported Modify at Runtime . . . . 1 . . . . 2 . . . . 2

LineWidth . . . Y

The LINE control does not generate any events, therefore no update to the server will occur.

________________________________________________________ClarioNET

98
LIST

APPENDIX

A LIST control is treated the same as a COMBO control. For information on the LIST control refer to the COMBO Control section.

MENU
Attributes Supported Modify at Runtime At . . . . . . . Y Color . . . . . Y Disable . . . . Y First Font Hide . . . . . Y . . . . . N . . . . . Y . . . . N . . . . N . . . . 1 . . . . N . . . . N . . . . 1 . . . . Y Icon Last Msg . . . . . . Y . . . . . . Y . . . . . . Y . . . Y Attributes Supported Modify at Runtime . . . . 2 . . . . N . . . . N . . . . 2 . . . . N . . . . 2

Key . . . . . . . Y

Separator Text

Std . . . . . . . Y* . . . . N . . . . . . Y

Hlp . . . . . . Y

*STD:Close and STD:PrinterSetup are supported. All other STD window actions are not supported.

When a menu item is selected, EVENT:Accepted is posted to the server program.

OPTION
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 1,2 . . . . N . . . . 1,2 . . . . N . . . . 2 Full . . . . . . . Y Hide . . . . . . Y Hlp . . . . . . . Y Key . . . . . . . Y Msg Scroll Skip Text . . . . . . Y . . . . . Y . . . . . . Y . . . . . . Y . . . . Y Attributes Supported Modify at Runtime . . . . 2 . . . . 1,2 . . . . Y . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2

At . . . . . . . Y Bevel . . . . . Y Boxed . . . . Y . Y Color . . . . . Y CONTENTS Cursor . . . . N Disable . . . . Y DropId . . . . N Font . . . . . Y

ToolTip

Trn . . . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The OPTION control generates the following events which trigger update information to the server:
EVENT:Accepted EVENT:AlertKey EVENT:Selected, (client property EventSelectedAllowed is set to 1)

ClarioNET________________________________________________________

APPENDIX

99
After one of the above events occur, the CHOICE of the control, the EVENT, and KEYCODE are sent to the server. The new RADIO control is selected on the server and the OPTION control report it using CHOICE.

PANEL
Attributes Supported Modify at Runtime At . . . . . . . Y Bevel . . . . . Y Disable . . . . Y Fill . . . . . . Y . . . . 2 . . . . 2 . . . . 1,2 . . . . 2 Full . . . . . . . Y Hide Scroll . . . . . . Y . . . . . Y Attributes Supported Modify at Runtime . . . . 2 . . . . 1,2 . . . . 2

The PANEL control does not generate any events, therefore no update to the server will occur.

PROMPT
Attributes Supported Modify at Runtime At . . . . . . . Y Center . . . . Y Color . . . . . Y Cursor . . . . N Disable . . . . Y Font . . . . . Y Full . . . . . . Y . . . . 2 . . . . 2 . . . . 2 . . . . N . . . . 1,2 . . . . 2 . . . . 2 Hide . . . . . . Y Attributes Supported Modify at Runtime . . . . 1,2 . . . . 2 . . . . 2 . . . . 2 . . . . 1,2 . . . . 2

Left . . . . . . . Y Right . . . . . . Y Scroll Text . . . . . Y . . . . . . Y

Trn . . . . . . . Y

The PROMPT control does not generate any events, therefore no update to the server will occur.

PROGRESS
Attributes Supported Modify at Runtime At . . . . . . . Y Color . . . . . Y CONTENTS . Y Cursor . . . . N Disable . . . . Y . . . . 2 . . . . 2 . . . . 1,2 . . . . N . . . . 1,2 Full . . . . . . . Y Hide Scroll . . . . . . Y . . . . . Y . . . . . Y Range Attributes Supported Modify at Runtime . . . . 2 . . . . 1,2 . . . . 2 . . . . 2 . . . . 2

Trn . . . . . . . Y

When a PROGRESS control is placed on a window the client window behaves slightly differently. Normally the client software does not contact the server unless the user has performed some activity to generate an EVENT. With a PROGRESS control present the client

________________________________________________________ClarioNET

100

APPENDIX
window periodically checks with the server to refresh the client window. The time between automatic refresh is set on the client side with the ProgressUpdateFrequency class property. When the client frequency is reached, a message is sent to the server to scan the current window and send the changes to the client. The change can consist of anything including the detection that another window has opened. The limitation to this is that the ACCEPT loop on the server must be cycling. This is essential because the message sent from the client will only be heard by the server when the ACCEPT loop gets an event.
Note: Automatic client update requests will only occur when the PROGRESS control is enabled. If disabled, the automatic update requests will stop.

RADIO
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . 2 . . . . 2 . . . . N . . . . 1,2 . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 1 . . . . Y Icon . . . . . . Y Attributes Supported Modify at Runtime . . . . 2 . . . . N . . . . N . . . . 2 . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . N

At . . . . . . . Y Color . . . . . Y Cursor . . . . N Disable . . . . Y DropId . . . . N Flat . . . . . . Y Font Hide . . . . . Y . . . . . Y Full . . . . . . Y Hlp . . . . . . Y

Key . . . . . . . Y Left . . . . . . . Y Msg Scroll Skip Text . . . . . . Y . . . . . Y . . . . . . Y . . . . . . Y . . . . Y Right . . . . . . Y

ToolTip

Trn . . . . . . . Y Value . . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The RADIO button will only send an EVENT to the server when an EVENT:AlertKey is generated. The only action on the client is to set the KEYCODE that causes the alert and post the EVENT:AlertKey to the server.

ClarioNET________________________________________________________

APPENDIX
REGION
Attributes Supported Modify at Runtime At . . . . . . . Y Bevel . . . . . Y Color . . . . . Y Cursor . . . . N Disable . . . . Y DragId Fill . . . . N DropId . . . . N . . . . . . Y . . . . 2 . . . . 2 . . . . N . . . . N . . . . 1,2 . . . . N . . . . N . . . . 2 FillColor . . . . Y Full . . . . . . . Y Hide Imm Scroll . . . . . . Y . . . . . . Y . . . . . Y Attributes Supported

101

Modify at Runtime

. . . . 2 . . . . 2 . . . . 1,2 . . . . N . . . . N . . . . N

SelectedColor Y 2 Trn . . . . . . . Y

If the mouse is clicked in the REGION, EVENT:Accepted is sent to the server. If the IMM attribute has been set, EVENT:MouseIn and EVENT:MouseOut is sent then the mouse enters and leaves the region.
Note: Using IMM with this control should be used sparingly to spare network traffic.

SHEET
Attributes Supported Modify at Runtime Above Below . . . . Y . . . . Y . . . Y . Y . . . . N . . . . 2 . . . . N . . . . N . . . . 1 . . . . 2 . . . . 1,2 . . . . N . . . . 1,2 . . . . N . . . . N . . . . 2 . . . . N . . . . 1,2 Hscroll . . . . . Y Imm Join . . . . . . Y . . . . . . Y Attributes Supported Modify at Runtime . . . . 2 . . . . N . . . . N . . . . N . . . . N . . . . 2 . . . . N . . . . N . . . . 2 . . . . N . . . . N . . . . N . . . . N

At . . . . . . . Y BrokenTabs . Y CHOICE Color . . . . . Y CONTENTS Cursor . . . . N Disable . . . . Y Down . . . . . Y DropId . . . . N Font Hide . . . . . Y . . . . . Y Full . . . . . . Y

Key . . . . . . . Y Left . . . . . . . Y Msg . . . . . . Y NoSheet . . . . Y Right . . . . . . Y Scroll . . . . . Y Selected . . . . Y Spread . . . . . Y Up . . . . . . . Y Wizard . . . . . Y

The SHEET control generates the following events which trigger update information to the server:
EVENT:AlertKey EVENT:NewSelection EVENT:Selected, (client property EventSelectedAllowed is set to 1)

________________________________________________________ClarioNET

102

APPENDIX
When a new tab is selected on the client, the SHEET control gets the event. The new tab CHOICE is sent to the server along with EVENT and KEYCODE. PROP:Selected is used to select the new tab on the server. The client program will receive the EVENT and can check which tab is displayed by using CHOICE.
Note: EVENT:TabChanging is not sent.

SPIN
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . N . . . . 2 . . . . N . . . . N . . . . 2 . . . . 1,2 . . . . N . . . . N . . . . N . . . . 1,2 . . . . N . . . . 2 . . . . N . . . . 2 . . . . 1,2 . . . . Y . . . . N . . . . N . . . . N . . . . N InToolbar . . . N Attributes Supported Modify at Runtime . . . . N . . . . N . . . . N . . . . N . . . . 2 . . . . N . . . . 2 . . . . N . . . . N . . . . N . . . . N . . . . N . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . N . . . . N

At . . . . . . . Y Cap . . . . . . Y Center . . . . Y . Y Color . . . . . Y CONTENTS Decimal Cursor . . . . N . . . Y Delay . . . . . Y Disable . . . . Y DropId . . . . N Font . . . . . Y From . . . . . N Full . . . . . . Y Hide . . . . . Y Hlp . . . . . . Y Hscroll . . . . Y HVScroll . . . N Imm Ins . . . . . Y . . . . . . Y

Key . . . . . . . Y Left . . . . . . . Y Mask . . . . . . Y Msg . . . . . . Y . . . . . Y . . . Y Ovr . . . . . . . Y Range ReadOnly Req Scroll Skip Step Text

Repeat . . . . . Y . . . . . . Y . . . . . Y . . . . . . Y . . . . . . Y . . . . . . Y . . . . Y Right . . . . . . Y

ToolTip

Trn . . . . . . . Y Upr . . . . . . . Y Vscroll . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The SPIN control generates the following events which trigger update information to the server:
EVENT:Accepted (and CONTENTS have not changed) EVENT:AlertKey EVENT:Selected, (client property EventSelectedAllowed is set to 1) EVENT:NewSelection (only if IMM is set)

After one of these events, the CONTENTS of the control, EVENT, and KEYCODE are sent to the Server.

ClarioNET________________________________________________________

APPENDIX
STRING
Attributes Supported Modify at Runtime Angle . . . . Y . . . . 2 . . . . 2 . . . . N . . . . 2 . . . . N . . . . 2 . . . . 1,2 . . . . N . . . . 2 . . . . 1,2 . . . . N . . . . 2 . . . . 2 . . . . 1,2 Left . . . . . . . Y Max . . . . . . N Min . . . . . . . N Page . . . . . . N PageNo Reset Scroll Skip Sum Tally Text . . . . N . . . . . N . . . . . Y . . . . . . N . . . . . . N . . . . . . N . . . . . . Y Attributes Supported

103

Modify at Runtime

. . . . 2 . . . . N . . . . N . . . . N . . . . N . . . . N . . . . 2 . . . . N . . . . N . . . . N . . . . N . . . . N . . . . 2

At . . . . . . . Y Ave . . . . . . N Center . . . . Y Cnt . . . . . . N Color . . . . . Y Contents . . . Y Cursor . . . . N Decimal . . . Y Disable . . . . Y DropId . . . . N Font Hide . . . . . Y . . . . . Y Full . . . . . . Y

Right . . . . . . Y

Trn . . . . . . . Y

The STRING control does not generate any events, therefore no update to the server will occur.

TAB
Attributes Supported Modify at Runtime ChildIndex . . Y Color . . . . . Y Disable . . . . Y DropId . . . . N Font Hide . . . . . Y . . . . . Y . . . . N . . . . 2 . . . . 1,2 . . . . N . . . . 2 . . . . 1,2 Hlp . . . . . . . Y Key . . . . . . . Y Msg Req Text . . . . . . Y . . . . . . N . . . . . . Y . . . . Y Attributes Supported Modify at Runtime . . . . Y . . . . N . . . . 2 . . . . N . . . . 2 . . . . 2

ToolTip

All activity for The TAB control occurs through its parent SHEET control.
Note: The tab order cannot be changed at runtime.

TEXT
Attributes Supported Modify at Runtime Alrt* . . . . . Y . . . . Y . Y . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 1,2 Key . . . . . . . Y Left . . . . . . . Y Msg . . . . . . Y . . . Y Ovr . . . . . . . Y ReadOnly Attributes Supported Modify at Runtime . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2

At . . . . . . . Y Center Color . . . . . Y CONTENTS

________________________________________________________ClarioNET

104
Cursor . . . . N Disable . . . . Y DropId . . . . N Font Hide . . . . . Y . . . . . Y Full . . . . . . Y Hlp . . . . . . Y Hscroll . . . . Y HVScroll . . . Y Ins . . . . . . Y . . . . N . . . . 1,2 . . . . N . . . . 2 . . . . 2 . . . . 1,2 . . . . Y . . . . 2 . . . . N . . . . 2 Req . . . . . . Y . . . . N . . . . N . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 . . . . 2 Resize . . . . . Y Right . . . . . . Y Scroll Single Skip ToolTip . . . . . Y . . . . . Y . . . . Y . . . . . . Y

APPENDIX

Trn . . . . . . . Y Upr . . . . . . . Y Vscroll . . . . . Y

*First 25 AlertKeys returned by {PROP:Alrt, x}, except MouseLeft

The TEXT control generates the following events which trigger update information to the server:
EVENT:Accepted (if the contents of the TEXT control have changed) EVENT:AlertKey EVENT:Selected, (client property EventSelectedAllowed is set to 1)

After one of these events the CONTENTS of the control, the EVENT, and KEYCODE are sent to the server.

General Property and Control Notes


ClarioNET detects the attributes of all standard Clarion controls on each window. These properties are used to create the exact window replica that the client uses. Because the remote client screen is not truly attached to the server but simply a replica, not all properties can be supported. Nearly all control attributes (properties) are scanned and used when first building the control on the client. Thereafter, for each window update cycle, a subset of those properties is transmitted to the client. Use ClarioNET:SetUpdateExtents to configure the settings for optimization of scanning for changed properties on a control. The property scanning in ClarioNET is very fast an efficient, being one of the most highly opimized areas of server code. Only consider limiting control scanning when you have actually assembled and used a ClarioNET web application and test both scann and non-scan alternatives.

ClarioNET________________________________________________________

APPENDIX
ClarioNET:SetUpdateExtents(SHORT ControlType, SHORT Extent)

105

ControlType An integer constant, expression, EQUATE or variable that specifies the type of control to limit. EQUATE statements for the ControlType can be found in the EQUATES.CLW file. These equates are denoted by a prefix of CREATE:. A special CREATE:AddDelete ControlType is also available. Extent An integer constant, expression, EQUATE or variable that defines the degree to which each controls properties are scanned. A value of zero (0) means that no scanning is done. A value of one (1) means that only the most basic properties are scanned for changes. This includes CONTENTS, HIDE, and DISABLE. A value of two (2) means that all control properties are scanned.

This procedure sets the extent that ClarioNET investigates the server programs current CONTROL attributes for changes. Although ClarioNET is extremely fast in its window and control property scanning, windows with 500 to 1,500 controls can take a perceptible amount of time. There is also a special ControlType CREATE:AddDelete that is defined for ClarioNET. This specifies that the window is scanned for added or deleted controls at runtime and can take perceptible time for windows with over 400 controls. When the ControlType is set to CREATE:AddDelete the Extent parameter can be set to zero (0) to disable the check for added and deleted controls. If set to one (1) the checking for added and deleted controls is enabled. The default extent value for all controls (except CREATE:AddDelete) is two (2) and for CREATE:AddDelete it is one (1).

CREATEing and DESTROYing Controls at Runtime


ClarioNET also scans your WINDOWs for new or missing controls at runtime. ClarioNET maintains a separate internal description of your entire window, and if a control is found (actually a Field Equate Label) that is not in the list it knows that the control has been created and then

________________________________________________________ClarioNET

106

APPENDIX
creates it on the client. The same thing occurs for deleted controls; if a control is found missing in the window it is deleted on the client.

The REQ Attribute : Required Fields


Controls with the REQ attribute, indicating it is a required field, are handled on the Client side in ClarioNET. Recall that the Clarion language specifies when a button with the REQ attribute is pressed, all ENTRY and TEXT controls with the REQ attribute are checked that they are not blank or zero. The first control encountered that does not contain data immediately receives input focus. In ClarioNET, when a client side button with a REQ attribute is pressed, the INCOMPLETE() procedure is called and the first blank or zero ENTRY or TEXT control receives focus.

MOUSEX() and MOUSEY()


Each time a client event and data are sent to the server the current CLIENT MOUSEX() and MOUSEY() LONG values are also sent to the server. HOWEVER a call to the servers MOUSEX() and MOUSEY() functions will not give you these values. Check the ClarioNETWindow.MouseX and ClarioNETWindow.MouseY class properties to get the latest mouse position on the client.
Note: Because there might be screen scaling differences between server and client screens these values might not be totally reliable. This is because your server program, although not visible, has a virtual window associated with it that is scaled in dialog units according to your servers display settings and the basic font your WINDOW or APPLICATION has specified. The client might be running at a higher or lower resolution with large, small, or another size screen font.

All Controls must have USE attributes


To guarantee that all controls are created in the proper order, every control must have a USE attribute. In many cases your control will appear properly without a USE variable, however the problems occur with nested Controls within containers, such as SHEET, GROUP, and OPTION controls. Even though the Clarion compiler automatically assigns a field equate label when no USE variable is specified, these numbers may not enable proper parent/child control sequencing.

ClarioNET________________________________________________________

APPENDIX
Note!

107
A common problem caused by a missing USE attribute is when controls are not visible on the client. If you notice missing controls or menu items, look first for a missing USE attribute in your server side program.

Redirected STD: function calls


ClarioNET does not support Clarions STD syntax except for STD:Close, STD:PrinterDialog and STD:Help. STD:Close This STD attribute is supported. When this attribute is found on a control that received an event the client window is closed and POST(EVENT:CloseWindow) is posted to the server window. STD:Help, STD:HelpIndex, STD:HelponHelp, STD:HelpSearch These four STD:Help items are passed through to the client program. When you have specified a help file with the HELP Clarion procedure call and ClarioNET:EnableHelp has been used to turn help usage on, these STD: items will operate on the client. STD:PrintSetup This STD attribute is supported. When this attribute is found on a control that received an event, instructions are sent to the Client to display a PRINTERDIALOG window. When the Client user finishes their selections the following client printer properties are set. for the current server system printer variable.
PRINTER{PROPPRINT:Device} PRINTER{PROPPRINT:Paper} PRINTER{PROPPRINT:PaperHeight} PRINTER{PROPPRINT:PaperWidth} PRINTER{PROPPRINT:Percent} PRINTER{PROPPRINT:Resolution}

However there is no guarantee that these changes will effect the current server printer device that is being used by the server based program.

________________________________________________________ClarioNET

108

APPENDIX
The following STD attributes are not supported, and will display a Functionality Not Supported message window on the client, and will be ignored by the server program.
STD:WindowList STD:CascadeWindow STD:Cut STD:Paste STD:Undo STD:TileVertical STD:TileWindow STD:ArrangeIcons STD:Copy STD:Clear STD:TileHorizontal

Redirected Clarion Standard Procedures


The changes to the BUILTINS.CLW file added OMIT/COMPILE statements that redirect many standard Clarion procedure calls to internal ClarioNET procedures. These ClarioNET procedures automatically detect when the program is running locally or has been launched by the Clarion Application Broker. The following standard Clarion procedures are redirected:
ALERT ASK BOX ELLIPSE HELP PIE POPUP ROUNDBOX SHOW ARC BLANK CHORD GETINI LINE POLYGON PUTINI SELECT TYPE

Redirected Standard Dialog Boxes


ClarioNET redirects the standard your usage of the following Clarion functionality using the Clarion SYSTEM{PROP:?????Hook} capability.
AssertHook FileDialogHook ColorDialogHook FontDialogHook

Run-Time Property Handling


There are many runtime properties that the server program can read and write and provide additional Clarion functionality.

ClarioNET________________________________________________________

APPENDIX
PROP:AlwaysDrop

109

Inspected on LIST and COMBO controls when first building the window for transfer to client.
PROP:DeferMove & PROP:LazyDisplay

Ignored. The client side of ClarioNET is the only displayed user interface; ClarioNET client side code handles all moves and refreshes for maximum speed.
SYSTEM{PROP:ColorDialogHook} SYSTEM{PROP:FontDialogHook} SYSTEM{PROP:PrinterDialogHook}

These properties are redirected to internal ClarioNET procedures that replicate the call on the client. Your server program receives a response identical to the program running locally.
SYSTEM{PROP:FileDialogHook}

Will display a message on the client that FILEDIALOG is not currently available in ClarioNET.
PROP:HaltHook, PROP:StopHook, & PROP:AssertHook

These properties are set to display a message box on the client and return the response to the server program.
PROP:MaxHeight, PROP:MaxWidth PROP:MinHeight, PROP:MinWidth

These properties are examined and sent to the client when first building a window.
PROP:NoTips

This property is checked both when first building the client window and for each update process.
PROP:AcceptAll & SELECT()

This deals with AcceptAll mode. ClarioNET is constantly checking SYSTEM{PROP:AcceptAll} from within the ClarioNET:TakeEvent procedure. When SYSTEM{PROP:AcceptAll} = 1 the call returns immediately.

________________________________________________________ClarioNET

110

APPENDIX
When AcceptAll finishes, either after finding a problem control or all controls are processed, SYSTEM{PROP:AcceptAll} is set to 0 by Clarion and the ClarioNET:TakeEvent processing continues.
PROP:Checked

Not used because examining the CONTENTS() of a CHECK control is more accurate.
PROP:ChoiceFEQ

Can be examined on the server program for current choice. Setting this property will have an effect only when ClarioNET tries to detect the {PROP:Selected} item in a SHEET or OPTION control.
PROP:Edit

Not available.
PROP:EventsWaiting

Used extensively within ClarioNET:TakeEvent to determine when all server program business logic. processing is finished and the screen can be scanned for transmission.
PROP:Follows

This property assigns a new tab order location for a control. Unfortunately there is no way that we can support tab order changes with the standard Clarion syntax. We have provided the procedure:
ClarioNET:SetPropFollows(SIGNED ControlFEQ, SIGNED FollowsFEQ)

ControlFEQ The Field Equate Label of the control to change tab order. FollowsFEQ The Field Equate Label of the control that should come immediately before ControlFEQ. This enables you to change the tab order at runtime.

ClarioNET________________________________________________________

APPENDIX
Note!

111
If you CREATE a control at runtime always use this procedure call to set the tab order location of your newly created control.

PROP:HscrollPos & PROP:VscrollPos If you assign a value to these properties the ClarioNET Window update process will detect the change for the specific control and the client scroll position will be updated. PROP:IconList Fully supported in LIST controls. PROP:PrintMode ClarioNET sets this property in REPORT procedures to make sure that images on reports are written to the Clarion created WMF file. PROP:LineHeight This property is inspected when updating LIST and COMBO controls. PROP:Threading ClarioNET forces your server application to use the single document interface immediately within the call to ClarioNETServer:Init. This is accomplished by setting SYSTEM{PROP:Threading} = 0. This is an operational requirement of the Clarion Application Broker. PROP:Touched When an ENTRY, TEXT, SPIN, or COMBO has data modified by client action, PROP:Touched for that control is set to .1.. PROP:LineHeight This property is inspected when updating LIST and COMBO controls.

________________________________________________________ClarioNET

112

APPENDIX

Forced Shutdown
A well behaved remote client automatically shuts down when no activity is apparent. When a specified time has elapsed and not activity has been performed on the client, both client and server programs will shut down automatically. In all cases the Clarion HALT procedure call is used to make sure that the executing program is completely shut down and all memory is deallocated. There are several scenarios that are considered.

User stops using client program but does not exit.


In this case the Client No Activity Shutdown is examined. ClarioNET uses an internal timer to check if the user has performed an action within this period of time. If not it is assumed that the user has abandoned the session. The client sends the server a message to shut down, and the client then HALTs. To insure that the server program is stopped and completely removed from memory, a Clarion HALT is issued on the server also.

Communication between client and server has been severed


In this case the client and server portions have lost touch with each other. Similar to the client, the ClarioNET server extension has an internal timer that is always checking if it has heard from the client within the Server No Activity Shutdown time. If this time is exceeded then it is assumed that contact with the client is lost and a HALT is issued. When Continuous Connection is being used, the client is automatically contacting the server at certain intervals to let it know that it is still alive and waiting for user actions. There is no client inactivity time and the client and server can be considered a continuously running program. Both will continue operating until the connection between client and server is lost and the Server No Activity Time is exceeded, at which time the server program will issue a HALT.

ClarioNET________________________________________________________

APPENDIX

113

Notes for Hand Coders


Here is a general map of the critical procedure calls that control the system:
!ClarioNETServer Initialization (Note 1) PROCEDURE !ClarioNET Window Initialization (Note 2) ACCEPT !ClarioNET Event Detection, Window Scanning, & Client Notification !(Note 3) ! Code.. !ClarioNET Window Close signaling (Note 4) ! Code.. END ClarioNET Window Kill (Note 5) End of procedure ClarioNETServer CloseDown (Note 6)

This is a general overview of the cycle of interaction between ClarioNET and your server program. Numbers in parentheses refer to the map of critical procedures. (1) & (6) ClarioNETServer Initialization and CloseDown are accomplished with the calls to ClarioNETServer:Init and ClarioNETServer:Kill. These procedures initialize data structures and communicate with the Clarion Application Broker to gather the necessary server communication information. (2) ClarioNET Window Initialization must occur for each Clarion PROCEDURE that will display and process a Window. This is handled with the ClarioNET:OpenWindowInit, ClarioNET:InitWindow and ClarioNET:OpenWindow procedures. These procedures use a locally instantiated ClarioNETWindowClass class as a parameter used for keeping track of the Window and its current state.

________________________________________________________ClarioNET

114

APPENDIX
(3) Event Detection, Window Scanning, & Client Notification is the most important function call in the system. ClarioNET:TakeEvent must be the first call after ACCEPT so that it can monitor the status of the window. ClarioNET:TakeEvent has two purposes: (a) It detects when there are no more events waiting (PROP:EventsWaiting} = 0) so that the window can be scanned and sent to the client. (b) When a command is received from the client (EVENT:Request) the ACCEPT is triggered and ClarioNET:TakeEvent handles the incoming command. During the server program operation, the ACCEPT loop is just looping through waiting for a TCP/IP-HTTP signal from the Client. When received, the Event and/or Data is posted to the proper window or control and the ACCEPT loop continues to process your code that senses the event and data change. Your Clarion server program has no idea where the change came from just that the event and data has changed. At this stage the Client is waiting for a response. The client is effectively dead until the server sends a response. The Clarion program continues to execute program code to finish the predetermined outcome of the event and/or data change. only when there are no events waiting in the ACCEPT loop does the ClarioNET:TakeEvent procedure again detect that {PROP:EventsWaiting} = 0 and scan the window, sending any changes to the client. (4) Window Close Signaling: It is critical that the client be informed when a Window is closing. This is the primary cause of the client going dead. Do not rely on .BREAK. to exit the ACCEPT loop. Always use POST(EVENT:CloseWindow). (5) ClarioNET Window Kill: When processing of a window is complete and the PROCEDURE is exiting, it is essential to call ClarioNET:KillWindow to DISPOSE of CLASSes instantiated for that Window and to notify the Client that the window is being closed. This is essential because the Client also must DISPOSE of CLASSes, exit a PROCEDURE, and then recontact the server to refresh the prior Window. (6) ClarioNETServer Close Down : When the program itself is terminating, ClarioNETServer:Kill must be called to cleanup and safely return all memory and resources to the server.
Note: The ClarioNET server extension is a one-pass system. Once your server program is launched and you call your first window, all further WINDOWs must be called from the

ClarioNET________________________________________________________

APPENDIX
top level WINDOW. After the first window is closed you can ONLY call the following server side ClarioNET procedures to contact the client: ClarioNET:CallClientProcedure Any INI functions, MESSAGE, ClarioNET:ClientBeep ASK

115

ClarioNET Window Procedure Call Locations


There are six (6) procedure calls that must be placed in specific locations in any procedure that manages a window. These procedures form a unified system of keeping track of the window from startup to closedown. Do not consider these procedures something you can use to get alternative functionality. They have been designed as a unified set and should be left to do their work.
Sample PROCEDURE ClarioNETWindow ClarioNETWindowClass ! This declares the CLASS where ClarioNET stores all information ! for the window to be used. We recommend the definition is ! within the procedure data section Window WINDOW !Your window Definition END CODE OPEN(Window) ClarioNET:OpenWindowInit(ClarioNETWindow) ! Records some EVENT information. MUST be before ! ClarioNET:InitWindow and AFTER OPEN(Window) ClarioNET:InitWindow(ClarioNETWindow, Window, 1) ! This is the main initialization function and MUST be called ! AFTER the window has been OPENed. Data structures are ! allocated, timers are examined, and other tasks to ! prepare for processing of the window. ACCEPT IF ClarioNET:TakeEvent(ClarioNETWindow) POST(EVENT:CloseWindow) END ! This is the main processing function. It MUST

________________________________________________________ClarioNET

116
! Be the first executable code statement after ! ACCEPT.

APPENDIX

CASE EVENT() OF EVENT:CloseWindow ClarioNET:CloseWindow(ClarioNETWindow) OF EVENT:OpenWindow ClarioNET:OpenWindowInit(ClarioNETWindow) ! This simply records and clears the window TIMER. END ! ALWAYS exit the ACCEPT loop by posting EVENT:CloseWindow. !!!! END CLOSE(Window) ClarioNET:KillWindow(ClarioNETWindow) ! This procedure cleans up memory allocated in ! ClarioNET:InitWindow and sends any required ! messages to the client to close its window.

ClarioNET________________________________________________________

APPENDIX

117

Problems and Limitations


ClarioNET has been heavily tested to make sure your IP deployment as easy and as powerful as possible. With just six procedure calls and one class instance per procedure there is hardly any code added to your application. But with this simplicity comes some limitations and potentials for coding mistakes which may break the client server communication alignment.

Problems? Check these items FIRST


Client does not launch program. 1) 2) 3) 4) 5) 6) No internet connection on the client computer. IP address or domain name are wrong. Client: program name or directory structure are wrong. The Clarion EXE Application Broker is not running or the MS Internet Information Server has not been started. Server program has attempted to start but DLLs are missing. Server program has attempted to start but no ClarioNET procedure calls have been placed into the program and the ClarioNET system is not called. Server program has attempted to start but when files are being accessed an error has occurred.

7)

Client launches program but during usage it freezes. 1) 2) 3) 4) You have not added the template to ALL your applications EXE and DLL APP files. The particular area of code being executed is using Edit-In-Place or Query by Example (QBE) functionality . A procedure has been called on EVENT:Timer. ClarioNET procedure calls have been placed by hand coding and either the locations or usage is incorrect.

________________________________________________________ClarioNET

118

APPENDIX
Problems can occur when your own custom code or third party code is used and the following conditions exist: 1) 2) If code writes directly to the screen using API calls these items will not appear on client. When using classes that override default ABC classes, there is a small chance that ClarioNET calls will not be added, or added in the wrong locations. Code or DLLs (custom or 3rd party) that are compiled without the BUILTINS.CLW file that we provide that controls the redirection of standard Clarion procedure calls can cause unstable behavior. Code or DLLs (custom or 3rd party) that are compiled without the ClarioNET procedure calls will hang the system when any of these windows are opened

3)

4)

ClarioNET Server Side Procedure Calls MUST be in specific locations

The six procedure calls are designed to analyze your running application from various points of execution. Their location is critical. These procedures are:
ClarioNET:OpenWindowInit ClarioNET:InitWindow ClarioNET:OpenWindow ClarioNET:TakeEvent ClarioNET:CloseWindow ClarioNET:KillWindow
Calling Procedures That Display Windows in EVENT:Timer

Do not call a procedure that requires user interaction to close from an EVENT:Timer. Window procedures can and must only be called in response to a user event. Because the server program is always waiting for client instructions, the client can only know whats happening in response to an event it sends to the server. Each ACCEPT loop that processes a window is designed so that it is waiting for a specific EVENT from the client program. An instruction can be sent to the client only after the client has contacted the server, and the client is waiting for a response.

ClarioNET________________________________________________________

APPENDIX
If you call a procedure on an EVENT:Timer, not only will the data stream that is sent to the client be ignored, but the server client alignment will be invalidated and both sides will be hung.

119

This restriction does not apply to windows that will close themselves, as in small status windows with progress controls or text that changes as the event loop is cycled.
Window Size is Incorrect on Client

When you use INI files to save and restore WINDOW and APPLICATION size that subsequent runs may result in improper window sizes. This is because the Clarion size saving INI process reads the displayed windows size and saves it. There is a good chance that the window size on the server might be different than the client. You can of course change the size and location of the window and controls using runtime property assignments and the ClarioNET server code will transmit these changes to the client. We recommend that you disable the INI window size saving procedure upon testing ClarioNET:Active() = 1.
A Call to POPUP Can Hang the Server

This happens if...

Modifications required to the BUILTINS.CLW file as described


earlier were not performed

You did not add ClarionetUsed as a project define.


The POPUP menu will actually be processed on the server and the server program will be waiting for an answer.....an answer it cannot get.
Window Controls on the Client Are in the Wrong Order or Missing

When the client window is created a complex parent/child scanning operation takes place that creates parents before children, then creates controls in the proper tab order. It is essential that all controls have USE variables. Be especially vigilant of TABs and MENUs.
Report Progress Windows That Require an Event to start printing

A single guideline will make your report generation procedures work perfectly: do not combine a WINDOW with a REPORT procedure that requires user action. Perform all user selection processes to gather data

________________________________________________________ClarioNET

120

APPENDIX
that will be used to generate the report in a separate procedure. Let the REPORT procedure do just that...generate the report.
Windows with PROGRESS Controls

If a WINDOW or APPLICATION contains a PROGRESS control, the ClarioNET client will respond in a special way. After displaying the window the client will request a refresh of the window information at regular intervals. This behavior can be canceled by DISABLEing the progress control.
Printout Size Limits or Orientation

With ClarioNET, Clarions Report Print Preview mode must always be used.This is needed to force reports to print to Windows Metafiles) by the server program. The .WMF files are sent to the client. All metafiles for a single report are combined in a single compressed archive for transfer to the client. The maximum size is limited only to the practical transmission time to the client. WMF files compress to an average of 2 to 15K per page. ClarioNET has NO LIMITS to the complexity of a report page or the number of pages. There is only a common sense limitation that you need to determine because of the time it takes to send the compressed file of printout pages to the client. Be aware when a huge printout (2,000 + pages) could be generated that could take a long time to download to the client.
Missing ICON or IMAGE contents

Remember to place all images in the execute or public directory.


Do Not use EVENT:Last in the server program

ClarioNET uses this EVENT as a trigger.


Data Within Listbox is not Formatted Correctly

There is a maximum of 40 LIST and COMBO controls per window and a maximum of 200 QUEUE fields per LIST. If the listbox exceeds these limits your listbox data will not be formatted properly. Most often you will see records shifted over a number of columns as the list lines progress downwards.

ClarioNET________________________________________________________

APPENDIX
Wrong BUTTON has DEFAULT behavior

121

It is possible that you have used the DEFAULT attribute on a BUTTON control in a window more than once. ClarioNET recognizes this feature on the first BUTTON with the DEFAULT attribute as it scans the window in control specification order.
Calling other Window procedures during Window startup

Many times you may wish to call a splash type window during the opening process of a window. This is fine in ClarioNET but we recommend that you call the procedure to display the splash window BEFORE the ACCEPT loop begins or in the EVENT:OpenWindow location within the ACCEPT loop. If the splash window procedure that you have called returns a result that should cause the calling procedure to immediately RETURN, you can use a RETURN statement.
Program Lockup

Because ClarioNET maintains a strict client server alignment of events and window layering, it is essential that the two never lose their alignment. If alignment is lost there is no way to recover, and the link is considered dead. The server program will time out and terminate itself. The client program will exit after a time out, either from inactivity or because of an HTTP timeout event. This is the most common area of problems with ClarioNET and usually stems from a coding error in the server program.
Font Sizes on the Client

Because the client computer may be using a different screen resolution and screen font size than the server, there is the possibility the size of screen controls such as strings may be wrong. This is unavoidable and can be eased if you test your application in several screen resolutions to be sure everything fits well. When ClarioNET receives an APPLICATION or WINDOW to display it determines the basic font size that was used on the server and creates a window with the same size font. The resulting window should be nearly identical.
MDI apps become SDI apps

ClarioNET forces your application to run as a Single Document Interface application. This is required by the Clarion Application Broker. Please note the following items as you inspect your MDI application coding:

________________________________________________________ClarioNET

122
1.

APPENDIX
POSTing events to other threads will have no effect. The event will be posted to the current thread. Please examine what could happened in the current ACCEPT loop received a POSTED event. Variables with the THREAD attribute become more global in scope.
There is no need to remove the START or MDI items from your program. START will simply become a procedure call and MDI will be ignored.

2.

Note!

List Box Has Scrambled or Garbled Entries

This can be caused is there is a vertical bar .|. in the contents of one of the queue fields. Clarion internally uses this character as a delimiter when it is providing ClarioNET with the LIST contents. There is no way for us to change this at present, and we suggest that you filter this character out and change it to an alternative.
API Calls That Write to Server Screen

These will not appear on the clients screen.


Third Party Code or DLLs

If compiled without the revised BUILTINS.CLW these may hang the system if calling anything that was revised.

Additional Programming Guidelines


For best display always specify X, Y, Width and Height for controls.
If an AT parameter is left blank the field, as internally set by the Clarion runtime, might now be big enough to display the entire control

Do not use windows in report procedures. Gather the data necessary to


produce the report, and then call the report procedure.

ClarioNET________________________________________________________

APPENDIX

123

Clarion Library Source Code Changes


The installation program backs up your existing BUILTINS.CLW file, and replaces it with a modified one. Many Clarion standard procedures must be redirected to internal ClarioNET procedures to provide web usage. If for some reason you must manually update the Builtins.clw file, the procedure is as follows: 1. Load BUILTINS.CLW into the Clarion editor. Select File | Open and Navigate to the Clarion LIBSRC directory. Change the Files of type to Clarion source (*.clw; *.inc; *.trn). Select BUILTINS.CLW (You should now see this file in the text editor)

2. 3. 4.

Move the cursor to just below the MODULE Line. Select File | Import File, and select ClarioNET_Builtins.CLW file from the Clarion LIBSRC Directory. Save the file.

________________________________________________________ClarioNET

124
5. 6. Load an application and compile.

APPENDIX

The compiler will report 18 Indistinguishable New Prototype Errors. This is expected because the old prototypes are still in the BUILTINS.CLW file. You need to comment out those lines. This is easily done as follows.... Press the [Edit] errors button. Press the [OK] button for the Edits made in generated source.. Warning dialog. The cursor will be placed at the source of the first error encountered. Turn the line to a comment by adding an exclamation (!) point just before the code that appears on the line.

7. 8. 9.

10. Use the [F4] key to find each successive error. Comment out each of these lines of code. 10. Complete the modification by saving the modified BUILTINS.CLW. Recompile your application. The ClarioNET server extension DLL automatically detects when your application is running locally and simply sends the calls on to the standard Clarion procedures. When launched for web usage ClarioNET receives the procedure calls and stores the information internally for transmission and replication on the client.

Clarion LEGACY Template Modifications Required


To add the ability for ClarioNET to support reports in a Legacy template generated program there are two EMBED locations that need to be added to the REPORT.TPW template file. 1. Load REPORT.TPW into the Clarion editor. Select File | Open and Navigate to the Clarion TEMPLATE directory. Change the Files of type to Clarion All files (*.*). Select REPORT.TPW. You should now see this file in the text editor. Scroll down to line 206. Immediately after the ACCEPT statement, add the following template code:

2.

#EMBED(%BeginningOfAcceptLoop,Beginning of ACCEPT Loop)

ClarioNET________________________________________________________

APPENDIX
3.

125
Go to line 208. Immediately after the CASE EVENT() statement, add the following template code:

#EMBED(%WithinEventProcessing,Event Processing for ACCEPT Loop) NOTE: If the standard Clarion Legacy templates have been modified, the line numbers specified above will differ. Look for the mentioned code instead of line numbers.

Template Registry Setup


The installation program automatically registers the ClarioNET template. Should you need to manually register it, you will find the Clarionet.TPL file in the TEMPLATE subdirectory. 1. 2. 3. 4. Choose Setup | Template Registry from the Clarion Environment menubar. In the Template Registry dialog, press the [Register] button. In the Template File dialog, select the CLARIONET.TPL from the ..\TEMPLATE subdirectory, then press [OK]. Press the [Close] button after the template is registered.

Error Messages
These error messages will appear in a standard Clarion MESSAGE box if an error occurs.
Client Error: Transfer File to Server Error Opening File: (filename) Error # (?) Error : ????? Skipping file

The file specified on the client side to be transferred to the server could not be opened for the reasons stated in .Error.. Non-fatal error, the file will be skipped and not transferred.
Client Error: Transfer File to Server Size of file : (filename) exceeds internal limits of (size) Skipping file

________________________________________________________ClarioNET

126
The file was too large for the client side internal transfer buffers. Non-fatal error, the file will be skipped and not transferred.

APPENDIX

Client Error: Transfer File to Server Size of encoded file : (filename) exceeds internal buffer size of (size) Skipping file

After the file was mime encoded and encrypted, the resulting datastream size was too large for the internal buffer. Non-fatal error, the file will be skipped and not transferred.
Client: Shell Execute Error Error executing connection to : (command)

This occurs when a button with ClarioNET:WEBLINK as the KEY equate was pressed and the ShellExecute command used ended in failure.
Client: Non-Fatal Server Error Stream did not contain a header or receive encrypting Command = (datastream portion)

A datastream has been received by the client that was not properly formatted by the server. This means that either the datastream was corrupted in transit via the TCP/IP connection or that some serious error has occurred on the server.
Client: Datastream Error Unrecognized Assignment Function Code

This indicates that one of the codes used on the server to tell the client what to do is not recognized by the client. If this happens the most likely problem is that the ClarioNET procedure calls in the server application are not properly placed -or- the basic logic used in the design of ClarioNET is being violated in the server program. The most common source of this message is when a new window is opened when the client is expecting a simple update stream for the current window.
Limit Exceeded Messages More than (x) variables required for screen. Number of Lists (x) exceeds internal limit of (x) queues Number of String USE variables exceeded

All the above messages indicate that the screen was too large to be rendered on the Client. Your first action should be to reduce the number of controls on your screen. Also, contact SoftVelocity, providing your

ClarioNET________________________________________________________

APPENDIX

127
window structures, so that the internal capacities might be increased in future editions.
Client : Report Generation Error There was a data compression/encryption error... (info) when the report was being prepared for transmission.

This indicates there was an error on the server when the files were being compressed and encrypted for transmission to the client.
Client: File Error Client File Error on (filename) Location: (number) Error Value = (number) Error : (string)

This is a general message when a file CREATE, OPEN, ADD, APPEND, CLOSE, or GET operation encountered an error. The .Location. number can be reported to SoftVelocity to determine where the error occurred and aid in debugging for future problems.
Client: Compression Error In-Ram Compression Initialization Error In-Ram Decompression Initialization Error

This indicates that the main data compression/encoding system could not be initialized and is a fatal error. Please report this to SoftVelocity.
Client: Compression Error (1) Stream Compression Error Code: (number) (2) Stream Decompression Error Code: (number)

This indicates an error has occurred during the compression/encryption process for sending data to the server. Please report this to SoftVelocity.
Client: Decompression Error Client Decompression System ERROR (string)

This indicates that an error has occurred decompressing & decrypting the datastream received from the server. Please report this to SoftVelocity.
Server: Compression Error Server Compression System ERROR (text)

________________________________________________________ClarioNET

128

APPENDIX
This indicates that an error has occurred compressing & encrypting a datastream to send to the client. Please report this to SoftVelocity.
Server: File Error Server File Error... Filename : (filename) Code Location Marker : (number) Calling Index : (number) Error # (number) Error : (text)

This is a general message when a file CREATE, OPEN, ADD, APPEND, CLOSE, or GET operation encountered an error. The Location and Index values can be reported to the authors of ClarioNET to determine where the error occurred and aid in debugging for future problems.

ClarioNET________________________________________________________

Index

129

Index
Symbols
8080 15,17,81

A
ABC ABC Toolbar Abc.app ACCEPT ALERT Application Broker application logic Application Visible on Server ARC Architecture Arial ASK AssertHook 2,21,24,28,38,40,63,66-67,76,118 2,24 67 27,30,60,70,74-75,87,89,100, 113-116,118,121-122,124-125 108 3,5,10,13-15,22,28-30,40,43,47-49, 51,72,81,108,111,113,117,121 50,60 1,22 33,108 1,10 36,62 3,108,115 108-109

B
bitmapped graphics BLANK Blink, Inc. BlowFishFlag BOX BREAK BUILTINS.CLW BUTTON 35 33,108 46 71 33,91-92,108 30,57,114 4,13,28,33,108,118-119,122-124 62,92,121

________________________________________________________ClarioNET

130
C
CENTER CHECK CHORD ClarioNET Clarionet.clw Clarionet.inc Clarionet.tpl ClarioNET:Active ClarioNET:CallClientProcedure ClarioNET:ClientBeep ClarioNET:ClientProcedure ClarioNET:CloseWindow ClarioNET:EnableHelp ClarioNET:GetFilesFromClient ClarioNET:GetPrintFileName ClarioNET:Global.ClientQueryRequest ClarioNET:HandleClientQuery ClarioNET:InitWindow ClarioNET:KillWindow ClarioNET:OpenPushWindow ClarioNET:OpenWindow ClarioNET:OpenWindowInit ClarioNET:PutINI ClarioNET:QueryServerProgram ClarioNET:RegisterBrowse ClarioNET:SendClientFilesToServer ClarioNET:SendClientQueryResponse ClarioNET:SendFilesToClient ClarioNET:SetCursor 31 29,90,92-93,110 33,108 4,1-3,5-129 66 66 66 119 60,85,87-88,115 76,115 60-61,87 75,116,118 22,33,107 55-58 68-69 73 73 74,113,115-116,118 75,114,116,118 78-80 63,73-74,76,113,115-116,118 73,76,113,115-116,118 76 72,88 75 55-58 73 53-55 62-63

Index

ClarioNET________________________________________________________

Index
ClarioNET:SetPropFollows ClarioNET:SetUpdateExtents ClarioNET:StartClientSession ClarioNET:TakeEvent ClarioNET:WEBLINK ClarioNETServer:Active ClarioNETServer:Init ClarioNETServer:Kill ClarioNETUsed ClarioNETWindow.MouseX ClarioNETWindowClass client application Client Auto Shut Down Client Procedure Client Queries Client Refresh Interval Client Side Cursor Client side launching program Client.clw Client.inc ClientNoActivityTimeOut Clntstub.lib ClosePushWindow CLRNT_C .ClientTempDirectory CLRNT_C .EventSelectedAllowed CLRNT_C .HostProgramDirectory CLRNT_C .HostProgramName CLRNT_C .LaunchingWindow CLRNT_C .PingFlag CLRNT_C .ProxyPassword CLRNT_C .ServerPort

131
110 76,104-105 87 74-75,89,109-110,114-115,118 62,126 28,40,72 7,22,33,49,59,70,72-73,76,88,111,113 72,113-114 16,19,28,30,33 29,106 73-75,113,115 10-12,34,46,49 2,23-24 3,60-61,63 3,72 1,23 3,62 67 66 66,86 71 65 78-80 84 85 81 81 84 84 82 81

________________________________________________________ClarioNET

132
CLRNT_C .UseLaunchingWindow CLRNT_C .UsePreconfig CLRNT_C .UserAgent CLRNT_ERR_DECOMP_INIT_FAILURE CLRNT_ERR_HTTP_FAILURE CLRNT_ERR_HTTP_TIMEOUT CLRNT_ERR_INACTIVE CLRNT_ERR_NO_CREATE_TEMP CLRNT_ERR_NO_HOSTDIR CLRNT_ERR_NO_HOSTNAME CLRNT_ERR_NO_SERVERMAME CLRNT_ERR_NONE CLRNT_ERR_PING CLRNT_ERR_SESSION_FAILURE CLRNT_ERR_VERSION_MISMATCH Clrnt50c.lib Clrnt50s.dll Clrnt50s.lib Clrnt55c.lib Clrnt55s.dll Clrnt55s.lib ColorDialogHook COMBO Command Line Parameters Comp.lang.clarion Connect.clw Connect50.prj Connect55.prj Console Continuous Connection control attributes 84 82 81 86 86 87 87 86 86 86 86 86-87 87 86 86 45,65,80 65 65 45,66,80 65 65 108-109 29,90,93-94,98,109,111,120 3,59 6 67 67 67 10,39 1,23,112 104

Index

ClarioNET________________________________________________________

Index
CPCS Report Cursor Customer Service CWICWEB

133
2,25 62-63,123-124 6 16,47-49,51

D
Datastream Error Datastreams DBMS default printer Defines DelimitedProgramList Deployment device settings DisplayServerScreen distributed processing Downloading Report 126 23 44,50 29,43-44 2,16,19,30 88 1,3,13,46-52 39 71 60 69

E
Edit-in-Place ELLIPSE Encryption EQUATES Error Messages Error Opening File EVENT:Last EVENT:Selected EVENT:Timer Example.dct EXEC external IP address 38 33,95,108 1-2,23,33 83,86,105 4,125 125 29,120 85,91,93-95,99,101-102,104 29,117-119 67 16,47,49,51-52 48

________________________________________________________ClarioNET

134
F
file transfers FileDialogHook FileListQueue Client File Error on ..... FLQ:Filename Font Sizes FontDialogHook fully qualified file name Functionality Not Supported 53-54 108-109 53-58 127 54-55,57 121 108-109 53 108

Index

G
GETINI global template GraphicDownloadFlag Graphics Device Interface Graphics Statements GROUP 22,76-77,108 19,31 80,82 39 2,33 96,106

H
Handcode.clw Handcode.prj HELP HELP Sent to Client help system HP LaserJet Series II HTTP protocol HyperLink 67 67 1,19,22,32-33,107-108 1,22 22,32-33 40,43 10 3,62

I
ICON 29,90,93,120

ClarioNET________________________________________________________

Index
IMAGE Images INI file Internet Explorer Internet Information Server ISAPI ISAPI broker ISAPI deployment

135
35,52,96-97,120 47-48,51-52,82,84,89,111,120 29,31,35,53,76-78,119 13 10,40,47,117 14,22,29,40,43,47,51,81 81 40

K
KEY 62,93,95-96,99-100,102,104,126

L
LED indication Legacy.app License Password LicensePassword Limit Exceeded Messages LINE List Box LoadStar RPM local file management Localhost Lockup Lscomp.dll Lsdecomp.lib 17 67 1,7,21-22,71 7,70-71 126 33,97-98,108 122 2,25 44 5,15,48-49,81 121 65 66

M
MDI Metafile MOUSEX 24,30,36,90,121-122 12,39,41,43,120 106

________________________________________________________ClarioNET

136
MSG Multiple Document Interface 62 30

Index

N
Netscape Navigator News.softvelocity.com Newsgroup non-English clients n-tier computing 13 6 6 83 10, 60

O
OPTION Overhead 29,90,98-99,106,110 11

P
page size PANEL Password Patches PIE POLYGON POPUP PORT PREVIEW attribute print preview printer driver PRINTERDIALOG Printout Size Limits Prntprvw.clw Prntprvw.lib Prntprvw.prj 39,43 99 7,21,34,82 13,34 33,108 108 19,108,119 2,25,28,48,69-70,111,119-120,124 29,39-40 39,45,66-67 39-41,43 41,107 120 67 66-67 66-67

ClarioNET________________________________________________________

Index
PROGRESS project define PROMPT PROP:AlwaysDrop PROP:DeferMove PROP:LazyDisplay Properties Support PUBLIC Public directory PUTINI

137
29,40,79,83,90,99-100,120 15,28,30,119 99 109 109 109 4,90 47-48,51-52 56 22,76-77,108

Q
Query-by-Example QuickStart 38 5,15

R
RADIO README.TXT Redirected Clarion Standard Procedures Redirected Standard Dialog Boxes reg file REGION Report Functions Report Generation Error Report Preview Report Progress Report status window Required Fields Requirements Resolutions ROUNDBOX 99-100 5,13 108 108 43-44 101 3,68 127 40 119 69 106 1,3,13,46 31,36,121 33,108

________________________________________________________ClarioNET

138
RunCallClass Run-Time Property Handling 77 108

Index

S
Security SELECT Server Access server application Server Auto Shut Down Server Class Server Side Procedure Calls ServerNoActivityTimeOut Setup SHEET Shell Execute Error SHOW Shrinker Single Document Interface Source Code Procedures SPIN Splash Screen Stream did not contain a header SYSTEM{PROP:Threading} 2,33 108-109 2,34 11-12,20,27,32,43-44,49,52-54,57, 59-60,62,65,71,77,80,111,126 2,23-24 3,70 118 71 1-5,13-14,39-41,43-44,48,97-98,107,125 29,90,101-103,106,110 126 33,108 46 29,121 2,37 29,90,102,111 3,63 126 30,111

T
TAB tab order technical support Template Options Template Registry 38,103,119 103,110-111,119 6 1,21-26 4,125

ClarioNET________________________________________________________

Index
TEXT thin client Thread TIMER Times New Roman Transfer Files Trial mode TYPE

139
29,90,103-104,106,111 10,36,60,82 24,30,122 30,40,116 36 3,53 7 33,45,70,77,80,82,108

U
Uniform Resource Locator UpdatePushWindow URL USE attributes USE Attributes USE variable User Access user interface 49 78-80 15,45,48-49 29,38 2 38,75,78-79,89,96,106,119,126 2,34 11,27-28,30,37,40,45,53,87,89-90,109

W
white papers window height and width WINDOW Properties Window Size Windows 2000 Windows NT WININET.DLL WinPtr WMf Www.softvelocity.com 5 31 90 119 43,48,50 39,43,48 13,30,46 60-61,87 12,39-40,52,68-69,82,111,120 6,13,81

________________________________________________________ClarioNET

140

Index

ClarioNET________________________________________________________

You might also like