theConfig 10.0
|
List of all callback defined by tcllcconfig
The callback is a regular TCL proc that either stands alone or is part of a class.
[list ?instance|class? callback args...]
TCL also allows additional parameters to be passed to the callback, for example, to support a specific implementation. These parameters are added at the end of the callback-call.
Example: If the callback provide two arguments by default (arg1
and arg2
), the following definition:
define-callback-command [list instance callback add1 add2 add3]
results in the following callback call:
instance callback arg1 arg2 add1 add2 add3
Example about the delete-callback-setup from the RPC server example/tcl/LibSq3LiteRpcServer.tcl
ServerSetup : The DeleteCallback is usually installed in the Setup-Callback but only once.
if {[my ConfigGetIsParent]} { # call “ObjectDeleteCall” ONLY when deleting an instance whose class name matches the regular expression “^Sq3” MkObjectC DeleteCallbackSetup "LibSq3LiteRpcServer" [list [self] ObjectDeleteCall] "^Sq3" }
The DeleteCallback is called before the deletion. In the RPC example, the RPC client is informed about the impending deletion.
oo::define LibSq3LiteRpcServer method ObjectDeleteCall { typeName typeHdl objHdl } { my Send "E" "%DEL:CHH" $typeName $typeHdl $objHdl } oo::define LibSq3LiteRpcServer export ObjectDeleteCall
ServerCleanup : If the RPC server is deleted, the DeleteCallback is no longer needed and is therefore also deleted.
if {[my ConfigGetIsParent]} { MkObjectC DeleteCallbackCleanup "LibSq3LiteRpcServer" }
Example about the delete-callback-setup from the RPC client example/tcl/LibSq3LiteRpcClient.tcl
Constructor: Add the DeleteCallback-Service if not already available :
oo::define Sq3LiteRpc constructor { rpcHdl args} { next $rpcHdl {*}$args # only use "DeleteCallback" on the initial (Parent) context set parentRpc [$rpcHdl LinkGetParent] # add service "%DEL" as static-callback "Sq3LiteDestructor" $parentRpc ServiceCreate "%DEL" [list Sq3LiteRpc Sq3LiteDestructor $rpcHdl] }
DeleteCallback: If the objHdl is still available delete the obj :
oo::define Sq3LiteRpc self method Sq3LiteDestructor {parentRpc childRpc} { set typName [$parentRpc ReadSTR] set typHdl [$parentRpc ReadHDL] set objHdl [$parentRpc ReadHDL] # type=MyClassS -> rpc=MyClassRpc set classRpc [string replace $typName end end Rpc] # hdl=objHdl -> obj set obj [$childRpc CacheLookup $classRpc $objHdl] # is "obj" already deleted ? if {$obj eq "MK_NULL"} return # now delete "obj" try { # the "objHdl" is already deleted on server, avoid resent $obj hdl 0 $obj destroy } on error {} { [$parentRpc ErrorCatch] Println } } oo::define Sq3LiteRpc export Sq3LiteDestructor
LibLcConfigRpcServer.tcl
→ using LcConfigSetIncludeFunc with callback oo::define LibLcConfigRpcServer method LcConfigSetIncludeFunc {} { set cfg [my LcConfigC_RpcRead] set fConfigIncludeData_ptr [my ReadSTR] $cfg SetIncludeFunc [list [self] $fConfigIncludeData_ptr] if {[my ServiceIsTransaction]} { my Send "R" } }
LcConfigServer.tcl
→ callback to be called # use "include_func" as "proc" method include_func { cfg dir match ret } { $ret AppendLA [MkBufferListC FileGlob [file join $dir $match]] }