Package com.jacob.activeX

Source Code of com.jacob.activeX.ActiveXComponent

/*
* Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com).
* Get more information about JACOB at http://sourceforge.net/projects/jacob-project
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
package com.jacob.activeX;

import com.jacob.com.Dispatch;
import com.jacob.com.JacobObject;
import com.jacob.com.Variant;

/**
* This class provides a higher level, more object like, wrapper for top of the
* Dispatch object. The Dispatch class's method essentially directly map to
* Microsoft C API including the first parameter that is almost always the
* target of the message. ActiveXComponent assumes the target of every message
* is the MS COM object behind the ActiveXComponent. This removes the need to
* pass the Dispatch object into every method.
* <p>
* It is really up to the developer as to whether they want to use the Dispatch
* interface or the ActiveXComponent interface.
* <p>
* This class simulates com.ms.activeX.ActiveXComponent only in the sense that
* it is used for creating Dispatch objects
*/
public class ActiveXComponent extends Dispatch {

  /**
   * Normally used to create a new connection to a microsoft application. The
   * passed in parameter is the name of the program as registered in the
   * registry. It can also be the object name.
   * <p>
   * This constructor causes a new Windows object of the requested type to be
   * created. The windows CoCreate() function gets called to create the
   * underlying windows object.
   *
   * <pre>
   * new ActiveXComponent(&quot;ScriptControl&quot;);
   * </pre>
   *
   * @param programId
   */
  public ActiveXComponent(String programId) {
    super(programId);
  }

  /**
   * Creates an active X component that is built on top of the COM pointers
   * held in the passed in dispatch. This widens the Dispatch object to pick
   * up the ActiveXComponent API
   *
   * @param dispatchToBeWrapped
   */
  public ActiveXComponent(Dispatch dispatchToBeWrapped) {
    super(dispatchToBeWrapped);
  }

  /**
   * only used by the factories
   *
   */
  private ActiveXComponent() {
    super();
  }

  /**
   * Probably was a cover for something else in the past. Should be
   * deprecated.
   *
   * @return Now it actually returns this exact same object.
   */
  public Dispatch getObject() {
    return this;
  }

  /**
   * Most code should use the standard ActiveXComponent(String) contructor and
   * not this factory method. This method exists for applications that need
   * special behavior. <B>Experimental in release 1.9.2.</B>
   * <p>
   * Factory that returns a Dispatch object wrapped around the result of a
   * CoCreate() call. This differs from the standard constructor in that it
   * throws no exceptions and returns null on failure.
   * <p>
   * This will fail for any prog id with a ":" in it.
   *
   * @param pRequestedProgramId
   * @return Dispatch pointer to the COM object or null if couldn't create
   */
  public static ActiveXComponent createNewInstance(String pRequestedProgramId) {
    ActiveXComponent mCreatedDispatch = null;
    try {
      mCreatedDispatch = new ActiveXComponent();
      mCreatedDispatch.coCreateInstance(pRequestedProgramId);
    } catch (Exception e) {
      mCreatedDispatch = null;
      if (JacobObject.isDebugEnabled()) {
        JacobObject.debug("Unable to co-create instance of "
            + pRequestedProgramId);
      }
    }
    return mCreatedDispatch;
  }

  /**
   * Most code should use the standard ActiveXComponent(String) constructor and
   * not this factory method. This method exists for applications that need
   * special behavior. <B>Experimental in release 1.9.2.</B>
   * <p>
   * Factory that returns a Dispatch wrapped around the result of a
   * getActiveObject() call. This differs from the standard constructor in
   * that it throws no exceptions and returns null on failure.
   * <p>
   * This will fail for any prog id with a ":" in it
   *
   * @param pRequestedProgramId
   * @return Dispatch pointer to a COM object or null if wasn't already
   *         running
   */
  public static ActiveXComponent connectToActiveInstance(
      String pRequestedProgramId) {
    ActiveXComponent mCreatedDispatch = null;
    try {
      mCreatedDispatch = new ActiveXComponent();
      mCreatedDispatch.getActiveInstance(pRequestedProgramId);
    } catch (Exception e) {
      mCreatedDispatch = null;
      if (JacobObject.isDebugEnabled()) {
        JacobObject.debug("Unable to attach to running instance of "
            + pRequestedProgramId);
      }
    }
    return mCreatedDispatch;
  }

  /**
   * @see com.jacob.com.Dispatch#finalize()
   */
  protected void finalize() {
    super.finalize();
  }

  /*
   * ============================================================
   *
   * start of instance based calls to the COM layer
   * ===========================================================
   */

  /**
   * retrieves a property and returns it as a Variant
   *
   * @param propertyName
   * @return variant value of property
   */
  public Variant getProperty(String propertyName) {
    return Dispatch.get(this, propertyName);
  }

  /**
   * retrieves a property and returns it as an ActiveX component
   *
   * @param propertyName
   * @return Dispatch representing the object under the property name
   */
  public ActiveXComponent getPropertyAsComponent(String propertyName) {
    return new ActiveXComponent(Dispatch.get(this, propertyName)
        .toDispatch());

  }

  /**
   * retrieves a property and returns it as a Boolean
   *
   * @param propertyName
   *            property we are looking up
   * @return boolean value of property
   */
  public boolean getPropertyAsBoolean(String propertyName) {
    return Dispatch.get(this, propertyName).getBoolean();
  }

  /**
   * retrieves a property and returns it as a byte
   *
   * @param propertyName
   *            property we are looking up
   * @return byte value of property
   */
  public byte getPropertyAsByte(String propertyName) {
    return Dispatch.get(this, propertyName).getByte();
  }

  /**
   * retrieves a property and returns it as a String
   *
   * @param propertyName
   * @return String value of property
   */
  public String getPropertyAsString(String propertyName) {
    return Dispatch.get(this, propertyName).getString();

  }

  /**
   * retrieves a property and returns it as a int
   *
   * @param propertyName
   * @return the property value as an int
   */
  public int getPropertyAsInt(String propertyName) {
    return Dispatch.get(this, propertyName).getInt();
  }

  /**
   * sets a property on this object
   *
   * @param propertyName
   *            property name
   * @param arg
   *            variant value to be set
   */
  public void setProperty(String propertyName, Variant arg) {
    Dispatch.put(this, propertyName, arg);
  }

  /**
   * sets a property on this object
   *
   * @param propertyName
   *            property name
   * @param arg
   *            variant value to be set
   */
  public void setProperty(String propertyName, Dispatch arg) {
    Dispatch.put(this, propertyName, arg);
  }

  /**
   * sets a property to be the value of the string
   *
   * @param propertyName
   * @param propertyValue
   */
  public void setProperty(String propertyName, String propertyValue) {
    this.setProperty(propertyName, new Variant(propertyValue));
  }

  /**
   * sets a property as a boolean value
   *
   * @param propertyName
   * @param propValue
   *            the boolean value we want the prop set to
   */
  public void setProperty(String propertyName, boolean propValue) {
    this.setProperty(propertyName, new Variant(propValue));
  }

  /**
   * sets a property as a boolean value
   *
   * @param propertyName
   * @param propValue
   *            the boolean value we want the prop set to
   */
  public void setProperty(String propertyName, byte propValue) {
    this.setProperty(propertyName, new Variant(propValue));
  }

  /**
   * sets the property as an int value
   *
   * @param propertyName
   * @param propValue
   *            the int value we want the prop to be set to.
   */
  public void setProperty(String propertyName, int propValue) {
    this.setProperty(propertyName, new Variant(propValue));
  }

  /*-------------------------------------------------------
   * Listener logging helpers
   *-------------------------------------------------------
   */

  /**
   * This boolean determines if callback events should be logged
   */
  public static boolean shouldLogEvents = false;

  /**
   * used by the doc and application listeners to get intelligent logging
   *
   * @param description
   *            event description
   * @param args
   *            args passed in (variants)
   *
   */
  public void logCallbackEvent(String description, Variant[] args) {
    String argString = "";
    if (args != null && ActiveXComponent.shouldLogEvents) {
      if (args.length > 0) {
        argString += " args: ";
      }
      for (int i = 0; i < args.length; i++) {
        short argType = args[i].getvt();
        argString += ",[" + i + "]";
        // break out the byref bits if they are on this
        if ((argType & Variant.VariantByref) == Variant.VariantByref) {
          // show the type and the fact that its byref
          argString += "("
              + (args[i].getvt() & ~Variant.VariantByref) + "/"
              + Variant.VariantByref + ")";
        } else {
          // show the type
          argString += "(" + argType + ")";
        }
        argString += "=";
        if (argType == Variant.VariantDispatch) {
          Dispatch foo = (args[i].getDispatch());
          argString += foo;
        } else if ((argType & Variant.VariantBoolean) == Variant.VariantBoolean) {
          // do the boolean thing
          if ((argType & Variant.VariantByref) == Variant.VariantByref) {
            // boolean by ref
            argString += args[i].getBooleanRef();
          } else {
            // boolean by value
            argString += args[i].getBoolean();
          }
        } else if ((argType & Variant.VariantString) == Variant.VariantString) {
          // do the string thing
          if ((argType & Variant.VariantByref) == Variant.VariantByref) {
            // string by ref
            argString += args[i].getStringRef();
          } else {
            // string by value
            argString += args[i].getString();
          }
        } else {
          argString += args[i].toString();
        }
      }
      System.out.println(description + argString);
    }
  }

  /*
   * ==============================================================
   *
   * covers for dispatch call methods
   * =============================================================
   */

  /**
   * makes a dispatch call for the passed in action and no parameter
   *
   * @param callAction
   * @return ActiveXComponent representing the results of the call
   */
  public ActiveXComponent invokeGetComponent(String callAction) {
    return new ActiveXComponent(invoke(callAction).toDispatch());
  }

  /**
   * makes a dispatch call for the passed in action and single parameter
   *
   * @param callAction
   * @param parameter
   * @return ActiveXComponent representing the results of the call
   */
  public ActiveXComponent invokeGetComponent(String callAction,
      Variant parameter) {
    return new ActiveXComponent(invoke(callAction, parameter).toDispatch());
  }

  /**
   * makes a dispatch call for the passed in action and single parameter
   *
   * @param callAction
   * @param parameter1
   * @param parameter2
   * @return ActiveXComponent representing the results of the call
   */
  public ActiveXComponent invokeGetComponent(String callAction,
      Variant parameter1, Variant parameter2) {
    return new ActiveXComponent(invoke(callAction, parameter1, parameter2)
        .toDispatch());
  }

  /**
   * makes a dispatch call for the passed in action and single parameter
   *
   * @param callAction
   * @param parameter1
   * @param parameter2
   * @param parameter3
   * @return ActiveXComponent representing the results of the call
   */
  public ActiveXComponent invokeGetComponent(String callAction,
      Variant parameter1, Variant parameter2, Variant parameter3) {
    return new ActiveXComponent(invoke(callAction, parameter1, parameter2,
        parameter3).toDispatch());
  }

  /**
   * makes a dispatch call for the passed in action and single parameter
   *
   * @param callAction
   * @param parameter1
   * @param parameter2
   * @param parameter3
   * @param parameter4
   * @return ActiveXComponent representing the results of the call
   */
  public ActiveXComponent invokeGetComponent(String callAction,
      Variant parameter1, Variant parameter2, Variant parameter3,
      Variant parameter4) {
    return new ActiveXComponent(invoke(callAction, parameter1, parameter2,
        parameter3, parameter4).toDispatch());
  }

  /**
   * invokes a single parameter call on this dispatch that returns no value
   *
   * @param actionCommand
   * @param parameter
   * @return a Variant but that may be null for some calls
   */
  public Variant invoke(String actionCommand, String parameter) {
    return Dispatch.call(this, actionCommand, parameter);
  }

  /**
   * makes a dispatch call to the passed in action with a single boolean
   * parameter
   *
   * @param actionCommand
   * @param parameter
   * @return Variant result
   */
  public Variant invoke(String actionCommand, boolean parameter) {
    return Dispatch.call(this, actionCommand, new Variant(parameter));
  }

  /**
   * makes a dispatch call to the passed in action with a single int parameter
   *
   * @param actionCommand
   * @param parameter
   * @return Variant result of the invoke (Dispatch.call)
   */
  public Variant invoke(String actionCommand, int parameter) {
    return Dispatch.call(this, actionCommand, new Variant(parameter));
  }

  /**
   * makes a dispatch call to the passed in action with a string and integer
   * parameter (this was put in for some application)
   *
   * @param actionCommand
   * @param parameter1
   * @param parameter2
   * @return Variant result
   */
  public Variant invoke(String actionCommand, String parameter1,
      int parameter2) {
    return Dispatch.call(this, actionCommand, parameter1, new Variant(
        parameter2));
  }

  /**
   * makes a dispatch call to the passed in action with two integer parameters
   * (this was put in for some application)
   *
   * @param actionCommand
   * @param parameter1
   * @param parameter2
   * @return a Variant but that may be null for some calls
   */
  public Variant invoke(String actionCommand, int parameter1, int parameter2) {
    return Dispatch.call(this, actionCommand, new Variant(parameter1),
        new Variant(parameter2));
  }

  /**
   * makes a dispatch call for the passed in action and single parameter
   *
   * @param callAction
   * @param parameter
   * @return a Variant but that may be null for some calls
   */
  public Variant invoke(String callAction, Variant parameter) {
    return Dispatch.call(this, callAction, parameter);
  }

  /**
   * makes a dispatch call for the passed in action and two parameter
   *
   * @param callAction
   * @param parameter1
   * @param parameter2
   * @return a Variant but that may be null for some calls
   */
  public Variant invoke(String callAction, Variant parameter1,
      Variant parameter2) {
    return Dispatch.call(this, callAction, parameter1, parameter2);
  }

  /**
   * makes a dispatch call for the passed in action and two parameter
   *
   * @param callAction
   * @param parameter1
   * @param parameter2
   * @param parameter3
   * @return Variant result data
   */
  public Variant invoke(String callAction, Variant parameter1,
      Variant parameter2, Variant parameter3) {
    return Dispatch.call(this, callAction, parameter1, parameter2,
        parameter3);
  }

  /**
   * calls call() with 4 variant parameters
   *
   * @param callAction
   * @param parameter1
   * @param parameter2
   * @param parameter3
   * @param parameter4
   * @return Variant result data
   */
  public Variant invoke(String callAction, Variant parameter1,
      Variant parameter2, Variant parameter3, Variant parameter4) {
    return Dispatch.call(this, callAction, parameter1, parameter2,
        parameter3, parameter4);
  }

  /**
   * makes a dispatch call for the passed in action and no parameter
   *
   * @param callAction
   * @return a Variant but that may be null for some calls
   */
  public Variant invoke(String callAction) {
    return Dispatch.call(this, callAction);
  }

  /**
   * This is really a cover for call(String,Variant[]) that should be
   * eliminated call with a variable number of args mainly used for quit.
   *
   * @param name
   * @param args
   * @return Variant returned by the invoke (Dispatch.callN)
   */
  public Variant invoke(String name, Variant[] args) {
    return Dispatch.callN(this, name, args);
  }

}
TOP

Related Classes of com.jacob.activeX.ActiveXComponent

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.