INIT

 (Available in 01 TS COM - TS_COM_ISink)

Purpose

Create a 'TS_ISink' instance

Syntax

oISink:=TS_ISink{ uoIOwner, uoIAISource, uoInvokeHandler, upstruIID }

Arguments

uoIOwner
OBJECT(TS_IUnknown|TS_DelegateISink)
uoIAISource
OBJECT(TS_IUnknown)
uoInvokeHandler
NIL, OBJECT
upstruIID
PTR(WinGUID)

Description

This class is used to delegate events, originating from 'uoIAISource' to 'uoInvokeHandler'. If no 'uoInvokeHandler' is specified then the events are delegated to the 'ISink' instance ( SELF ).

Example

CLASS SomeIClass INHERIT TS_ISink

METHOD INIT( ..., ...  ; ...
...) CLASS SomeIClass
// Less secure ( and simple ) form of an '[less]safe' init method
// It is better not to call any object method/access/assign from
// inside the init method, if needed do this form the 'New()' method.
// From here on insert you own initialization code
// Process the parameters
   ..., ... 
   IF lParameterError
      TSTrace Warning "... parameter error ..."
      SELF:InvalidateObject( )
   END
// At this point all initialization code should be done
   IF SELF:IsValidObject
//    The 'New()' method will be called by the SUPER class
      SUPER:INIT( ... ; ...
     ... , ... )
   ELSE
      TSTrace Warning TS_TEXT_GEN_CAN_NOT_INITIALIZE
      SELF:InvalidateObject( )
   END
RETURN SELF

METHOD INIT( ..., ...  ; ...
...) CLASS SomeIClass
// Most secure ( and complex ) form of an 'safe' init method
// It is better not to call any object method/access/assign from
// inside the init method, if needed do this form the 'New()' method.
   DO CASE
   CASE SELF:IsInited
      TSTrace Warning "Can not re-init"
   CASE SELF:IsInInit
      SELF:CountInInit( TRUE )
//    From here on insert you own initialization code
//    Process the parameters
      ..., ... 
      IF lParameterError
         TSTrace Warning "... parameter error ..."
         SELF:InvalidateObject( )
      END
//    At this point all initialization code should be done
      SELF:CountInInit( FALSE )
      IF SELF:IsValidObject
         SUPER:INIT( ... ; ...
        ... , ... )
         IF SELF:NeedNew
            SELF:NeedNew:=FALSE
//          Put your 'PostInit()' code in the 'New()' method
            SELF:NEW( ... ; ...
           ... , ... )
         END
      ELSE
         TSTrace Warning TS_TEXT_GEN_CAN_NOT_INITIALIZE
         SELF:InvalidateObject( )
      END
   OTHERWISE
      TSTrace Warning "This can not happen"
   END
RETURN SELF

Source

METHOD INIT( uoIOwner, uoIAISource, uoInvokeHandler, upstruIID ) CLASS TS_ISink
LOCAL cAccessTypeList AS STRING
LOCAL oCOMGlobalData AS _TS_COMGlobalData
LOCAL pstruISinkIID AS _WinGUID
LOCAL pstruIID AS _WinGUID
LOCAL lInit AS LOGIC
   TSTrace Enter CREATE
   oCOMGlobalData:=_TS_ModuleGetCOMGlobalData( )
   #IFDEF TS_COMGLOBALDATA_CRITICALSECTION
      EnterCriticalSection( oCOMGlobalData:_COMGGeneralPurposeSection )
   #ENDIF
   IF LOGIC( _CAST, _AND( SELF:_ObjectStat1, TS_OBJSTAT1_ININIT  ; ...
  ... ) )
      SELF:_ObjectStat1+=TS_OBJSTAT1_COUNTVALUE
      cAccessTypeList:=TS_AccessTypeList( uoIOwner, uoIAISource, uoInvokeHandler,  ; ...
     ... upstruIID )
      lInit:=TRUE
      DO CASE
      CASE CharPos( cAccessTypeList, 1 )=="U"
//       Do nothing
      CASE CharPos( cAccessTypeList, 1 )=="O"
//       Do nothing
      OTHERWISE
         lInit:=FALSE
      END
      DO CASE
      CASE CharPos( cAccessTypeList, 2 )=="U"
//       Do nothing
      CASE CharPos( cAccessTypeList, 2 )=="*"
//       Do nothing
      CASE CharPos( cAccessTypeList, 2 )=="O"
//       Do nothing
      OTHERWISE
         lInit:=FALSE
      END
      DO CASE
      CASE CharPos( cAccessTypeList, 3 )=="U"
//       Do nothing
      CASE CharPos( cAccessTypeList, 3 )=="O"
//       Do nothing
      OTHERWISE
         lInit:=FALSE
      END
      DO CASE
      CASE CharPos( cAccessTypeList, 4 )=="-"
         pstruIID:=upstruIID
      OTHERWISE
         lInit:=FALSE
      END
      IF lInit
         IF TS_IsValidObject( uoIAISource, TS_ISVALID_STATIC_XIUNKNOWN )
            IF pstruIID<>NULL_PTR
               IF SELF:IIDAdd( pstruIID )
                  pstruISinkIID:=TS_MemAlloc( _SIZEOF( _WinGUID ), TRUE )
                  IF pstruISinkIID==NULL_PTR
                     TSTrace Fatal "pstruISinkIID:=TS_MemAlloc(_SizeOf(_WinGUID)," ; ...
                    ... +"TRUE)==NULL_PTR"
                     SELF:InvalidateObject( )
                  ELSE
                     MemCopy( pstruISinkIID, pstruIID, _SIZEOF( _WinGUID ) )
                     IF IsInstanceOf( uoIOwner, #TS_DelegateISink )
                        IF SELF:_AITypeLib==NULL_OBJECT
                           SELF:_AITypeLib:=uoIOwner:AITypeLib
                        END
                        uoIOwner:=NIL
                     END
                     SELF:IID:=pstruISinkIID
                     IF SELF:_IID<>NULL_PTR
                        SUPER:INIT( uoIOwner, NULL_SYMBOL ; ...
                       ... , FALSE, uoInvokeHandler )
                        IF SELF:IsInvalidated
                           TSTrace Warning "SELF:IsInvalidated"
                           SELF:InvalidateObject( )
                        ELSE
                           SELF:_AlloweInInit+=1
                           SELF:_AISource:=uoIAISource
                           #IFDEF TS_TRACETIMED_ENABLE
                              _TS_TraceTimedEnter( TS_TT_SYM_EXTERNAL, TS_TT_SYM_IUNKNOWN ; ...
                             ... , #AddRef )
                           #ENDIF
                           SELF:_AISource:AddRef( )
                           #IFDEF TS_TRACETIMED_ENABLE
                              _TS_TraceTimedLeave( TS_TT_SYM_EXTERNAL, TS_TT_SYM_IUNKNOWN ; ...
                             ... , #AddRef )
                           #ENDIF
                           SELF:_AlloweInInit-=1
                        END
                     ELSE
                        TSTrace Warning "(SELF:IID:=pstruISinkIID)==NULL_PTR"
                        SELF:InvalidateObject( )
                     END
                     IF LOGIC( _CAST, TS_MemFree( pstruISinkIID, TRUE ) )
                        TSTrace Warning "LOGIC(_CAST,TS_MemFree(pstruISinkIID,TRUE))"
                     END
                     pstruISinkIID:=NULL_PTR
                  END
               ELSE
                  TSTrace Warning "!SELF:IIDAdd(pstruIID)"
                  SELF:InvalidateObject( )
               END
            ELSE
               TSTrace Warning "pstruIID==NULL_PTR"
               SELF:InvalidateObject( )
            END
         ELSE
            TSTrace Warning "!TS_IsValidObject(uoIAISource,TS_ISVALID_STATIC_XIUNKNOWN)"
            SELF:InvalidateObject( )
         END
      ELSE
         TSTrace Warning "Invalid parameter(s), Expected 'U|O', 'O|*', 'U|O' and " ; ...
        ... +"'-', Found '"+cAccessTypeList+"'"
         SELF:InvalidateObject( )
      END
      SELF:_ObjectStat1-=TS_OBJSTAT1_COUNTVALUE
      IF _AND( SELF:_ObjectStat1, TS_OBJSTAT1_NEWTEST )==TS_OBJSTAT1_NEEDNEW
         SELF:_ObjectStat1:=_AND( SELF:_ObjectStat1 ; ...
        ... , _NOT( TS_OBJSTAT1_NEEDNEW ) )
         IF SELF:IsValidObject
            SELF:NEW( uoIOwner, uoIAISource, uoInvokeHandler ; ...
           ... , upstruIID )
         ELSE
            TSTrace Warning TS_TEXT_GEN_CAN_NOT_INITIALIZE
            SELF:InvalidateObject( )
         END
      END
   ELSE
      TSTrace Warning "!LOGIC(_CAST,_And(SELF:_ObjectStat1,TS_OBJECT_STATUS_ININIT))"
   END
   #IFDEF TS_COMGLOBALDATA_CRITICALSECTION
      LeaveCriticalSection( oCOMGlobalData:_COMGGeneralPurposeSection )
   #ENDIF
   TSTrace Leave
RETURN SELF