зеркало из https://github.com/mozilla/gecko-dev.git
203 строки
4.7 KiB
Java
203 строки
4.7 KiB
Java
/*
|
|
* The contents of this file are subject to the Mozilla Public
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Frank
|
|
* Mitchell. Portions created by Frank Mitchell are
|
|
* Copyright (C) 1999 Frank Mitchell. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Frank Mitchell (frank.mitchell@sun.com)
|
|
*/
|
|
|
|
import java.util.Vector;
|
|
import java.lang.reflect.Method;
|
|
import org.mozilla.xpcom.*;
|
|
|
|
public class XPCTest {
|
|
static ComObject CreateSampleInstance() {
|
|
nsID kSampleCID =
|
|
new nsID("d3944dd0-ae1a-11d1-b66c-00805f8a2676");
|
|
|
|
nsID kISampleIID =
|
|
new nsID("57ecad90-ae1a-11d1-b66c-00805f8a2676");
|
|
|
|
|
|
// XXX: convert to nsIComponentManager calls
|
|
return (ComObject)XPComUtilities.CreateInstance(kSampleCID,
|
|
null,
|
|
kISampleIID);
|
|
}
|
|
|
|
public static void main(String[] argv) {
|
|
String command = "PrintStats";
|
|
int cmdOffset = -1;
|
|
boolean useXPCMethod = true;
|
|
|
|
try {
|
|
Object[] params = null;
|
|
|
|
// Process arguments
|
|
if (argv.length == 0) {
|
|
params = new Object[0];
|
|
}
|
|
else {
|
|
int argi = 0;
|
|
while (argv[argi].charAt(0) == '-') {
|
|
switch(argv[argi].charAt(1)) {
|
|
case 'r':
|
|
useXPCMethod = false;
|
|
break;
|
|
case 'x':
|
|
useXPCMethod = true;
|
|
break;
|
|
}
|
|
argi++;
|
|
}
|
|
|
|
command = argv[argi++];
|
|
if (Character.isDigit(command.charAt(0))) {
|
|
cmdOffset = Integer.parseInt(command);
|
|
}
|
|
|
|
params = paramArray(argv, argi);
|
|
}
|
|
|
|
ComObject sample = CreateSampleInstance();
|
|
|
|
// DEBUG
|
|
System.out.print("Command: "); // DEBUG
|
|
System.out.print(command); // DEBUG
|
|
System.out.print(", arguments: "); // DEBUG
|
|
System.out.println(paramString(params)); // DEBUG
|
|
|
|
nsID kISampleIID =
|
|
new nsID("57ecad90-ae1a-11d1-b66c-00805f8a2676");
|
|
|
|
if (cmdOffset >= 0) {
|
|
XPComUtilities.InvokeMethodByIndex(kISampleIID,
|
|
sample,
|
|
cmdOffset,
|
|
params);
|
|
}
|
|
else if (useXPCMethod) {
|
|
XPCMethod method = new XPCMethod(kISampleIID, command);
|
|
|
|
method.invoke(sample, params);
|
|
}
|
|
else {
|
|
Method[] methods = sample.getClass().getMethods();
|
|
|
|
for (int i = 0; i < methods.length; i++) {
|
|
if (methods[i].getName().equals(command)) {
|
|
Object retval =
|
|
methods[i].invoke(sample, params);
|
|
System.out.print("Retval: "); // DEBUG
|
|
System.out.println(retval); // DEBUG
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get "out" parameters and return value
|
|
System.out.print("Results: "); // DEBUG
|
|
System.out.println(paramString(params)); // DEBUG
|
|
|
|
}
|
|
catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
static String paramString(Object[] params) {
|
|
StringBuffer buf = new StringBuffer();
|
|
buf.append('[');
|
|
for (int i = 0; i < params.length; i++) {
|
|
if (i != 0) {
|
|
buf.append(", ");
|
|
}
|
|
buf.append(params[i]);
|
|
}
|
|
buf.append(']');
|
|
return buf.toString();
|
|
}
|
|
|
|
static Object[] paramArray(String[] argv) throws NumberFormatException {
|
|
return paramArray(argv, 0);
|
|
}
|
|
|
|
static Object[] paramArray(String[] argv, int argi)
|
|
throws NumberFormatException {
|
|
Vector vector = new Vector(argv.length - argi);
|
|
|
|
while (argi < argv.length) {
|
|
String opt = argv[argi];
|
|
if (opt.charAt(0) != '-') {
|
|
vector.addElement(opt);
|
|
}
|
|
else {
|
|
switch (opt.charAt(1)) {
|
|
case 'c':
|
|
argi++;
|
|
vector.addElement(new Character(argv[argi].charAt(0)));
|
|
break;
|
|
case 'b':
|
|
argi++;
|
|
vector.addElement(Byte.valueOf(argv[argi]));
|
|
break;
|
|
case 's':
|
|
argi++;
|
|
vector.addElement(Short.valueOf(argv[argi]));
|
|
break;
|
|
case 'i':
|
|
argi++;
|
|
vector.addElement(Integer.valueOf(argv[argi]));
|
|
break;
|
|
case 'j':
|
|
case 'l':
|
|
argi++;
|
|
vector.addElement(Long.valueOf(argv[argi]));
|
|
break;
|
|
case 'f':
|
|
argi++;
|
|
vector.addElement(Float.valueOf(argv[argi]));
|
|
break;
|
|
case 'd':
|
|
argi++;
|
|
vector.addElement(Double.valueOf(argv[argi]));
|
|
break;
|
|
case 'r':
|
|
case '0':
|
|
vector.addElement(null);
|
|
break;
|
|
case '@':
|
|
argi++;
|
|
vector.addElement(new nsID(argv[argi]));
|
|
break;
|
|
case 'z':
|
|
argi++;
|
|
vector.addElement(Boolean.valueOf(argv[argi]));
|
|
break;
|
|
}
|
|
}
|
|
argi++;
|
|
}
|
|
|
|
Object[] result = new Object[vector.size()];
|
|
for (int i = 0; i < result.length; i++) {
|
|
result[i] = vector.elementAt(i);
|
|
}
|
|
return result;
|
|
}
|
|
}
|