Add the Utgard resources

This commit is contained in:
luoyan35714
2014-12-10 17:42:02 +08:00
parent fd77b8e66e
commit 6d72a9b91e
137 changed files with 11245 additions and 230 deletions
@@ -0,0 +1,32 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
public interface Categories
{
public static final String OPCDAServer10 = "63D5F430-CFE4-11d1-B2C8-0060083BA1FB";
public static final String OPCDAServer20 = "63D5F432-CFE4-11d1-B2C8-0060083BA1FB";
public static final String OPCDAServer30 = "CC603642-66D7-48f1-B69A-B625E73652D7";
public static final String XMLDAServer10 = "3098EDA4-A006-48b2-A27F-247453959408";
}
@@ -0,0 +1,37 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
public interface Constants
{
public static final String IConnectionPointContainer_IID = "B196B284-BAB4-101A-B69C-00AA00341D07";
public static final String IConnectionPoint_IID = "B196B286-BAB4-101A-B69C-00AA00341D07";
public static final String IOPCCommon_IID = "F31DFDE2-07B6-11D2-B2D8-0060083BA1FB";
public static final String IEnumString_IID = "00000101-0000-0000-C000-000000000046";
public static final String IEnumGUID_IID = "0002E000-0000-0000-C000-000000000046";
public static final int S_OK = 0;
public static final int S_FALSE = 1;
}
@@ -0,0 +1,32 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
public interface EventHandler
{
public String getIdentifier ();
public IJIComObject getObject ();
public void detach () throws JIException;
}
@@ -0,0 +1,174 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
import java.math.BigDecimal;
import java.util.Calendar;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIStruct;
public class FILETIME
{
private int high = 0;
private int low = 0;
public FILETIME ()
{
}
public FILETIME ( final FILETIME arg0 )
{
this.high = arg0.high;
this.low = arg0.low;
}
public FILETIME ( final int high, final int low )
{
this.high = high;
this.low = low;
}
public int getHigh ()
{
return this.high;
}
public void setHigh ( final int high )
{
this.high = high;
}
public int getLow ()
{
return this.low;
}
public void setLow ( final int low )
{
this.low = low;
}
@Override
public int hashCode ()
{
final int PRIME = 31;
int result = 1;
result = PRIME * result + this.high;
result = PRIME * result + this.low;
return result;
}
@Override
public boolean equals ( final Object obj )
{
if ( this == obj )
{
return true;
}
if ( obj == null )
{
return false;
}
if ( getClass () != obj.getClass () )
{
return false;
}
final FILETIME other = (FILETIME)obj;
if ( this.high != other.high )
{
return false;
}
if ( this.low != other.low )
{
return false;
}
return true;
}
public static JIStruct getStruct () throws JIException
{
final JIStruct struct = new JIStruct ();
struct.addMember ( Integer.class );
struct.addMember ( Integer.class );
return struct;
}
public static FILETIME fromStruct ( final JIStruct struct )
{
final FILETIME ft = new FILETIME ();
ft.setLow ( (Integer)struct.getMember ( 0 ) );
ft.setHigh ( (Integer)struct.getMember ( 1 ) );
return ft;
}
public Calendar asCalendar ()
{
final Calendar c = Calendar.getInstance ();
/*
* The following "strange" stuff is needed since we miss a ulong type
*/
long i = 0xFFFFFFFFL & this.high;
i = i << 32;
long j = 0xFFFFFFFFFFFFFFFFL & i;
i = 0xFFFFFFFFL & this.low;
j += i;
j /= 10000L;
j -= 11644473600000L;
c.setTimeInMillis ( j );
return c;
}
public Calendar asBigDecimalCalendar ()
{
final Calendar c = Calendar.getInstance ();
/*
* The following "strange" stuff is needed since we miss a ulong type
*/
long i = 0xFFFFFFFFL & this.high;
i = i << 32;
BigDecimal d1 = new BigDecimal ( 0xFFFFFFFFFFFFFFFFL & i );
i = 0xFFFFFFFFL & this.low;
d1 = d1.add ( new BigDecimal ( i ) );
d1 = d1.divide ( new BigDecimal ( 10000L ) );
d1 = d1.subtract ( new BigDecimal ( 11644473600000L ) );
c.setTimeInMillis ( d1.longValue () );
return c;
}
@Override
public String toString ()
{
return String.format ( "%s/%s", this.high, this.low );
}
}
@@ -0,0 +1,46 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
public class KeyedResult<K, V> extends Result<V>
{
private K key;
public KeyedResult ()
{
super ();
}
public KeyedResult ( final K key, final V value, final int errorCode )
{
super ( value, errorCode );
this.key = key;
}
public K getKey ()
{
return this.key;
}
public void setKey ( final K key )
{
this.key = key;
}
}
@@ -0,0 +1,37 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2012 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
import java.util.ArrayList;
public class KeyedResultSet<K, V> extends ArrayList<KeyedResult<K, V>>
{
private static final long serialVersionUID = 1L;
public KeyedResultSet ()
{
super ();
}
public KeyedResultSet ( final int size )
{
super ( size ); // me
}
}
@@ -0,0 +1,64 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
public class Result<T>
{
private T value;
private int errorCode;
public Result ()
{
}
public Result ( final T value, final int errorCode )
{
this.value = value;
this.errorCode = errorCode;
}
public int getErrorCode ()
{
return this.errorCode;
}
public void setErrorCode ( final int errorCode )
{
this.errorCode = errorCode;
}
public T getValue ()
{
return this.value;
}
public void setValue ( final T value )
{
this.value = value;
}
public boolean isFailed ()
{
return this.errorCode != 0;
}
}
@@ -0,0 +1,38 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common;
import java.util.ArrayList;
public class ResultSet<T> extends ArrayList<Result<T>>
{
private static final long serialVersionUID = 6392417310208978252L;
public ResultSet ()
{
super ();
}
public ResultSet ( final int size )
{
super ( size ); // me
}
}
@@ -0,0 +1,45 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common.impl;
import org.jinterop.dcom.core.IJIComObject;
public class BaseCOMObject
{
private IJIComObject comObject = null;
/**
* Create a new base COM object
*
* @param comObject
* The COM object to wrap but be addRef'ed
*/
public BaseCOMObject ( final IJIComObject comObject )
{
this.comObject = comObject;
}
protected synchronized IJIComObject getCOMObject ()
{
return this.comObject;
}
}
@@ -0,0 +1,134 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common.impl;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
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.JIFlags;
import rpc.core.UUID;
public class EnumGUID extends BaseCOMObject
{
public static final int DEFAULT_BATCH_SIZE = Integer.getInteger ( "openscada.dcom.enum-batch-size", 10 );
public EnumGUID ( final IJIComObject enumStringObject ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( enumStringObject.queryInterface ( org.openscada.opc.dcom.common.Constants.IEnumGUID_IID ) );
}
public int next ( final List<UUID> list, final int num ) throws JIException
{
if ( num <= 0 )
{
return 0;
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addInParamAsInt ( num, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( num, JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIArray ( UUID.class, null, 1, true, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
UUID[] resultData = (UUID[]) ( (JIArray)result[0] ).getArrayInstance ();
Integer cnt = (Integer)result[1];
for ( int i = 0; i < cnt; i++ )
{
list.add ( resultData[i] );
}
return cnt;
}
public Collection<UUID> next ( final int num ) throws JIException
{
List<UUID> list = new ArrayList<UUID> ( num );
next ( list, num );
return list;
}
public void skip ( final int num ) throws JIException
{
if ( num <= 0 )
{
return;
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsInt ( num, JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
public void reset () throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
getCOMObject ().call ( callObject );
}
public EnumGUID cloneObject () throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
IJIComObject object = (IJIComObject)result[0];
return new EnumGUID ( object );
}
public Collection<UUID> asCollection ( final int batchSize ) throws JIException
{
reset ();
List<UUID> data = new ArrayList<UUID> ();
int i = 0;
do
{
i = next ( data, batchSize );
} while ( i == batchSize );
return data;
}
public Collection<UUID> asCollection () throws JIException
{
return asCollection ( DEFAULT_BATCH_SIZE );
}
}
@@ -0,0 +1,136 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common.impl;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
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.JIFlags;
import org.jinterop.dcom.core.JIString;
public class EnumString extends BaseCOMObject
{
public static final int DEFAULT_BATCH_SIZE = Integer.getInteger ( "openscada.dcom.enum-batch-size", 10 );
public EnumString ( final IJIComObject enumStringObject ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( enumStringObject.queryInterface ( org.openscada.opc.dcom.common.Constants.IEnumString_IID ) );
}
public int next ( final List<String> list, final int num ) throws JIException
{
if ( num <= 0 )
{
return 0;
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addInParamAsInt ( num, JIFlags.FLAG_NULL );
//callObject.addInParamAsInt ( num, JIFlags.FLAG_NULL );
//callObject.addOutParamAsObject ( new JIArray ( new JIPointer ( new JIString (
// JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), null, 1, true, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIArray ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ), null, 1, true, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
//JIPointer[] resultData = (JIPointer[]) ( (JIArray) ( result[0] ) ).getArrayInstance ();
JIString[] resultData = (JIString[]) ( (JIArray)result[0] ).getArrayInstance ();
Integer cnt = (Integer)result[1];
for ( int i = 0; i < cnt; i++ )
{
//list.add ( ( (JIString)resultData[i].getReferent () ).getString () );
list.add ( resultData[i].getString () );
}
return cnt;
}
public Collection<String> next ( final int num ) throws JIException
{
List<String> list = new ArrayList<String> ( num );
next ( list, num );
return list;
}
public void skip ( final int num ) throws JIException
{
if ( num <= 0 )
{
return;
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsInt ( num, JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
public void reset () throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
getCOMObject ().call ( callObject );
}
public EnumString cloneObject () throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
IJIComObject object = (IJIComObject)result[0];
return new EnumString ( object );
}
public Collection<String> asCollection ( final int batchSize ) throws JIException
{
reset ();
List<String> data = new ArrayList<String> ();
int i = 0;
do
{
i = next ( data, batchSize );
} while ( i == batchSize );
return data;
}
public Collection<String> asCollection () throws JIException
{
return asCollection ( DEFAULT_BATCH_SIZE );
}
}
@@ -0,0 +1,65 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common.impl;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JIFrameworkHelper;
import org.openscada.opc.dcom.common.EventHandler;
public class EventHandlerImpl implements EventHandler
{
private String identifier = null;
private IJIComObject object = null;
public String getIdentifier ()
{
return this.identifier;
}
public synchronized IJIComObject getObject ()
{
return this.object;
}
public synchronized void setInfo ( final IJIComObject object, final String identifier )
{
this.object = object;
this.identifier = identifier;
}
public synchronized void detach () throws JIException
{
if ( this.object != null && this.identifier != null )
{
try
{
JIFrameworkHelper.detachEventHandler ( this.object, this.identifier );
}
finally
{
this.object = null;
this.identifier = null;
}
}
}
}
@@ -0,0 +1,71 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common.impl;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JICallBuilder;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JIVariant;
public class Helper
{
/**
* Make the COM call but do not treat S_FALSE as error condition for the whole call
* @param object the object to make to call on
* @param callObject the call object
* @return the result of the call
* @throws JIException
*/
public static Object[] callRespectSFALSE ( final IJIComObject object, final JICallBuilder callObject ) throws JIException
{
try
{
return object.call ( callObject );
}
catch ( JIException e )
{
if ( e.getErrorCode () != org.openscada.opc.dcom.common.Constants.S_FALSE )
{
throw e;
}
return callObject.getResultsInCaseOfException ();
}
}
/**
* Perform some fixes on the variant when writing it to OPC items. This method
* only changes control information on the variant and not the value itself!
* @param value the value to fix
* @return the fixed value
* @throws JIException In case something goes wrong
*/
public static JIVariant fixVariant ( final JIVariant value ) throws JIException
{
if ( value.isArray () )
{
if ( value.getObjectAsArray ().getArrayInstance () instanceof Boolean[] )
{
value.setFlag ( JIFlags.FLAG_REPRESENTATION_VARIANT_BOOL );
}
}
return value;
}
}
@@ -0,0 +1,101 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.common.impl;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collection;
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.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIString;
public class OPCCommon extends BaseCOMObject
{
public OPCCommon ( final IJIComObject opcObject ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcObject.queryInterface ( org.openscada.opc.dcom.common.Constants.IOPCCommon_IID ) );
}
public void setLocaleID ( final int localeID ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addInParamAsInt ( localeID, JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
public int getLocaleID () throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addOutParamAsObject ( Integer.class, JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
return (Integer)result[0];
}
public String getErrorString ( final int errorCode, final int localeID ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addInParamAsInt ( errorCode, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( localeID, JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
return ( (JIString) ( (JIPointer)result[0] ).getReferent () ).getString ();
}
public void setClientName ( final String clientName ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 4 );
callObject.addInParamAsString ( clientName, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
getCOMObject ().call ( callObject );
}
public Collection<Integer> queryAvailableLocaleIDs () throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
JIArray resultArray = (JIArray) ( (JIPointer)result[1] ).getReferent ();
Integer[] intArray = (Integer[])resultArray.getArrayInstance ();
return Arrays.asList ( intArray );
}
}
@@ -0,0 +1,43 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public interface Constants extends org.openscada.opc.dcom.common.Constants
{
public static final String IOPCServer_IID = "39C13A4D-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCGroupStateMgt_IID = "39C13A50-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCBrowse_IID = "39227004-A18F-4B57-8B0A-5235670F4468";
public static final String IOPCBrowseServerAddressSpace_IID = "39C13A4F-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCItemMgt_IID = "39C13A54-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCItemProperties_IID = "39C13A72-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCItemIO_IID = "85C0B427-2893-4CBC-BD78-E5FC5146F08F";
public static final String IOPCDataCallback_IID = "39C13A70-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCAsyncIO2_IID = "39C13A71-011E-11D0-9675-0020AFD8ADB3";
public static final String IOPCSyncIO_IID = "39C13A52-011E-11D0-9675-0020AFD8ADB3";
}
@@ -0,0 +1,34 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import org.openscada.opc.dcom.common.KeyedResultSet;
import org.openscada.opc.dcom.common.ResultSet;
public interface IOPCDataCallback
{
public void dataChange ( int transactionId, int serverGroupHandle, int masterQuality, int masterErrorCode, KeyedResultSet<Integer, ValueData> result );
public void readComplete ( int transactionId, int serverGroupHandle, int masterQuality, int masterErrorCode, KeyedResultSet<Integer, ValueData> result );
public void writeComplete ( int transactionId, int serverGroupHandle, int masterErrorCode, ResultSet<Integer> result );
public void cancelComplete ( int transactionId, int serverGroupHandle );
}
@@ -0,0 +1,56 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public class IORequest
{
private String itemID;
private int maxAge;
public IORequest ( final String itemID, final int maxAge )
{
this.itemID = itemID;
this.maxAge = maxAge;
}
public String getItemID ()
{
return this.itemID;
}
public void setItemID ( final String itemID )
{
this.itemID = itemID;
}
public int getMaxAge ()
{
return this.maxAge;
}
public void setMaxAge ( final int maxAge )
{
this.maxAge = maxAge;
}
}
@@ -0,0 +1,55 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public enum OPCBROWSEDIRECTION
{
OPC_BROWSE_UP ( 1 ),
OPC_BROWSE_DOWN ( 2 ),
OPC_BROWSE_TO ( 3 ),
OPC_BROWSE_UNKNOWN ( 0 );
private int _id;
private OPCBROWSEDIRECTION ( final int id )
{
this._id = id;
}
public int id ()
{
return this._id;
}
public static OPCBROWSEDIRECTION fromID ( final int id )
{
switch ( id )
{
case 1:
return OPC_BROWSE_UP;
case 2:
return OPC_BROWSE_DOWN;
case 3:
return OPC_BROWSE_TO;
default:
return OPC_BROWSE_UNKNOWN;
}
}
}
@@ -0,0 +1,55 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public enum OPCBROWSETYPE
{
OPC_BRANCH ( 1 ),
OPC_LEAF ( 2 ),
OPC_FLAT ( 3 ),
OPC_UNKNOWN ( 0 );
private int _id;
private OPCBROWSETYPE ( final int id )
{
this._id = id;
}
public int id ()
{
return this._id;
}
public static OPCBROWSETYPE fromID ( final int id )
{
switch ( id )
{
case 1:
return OPC_BRANCH;
case 2:
return OPC_LEAF;
case 3:
return OPC_FLAT;
default:
return OPC_UNKNOWN;
}
}
}
@@ -0,0 +1,52 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public enum OPCDATASOURCE
{
OPC_DS_CACHE ( 1 ),
OPC_DS_DEVICE ( 2 ),
OPC_DS_UNKNOWN ( 0 );
private int _id;
private OPCDATASOURCE ( final int id )
{
this._id = id;
}
public int id ()
{
return this._id;
}
public static OPCDATASOURCE fromID ( final int id )
{
switch ( id )
{
case 1:
return OPC_DS_CACHE;
case 2:
return OPC_DS_DEVICE;
default:
return OPC_DS_UNKNOWN;
}
}
}
@@ -0,0 +1,64 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public enum OPCENUMSCOPE
{
OPC_ENUM_PRIVATE_CONNECTIONS ( 1 ),
OPC_ENUM_PUBLIC_CONNECTIONS ( 2 ),
OPC_ENUM_ALL_CONNECTIONS ( 3 ),
OPC_ENUM_PRIVATE ( 4 ),
OPC_ENUM_PUBLIC ( 5 ),
OPC_ENUM_ALL ( 6 ),
OPC_ENUM_UNKNOWN ( 0 );
private int _id;
private OPCENUMSCOPE ( final int id )
{
this._id = id;
}
public int id ()
{
return this._id;
}
public static OPCENUMSCOPE fromID ( final int id )
{
switch ( id )
{
case 1:
return OPC_ENUM_PRIVATE_CONNECTIONS;
case 2:
return OPC_ENUM_PUBLIC_CONNECTIONS;
case 3:
return OPC_ENUM_ALL_CONNECTIONS;
case 4:
return OPC_ENUM_PRIVATE;
case 5:
return OPC_ENUM_PUBLIC;
case 6:
return OPC_ENUM_ALL;
default:
return OPC_ENUM_UNKNOWN;
}
}
}
@@ -0,0 +1,119 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public class OPCGroupState
{
private int _updateRate = 1000;
private boolean _active = true;
private String _name = "";
private int _timeBias = 0;
private float _percentDeadband = 0.0f;
private int _localeID = 0;
private int _clientHandle = 0;
private int _serverHandle = 0;
public boolean isActive ()
{
return this._active;
}
public void setActive ( final boolean active )
{
this._active = active;
}
public int getClientHandle ()
{
return this._clientHandle;
}
public void setClientHandle ( final int clientHandle )
{
this._clientHandle = clientHandle;
}
public int getLocaleID ()
{
return this._localeID;
}
public void setLocaleID ( final int localeID )
{
this._localeID = localeID;
}
public String getName ()
{
return this._name;
}
public void setName ( final String name )
{
this._name = name;
}
public float getPercentDeadband ()
{
return this._percentDeadband;
}
public void setPercentDeadband ( final float percentDeadband )
{
this._percentDeadband = percentDeadband;
}
public int getServerHandle ()
{
return this._serverHandle;
}
public void setServerHandle ( final int serverHandle )
{
this._serverHandle = serverHandle;
}
public int getTimeBias ()
{
return this._timeBias;
}
public void setTimeBias ( final int timeBias )
{
this._timeBias = timeBias;
}
public int getUpdateRate ()
{
return this._updateRate;
}
public void setUpdateRate ( final int updateRate )
{
this._updateRate = updateRate;
}
}
@@ -0,0 +1,124 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2012 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import org.jinterop.dcom.common.JIException;
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.core.JIVariant;
public class OPCITEMDEF
{
private String accessPath = "";
private String itemID = "";
private boolean active = true;
private int clientHandle;
private short requestedDataType = JIVariant.VT_EMPTY;
private short reserved;
public String getAccessPath ()
{
return this.accessPath;
}
public void setAccessPath ( final String accessPath )
{
this.accessPath = accessPath;
}
public int getClientHandle ()
{
return this.clientHandle;
}
public void setClientHandle ( final int clientHandle )
{
this.clientHandle = clientHandle;
}
public boolean isActive ()
{
return this.active;
}
public void setActive ( final boolean active )
{
this.active = active;
}
public String getItemID ()
{
return this.itemID;
}
public void setItemID ( final String itemID )
{
this.itemID = itemID;
}
public short getRequestedDataType ()
{
return this.requestedDataType;
}
public void setRequestedDataType ( final short requestedDataType )
{
this.requestedDataType = requestedDataType;
}
public short getReserved ()
{
return this.reserved;
}
public void setReserved ( final short reserved )
{
this.reserved = reserved;
}
/**
* Convert to structure to a J-Interop structure
*
* @return the j-interop structe
* @throws JIException
*/
public JIStruct toStruct () throws JIException
{
final JIStruct struct = new JIStruct ();
struct.addMember ( new JIString ( getAccessPath (), JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) );
struct.addMember ( new JIString ( getItemID (), JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) );
struct.addMember ( new Integer ( isActive () ? 1 : 0 ) );
struct.addMember ( Integer.valueOf ( getClientHandle () ) );
struct.addMember ( Integer.valueOf ( 0 ) ); // blob size
struct.addMember ( new JIPointer ( null ) ); // blob
struct.addMember ( Short.valueOf ( getRequestedDataType () ) );
struct.addMember ( Short.valueOf ( getReserved () ) );
return struct;
}
}
@@ -0,0 +1,104 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIArray;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIStruct;
import org.jinterop.dcom.core.JIVariant;
public class OPCITEMRESULT
{
private int _serverHandle = 0;
private short _canonicalDataType = JIVariant.VT_EMPTY;
private short _reserved = 0;
private int _accessRights = 0;
public int getAccessRights ()
{
return this._accessRights;
}
public void setAccessRights ( final int accessRights )
{
this._accessRights = accessRights;
}
public short getCanonicalDataType ()
{
return this._canonicalDataType;
}
public void setCanonicalDataType ( final short canonicalDataType )
{
this._canonicalDataType = canonicalDataType;
}
public short getReserved ()
{
return this._reserved;
}
public void setReserved ( final short reserved )
{
this._reserved = reserved;
}
public int getServerHandle ()
{
return this._serverHandle;
}
public void setServerHandle ( final int serverHandle )
{
this._serverHandle = serverHandle;
}
public static JIStruct getStruct () throws JIException
{
JIStruct struct = new JIStruct ();
struct.addMember ( Integer.class ); // Server handle
struct.addMember ( Short.class ); // data type
struct.addMember ( Short.class ); // reserved
struct.addMember ( Integer.class ); // access rights
struct.addMember ( Integer.class ); // blob size
// grab the normally unused byte array
struct.addMember ( new JIPointer ( new JIArray ( Byte.class, null, 1, true, false ) ) );
return struct;
}
public static OPCITEMRESULT fromStruct ( final JIStruct struct )
{
OPCITEMRESULT result = new OPCITEMRESULT ();
result.setServerHandle ( new Integer ( (Integer)struct.getMember ( 0 ) ) );
result.setCanonicalDataType ( new Short ( (Short)struct.getMember ( 1 ) ) );
result.setReserved ( new Short ( (Short)struct.getMember ( 2 ) ) );
result.setAccessRights ( new Integer ( (Integer)struct.getMember ( 3 ) ) );
return result;
}
}
@@ -0,0 +1,114 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIStruct;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.dcom.common.FILETIME;
public class OPCITEMSTATE
{
private int _clientHandle = 0;
private FILETIME _timestamp = null;
private short _quality = 0;
private short _reserved = 0;
private JIVariant _value = null;
public int getClientHandle ()
{
return this._clientHandle;
}
public void setClientHandle ( final int clientHandle )
{
this._clientHandle = clientHandle;
}
public short getQuality ()
{
return this._quality;
}
public void setQuality ( final short quality )
{
this._quality = quality;
}
public short getReserved ()
{
return this._reserved;
}
public void setReserved ( final short reserved )
{
this._reserved = reserved;
}
public FILETIME getTimestamp ()
{
return this._timestamp;
}
public void setTimestamp ( final FILETIME timestamp )
{
this._timestamp = timestamp;
}
public JIVariant getValue ()
{
return this._value;
}
public void setValue ( final JIVariant value )
{
this._value = value;
}
public static JIStruct getStruct () throws JIException
{
JIStruct struct = new JIStruct ();
struct.addMember ( Integer.class );
struct.addMember ( FILETIME.getStruct () );
struct.addMember ( Short.class );
struct.addMember ( Short.class );
struct.addMember ( JIVariant.class );
return struct;
}
public static OPCITEMSTATE fromStruct ( final JIStruct struct )
{
OPCITEMSTATE itemState = new OPCITEMSTATE ();
itemState.setClientHandle ( (Integer)struct.getMember ( 0 ) );
itemState.setTimestamp ( FILETIME.fromStruct ( (JIStruct)struct.getMember ( 1 ) ) );
itemState.setQuality ( (Short)struct.getMember ( 2 ) );
itemState.setReserved ( (Short)struct.getMember ( 3 ) );
itemState.setValue ( (JIVariant)struct.getMember ( 4 ) );
return itemState;
}
}
@@ -0,0 +1,52 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public enum OPCNAMESPACETYPE
{
OPC_NS_HIERARCHIAL ( 1 ),
OPC_NS_FLAT ( 2 ),
OPC_NS_UNKNOWN ( 0 );
private int _id;
private OPCNAMESPACETYPE ( final int id )
{
this._id = id;
}
public int id ()
{
return this._id;
}
public static OPCNAMESPACETYPE fromID ( final int id )
{
switch ( id )
{
case 1:
return OPC_NS_HIERARCHIAL;
case 2:
return OPC_NS_FLAT;
default:
return OPC_NS_UNKNOWN;
}
}
}
@@ -0,0 +1,64 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public enum OPCSERVERSTATE
{
OPC_STATUS_RUNNING ( 1 ),
OPC_STATUS_FAILED ( 2 ),
OPC_STATUS_NOCONFIG ( 3 ),
OPC_STATUS_SUSPENDED ( 4 ),
OPC_STATUS_TEST ( 5 ),
OPC_STATUS_COMM_FAULT ( 6 ),
OPC_STATUS_UNKNOWN ( 0 );
private int _id;
private OPCSERVERSTATE ( final int id )
{
this._id = id;
}
public int id ()
{
return this._id;
}
public static OPCSERVERSTATE fromID ( final int id )
{
switch ( id )
{
case 1:
return OPC_STATUS_RUNNING;
case 2:
return OPC_STATUS_FAILED;
case 3:
return OPC_STATUS_NOCONFIG;
case 4:
return OPC_STATUS_SUSPENDED;
case 5:
return OPC_STATUS_TEST;
case 6:
return OPC_STATUS_COMM_FAULT;
default:
return OPC_STATUS_UNKNOWN;
}
}
}
@@ -0,0 +1,201 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import org.jinterop.dcom.common.JIException;
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.openscada.opc.dcom.common.FILETIME;
public class OPCSERVERSTATUS
{
private FILETIME _startTime = null;
private FILETIME _currentTime = null;
private FILETIME _lastUpdateTime = null;
private OPCSERVERSTATE _serverState = null;
private int _groupCount = -1;
private int _bandWidth = -1;
private short _majorVersion = -1;
private short _minorVersion = -1;
private short _buildNumber = -1;
private short _reserved = 0;
private String _vendorInfo = null;
public int getBandWidth ()
{
return this._bandWidth;
}
public void setBandWidth ( final int bandWidth )
{
this._bandWidth = bandWidth;
}
public short getBuildNumber ()
{
return this._buildNumber;
}
public void setBuildNumber ( final short buildNumber )
{
this._buildNumber = buildNumber;
}
public FILETIME getCurrentTime ()
{
return this._currentTime;
}
public void setCurrentTime ( final FILETIME currentTime )
{
this._currentTime = currentTime;
}
public int getGroupCount ()
{
return this._groupCount;
}
public void setGroupCount ( final int groupCount )
{
this._groupCount = groupCount;
}
public FILETIME getLastUpdateTime ()
{
return this._lastUpdateTime;
}
public void setLastUpdateTime ( final FILETIME lastUpdateTime )
{
this._lastUpdateTime = lastUpdateTime;
}
public short getMajorVersion ()
{
return this._majorVersion;
}
public void setMajorVersion ( final short majorVersion )
{
this._majorVersion = majorVersion;
}
public short getMinorVersion ()
{
return this._minorVersion;
}
public void setMinorVersion ( final short minorVersion )
{
this._minorVersion = minorVersion;
}
public short getReserved ()
{
return this._reserved;
}
public void setReserved ( final short reserved )
{
this._reserved = reserved;
}
public FILETIME getStartTime ()
{
return this._startTime;
}
public void setStartTime ( final FILETIME startTime )
{
this._startTime = startTime;
}
public String getVendorInfo ()
{
return this._vendorInfo;
}
public void setVendorInfo ( final String vendorInfo )
{
this._vendorInfo = vendorInfo;
}
public OPCSERVERSTATE getServerState ()
{
return this._serverState;
}
public void setServerState ( final OPCSERVERSTATE dwServerState )
{
this._serverState = dwServerState;
}
public static JIStruct getStruct () throws JIException
{
JIStruct struct = new JIStruct ();
struct.addMember ( FILETIME.getStruct () );
struct.addMember ( FILETIME.getStruct () );
struct.addMember ( FILETIME.getStruct () );
struct.addMember ( Short.class ); // enum: OPCSERVERSTATE
struct.addMember ( Integer.class );
struct.addMember ( Integer.class );
struct.addMember ( Short.class );
struct.addMember ( Short.class );
struct.addMember ( Short.class );
struct.addMember ( Short.class );
struct.addMember ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ) );
return struct;
}
public static OPCSERVERSTATUS fromStruct ( final JIStruct struct )
{
OPCSERVERSTATUS status = new OPCSERVERSTATUS ();
status._startTime = FILETIME.fromStruct ( (JIStruct)struct.getMember ( 0 ) );
status._currentTime = FILETIME.fromStruct ( (JIStruct)struct.getMember ( 1 ) );
status._lastUpdateTime = FILETIME.fromStruct ( (JIStruct)struct.getMember ( 2 ) );
status._serverState = OPCSERVERSTATE.fromID ( (Short)struct.getMember ( 3 ) );
status._groupCount = (Integer)struct.getMember ( 4 );
status._bandWidth = (Integer)struct.getMember ( 5 );
status._majorVersion = (Short)struct.getMember ( 6 );
status._minorVersion = (Short)struct.getMember ( 7 );
status._buildNumber = (Short)struct.getMember ( 8 );
status._reserved = (Short)struct.getMember ( 9 );
status._vendorInfo = ( (JIString) ( (JIPointer)struct.getMember ( 10 ) ).getReferent () ).getString ();
return status;
}
}
@@ -0,0 +1,59 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
public class PropertyDescription
{
private int _id = -1;
private String _description = "";
private short _varType = 0;
public String getDescription ()
{
return this._description;
}
public void setDescription ( final String description )
{
this._description = description;
}
public int getId ()
{
return this._id;
}
public void setId ( final int id )
{
this._id = id;
}
public short getVarType ()
{
return this._varType;
}
public void setVarType ( final short varType )
{
this._varType = varType;
}
}
@@ -0,0 +1,65 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import java.util.Calendar;
import org.jinterop.dcom.core.JIVariant;
public class ValueData
{
private JIVariant value;
private short quality;
private Calendar timestamp;
public short getQuality ()
{
return this.quality;
}
public void setQuality ( final short quality )
{
this.quality = quality;
}
public Calendar getTimestamp ()
{
return this.timestamp;
}
public void setTimestamp ( final Calendar timestamp )
{
this.timestamp = timestamp;
}
public JIVariant getValue ()
{
return this.value;
}
public void setValue ( final JIVariant value )
{
this.value = value;
}
}
@@ -0,0 +1,80 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da;
import org.jinterop.dcom.core.JIVariant;
/**
* Data for a write request to the server
*
* @author Jens Reimann <jens.reimann@th4-systems.com>
*/
public class WriteRequest
{
private int serverHandle = 0;
private JIVariant value = JIVariant.EMPTY ();
public WriteRequest ()
{
}
public WriteRequest ( final WriteRequest request )
{
this.serverHandle = request.serverHandle;
this.value = request.value;
}
/**
* Create a new write request with pre-fille data
*
* @param serverHandle
* the server handle of the item to write to
* @param value
* the value to write.
*/
public WriteRequest ( final int serverHandle, final JIVariant value )
{
this.serverHandle = serverHandle;
this.value = value;
}
public int getServerHandle ()
{
return this.serverHandle;
}
public void setServerHandle ( final int serverHandle )
{
this.serverHandle = serverHandle;
}
public JIVariant getValue ()
{
return this.value;
}
public void setValue ( final JIVariant value )
{
this.value = value;
}
}
@@ -0,0 +1,141 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
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.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.openscada.opc.dcom.common.Result;
import org.openscada.opc.dcom.common.ResultSet;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.OPCDATASOURCE;
public class OPCAsyncIO2 extends BaseCOMObject
{
public class AsyncResult
{
private final ResultSet<Integer> result;
private final Integer cancelId;
public AsyncResult ()
{
super ();
this.result = new ResultSet<Integer> ();
this.cancelId = null;
}
public AsyncResult ( final ResultSet<Integer> result, final Integer cancelId )
{
super ();
this.result = result;
this.cancelId = cancelId;
}
public Integer getCancelId ()
{
return this.cancelId;
}
public ResultSet<Integer> getResult ()
{
return this.result;
}
}
public OPCAsyncIO2 ( final IJIComObject opcAsyncIO2 ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcAsyncIO2.queryInterface ( Constants.IOPCAsyncIO2_IID ) );
}
public void setEnable ( final boolean state ) throws JIException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 4 );
callObject.addInParamAsInt ( state ? 1 : 0, JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
public int refresh ( final OPCDATASOURCE dataSource, final int transactionID ) throws JIException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsShort ( (short)dataSource.id (), JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( transactionID, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
final Object result[] = getCOMObject ().call ( callObject );
return (Integer)result[0];
}
public void cancel ( final int cancelId ) throws JIException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addInParamAsInt ( cancelId, JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
public AsyncResult read ( final int transactionId, final Integer... serverHandles ) throws JIException
{
if ( serverHandles == null || serverHandles.length == 0 )
{
return new AsyncResult ();
}
final 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 );
final Object[] result = getCOMObject ().call ( callObject );
final Integer cancelId = (Integer)result[0];
final Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
final ResultSet<Integer> resultSet = new ResultSet<Integer> ();
for ( int i = 0; i < serverHandles.length; i++ )
{
resultSet.add ( new Result<Integer> ( serverHandles[i], errorCodes[i] ) );
}
return new AsyncResult ( resultSet, cancelId );
}
}
@@ -0,0 +1,35 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.da.Constants;
public class OPCBrowse extends BaseCOMObject
{
public OPCBrowse ( final IJIComObject opcServer ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcServer.queryInterface ( Constants.IOPCBrowse_IID ) );
}
}
@@ -0,0 +1,157 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JICallBuilder;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIString;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.common.impl.EnumString;
import org.openscada.opc.dcom.common.impl.Helper;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.OPCBROWSEDIRECTION;
import org.openscada.opc.dcom.da.OPCBROWSETYPE;
import org.openscada.opc.dcom.da.OPCNAMESPACETYPE;
/**
* Implementation for <code>IOPCBrowseServerAddressSpace</code>
* @author Jens Reimann <jens.reimann@th4-systems.com>
*
*/
public class OPCBrowseServerAddressSpace extends BaseCOMObject
{
public OPCBrowseServerAddressSpace ( final IJIComObject opcServer ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcServer.queryInterface ( Constants.IOPCBrowseServerAddressSpace_IID ) );
}
/**
* Get the information how the namespace is organized
* @return the organization of the namespace
* @throws JIException
*/
public OPCNAMESPACETYPE queryOrganization () throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addOutParamAsType ( Short.class, JIFlags.FLAG_NULL );
Object result[] = getCOMObject ().call ( callObject );
return OPCNAMESPACETYPE.fromID ( (Short)result[0] );
}
/**
* Direct the browser to another position
*
* Depending on the <em>direction</em> the new position will be set based on the provided
* position information. If the direction is {@link OPCBROWSEDIRECTION#OPC_BROWSE_TO} then
* the <em>position</em> is the item to go to. If the direction is {@link OPCBROWSEDIRECTION#OPC_BROWSE_DOWN}
* the browser will descent into the tree down (not to) the branch item in <em>position</em>.
* Passing {@link OPCBROWSEDIRECTION#OPC_BROWSE_UP} won't need a <em>position</em> (pass <code>null</code>)
* and will ascent in the tree one level.
*
* Passing {@link OPCBROWSEDIRECTION#OPC_BROWSE_TO} and <code>null</code> as position will
* go to the first root entry of the namespace.
*
* @param position The item position reference for the direction
* @param direction The direction to go based on the position
* @throws JIException
*/
public void changePosition ( final String position, final OPCBROWSEDIRECTION direction ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsShort ( (short)direction.id (), JIFlags.FLAG_NULL );
callObject.addInParamAsString ( position, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
getCOMObject ().call ( callObject );
}
public EnumString browse ( final OPCBROWSETYPE browseType, final String filterCriteria, final int accessRights, final int dataType ) throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsShort ( (short)browseType.id (), JIFlags.FLAG_NULL );
callObject.addInParamAsString ( filterCriteria, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addInParamAsShort ( (short)dataType, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( accessRights, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
return new EnumString ( (IJIComObject)result[0] );
}
/**
* Return the possible access paths for an item
* @param itemID the item to query
* @return A string enumerator for the possible access paths
* @throws JIException
* @throws IllegalArgumentException
* @throws UnknownHostException
*/
public EnumString browseAccessPaths ( final String itemID ) throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 4 );
callObject.addInParamAsString ( itemID, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
return new EnumString ( (IJIComObject)result[0] );
}
/**
* Get the complete item id from an item at the local position.
*
* Browsing a hierarchical namespace the browse method will return items based on the
* local level in the namespace. So actually only the last part of the item ID hierarchy
* is returned. In order to convert this to the full item ID one can use this method. It
* will only work if the browser is still at the position in question.
*
* @param item the local item
* @return the complete item ID
* @throws JIException
*/
public String getItemID ( final String item ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addInParamAsString ( item, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addOutParamAsObject ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
return ( (JIString) ( (JIPointer)result[0] ).getReferent () ).getString ();
}
}
@@ -0,0 +1,259 @@
/*
* This file is part of the OpenSCADA project
*
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
* Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.util.LinkedList;
import java.util.List;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIArray;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JILocalCoClass;
import org.jinterop.dcom.core.JILocalInterfaceDefinition;
import org.jinterop.dcom.core.JILocalMethodDescriptor;
import org.jinterop.dcom.core.JILocalParamsDescriptor;
import org.jinterop.dcom.core.JIStruct;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.dcom.common.FILETIME;
import org.openscada.opc.dcom.common.KeyedResult;
import org.openscada.opc.dcom.common.KeyedResultSet;
import org.openscada.opc.dcom.common.Result;
import org.openscada.opc.dcom.common.ResultSet;
import org.openscada.opc.dcom.common.impl.EventHandlerImpl;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.IOPCDataCallback;
import org.openscada.opc.dcom.da.ValueData;
public class OPCDataCallback extends EventHandlerImpl
{
private IOPCDataCallback callback = null;
private JILocalCoClass coClass = null;
public OPCDataCallback ()
{
super ();
}
public Object[] OnDataChange ( final int transactionId, final int serverGroupHandle, final int masterQuality, final int masterErrorCode, final int count, final JIArray clientHandles, final JIArray values, final JIArray qualities, final JIArray timestamps, final JIArray errors )
{
final IOPCDataCallback callback = this.callback;
if ( callback == null )
{
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
// get arrays for more readable code later ;-)
final Integer[] errorCodes = (Integer[])errors.getArrayInstance ();
final Integer[] itemHandles = (Integer[])clientHandles.getArrayInstance ();
final Short[] qualitiesArray = (Short[])qualities.getArrayInstance ();
final JIVariant[] valuesArray = (JIVariant[])values.getArrayInstance ();
final JIStruct[] timestampArray = (JIStruct[])timestamps.getArrayInstance ();
// create result data
final KeyedResultSet<Integer, ValueData> result = new KeyedResultSet<Integer, ValueData> ();
for ( int i = 0; i < count; i++ )
{
final ValueData vd = new ValueData ();
vd.setQuality ( qualitiesArray[i] );
vd.setTimestamp ( FILETIME.fromStruct ( timestampArray[i] ).asCalendar () );
vd.setValue ( valuesArray[i] );
result.add ( new KeyedResult<Integer, ValueData> ( itemHandles[i], vd, errorCodes[i] ) );
}
// fire event
try
{
callback.dataChange ( transactionId, serverGroupHandle, masterQuality, masterErrorCode, result );
}
catch ( final Throwable e )
{
e.printStackTrace ();
}
// The client must always return S_OK
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
public synchronized Object[] OnReadComplete ( final int transactionId, final int serverGroupHandle, final int masterQuality, final int masterErrorCode, final int count, final JIArray clientHandles, final JIArray values, final JIArray qualities, final JIArray timestamps, final JIArray errors )
{
if ( this.callback == null )
{
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
// get arrays for more readable code later ;-)
final Integer[] errorCodes = (Integer[])errors.getArrayInstance ();
final Integer[] itemHandles = (Integer[])clientHandles.getArrayInstance ();
final Short[] qualitiesArray = (Short[])qualities.getArrayInstance ();
final JIVariant[] valuesArray = (JIVariant[])values.getArrayInstance ();
final JIStruct[] timestampArray = (JIStruct[])timestamps.getArrayInstance ();
// create result data
final KeyedResultSet<Integer, ValueData> result = new KeyedResultSet<Integer, ValueData> ();
for ( int i = 0; i < count; i++ )
{
final ValueData vd = new ValueData ();
vd.setQuality ( qualitiesArray[i] );
vd.setTimestamp ( FILETIME.fromStruct ( timestampArray[i] ).asCalendar () );
vd.setValue ( valuesArray[i] );
result.add ( new KeyedResult<Integer, ValueData> ( itemHandles[i], vd, errorCodes[i] ) );
}
// fire event
try
{
this.callback.readComplete ( transactionId, serverGroupHandle, masterQuality, masterErrorCode, result );
}
catch ( final Throwable e )
{
e.printStackTrace ();
}
// The client must always return S_OK
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
public synchronized Object[] OnWriteComplete ( final int transactionId, final int serverGroupHandle, final int masterErrorCode, final int count, final JIArray clientHandles, final JIArray errors )
{
if ( this.callback == null )
{
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
// get arrays for more readable code later ;-)
final Integer[] errorCodes = (Integer[])errors.getArrayInstance ();
final Integer[] itemHandles = (Integer[])clientHandles.getArrayInstance ();
// create result data
final ResultSet<Integer> result = new ResultSet<Integer> ();
for ( int i = 0; i < count; i++ )
{
result.add ( new Result<Integer> ( itemHandles[i], errorCodes[i] ) );
}
// fire event
try
{
this.callback.writeComplete ( transactionId, serverGroupHandle, masterErrorCode, result );
}
catch ( final Throwable e )
{
e.printStackTrace ();
}
// The client must always return S_OK
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
public synchronized Object[] OnCancelComplete ( final int transactionId, final int serverGroupHandle )
{
if ( this.callback == null )
{
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
this.callback.cancelComplete ( transactionId, serverGroupHandle );
// The client must always return S_OK
return new Object[] { org.openscada.opc.dcom.common.Constants.S_OK };
}
public synchronized JILocalCoClass getCoClass () throws JIException
{
if ( this.coClass != null )
{
return this.coClass;
}
this.coClass = new JILocalCoClass ( new JILocalInterfaceDefinition ( Constants.IOPCDataCallback_IID, false ), this, false );
JILocalParamsDescriptor params;
JILocalMethodDescriptor method;
// OnDataChange
params = new JILocalParamsDescriptor ();
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL ); // trans id
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL ); // group handle
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL ); // master quality
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL ); // master error
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL ); // count
params.addInParamAsObject ( new JIArray ( Integer.class, null, 1, true ), JIFlags.FLAG_NULL ); // item handles
params.addInParamAsObject ( new JIArray ( JIVariant.class, null, 1, true ), JIFlags.FLAG_NULL ); // values
params.addInParamAsObject ( new JIArray ( Short.class, null, 1, true ), JIFlags.FLAG_NULL ); // qualities
params.addInParamAsObject ( new JIArray ( FILETIME.getStruct (), null, 1, true ), JIFlags.FLAG_NULL ); // timestamps
params.addInParamAsObject ( new JIArray ( Integer.class, null, 1, true ), JIFlags.FLAG_NULL ); // errors
method = new JILocalMethodDescriptor ( "OnDataChange", params );
this.coClass.getInterfaceDefinition ().addMethodDescriptor ( method );
// OnReadComplete
params = new JILocalParamsDescriptor ();
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( Integer.class, null, 1, true ), JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( JIVariant.class, null, 1, true ), JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( Short.class, null, 1, true ), JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( FILETIME.getStruct (), null, 1, true ), JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( Integer.class, null, 1, true ), JIFlags.FLAG_NULL );
method = new JILocalMethodDescriptor ( "OnReadComplete", params );
this.coClass.getInterfaceDefinition ().addMethodDescriptor ( method );
// OnWriteComplete
params = new JILocalParamsDescriptor ();
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( Integer.class, null, 1, true ), JIFlags.FLAG_NULL );
params.addInParamAsObject ( new JIArray ( Integer.class, null, 1, true ), JIFlags.FLAG_NULL );
method = new JILocalMethodDescriptor ( "OnWriteComplete", params );
this.coClass.getInterfaceDefinition ().addMethodDescriptor ( method );
// OnCancelComplete
params = new JILocalParamsDescriptor ();
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
params.addInParamAsType ( Integer.class, JIFlags.FLAG_NULL );
method = new JILocalMethodDescriptor ( "OnCancelComplete", params );
this.coClass.getInterfaceDefinition ().addMethodDescriptor ( method );
// Add supported event interfaces
final List<String> eventInterfaces = new LinkedList<String> ();
eventInterfaces.add ( Constants.IOPCDataCallback_IID );
this.coClass.setSupportedEventInterfaces ( eventInterfaces );
return this.coClass;
}
public void setCallback ( final IOPCDataCallback callback )
{
this.callback = callback;
}
public IOPCDataCallback getCallback ()
{
return this.callback;
}
}
@@ -0,0 +1,218 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JICallBuilder;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JIFrameworkHelper;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.impls.JIObjectFactory;
import org.openscada.opc.dcom.common.EventHandler;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.IOPCDataCallback;
import org.openscada.opc.dcom.da.OPCGroupState;
/**
* Implementation of <code>IOPCGroupStateMgt</code>
*
* @author Jens Reimann <jens.reimann@th4-systems.com>
*/
public class OPCGroupStateMgt extends BaseCOMObject
{
public OPCGroupStateMgt ( final IJIComObject opcGroup ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcGroup.queryInterface ( Constants.IOPCGroupStateMgt_IID ) );
}
public OPCGroupState getState () throws JIException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Boolean.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Float.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
final Object result[] = getCOMObject ().call ( callObject );
final OPCGroupState state = new OPCGroupState ();
state.setUpdateRate ( (Integer)result[0] );
state.setActive ( (Boolean)result[1] );
state.setName ( ( (JIString) ( (JIPointer)result[2] ).getReferent () ).getString () );
state.setTimeBias ( (Integer)result[3] );
state.setPercentDeadband ( (Float)result[4] );
state.setLocaleID ( (Integer)result[5] );
state.setClientHandle ( (Integer)result[6] );
state.setServerHandle ( (Integer)result[7] );
return state;
}
/**
* Set the group state Leaving any of the parameters <code>null</code> will keep the current value untouched.
*
* @param requestedUpdateRate
* the requested update rate
* @param active
* Flag if the group is active or not
* @param timeBias
* The time bias
* @param percentDeadband
* the deadband percent
* @param localeID
* the locale ID
* @param clientHandle
* the client handle
* @return the granted update rate
* @throws JIException
*/
public int setState ( final Integer requestedUpdateRate, final Boolean active, final Integer timeBias, final Float percentDeadband, final Integer localeID, final Integer clientHandle ) throws JIException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsPointer ( new JIPointer ( requestedUpdateRate ), JIFlags.FLAG_NULL );
if ( active != null )
{
callObject.addInParamAsPointer ( new JIPointer ( Integer.valueOf ( active.booleanValue () ? 1 : 0 ) ), JIFlags.FLAG_NULL );
}
else
{
callObject.addInParamAsPointer ( new JIPointer ( null ), JIFlags.FLAG_NULL );
}
callObject.addInParamAsPointer ( new JIPointer ( timeBias ), JIFlags.FLAG_NULL );
callObject.addInParamAsPointer ( new JIPointer ( percentDeadband ), JIFlags.FLAG_NULL );
callObject.addInParamAsPointer ( new JIPointer ( localeID ), JIFlags.FLAG_NULL );
callObject.addInParamAsPointer ( new JIPointer ( clientHandle ), JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
final Object[] result = getCOMObject ().call ( callObject );
return (Integer)result[0];
}
public OPCItemMgt getItemManagement () throws JIException
{
return new OPCItemMgt ( getCOMObject () );
}
/**
* Rename to group
*
* @param name
* the new name
* @throws JIException
*/
public void setName ( final String name ) throws JIException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsString ( name, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
getCOMObject ().call ( callObject );
}
/**
* Clone the group
*
* @param name
* the name of the cloned group
* @return The cloned group
* @throws JIException
* @throws UnknownHostException
* @throws IllegalArgumentException
*/
public OPCGroupStateMgt clone ( final String name ) throws JIException, IllegalArgumentException, UnknownHostException
{
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addInParamAsString ( name, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addInParamAsUUID ( Constants.IOPCGroupStateMgt_IID, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
final Object[] result = getCOMObject ().call ( callObject );
return new OPCGroupStateMgt ( (IJIComObject)result[0] );
}
/**
* Attach a new callback to the group
*
* @param callback
* The callback to attach
* @return The event handler information
* @throws JIException
*/
public EventHandler attach ( final IOPCDataCallback callback ) throws JIException
{
final OPCDataCallback callbackObject = new OPCDataCallback ();
callbackObject.setCallback ( callback );
// sync the callback object so that no calls get through the callback
// until the callback information is set
// If happens in some cases that the callback is triggered before
// the method attachEventHandler returns.
synchronized ( callbackObject )
{
final String id = JIFrameworkHelper.attachEventHandler ( getCOMObject (), Constants.IOPCDataCallback_IID, JIObjectFactory.buildObject ( getCOMObject ().getAssociatedSession (), callbackObject.getCoClass () ) );
callbackObject.setInfo ( getCOMObject (), id );
}
return callbackObject;
}
public OPCAsyncIO2 getAsyncIO2 ()
{
try
{
return new OPCAsyncIO2 ( getCOMObject () );
}
catch ( final Exception e )
{
return null;
}
}
public OPCSyncIO getSyncIO ()
{
try
{
return new OPCSyncIO ( getCOMObject () );
}
catch ( final Exception e )
{
return null;
}
}
}
@@ -0,0 +1,73 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
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.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.dcom.common.FILETIME;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.IORequest;
public class OPCItemIO extends BaseCOMObject
{
public OPCItemIO ( final IJIComObject opcItemIO ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcItemIO.queryInterface ( Constants.IOPCItemIO_IID ) );
}
public void read ( final IORequest[] requests ) throws JIException
{
if ( requests.length == 0 )
{
return;
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
JIString itemIDs[] = new JIString[requests.length];
Integer maxAges[] = new Integer[requests.length];
for ( int i = 0; i < requests.length; i++ )
{
itemIDs[i] = new JIString ( requests[i].getItemID (), JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
maxAges[i] = new Integer ( requests[i].getMaxAge () );
}
callObject.addInParamAsInt ( requests.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( itemIDs, true ), JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( maxAges, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( JIVariant.class, null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( FILETIME.getStruct (), null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
}
@@ -0,0 +1,211 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2012 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
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.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIStruct;
import org.openscada.opc.dcom.common.KeyedResult;
import org.openscada.opc.dcom.common.KeyedResultSet;
import org.openscada.opc.dcom.common.Result;
import org.openscada.opc.dcom.common.ResultSet;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.common.impl.Helper;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.OPCITEMDEF;
import org.openscada.opc.dcom.da.OPCITEMRESULT;
public class OPCItemMgt extends BaseCOMObject
{
public OPCItemMgt ( final IJIComObject opcGroup ) throws JIException
{
super ( opcGroup.queryInterface ( Constants.IOPCItemMgt_IID ) );
}
public KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> validate ( final OPCITEMDEF... items ) throws JIException
{
if ( items.length == 0 )
{
return new KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> ();
}
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
final JIStruct struct[] = new JIStruct[items.length];
for ( int i = 0; i < items.length; i++ )
{
struct[i] = items[i].toStruct ();
}
final JIArray itemArray = new JIArray ( struct, true );
callObject.addInParamAsInt ( items.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( itemArray, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( 0, JIFlags.FLAG_NULL ); // don't update blobs
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( OPCITEMRESULT.getStruct (), null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
final Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
final JIStruct[] results = (JIStruct[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
final Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
final KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> resultList = new KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> ( items.length );
for ( int i = 0; i < items.length; i++ )
{
final OPCITEMRESULT itemResult = OPCITEMRESULT.fromStruct ( results[i] );
final KeyedResult<OPCITEMDEF, OPCITEMRESULT> resultEntry = new KeyedResult<OPCITEMDEF, OPCITEMRESULT> ( items[i], itemResult, errorCodes[i] );
resultList.add ( resultEntry );
}
return resultList;
}
public KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> add ( final OPCITEMDEF... items ) throws JIException
{
if ( items.length == 0 )
{
return new KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> ();
}
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
final JIStruct struct[] = new JIStruct[items.length];
for ( int i = 0; i < items.length; i++ )
{
struct[i] = items[i].toStruct ();
}
final JIArray itemArray = new JIArray ( struct, true );
callObject.addInParamAsInt ( items.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( itemArray, JIFlags.FLAG_NULL );
/*
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( OPCITEMRESULT.getStruct (), null, 1, true ) ),
JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ),
JIFlags.FLAG_NULL );
*/
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( OPCITEMRESULT.getStruct (), null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
final Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
final JIStruct[] results = (JIStruct[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
final Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
final KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> resultList = new KeyedResultSet<OPCITEMDEF, OPCITEMRESULT> ( items.length );
for ( int i = 0; i < items.length; i++ )
{
final OPCITEMRESULT itemResult = OPCITEMRESULT.fromStruct ( results[i] );
final KeyedResult<OPCITEMDEF, OPCITEMRESULT> resultEntry = new KeyedResult<OPCITEMDEF, OPCITEMRESULT> ( items[i], itemResult, errorCodes[i] );
resultList.add ( resultEntry );
}
return resultList;
}
public ResultSet<Integer> remove ( final Integer... serverHandles ) throws JIException
{
if ( serverHandles.length == 0 )
{
return new ResultSet<Integer> ();
}
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsInt ( serverHandles.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( serverHandles, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
final Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
final Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
final ResultSet<Integer> results = new ResultSet<Integer> ( serverHandles.length );
for ( int i = 0; i < serverHandles.length; i++ )
{
results.add ( new Result<Integer> ( serverHandles[i], errorCodes[i] ) );
}
return results;
}
public ResultSet<Integer> setActiveState ( final boolean state, final Integer... items ) throws JIException
{
if ( items.length == 0 )
{
return new ResultSet<Integer> ();
}
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addInParamAsInt ( items.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( items, true ), JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( state ? 1 : 0, JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
final Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
final Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
final ResultSet<Integer> results = new ResultSet<Integer> ( items.length );
for ( int i = 0; i < items.length; i++ )
{
results.add ( new Result<Integer> ( items[i], errorCodes[i] ) );
}
return results;
}
public ResultSet<Integer> setClientHandles ( final Integer[] serverHandles, final Integer[] clientHandles ) throws JIException
{
if ( serverHandles.length != clientHandles.length )
{
throw new JIException ( 0, "Array sizes don't match" );
}
if ( serverHandles.length == 0 )
{
return new ResultSet<Integer> ();
}
final JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 4 );
callObject.addInParamAsInt ( serverHandles.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( serverHandles, true ), JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( clientHandles, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
final Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
final Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
final ResultSet<Integer> results = new ResultSet<Integer> ( serverHandles.length );
for ( int i = 0; i < serverHandles.length; i++ )
{
results.add ( new Result<Integer> ( serverHandles[i], errorCodes[i] ) );
}
return results;
}
}
@@ -0,0 +1,154 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
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.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.dcom.common.KeyedResult;
import org.openscada.opc.dcom.common.KeyedResultSet;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.common.impl.Helper;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.PropertyDescription;
public class OPCItemProperties extends BaseCOMObject
{
public OPCItemProperties ( final IJIComObject opcItemProperties ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcItemProperties.queryInterface ( Constants.IOPCItemProperties_IID ) );
}
public Collection<PropertyDescription> queryAvailableProperties ( final String itemID ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addInParamAsString ( itemID, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_BSTR ), null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Short.class, null, 1, true ) ), JIFlags.FLAG_NULL );
Object result[] = getCOMObject ().call ( callObject );
List<PropertyDescription> properties = new LinkedList<PropertyDescription> ();
int len = (Integer)result[0];
Integer[] ids = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
JIString[] descriptions = (JIString[]) ( (JIArray) ( (JIPointer)result[2] ).getReferent () ).getArrayInstance ();
Short[] variableTypes = (Short[]) ( (JIArray) ( (JIPointer)result[3] ).getReferent () ).getArrayInstance ();
for ( int i = 0; i < len; i++ )
{
PropertyDescription pd = new PropertyDescription ();
pd.setId ( ids[i] );
pd.setDescription ( descriptions[i].getString () );
pd.setVarType ( variableTypes[i] );
properties.add ( pd );
}
return properties;
}
public KeyedResultSet<Integer, JIVariant> getItemProperties ( final String itemID, final int... properties ) throws JIException
{
if ( properties.length == 0 )
{
return new KeyedResultSet<Integer, JIVariant> ();
}
Integer[] ids = new Integer[properties.length];
for ( int i = 0; i < properties.length; i++ )
{
ids[i] = properties[i];
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsString ( itemID, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addInParamAsInt ( properties.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( ids, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( JIVariant.class, null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
JIVariant[] values = (JIVariant[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
KeyedResultSet<Integer, JIVariant> results = new KeyedResultSet<Integer, JIVariant> ();
for ( int i = 0; i < properties.length; i++ )
{
results.add ( new KeyedResult<Integer, JIVariant> ( properties[i], values[i], errorCodes[i] ) );
}
return results;
}
public KeyedResultSet<Integer, String> lookupItemIDs ( final String itemID, final int... properties ) throws JIException
{
if ( properties.length == 0 )
{
return new KeyedResultSet<Integer, String> ();
}
Integer[] ids = new Integer[properties.length];
for ( int i = 0; i < properties.length; i++ )
{
ids[i] = properties[i];
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsString ( itemID, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addInParamAsInt ( properties.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( ids, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
JIPointer[] itemIDs = (JIPointer[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
KeyedResultSet<Integer, String> results = new KeyedResultSet<Integer, String> ();
for ( int i = 0; i < properties.length; i++ )
{
results.add ( new KeyedResult<Integer, String> ( properties[i], ( (JIString)itemIDs[i].getReferent () ).getString (), errorCodes[i] ) );
}
return results;
}
}
@@ -0,0 +1,191 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
import java.net.UnknownHostException;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JICallBuilder;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIStruct;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.common.impl.EnumString;
import org.openscada.opc.dcom.common.impl.Helper;
import org.openscada.opc.dcom.common.impl.OPCCommon;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.OPCENUMSCOPE;
import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
public class OPCServer extends BaseCOMObject
{
public OPCServer ( final IJIComObject opcServer ) throws IllegalArgumentException, UnknownHostException, JIException
{
super ( opcServer.queryInterface ( Constants.IOPCServer_IID ) );
}
/**
* Retrieve the current server status
* @return the current server status
* @throws JIException
*/
public OPCSERVERSTATUS getStatus () throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 3 );
callObject.addOutParamAsObject ( new JIPointer ( OPCSERVERSTATUS.getStruct () ), JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
return OPCSERVERSTATUS.fromStruct ( (JIStruct) ( (JIPointer)result[0] ).getReferent () );
}
public OPCGroupStateMgt addGroup ( final String name, final boolean active, final int updateRate, final int clientHandle, final Integer timeBias, final Float percentDeadband, final int localeID ) throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addInParamAsString ( name, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addInParamAsInt ( active ? 1 : 0, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( updateRate, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( clientHandle, JIFlags.FLAG_NULL );
callObject.addInParamAsPointer ( new JIPointer ( timeBias ), JIFlags.FLAG_NULL );
callObject.addInParamAsPointer ( new JIPointer ( percentDeadband ), JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( localeID, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( Integer.class, JIFlags.FLAG_NULL );
callObject.addInParamAsUUID ( Constants.IOPCGroupStateMgt_IID, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
return new OPCGroupStateMgt ( (IJIComObject)result[2] );
}
public void removeGroup ( final int serverHandle, final boolean force ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 4 );
callObject.addInParamAsInt ( serverHandle, JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( force ? 1 : 0, JIFlags.FLAG_NULL );
getCOMObject ().call ( callObject );
}
public void removeGroup ( final OPCGroupStateMgt group, final boolean force ) throws JIException
{
removeGroup ( group.getState ().getServerHandle (), force );
}
public OPCGroupStateMgt getGroupByName ( final String name ) throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsString ( name, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addInParamAsUUID ( Constants.IOPCGroupStateMgt_IID, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object[] result = getCOMObject ().call ( callObject );
return new OPCGroupStateMgt ( (IJIComObject)result[0] );
}
/**
* Get the groups
* @param scope The scope to get
* @return A string enumerator with the groups
* @throws JIException
* @throws IllegalArgumentException
* @throws UnknownHostException
*/
public EnumString getGroups ( final OPCENUMSCOPE scope ) throws JIException, IllegalArgumentException, UnknownHostException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 5 );
callObject.addInParamAsShort ( (short)scope.id (), JIFlags.FLAG_NULL );
callObject.addInParamAsUUID ( org.openscada.opc.dcom.common.Constants.IEnumString_IID, JIFlags.FLAG_NULL );
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
return new EnumString ( (IJIComObject)result[0] );
}
public OPCItemProperties getItemPropertiesService ()
{
try
{
return new OPCItemProperties ( getCOMObject () );
}
catch ( Exception e )
{
return null;
}
}
public OPCItemIO getItemIOService ()
{
try
{
return new OPCItemIO ( getCOMObject () );
}
catch ( Exception e )
{
return null;
}
}
/**
* Get the browser object (<code>IOPCBrowseServerAddressSpace</code>) from the server instance
* @return the browser object
*/
public OPCBrowseServerAddressSpace getBrowser ()
{
try
{
return new OPCBrowseServerAddressSpace ( getCOMObject () );
}
catch ( Exception e )
{
return null;
}
}
/**
* Get the common interface if supported
* @return the common interface or <code>null</code> if it is not supported
*/
public OPCCommon getCommon ()
{
try
{
return new OPCCommon ( getCOMObject () );
}
catch ( Exception e )
{
return null;
}
}
}
@@ -0,0 +1,113 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.da.impl;
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.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIStruct;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.dcom.common.KeyedResult;
import org.openscada.opc.dcom.common.KeyedResultSet;
import org.openscada.opc.dcom.common.Result;
import org.openscada.opc.dcom.common.ResultSet;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.common.impl.Helper;
import org.openscada.opc.dcom.da.Constants;
import org.openscada.opc.dcom.da.OPCDATASOURCE;
import org.openscada.opc.dcom.da.OPCITEMSTATE;
import org.openscada.opc.dcom.da.WriteRequest;
public class OPCSyncIO extends BaseCOMObject
{
public OPCSyncIO ( final IJIComObject opcSyncIO ) throws JIException
{
super ( opcSyncIO.queryInterface ( Constants.IOPCSyncIO_IID ) );
}
public KeyedResultSet<Integer, OPCITEMSTATE> read ( final OPCDATASOURCE source, final Integer... serverHandles ) throws JIException
{
if ( serverHandles == null || serverHandles.length == 0 )
{
return new KeyedResultSet<Integer, OPCITEMSTATE> ();
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
callObject.addInParamAsShort ( (short)source.id (), JIFlags.FLAG_NULL );
callObject.addInParamAsInt ( serverHandles.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( serverHandles, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( OPCITEMSTATE.getStruct (), null, 1, true ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
KeyedResultSet<Integer, OPCITEMSTATE> results = new KeyedResultSet<Integer, OPCITEMSTATE> ();
JIStruct[] states = (JIStruct[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[1] ).getReferent () ).getArrayInstance ();
for ( int i = 0; i < serverHandles.length; i++ )
{
results.add ( new KeyedResult<Integer, OPCITEMSTATE> ( serverHandles[i], OPCITEMSTATE.fromStruct ( states[i] ), errorCodes[i] ) );
}
return results;
}
public ResultSet<WriteRequest> write ( final WriteRequest... requests ) throws JIException
{
if ( requests.length == 0 )
{
return new ResultSet<WriteRequest> ();
}
Integer[] items = new Integer[requests.length];
JIVariant[] values = new JIVariant[requests.length];
for ( int i = 0; i < requests.length; i++ )
{
items[i] = requests[i].getServerHandle ();
values[i] = Helper.fixVariant ( requests[i].getValue () );
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsInt ( requests.length, JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( items, true ), JIFlags.FLAG_NULL );
callObject.addInParamAsArray ( new JIArray ( values, true ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIArray ( Integer.class, null, 1, true ) ), JIFlags.FLAG_NULL );
Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
Integer[] errorCodes = (Integer[]) ( (JIArray) ( (JIPointer)result[0] ).getReferent () ).getArrayInstance ();
ResultSet<WriteRequest> results = new ResultSet<WriteRequest> ();
for ( int i = 0; i < requests.length; i++ )
{
results.add ( new Result<WriteRequest> ( requests[i], errorCodes[i] ) );
}
return results;
}
}
@@ -0,0 +1,64 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.list;
/**
* Details about an OPC server class
* @author Jens Reimann &lt;jens.reimann@th4-systems.com&gt;
* @since 0.1.8
*/
public class ClassDetails
{
private String _clsId;
private String _progId;
private String _description;
public String getClsId ()
{
return this._clsId;
}
public void setClsId ( final String clsId )
{
this._clsId = clsId;
}
public String getDescription ()
{
return this._description;
}
public void setDescription ( final String description )
{
this._description = description;
}
public String getProgId ()
{
return this._progId;
}
public void setProgId ( final String progId )
{
this._progId = progId;
}
}
@@ -0,0 +1,27 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.list;
public interface Constants extends org.openscada.opc.dcom.common.Constants
{
public static final String IOPCServerList_IID = "13486D50-4821-11D2-A494-3CB306C10000";
public static final String OPCServerList_CLSID = "13486D51-4821-11D2-A494-3CB306C10000";
}
@@ -0,0 +1,168 @@
/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.opc.dcom.list.impl;
import java.net.UnknownHostException;
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.JIClsid;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JIPointer;
import org.jinterop.dcom.core.JIString;
import org.openscada.opc.dcom.common.impl.BaseCOMObject;
import org.openscada.opc.dcom.common.impl.EnumGUID;
import org.openscada.opc.dcom.common.impl.Helper;
import org.openscada.opc.dcom.list.ClassDetails;
import org.openscada.opc.dcom.list.Constants;
import rpc.core.UUID;
/**
* This class implements the IOPCServerList (aka OPCEnum) service.
* @author Jens Reimann &lt;jens.reimann@th4-systems.com&gt;
*
*/
public class OPCServerList extends BaseCOMObject
{
public OPCServerList ( final IJIComObject listObject ) throws JIException
{
super ( listObject.queryInterface ( Constants.IOPCServerList_IID ) );
}
public JIClsid getCLSIDFromProgID ( final String progId ) throws JIException
{
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 2 );
callObject.addInParamAsString ( progId, JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR );
callObject.addOutParamAsType ( UUID.class, JIFlags.FLAG_NULL );
try
{
Object[] result = getCOMObject ().call ( callObject );
return JIClsid.valueOf ( ( (UUID)result[0] ).toString () );
}
catch ( JIException e )
{
if ( e.getErrorCode () == 0x800401F3 )
{
return null;
}
throw e;
}
}
/**
* Return details about a serve class
* @param clsId A server class
* @throws JIException
*/
public ClassDetails getClassDetails ( final JIClsid clsId ) throws JIException
{
if ( clsId == null )
{
return null;
}
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 1 );
callObject.addInParamAsUUID ( clsId.getCLSID (), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), JIFlags.FLAG_NULL );
callObject.addOutParamAsObject ( new JIPointer ( new JIString ( JIFlags.FLAG_REPRESENTATION_STRING_LPWSTR ) ), JIFlags.FLAG_NULL );
Object[] result = Helper.callRespectSFALSE ( getCOMObject (), callObject );
ClassDetails cd = new ClassDetails ();
cd.setClsId ( clsId.getCLSID () );
cd.setProgId ( ( (JIString) ( (JIPointer)result[0] ).getReferent () ).getString () );
cd.setDescription ( ( (JIString) ( (JIPointer)result[1] ).getReferent () ).getString () );
return cd;
}
/*
HRESULT EnumClassesOfCategories(
[in] ULONG cImplemented,
[in,size_is(cImplemented)] CATID rgcatidImpl[],
[in] ULONG cRequired,
[in,size_is(cRequired)] CATID rgcatidReq[],
[out] IEnumGUID ** ppenumClsid
);
*/
public EnumGUID enumClassesOfCategories ( final String[] implemented, final String[] required ) throws IllegalArgumentException, UnknownHostException, JIException
{
UUID[] u1 = new UUID[implemented.length];
UUID[] u2 = new UUID[required.length];
for ( int i = 0; i < implemented.length; i++ )
{
u1[i] = new UUID ( implemented[i] );
}
for ( int i = 0; i < required.length; i++ )
{
u2[i] = new UUID ( required[i] );
}
return enumClassesOfCategories ( u1, u2 );
}
public EnumGUID enumClassesOfCategories ( final UUID[] implemented, final UUID[] required ) throws IllegalArgumentException, UnknownHostException, JIException
{
// ** CALL
JICallBuilder callObject = new JICallBuilder ( true );
callObject.setOpnum ( 0 );
// ** IN
callObject.addInParamAsInt ( implemented.length, JIFlags.FLAG_NULL );
if ( implemented.length == 0 )
{
callObject.addInParamAsPointer ( new JIPointer ( null ), JIFlags.FLAG_NULL );
}
else
{
callObject.addInParamAsArray ( new JIArray ( implemented, true ), JIFlags.FLAG_NULL );
}
callObject.addInParamAsInt ( required.length, JIFlags.FLAG_NULL );
if ( required.length == 0 )
{
callObject.addInParamAsPointer ( new JIPointer ( null ), JIFlags.FLAG_NULL );
}
else
{
callObject.addInParamAsArray ( new JIArray ( required, true ), JIFlags.FLAG_NULL );
}
// ** OUT
callObject.addOutParamAsType ( IJIComObject.class, JIFlags.FLAG_NULL );
// ** RESULT
Object result[] = Helper.callRespectSFALSE ( getCOMObject (), callObject );
return new EnumGUID ( (IJIComObject)result[0] );
}
}
@@ -0,0 +1,13 @@
#progId Vs ClsidDB
#Tue Nov 28 21:56:16 IST 2006
Word.Application=000209ff-0000-0000-c000-000000000046
TestCOM123.TestServer2=92a065a9-106a-4cc3-8d67-43e3a1e73df3
SYSINFO.SysInfo=6fba474b-43ac-11ce-9a0e-00aa0062bb4c
ADODB.Connection=00000514-0000-0010-8000-00aa006d2ea4
TestJavaServer.TestServer2=617d5a31-a3bf-440f-a58f-1f57f6ac7527
TestJavaServer.TestServer1=56bad610-0fcb-418a-b25e-174159a4adce
InternetExplorer.Application=0002df01-0000-0000-c000-000000000046
Excel.Application=00024500-0000-0000-c000-000000000046
StdCollection.VBCollection=4b738074-ea47-11d2-b25a-00105a022091
WbemScripting.SWbemLocator=76a64158-cb41-11d1-8b02-00600806d9b6
PowerPoint.Application=91493441-5a91-11cf-8700-00aa0060263b