001: /*=============================================================================
002: * Copyright Texas Instruments 2000-2004. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * $ProjectHeader: OSCRIPT 0.155 Fri, 20 Dec 2002 18:34:22 -0800 rclark $
019: */
020:
021: package oscript.data;
022:
023: import oscript.DefaultParser;
024: import oscript.exceptions.*;
025:
026: /**
027: * A <code>ComMethod</code> object is a wrapper for a method of a COM
028: * object
029: *
030: * @author Rob Clark (rob@ti.com)
031: */
032: public class ComMethod extends Value {
033: /**
034: * The type object for an instance of ComMethod.
035: */
036: public final static Value TYPE = BuiltinType
037: .makeBuiltinType("oscript.data.ComMethod");
038: public final static String PARENT_TYPE_NAME = "oscript.data.OObject";
039: public final static String TYPE_NAME = "ComMethod";
040: public final static String[] MEMBER_NAMES = new String[] {
041: "getType", "castToString", "bopInstanceOf", "bopEquals",
042: "bopNotEquals", "callAsFunction" };
043:
044: /**
045: * The dispatch-pointer object is our handle to the COM object.
046: */
047: private org.jawin.DispatchPtr dptr;
048:
049: /**
050: * The name of the method.
051: */
052: private String name;
053:
054: /**
055: * Class Constructor.
056: *
057: * @param dptr the dispatch-ptr object
058: * @param name the name of the method
059: */
060: ComMethod(org.jawin.DispatchPtr dptr, String name) {
061: super ();
062:
063: this .dptr = dptr;
064: this .name = name;
065: }
066:
067: /**
068: * For benefit of <code>BuiltinType</code>... always throws an exception because
069: * script code should not be allowed to directly create an instance...
070: *
071: * @param args arguments to this constructor
072: * @throws PackagedScriptObjectException(Exception) if wrong number of args
073: */
074: public ComMethod(oscript.util.MemberTable args) {
075: throw PackagedScriptObjectException
076: .makeExceptionWrapper(new OIllegalArgumentException(
077: "wrong number of args!"));
078: }
079:
080: /* XXX should re-implement bopEquals/bopNotEquals/equals/hashCode to do the
081: * right thing... two instances that are wrapping the same method should
082: * appear to be equals()
083: */
084:
085: /**
086: * Get the type of this object. The returned type doesn't have to take
087: * into account the possibility of a script type extending a built-in
088: * type, since that is handled by {@link #getType}.
089: *
090: * @return the object's type
091: */
092: protected Value getTypeImpl() {
093: return TYPE;
094: }
095:
096: /**
097: * Call this object as a function.
098: *
099: * @param sf the current stack frame
100: * @param args the arguments to the function, or <code>null</code> if none
101: * @return the value returned by the function
102: * @throws PackagedScriptObjectException
103: */
104: public Value callAsFunction(oscript.util.StackFrame sf,
105: oscript.util.MemberTable args)
106: throws PackagedScriptObjectException {
107: try {
108: Object[] javaArgs;
109:
110: if (args != null) {
111: javaArgs = new Object[args.length()];
112: if (JavaBridge.convertArgs(INVOKEN_PARAMETER_TYPES,
113: javaArgs, args) < 0)
114: throw PackagedScriptObjectException
115: .makeExceptionWrapper(new OIllegalArgumentException(
116: "wrong arg types!"));
117: } else {
118: javaArgs = EMPTY_ARGS;
119: }
120:
121: // NOTE: support for side-effects commented out, since I'm not sure if it is a good idea or not
122: // // store copy of original values
123: // Object[] javaArgsCopy = new Object[javaArgs.length];
124: // System.arraycopy( javaArgs, 0, javaArgsCopy, 0, javaArgs.length );
125:
126: Object result = dptr.invokeN(name, javaArgs);
127:
128: // for( int i=0; i<javaArgs.length; i++ )
129: // if( javaArgs[i] != javaArgsCopy[i] )
130: // args[i].opAssign( JavaBridge.convertToScriptObject( javaArgs[i] ) );
131:
132: if (result instanceof org.jawin.DispatchPtr)
133: return new ComObject((org.jawin.DispatchPtr) result);
134:
135: return JavaBridge.convertToScriptObject(result);
136: } catch (org.jawin.COMException e) {
137: throw OJavaException.makeJavaExceptionWrapper(e);
138: }
139: }
140:
141: static final Class[] INVOKEN_PARAMETER_TYPES = new Class[] {
142: Object.class, Object.class, Object.class, Object.class,
143: Object.class, Object.class, Object.class, Object.class,
144: Object.class, Object.class, Object.class, Object.class,
145: Object.class, Object.class, Object.class, Object.class,
146: Object.class, Object.class, Object.class, Object.class };
147:
148: static final Object[] EMPTY_ARGS = new Object[0];
149: }
150:
151: /*
152: * Local Variables:
153: * tab-width: 2
154: * indent-tabs-mode: nil
155: * mode: java
156: * c-indentation-style: java
157: * c-basic-offset: 2
158: * eval: (c-set-offset 'substatement-open '0)
159: * eval: (c-set-offset 'case-label '+)
160: * eval: (c-set-offset 'inclass '+)
161: * eval: (c-set-offset 'inline-open '0)
162: * End:
163: */
|