eriksson Tue Feb 20 07:35:55 2001 EDT Modified files: /php4/ext/satellite typemanager.c Log: Patch for inherited interfaces by Daniel Stodden <[EMAIL PROTECTED]> Index: php4/ext/satellite/typemanager.c diff -u php4/ext/satellite/typemanager.c:1.2 php4/ext/satellite/typemanager.c:1.3 --- php4/ext/satellite/typemanager.c:1.2 Fri Sep 1 15:29:00 2000 +++ php4/ext/satellite/typemanager.c Tue Feb 20 07:35:55 2001 @@ -17,7 +17,7 @@ */ /* - * $Id: typemanager.c,v 1.2 2000/09/01 22:29:00 eriksson Exp $ + * $Id: typemanager.c,v 1.3 2001/02/20 15:35:55 eriksson Exp $ * vim: syntax=c tabstop=2 shiftwidth=2 */ @@ -219,19 +219,63 @@ return pException; } + + +/* + find an operation in an interface tree, + recursing into inherited interfaces +*/ +static CORBA_boolean +findoperation_recurse( IDL_tree tree, const char *name, + IdlInfo *pIdlInfo ) +{ + IDL_tree inherited; + CORBA_boolean success; + + success = orbit_find_type( IDL_INTERFACE(tree).body, + name, IDLN_OP_DCL, + pIdlInfo ); + if ( success ) + return CORBA_TRUE; + + for ( inherited = IDL_INTERFACE(tree).inheritance_spec; + inherited != NULL; + inherited = IDL_LIST(inherited).next ) { + IDL_tree ident = IDL_LIST(inherited).data; + InterfaceType *iface; + + iface = TypeManager_FindInterface( IDL_IDENT(ident).repo_id ); + success = findoperation_recurse( iface->mIdlInfo.mType, + name, + pIdlInfo ); + orbit_delete( iface ); + + if ( success ) + return CORBA_TRUE; + + zend_error( E_WARNING, "operation %s not found in iface %s\n", + name, IDL_IDENT(ident).repo_id ); + } + + return CORBA_FALSE; +} + /* find an operation in an interface based on case-insensitive name */ -OperationType * InterfaceType_FindOperation(InterfaceType * pInterface, - const char * name) +OperationType * InterfaceType_FindOperation( InterfaceType * pInterface, + const char * name ) { - OperationType * pOperation = orbit_new(OperationType); - CORBA_boolean success = orbit_find_type( - pInterface->mIdlInfo.mType, name, IDLN_OP_DCL, &pOperation->mIdlInfo); - if (!success) - { - orbit_delete(pOperation); - pOperation = NULL; - } - return pOperation; + OperationType *pOperation = orbit_new(OperationType); + IDL_tree tree = pInterface->mIdlInfo.mType; + CORBA_boolean success; + + success = findoperation_recurse( tree, name, + &pOperation->mIdlInfo ); + + if ( success ) + return pOperation; + + orbit_delete(pOperation); + return NULL; } /* find an attribute in an interface based on case-insensitive name */ -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]