/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.opc.da.dcom; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; import org.jinterop.dcom.common.JIException; import org.jinterop.dcom.core.IJIComObject; import org.jinterop.dcom.core.JIArray; import org.jinterop.dcom.core.JICallBuilder; import org.jinterop.dcom.core.JIComObjectImplWrapper; import org.jinterop.dcom.core.JIFlags; import org.jinterop.dcom.core.JIPointer; import org.jinterop.dcom.core.JIVariant; import org.jinterop.dcom.impls.JIObjectFactory; /** * * @author pk */ public class IOPCAsyncIO2 extends JIComObjectImplWrapper { public final static String IID_IOPCAsyncIO2 = "39c13a71-011e-11d0-9675-0020afd8adb3"; private Map<OPCDataListener, String> dataHandlers = new HashMap<>(); public IOPCAsyncIO2(IJIComObject comObject) { super(comObject); } public ReadResult read(Integer[] serverHandles, int transactionId) throws JIException //TODO retval { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(0); callObject.addInParamAsInt(serverHandles.length, JIFlags.FLAG_NULL); callObject.addInParamAsArray(new JIArray(serverHandles, true), JIFlags.FLAG_NULL); callObject.addInParamAsInt(transactionId, JIFlags.FLAG_NULL); callObject.addOutParamAsType(Integer.class, JIFlags.FLAG_NULL); callObject.addOutParamAsObject(new JIPointer(new JIArray(Integer.class, null, 1, true)), JIFlags.FLAG_NULL); Object[] result = comObject.call(callObject); Integer cancelId = (Integer) result[0]; Integer[] errors = (Integer[]) ((JIArray) ((JIPointer) result[1]).getReferent()).getArrayInstance(); Map<Integer, Integer> errorCodes = new HashMap<>(); for (int i = 0; i < serverHandles.length; i++) { errorCodes.put(serverHandles[i], errors[i]); } return new ReadResult(cancelId, errorCodes); } public ReadResult read(int[] serverHandles, int transactionId) throws JIException //TODO retval { Integer[] handles = new Integer[serverHandles.length]; for (int i = 0; i < serverHandles.length; i++) { handles[i] = serverHandles[i]; } return read(handles, transactionId); } public ReadResult write(Integer[] serverHandles, JIVariant[] values, int transactionId) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(1); callObject.addInParamAsInt(serverHandles.length, JIFlags.FLAG_NULL); callObject.addInParamAsArray(new JIArray(serverHandles, true), JIFlags.FLAG_NULL); callObject.addInParamAsArray(new JIArray(values, true), JIFlags.FLAG_NULL); callObject.addInParamAsInt(transactionId, JIFlags.FLAG_NULL); callObject.addOutParamAsType(Integer.class, JIFlags.FLAG_NULL); callObject.addOutParamAsObject(new JIPointer(new JIArray(Integer.class, null, 1, true)), JIFlags.FLAG_NULL); Object[] result; try { result = comObject.call(callObject); } catch (JIException ex) { if (ex.getErrorCode() == 1 /*S_FALSE*/) { result = callObject.getResultsInCaseOfException(); } else { throw ex; } } Integer cancelId = (Integer) result[0]; Integer[] errors = (Integer[]) ((JIArray) ((JIPointer) result[1]).getReferent()).getArrayInstance(); Map<Integer, Integer> errorCodes = new HashMap<>(); for (int i = 0; i < serverHandles.length; i++) { errorCodes.put(serverHandles[i], errors[i]); } return new ReadResult(cancelId, errorCodes); } public ReadResult write(int[] serverHandles, JIVariant[] values, int transactionId) throws JIException { Integer[] handles = new Integer[serverHandles.length]; for (int i = 0; i < serverHandles.length; i++) { handles[i] = serverHandles[i]; } return write(handles, values, transactionId); } public int refresh2(short datasource, int transactionId) throws JIException { Logger.getLogger(IOPCAsyncIO2.class.getName()).finest("refresh2()"); JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(2); callObject.addInParamAsShort(datasource, JIFlags.FLAG_NULL); callObject.addInParamAsInt(transactionId, JIFlags.FLAG_NULL); callObject.addOutParamAsType(Integer.class, JIFlags.FLAG_NULL); Object[] result = comObject.call(callObject); return (Integer) result[0]; } public void cancel2(int cancelId) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(3); callObject.addInParamAsInt(cancelId, JIFlags.FLAG_NULL); comObject.call(callObject); } public void setEnable(boolean enable) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(4); callObject.addInParamAsBoolean(enable, JIFlags.FLAG_NULL); comObject.call(callObject); } public boolean getEnable() throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(5); callObject.addOutParamAsType(Boolean.class, JIFlags.FLAG_NULL); Object[] result = comObject.call(callObject); return (Boolean) result[0]; } public static class ReadResult { private final Integer cancelId; private final Map<Integer, Integer> errorCodes; private ReadResult(Integer aCancelId, Map<Integer, Integer> aErrorCodes) { cancelId = aCancelId; errorCodes = aErrorCodes; } public Integer getCancelId() { return cancelId; } public Map<Integer, Integer> getErrorCodes() { return errorCodes; } } public void addDataListener(OPCDataListener listener) throws JIException { if (!dataHandlers.containsKey(listener)) { OPCDataCallbackImpl dataCallbackImpl = new OPCDataCallbackImpl(listener); String cookie = JIObjectFactory.attachEventHandler(comObject, OPCDataCallbackImpl.IID_IOPCDataCallback, JIObjectFactory.buildObject(comObject.getAssociatedSession(), dataCallbackImpl.getLocalClass())); dataHandlers.put(listener, cookie); } } public void removeDataListener(OPCDataListener listener) throws JIException { if (dataHandlers.containsKey(listener)) { JIObjectFactory.detachEventHandler(comObject, dataHandlers.get(listener)); } } }