> OLESpec
Originator - Mike
Purpose - Specification of generic 'OLE' interface and mechanisms
Version - 1.00
Started - 14th August 1993
Completed -
Changes -
OLE or object linking and embedding allows an application to share
data with a secondary or server application which can edit that
data and return it. This allows compliant applications to gain
features provided by specific graphics or text servers without having
to reimplement those features again.
This documentation defines the message passing protocols necessary for
this kind of data sharing.
Client/Server applications
A client application (such as Impression) may wish to edit data it is capable of loading and rendering (such as drawfiles). There are two options open for such an application. Either it can provide facilities to edit these files itself, or use an already resident editor by sharing the file with it. It seems sensible and easier to choose the second option, in which case the client needs to ask a 'compliant' server to engadge in a two way data sharing session. It does so by the use of a OLEServer$<UniqueName> system variable which the server provides.
Any application which prvides its own file type and is capable of editing such files may set itself up to be an OLE server. To do so it needs to create a system variable, outlining the file type it can edit. This should be done in the applications boot file so it is present for use by a client whenever the application is seen by the filer.
The syntax of this variable is as follows
Variable name = OLEServer$Type_XXX
Variable value = -N <UniqueName> -R <run><Run$Path>
X = 0..9 | A..FAlphaChar = 0..9 | A..Z | a..z
run = 'run ' or '/'
Spaces must be used as separaters.
a typical example is
OLEServer$Type_AFF -N OLESupport -R /Desktop_OLESupport
-N : N=Name
This token specifies a unique name to be passed to the server in an OpenSession message. This message is broadcast so it is up to the server who recognises the name to respond. This string can be up to 16 characters long. When passed in messages it should be specified as a 16byte string with all unused bytes zero'd. ie FNpad("UniqueName",16) or similar. Note the server name should be modeled on the application name such as 'OLESupport' used by the support module.
-R : R=Run
This token allows a potential client to Wimp_StartTask the server. It must provide a run$path string which uniquely locates the server. This could be an expanded pathname or more usually a system variable. It should be preceded with a run command so the whole string can be passed straight to Wimp_StartTask. eg 'run <Draw$Dir>'. '/<Draw$Dir>' etc
An OLE session should be opened by an application which cannot itself edit a particular data format and wishes to share the data with a client in order to do so.
(1) The client should check to see if an OLEServer$Type_XXX variable
exists for its file type.
(If it cannot find such a variable, then the client may wish to
use the OLESupport module which simulates the response of a client
for particular file types. See OLESupDoc for information on how to
use this module task).
(2) Having found a server, the client should save its data to disc and send a OpenSession message as a broadcast to the server, using the unique name specified in the server$type variable. If the server is already running it will respond with an acknowledge. If there is no acknowledgement then the client should start the server up using the -R token and again broadcast the OpenSession message. The server will respond to this with a Message_OLEOpenSessionAck to inform the client a session is truely open. If again no acknowledgement is returned then the client should delete any swap files it created and tidy up.
Message_OLEOpenSession (&80E21)
On entry - R0 = User message recorded (18)
Message_OLEOpenSessionAck (&80E22)
return same block as OpenSession but copy my_ref to your_ref
(3) Whenever the server saves data back to file, it should send a changed message to the client (using the task handle passed in OLEOpenSession). This message format is as follows
Message_OLEFileChanged (&80E1E)
On entry - R0 = User message (17)
(4) Whenever the server throws data away, through user action it should send a message back to the client informing it that the session has been terminated.
Message_OLECloseSession (&80E23)
On entry - R0 = User message (17)
Session numbers & task handles
To provide context for OLE sessions a session number and task handle should be kept by the client and server for each session opened. Session numbers can be allocated by the client task in a way which makes them unique for the run time of the program. The client should also keep a copy of the servers task handle which it will receive via Message_OLEOpenSessionAck. This way it can tell the server whenever it closes down. The same can be said for a server. It needs to communicate file changes and session closures to a client.