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]