/* * 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 org.jinterop.dcom.common.JIException; import org.jinterop.dcom.core.IJIComObject; 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.JIString; import org.jinterop.dcom.core.JIStruct; import org.jinterop.dcom.impls.JIObjectFactory; /** * * @author pk */ public class IOPCServer extends JIComObjectImplWrapper { public static final String IID_IOPCServer = "39c13a4d-011e-11d0-9675-0020afd8adb3"; private static final int METHOD_INDEX_IOPCServer_AddGroup = 0; private static final int METHOD_INDEX_IOPCServer_GetErrorString = 1; private static final int METHOD_INDEX_IOPCServer_GetGroupByName = 2; private static final int METHOD_INDEX_IOPCServer_GetStatus = 3; private static final int METHOD_INDEX_IOPCServer_RemoveGroup = 4; private static final int METHOD_INDEX_IOPCServer_CreateGroupEnumerator = 5; private Map<OPCShutdownListener, String> shutdownHandlers = new HashMap<>(); public IOPCServer(IJIComObject server) throws JIException { super(server.queryInterface(IID_IOPCServer)); // The interface will become comObject. } public static class AddGroupResult { private int serverGroup; private int revisedUpdateRate; private IJIComObject iface; public AddGroupResult(int serverGroup, int revisedUpdateRate, IJIComObject iface) { this.serverGroup = serverGroup; this.revisedUpdateRate = revisedUpdateRate; this.iface = iface; } /** * @return the serverGroup */ public int getServerGroup() { return serverGroup; } /** * @return the revisedUpdateRate */ public int getRevisedUpdateRate() { return revisedUpdateRate; } /** * @return the iface */ public IJIComObject getIface() { return iface; } } public AddGroupResult addGroup(String name, boolean active, int requestedUpdateRate, int clientGroup, Integer timeBias, Float percentDeadband, int lcid, String iid) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(METHOD_INDEX_IOPCServer_AddGroup); callObject.addInParamAsString(name, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR); callObject.addInParamAsBoolean(active, JIFlags.FLAG_NULL); callObject.addInParamAsInt(requestedUpdateRate, JIFlags.FLAG_REPRESENTATION_UNSIGNED_INT); callObject.addInParamAsInt(clientGroup, JIFlags.FLAG_NULL); callObject.addInParamAsPointer(new JIPointer(timeBias != null ? timeBias : new Integer(0)), JIFlags.FLAG_NULL); callObject.addInParamAsPointer(new JIPointer(percentDeadband != null ? percentDeadband : new Float(0.0)), JIFlags.FLAG_NULL); callObject.addInParamAsInt(lcid, JIFlags.FLAG_REPRESENTATION_UNSIGNED_INT); callObject.addOutParamAsType(Integer.class, JIFlags.FLAG_NULL); //out param phServerGroup callObject.addOutParamAsType(Integer.class, JIFlags.FLAG_NULL); //out param pRevisedUpdateRate callObject.addInParamAsUUID(iid, JIFlags.FLAG_NULL); callObject.addOutParamAsType(IJIComObject.class, JIFlags.FLAG_NULL); // out param ppUnk Object[] result = comObject.call(callObject); if (callObject.isError()) throw new JIException(callObject.getHRESULT()); return new AddGroupResult( (Integer) result[0], (Integer) result[1], JIObjectFactory.narrowObject((IJIComObject) result[2])); } public String getErrorString(long errorCode, int locale) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(METHOD_INDEX_IOPCServer_GetErrorString); callObject.addInParamAsInt((int) errorCode, JIFlags.FLAG_NULL); callObject.addInParamAsInt(locale, JIFlags.FLAG_NULL); callObject.addOutParamAsObject(new JIPointer(new JIString(JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR)), JIFlags.FLAG_NULL); // out param ppString Object[] result = comObject.call(callObject); if (callObject.isError()) throw new JIException(callObject.getHRESULT()); return ((JIString) ((JIPointer) result[0]).getReferent()).getString(); } public IJIComObject getGroupByName(String name, String iid) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(METHOD_INDEX_IOPCServer_GetGroupByName); callObject.addInParamAsString(name, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR); callObject.addInParamAsUUID(iid, JIFlags.FLAG_NULL); callObject.addOutParamAsType(IJIComObject.class, JIFlags.FLAG_NULL); // out param ppUnk Object[] result = comObject.call(callObject); if (callObject.isError()) throw new JIException(callObject.getHRESULT()); return JIObjectFactory.narrowObject((IJIComObject) result[0]); } public OPCSERVERSTATUS getStatus() throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(METHOD_INDEX_IOPCServer_GetStatus); callObject.addOutParamAsObject(new JIPointer(OPCSERVERSTATUS.getEmptyStruct()), JIFlags.FLAG_NULL); // out param ppServerStatus Object[] result = comObject.call(callObject); if (callObject.isError()) throw new JIException(callObject.getHRESULT()); return new OPCSERVERSTATUS((JIStruct) ((JIPointer) result[0]).getReferent()); } public void removeGroup(int groupHandle, boolean force) throws JIException { JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(METHOD_INDEX_IOPCServer_RemoveGroup); callObject.addInParamAsInt(groupHandle, JIFlags.FLAG_REPRESENTATION_UNSIGNED_INT); callObject.addInParamAsBoolean(force, JIFlags.FLAG_NULL); Object[] result = comObject.call(callObject); if (callObject.isError()) throw new JIException(callObject.getHRESULT()); } public IJIComObject createGroupEnumerator(short scope, String iid) throws JIException { assert iid != null : "IID may not be null"; JICallBuilder callObject = new JICallBuilder(true); callObject.setOpnum(METHOD_INDEX_IOPCServer_CreateGroupEnumerator); callObject.addInParamAsShort(scope, JIFlags.FLAG_REPRESENTATION_UNSIGNED_INT); callObject.addInParamAsUUID(iid, JIFlags.FLAG_NULL); callObject.addOutParamAsType(IJIComObject.class, JIFlags.FLAG_NULL); // out param ppUnk try { Object[] result = comObject.call(callObject); return JIObjectFactory.narrowObject((IJIComObject) result[0]); } catch (JIException ex) { if (ex.getErrorCode() == 1/*S_FALSE*/) return JIObjectFactory.narrowObject((IJIComObject) callObject.getResultsInCaseOfException()[0]); else throw ex; } } public void addShutdownListener(OPCShutdownListener listener) throws JIException { if (!shutdownHandlers.containsKey(listener)) { OPCShutdownImpl shutdownImpl = new OPCShutdownImpl(listener); String cookie = JIObjectFactory.attachEventHandler(comObject, OPCShutdownImpl.IID_IOPCShutdown, JIObjectFactory.buildObject(comObject.getAssociatedSession(), shutdownImpl.getLocalClass())); shutdownHandlers.put(listener, cookie); } } public void removeShutdownListener(OPCShutdownListener listener) throws JIException { if (shutdownHandlers.containsKey(listener)) JIObjectFactory.detachEventHandler(comObject, shutdownHandlers.get(listener)); } }