[openrtm-commit:01745] r767 - trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port

openrtm @ openrtm.org openrtm @ openrtm.org
2016年 2月 22日 (月) 22:24:37 JST


Author: win-ei
Date: 2016-02-22 22:24:37 +0900 (Mon, 22 Feb 2016)
New Revision: 767

Added:
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java
Log:
Direct data put mode has been implemented as a new interface_type=direct. Callbacks have been implemented.

Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java	                        (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java	2016-02-22 13:24:37 UTC (rev 767)
@@ -0,0 +1,26 @@
+package jp.go.aist.rtm.RTC.port;
+
+  /**
+   * {@.ja ConnectorDataListenerArgumentDataRef クラス}
+   * {@.en ConnectorDataListenerArgumentDataRef class}
+   *
+   *
+   */
+public class ConnectorDataListenerArgumentDataRef<DataType> {
+    /**
+     * {@.ja コンストラクタ}
+     * {@.en Constructor}
+     *
+     */
+    public ConnectorDataListenerArgumentDataRef(ConnectorBase.ConnectorInfo info,
+                                         DataType data){
+        m_info = info; 
+        m_data = data;
+    }
+    public ConnectorBase.ConnectorInfo m_info; 
+    public DataType m_data;
+}
+
+
+
+

Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java	                        (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java	2016-02-22 13:24:37 UTC (rev 767)
@@ -0,0 +1,439 @@
+package jp.go.aist.rtm.RTC.port;
+
+import jp.go.aist.rtm.RTC.InPortConsumerFactory;
+import jp.go.aist.rtm.RTC.ObjectCreator;
+import jp.go.aist.rtm.RTC.ObjectDestructor;
+import jp.go.aist.rtm.RTC.log.Logbuf;
+//import jp.go.aist.rtm.RTC.util.NVUtil;
+//import jp.go.aist.rtm.RTC.util.ORBUtil;
+import jp.go.aist.rtm.RTC.util.Properties;
+
+//import org.omg.CORBA.BAD_OPERATION;
+//import org.omg.CORBA.TCKind;
+import org.omg.CORBA.portable.OutputStream;
+
+import _SDOPackage.NVListHolder;
+
+/**
+ * {@.ja InPortDirectConsumer クラス}
+ * {@.en InPortDirectConsumer class}
+ * <p>
+ * {@.ja データ転送に CORBA の OpenRTM::InPortCdr インターフェースを利用し
+ * た、push 型データフロー型を実現する InPort コンシューマクラス。}
+ * {@.en This is an implementation class of the input port Consumer  </p>
+ * that uses CORBA for means of communication. </p>
+ * The InPort consumer class which uses the OpenRTM::InPortCdr
+ * interface in CORBA for data transfer and realizes a push-type
+ * dataflow.}
+ */
+
+public class InPortDirectConsumer implements InPortConsumer, ObjectCreator<InPortConsumer>, ObjectDestructor {
+    /**
+     * {@.ja コンストラクタ}
+     * {@.en Constructor}
+     * <p>
+     * {@.en buffer 当該コンシューマに割り当てるバッファオブジェクト}
+     * {@.en buffer The buffer object that is attached to this Consumer}
+     *
+     */
+    public InPortDirectConsumer() {
+        //super(OpenRTM.InPortCdr.class);
+        rtcout = new Logbuf("InPortDirectConsumer");
+        //m_orb = ORBUtil.getOrb();
+    }
+    /**
+     * {@.ja 設定初期化}
+     * {@.en Initializing configuration}
+     * <p>
+     * {@.ja InPortConsumerの各種設定を行う。実装クラスでは、与えられた
+     * Propertiesから必要な情報を取得して各種設定を行う。この init() 関
+     * 数は、InPortProvider生成直後および、接続時にそれぞれ呼ばれる可
+     * 能性がある。したがって、この関数は複数回呼ばれることを想定して記
+     * 述されるべきである。}
+     * {@.en This operation would be called to configure in initialization.
+     * In the concrete class, configuration should be performed
+     * getting appropriate information from the given Properties data.
+     * This function might be called right after instantiation and
+     * connection sequence respectivly.  Therefore, this function
+     * should be implemented assuming multiple call.}
+     * 
+     * @param prop 
+     *   {@.ja 設定情報}
+     *   {@.en Configuration information}
+     */
+    public void init(Properties prop) {
+        m_properties = prop;
+    }
+
+    /**
+     * <p> Send data to the destination port </p>
+     * <p> Pure virtual function to send data to the destination port. </p>
+     *
+     */
+    /**
+     * {@.ja 接続先へのデータ送信}
+     * {@.en Send data to the destination port}
+     * <p>
+     * {@.ja 接続先のポートへデータを送信するための純粋仮想関数。
+     * 
+     * この関数は、以下のリターンコードを返す。
+     * <ul>
+     * <li>- PORT_OK:     正常終了。
+     * <li>- PORT_ERROR:  データ送信の過程で何らかのエラーが発生した。
+     * <li>- SEND_FULL:   データを送信したが、相手側バッファがフルだった。
+     * <li>- SEND_TIMEOUT:データを送信したが、相手側バッファがタイムアウトした。
+     * <li>- UNKNOWN_ERROR:原因不明のエラー</ul>}
+     * {@.en Pure virtual function to send data to the destination port.
+     *
+     * This function might the following return codes
+     * <ul>
+     * <li>- PORT_OK:       Normal return
+     * <li>- PORT_ERROR:    Error occurred in data transfer process
+     * <li>- SEND_FULL:     Buffer full although OutPort tried to send data
+     * <li>- SEND_TIMEOUT:  Timeout although OutPort tried to send data
+     * <li>- UNKNOWN_ERROR: Unknown error</ul>}
+     *
+     * @param data 
+     *   {@.ja 送信するデータ}
+     *   {@.en Data sent by this operation.}
+     * @return 
+     *   {@.ja リターンコード}
+     *   {@.en ReturnCode}
+     */
+    public ReturnCode put(final OutputStream data) {
+        rtcout.println(Logbuf.PARANOID, "put(): never called.");
+        
+        return ReturnCode.UNKNOWN_ERROR;
+    }
+    /**
+     * {@.ja InterfaceProfile情報を公開する}
+     * {@.en Publish InterfaceProfile information}
+     * <p>
+     * {@.ja InterfaceProfile情報を公開する。
+     * 引数で指定するプロパティ情報内の NameValue オブジェクトの
+     * dataport.interface_type 値を調べ、当該ポートに設定されている
+     * インターフェースタイプと一致する場合のみ情報を取得する。}
+     * {@.en Publish interfaceProfile information.
+     * Check the dataport.interface_type value of the NameValue object 
+     * specified by an argument in property information and get information
+     * only when the interface type of the specified port is matched.}
+     *
+     * @param properties 
+     *   {@.ja InterfaceProfile情報を受け取るプロパティ}
+     *   {@.en Properties to get InterfaceProfile information}
+     */
+    public void publishInterfaceProfile(NVListHolder properties) {
+        return;
+    }
+    /**
+     * {@.ja データ送信通知への登録}
+     * {@.en Subscribe to the data sending notification}
+     * <p>
+     * {@.ja 指定されたプロパティに基づいて、データ送出通知の受け取り
+     * に登録する。}
+     * {@.en Subscribe to the data sending notification based on specified 
+     * property information.}
+     *
+     * @param properties 
+     *   {@.ja 登録情報}
+     *   {@.en Information for subscription}
+     *
+     * @return 
+     *   {@.ja 登録処理結果(登録成功:true、登録失敗:false)}
+     *   {@.en Subscription result (Successful:true, Failed:false)}
+     */
+    public boolean subscribeInterface(final NVListHolder properties) {
+        rtcout.println(Logbuf.TRACE, "subscribeInterface(): do nothing");
+        return true; 
+    }
+    
+    /**
+     * {@.ja データ送信通知からの登録解除}
+     * {@.en Unsubscribe the data send notification}
+     * <p>
+     * {@.ja データ送出通知の受け取りから登録を解除する。}
+     * {@.en Unsubscribe the data send notification.}
+     *
+     * @param properties 
+     *   {@.ja 登録解除情報}
+     *   {@.en Information for unsubscription}
+     */
+    public void unsubscribeInterface(final NVListHolder properties) {
+        rtcout.println(Logbuf.TRACE, "unsubscribeInterface(): do nothing");
+    }
+
+    /**
+     * {@.ja IOR文字列からオブジェクト参照を取得する}
+     * {@.en Getting object reference fromn IOR string}
+     * @param properties 
+     *   {@.ja Information for subscription}
+     *   {@.en Information for subscription}
+     *
+     * @return 
+     *   {@.ja true: 正常取得, false: 取得失敗}
+     *   {@.en true: succeeded, false: failed}
+     */
+/*
+    private boolean subscribeFromIor(final NVListHolder properties) {
+        rtcout.println(Logbuf.TRACE, "subscribeFromIor()");
+    
+        int index;
+        index = NVUtil.find_index(properties,
+                               "dataport.corba_cdr.inport_ior");
+        if (index < 0) {
+            rtcout.println(Logbuf.ERROR, "inport_ior not found");
+            return false;
+        }
+        rtcout.println(Logbuf.DEBUG, "index:"+index);
+    
+        final String ior;
+
+        try {
+            rtcout.println(Logbuf.DEBUG, 
+                            "type:"+properties.value[index].value.type());
+            if( properties.value[index].value.type().kind() == 
+                TCKind.tk_wstring ) {
+                ior = properties.value[index].value.extract_wstring();
+            } else {
+                ior = properties.value[index].value.extract_string();
+            }
+        }
+        catch(BAD_OPERATION e) {
+            rtcout.println(Logbuf.ERROR, "inport_ior has no string");
+            return false;
+        }
+    
+        ORB orb = ORBUtil.getOrb();
+        org.omg.CORBA.Object obj = orb.string_to_object(ior);
+    
+        if (obj==null) {
+            rtcout.println(Logbuf.ERROR, "invalid IOR string has been passed");
+            return false;
+        }
+    
+        if (!super.setObject(obj)) {
+            rtcout.println(Logbuf.WARN, "Setting object to consumer failed.");
+            return false;
+        }
+        return true;
+    }
+*/
+    /**
+     * {@.ja Anyから直接オブジェクト参照を取得する}
+     * {@.en Getting object reference fromn Any directry}
+     * @param properties 
+     *   {@.ja Information for subscription}
+     *   {@.en Information for subscription}
+     * @return 
+     *   {@.ja true: 正常取得, false: 取得失敗}
+     *   {@.en true: succeeded, false: failed}
+     *
+     */
+/*
+    private boolean subscribeFromRef(final NVListHolder properties) {
+        rtcout.println(Logbuf.TRACE, "subscribeFromRef()");
+        int index;
+        index = NVUtil.find_index(properties,
+                                   "dataport.corba_cdr.inport_ref");
+        if (index < 0) {
+            rtcout.println(Logbuf.ERROR, "inport_ref not found");
+            return false;
+        }
+    
+        org.omg.CORBA.Object obj;
+        try {
+            obj = properties.value[index].value.extract_Object();
+        }
+        catch(BAD_OPERATION e){
+            rtcout.println(Logbuf.ERROR, "prop[inport_ref] is not objref");
+            return true;
+        }
+    
+        if (obj==null) {
+            rtcout.println(Logbuf.ERROR, "prop[inport_ref] is not objref");
+            return false;
+        }
+    
+        if (!super.setObject(obj)) {
+            rtcout.println(Logbuf.ERROR, "Setting object to consumer failed.");
+            return false;
+        }
+        return true;
+    }
+*/
+    /**
+     * {@.ja 接続解除(IOR版)}
+     * {@.en ubsubscribing (IOR version)}
+     *
+     * @param properties 
+     *   {@.ja Information for unsubscription}
+     *   {@.en Information for unsubscription}
+     *
+     * @return 
+     *   {@.ja true: 正常取得, false: 取得失敗}
+     *   {@.en true: succeeded, false: failed}
+     */
+/*
+    private boolean unsubscribeFromIor(final NVListHolder properties) {
+        rtcout.println(Logbuf.TRACE, "unsubscribeFromIor()");
+        int index;
+        index = NVUtil.find_index(properties,
+                                   "dataport.corba_cdr.inport_ior");
+        if (index < 0) {
+            rtcout.println(Logbuf.ERROR, "inport_ior not found");
+            return false;
+        }
+    
+        final String ior;
+        try {
+            if( properties.value[index].value.type().kind() == 
+                TCKind.tk_wstring ) {
+                ior = properties.value[index].value.extract_wstring();
+            } else {
+                ior = properties.value[index].value.extract_string();
+            }
+        }
+        catch(BAD_OPERATION e) {
+            rtcout.println(Logbuf.ERROR, "inport_ior has no string");
+            return false;
+        }
+    
+        ORB orb = ORBUtil.getOrb();
+        org.omg.CORBA.Object var = orb.string_to_object(ior);
+        if (!(_ptr()._is_equivalent(var))) {
+            rtcout.println(Logbuf.ERROR, "connector property inconsistency");
+            return false;
+        }
+    
+        releaseObject();
+        return true;
+    }
+*/
+    /**
+     * {@.ja 接続解除(Object reference版)}
+     * {@.en ubsubscribing (Object reference version)}
+     *
+     * @param properties 
+     *   {@.ja Information for unsubscription}
+     *   {@.en Information for unsubscription}
+     * @return 
+     *   {@.ja true: 正常取得, false: 取得失敗}
+     *   {@.en true: succeeded, false: failed}
+     */
+/*
+    private boolean unsubscribeFromRef(final NVListHolder properties) {
+        rtcout.println(Logbuf.TRACE, "unsubscribeFromRef()");
+        int index;
+        index = NVUtil.find_index(properties,
+                                   "dataport.corba_cdr.inport_ref");
+        if (index < 0) { 
+            return false; 
+        }
+    
+        org.omg.CORBA.Object obj;
+        try {
+            obj = properties.value[index].value.extract_Object();
+        }
+        catch(BAD_OPERATION e){
+            rtcout.println(Logbuf.ERROR, "prop[inport_ref] is not objref");
+            return false;
+        }
+    
+        if (!(_ptr()._is_equivalent(obj))) {
+            rtcout.println(Logbuf.ERROR, "connector property inconsistency");
+            return false;
+        }
+        
+        releaseObject();
+        return true;
+    }
+*/
+    /**
+     * {@.ja PortStatusをReturnCodeに変換する。}
+     * {@.en Converts PortStatus into ReturnCode.}
+     * 
+     * @param status
+     *   {@.ja PortStatus}
+     *   {@.en PortStatus}
+     * @return
+     *   {@.ja ReturnCode}
+     *   {@.en ReturnCode}
+     */
+    protected ReturnCode convertReturn(OpenRTM.PortStatus status) {
+        switch (status.value()) {
+            case 0:
+                return ReturnCode.PORT_OK;
+            case 1:
+                return ReturnCode.PORT_ERROR;
+            case 2:
+                return ReturnCode.BUFFER_FULL;
+            case 3:
+                return ReturnCode.BUFFER_EMPTY;
+            case 4:
+                return ReturnCode.BUFFER_TIMEOUT;
+            default:
+                return ReturnCode.UNKNOWN_ERROR;
+        }
+    }
+    
+    /**
+     * {@.ja InPortDirectConsumer を生成する}
+     * {@.en Creats InPortDirectConsumer}
+     * 
+     * @return 
+     *   {@.ja 生成されたInPortConsumer}
+     *   {@.en Object Created instances}
+     *
+     *
+     */
+    public InPortConsumer creator_() {
+        return new InPortDirectConsumer();
+    }
+    /**
+     * {@.ja Object を破棄する}
+     * {@.en Destructs Object}
+     * 
+     * @param obj
+     *   {@.ja 破棄するインタスタンス}
+     *   {@.en The target instances for destruction}
+     *
+     */
+    public void destructor_(Object obj) {
+        obj = null;
+    }
+    /**
+     * {@.ja モジュール初期化関数}
+     * {@.en Module initialization}
+     * <p>
+     * {@.ja InPortDirectConsumer のファクトリを登録する初期化関数。}
+     * {@.en This initialization function registers InPortDirectConsumer's 
+     * factory.}
+     */
+    public static void InPortDirectConsumerInit() {
+        final InPortConsumerFactory<InPortConsumer,String> factory 
+            = InPortConsumerFactory.instance();
+
+        factory.addFactory("direct",
+                    new InPortDirectConsumer(),
+                    new InPortDirectConsumer());
+    
+    }
+    /**
+     * {@.ja Connectorを設定する。}
+     * {@.en set Connector}
+     *
+     * @param connector 
+     *   {@.ja OutPortConnector}
+     *   {@.en OutPortConnector}
+     */
+    public void setConnector(OutPortConnector connector) {
+        m_connector = connector;
+    }
+
+    private Logbuf rtcout;
+    private Properties m_properties;
+    private OutPortConnector m_connector;
+//    private ORB m_orb;
+
+}
+

Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java	                        (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java	2016-02-22 13:24:37 UTC (rev 767)
@@ -0,0 +1,631 @@
+package jp.go.aist.rtm.RTC.port;
+
+import jp.go.aist.rtm.RTC.InPortProviderFactory;
+import jp.go.aist.rtm.RTC.ObjectCreator;
+import jp.go.aist.rtm.RTC.ObjectDestructor;
+import jp.go.aist.rtm.RTC.buffer.BufferBase;
+import jp.go.aist.rtm.RTC.log.Logbuf;
+//import jp.go.aist.rtm.RTC.util.CORBA_SeqUtil;
+import jp.go.aist.rtm.RTC.util.NVListHolderFactory;
+import jp.go.aist.rtm.RTC.util.NVUtil;
+//import jp.go.aist.rtm.RTC.util.ORBUtil;
+//import jp.go.aist.rtm.RTC.util.POAUtil;
+import jp.go.aist.rtm.RTC.util.Properties;
+
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.portable.OutputStream;
+
+//import OpenRTM.InPortCdrPOA;
+import _SDOPackage.NVListHolder;
+
+
+/**
+ * {@.ja InPortDirectProvider クラス}
+ * {@.en InPortDirectProvider class}
+ * <p>
+ * {@.ja データ転送に CORBA の OpenRTM::InPortCdr インターフェースを利用し
+ * た、push 型データフロー型を実現する InPort プロバイダクラス。}
+ * {@.en This is an implementation class of the input port Provider
+ * that uses CORBA for means of communication.}
+ *
+ *
+ */
+public class InPortDirectProvider implements InPortProvider, ObjectCreator<InPortProvider>, ObjectDestructor {
+    /**
+     * {@.ja コンストラクタ}
+     * {@.en Constructor}
+     *
+     *
+     */
+    public InPortDirectProvider() {
+        m_buffer = null; 
+        rtcout = new Logbuf("InPortDirectProvider");
+        // PortProfile setting
+        setInterfaceType("direct");
+    
+/*
+        // ConnectorProfile setting
+        m_objref = this._this();
+    
+        // set InPort's reference
+        ORB orb = ORBUtil.getOrb();
+        CORBA_SeqUtil.push_back(m_properties,
+                NVUtil.newNVString("dataport.corba_cdr.inport_ior",
+                              orb.object_to_string(m_objref)));
+        CORBA_SeqUtil.push_back(m_properties,
+                NVUtil.newNV("dataport.corba_cdr.inport_ref",
+                              m_objref, OpenRTM.InPortCdr.class ));
+
+        m_orb = ORBUtil.getOrb();
+*/
+
+    }
+    /**
+     * {@.ja 当該OpenRTM.InPortCdrのCORBAオブジェクト参照を取得する。}
+     * {@.en Gets CORBA object referense of this OpenRTM.InPortCdr}
+     * 
+     * @return 
+     *   {@.ja 当該PortのCORBAオブジェクト参照}
+     *   {@.en CORBA object referense of this OpenRTM.InPortCdr}
+     * 
+     */
+/*
+    public OpenRTM.InPortCdr _this() {
+        
+        if (this.m_objref == null) {
+            try {
+                this.m_objref = 
+                        OpenRTM.InPortCdrHelper.narrow(POAUtil.getRef(this));
+            } catch (Exception e) {
+                rtcout.println(Logbuf.WARN, "The exception was caught.");
+                throw new IllegalStateException(e);
+            }
+        }
+        
+        return this.m_objref;
+    }
+*/
+    /**
+     * {@.ja 設定初期化}
+     * {@.en Initializing configuration}
+     * <p>
+     * {@.ja InPortDirectProvider の各種設定を行う。与えられた
+     * Propertiesから必要な情報を取得して各種設定を行う。この init() 関
+     * 数は、InPortProvider生成直後および、接続時にそれぞれ呼ばれる可
+     * 能性がある。したがって、この関数は複数回呼ばれることを想定して記
+     * 述されるべきである。}
+     * {@.en This operation would be called to configure in initialization.
+     * In the concrete class, configuration should be performed
+     * getting appropriate information from the given Properties data.
+     * This function might be called right after instantiation and
+     * connection sequence respectivly.  Therefore, this function
+     * should be implemented assuming multiple call.}
+     * 
+     * @param prop 
+     *   {@.ja 設定情報}
+     *   {@.en Configuration information}
+     */
+    public void init(Properties prop){
+    }
+    /**
+     * {@.ja バッファをセットする}
+     * {@.en Setting outside buffer's pointer}
+     * <p>
+     * {@.ja OutPortProvider がデータを取り出すバッファをセットする。
+     * すでにセットされたバッファがある場合、以前のバッファへの
+     * ポインタに対して上書きされる。
+     * OutPortProviderはバッファの所有権を仮定していないので、
+     * バッファの削除はユーザの責任で行わなければならない。}
+     * {@.en A pointer to a buffer from which OutPortProvider retrieve data.
+     * If already buffer is set, previous buffer's pointer will be
+     * overwritten by the given pointer to a buffer.  Since
+     * OutPortProvider does not assume ownership of the buffer
+     * pointer, destructor of the buffer should be done by user.}
+     *
+     * @param buffer 
+     *   {@.ja OutPortProviderがデータを取り出すバッファへのポインタ}
+     *   {@.en A pointer to a data buffer to be used by OutPortProvider}
+     */
+    public void setBuffer(BufferBase<OutputStream> buffer) {
+        m_buffer = buffer;
+    }
+
+    /**
+     * {@.ja [CORBA interface] バッファにデータを書き込む}
+     * {@.en [CORBA interface] Write data into the buffer}
+     *
+     * <p>
+     * {@.ja 設定されたバッファにデータを書き込む。}
+     * {@.en Write data into the specified buffer.}
+     * </p>
+     *
+     * @param data 
+     *   {@.ja 書込対象データ}
+     *   {@.en The target data for writing}
+     *
+     */
+    public OpenRTM.PortStatus put(byte[] data)
+      throws SystemException {
+
+        rtcout.println(Logbuf.PARANOID, "InPortDirectProvider.put()");
+/*
+        if (m_buffer == null) {
+            EncapsOutputStreamExt cdr 
+            = new EncapsOutputStreamExt(m_orb,m_connector.isLittleEndian());
+            cdr.write_octet_array(data, 0, data.length);
+            onReceiverError(cdr);
+            return OpenRTM.PortStatus.PORT_ERROR;
+        }
+
+
+        rtcout.println(Logbuf.PARANOID, "received data size: "+data.length);
+
+
+        EncapsOutputStreamExt cdr 
+            = new EncapsOutputStreamExt(m_orb,m_connector.isLittleEndian());
+        cdr.write_octet_array(data, 0, data.length);
+
+        int len = cdr.getByteArray().length;
+        rtcout.println(Logbuf.PARANOID, "converted CDR data size: "+len);
+        onReceived(cdr);
+        jp.go.aist.rtm.RTC.buffer.ReturnCode ret = m_buffer.write(cdr);
+        return convertReturn(ret,cdr);
+*/
+        return OpenRTM.PortStatus.from_int(
+                                    OpenRTM.PortStatus._UNKNOWN_ERROR);
+    }
+
+    /**
+     * {@.ja [CORBA interface] バッファにデータを書き込む}
+     * {@.en [CORBA interface] Write data into the buffer}
+     * <p>
+     * {@.ja 設定されたバッファにデータを書き込む。}
+     * {@.en Write data into the specified buffer.}
+     *
+     * @param data 
+     *   {@.ja 書込対象データ}
+     *   {@.en The target data for writing}
+     *
+     * @return
+     *   {@.ja ステータス}
+     *   {@.en Prot status}
+     */
+    public OpenRTM.PortStatus put(final OpenRTM.CdrDataHolder data)
+      throws SystemException {
+        return put(data.value);
+
+    }
+    /**
+     * {@.ja リターンコード変換}
+     * {p.en Return codes conversion}
+     *
+     * @param status
+     *   {@.ja ReturnCode}
+     *   {@.en ReturnCode}
+     * @return
+     *   {@.ja PortStatus}
+     *   {@.en PortStatus}
+     */
+    protected OpenRTM.PortStatus 
+    convertReturn(jp.go.aist.rtm.RTC.buffer.ReturnCode status,
+                  final EncapsOutputStreamExt data) {
+        switch (status) {
+            case BUFFER_OK:
+                onBufferWrite(data);
+                return OpenRTM.PortStatus.from_int(OpenRTM.PortStatus._PORT_OK);
+            case BUFFER_ERROR:
+                onReceiverError(data);
+                return OpenRTM.PortStatus.from_int(
+                                            OpenRTM.PortStatus._PORT_ERROR);
+
+            case BUFFER_FULL:
+                onBufferFull(data);
+                onReceiverFull(data);
+                return OpenRTM.PortStatus.from_int(
+                                            OpenRTM.PortStatus._BUFFER_FULL);
+
+            case BUFFER_EMPTY:
+                // never come here
+                return OpenRTM.PortStatus.from_int(
+                                            OpenRTM.PortStatus._BUFFER_EMPTY);
+            case TIMEOUT:
+                onBufferWriteTimeout(data);
+                onReceiverTimeout(data);
+                return OpenRTM.PortStatus.from_int(
+                                            OpenRTM.PortStatus._BUFFER_TIMEOUT);
+            case PRECONDITION_NOT_MET:
+                onReceiverError(data);
+                return OpenRTM.PortStatus.from_int(
+                                            OpenRTM.PortStatus._PORT_ERROR);
+            default:
+                onReceiverError(data);
+                return OpenRTM.PortStatus.from_int(
+                                            OpenRTM.PortStatus._UNKNOWN_ERROR);
+        }
+    }
+
+    private Logbuf rtcout;
+
+    /**
+     * {@.ja InPortDirectProvider を生成する}
+     * {@.en Creats InPortDirectProvider}
+     * 
+     * @return 
+     *   {@.ja 生成されたInPortProvider}
+     *   {@.en Object Created instances}
+     *
+     */
+    public InPortProvider creator_() {
+        return new InPortDirectProvider();
+    }
+    /**
+     * {@.ja InPortDirectProvider を破棄する}
+     * {@.en Destructs InPortDirectProvider}
+     * 
+     * @param obj
+     *   {@.ja 破棄するインタスタンス}
+     *   {@.en The target instances for destruction}
+     *
+     */
+    public void destructor_(Object obj) {
+/*
+        try{
+            byte[] oid 
+                = _default_POA().servant_to_id((InPortDirectProvider)obj);
+            _default_POA().deactivate_object(oid);
+        }
+        catch(Exception e){
+            e.printStackTrace();
+        } 
+*/
+        obj = null;
+    }
+
+    /**
+     * {@.ja モジュール初期化関数}
+     * {@.en Module initialization}
+     * <p>
+     * {@.ja InPortCorbaCdrConsumer のファクトリを登録する初期化関数。}
+     * {@.en This initialization function registers InPortCorbaCdrConsumer's 
+     * factory.}
+     */
+    public static void InPortDirectProviderInit() {
+        final InPortProviderFactory<InPortProvider,String> factory 
+            = InPortProviderFactory.instance();
+
+        factory.addFactory("direct",
+                    new InPortDirectProvider(),
+                    new InPortDirectProvider());
+    
+    }
+    /**
+     * <p>InterfaceProfile情報を公開します。</p>
+     * 
+     * @param properties InterfaceProfile情報を受け取るホルダオブジェクト
+     */
+    /**
+     * {@.ja InterfaceProfile情報を公開する}
+     * {@.en Publish InterfaceProfile information}
+     * 
+     * <p>
+     * {@.ja InterfaceProfile情報を公開する。
+     * 引数で指定するプロパティ情報内の NameValue オブジェクトの
+     * dataport.interface_type 値を調べ、当該ポートに設定されている
+     * インターフェースタイプと一致する場合のみ情報を取得する。}
+     * {@.en Publish interfaceProfile information.
+     * Check the dataport.interface_type value of the NameValue object 
+     * specified by an argument in property information and get information
+     * only when the interface type of the specified port is matched.}
+     *
+     * @param properties 
+     *   {@.ja InterfaceProfile情報を受け取るホルダオブジェクト}
+     *   {@.en Holder object to get InterfaceProfile information}
+     *
+     */
+    public void publishInterfaceProfile(NVListHolder properties) {
+
+        NVUtil.appendStringValue(properties, "dataport.interface_type",
+                this.m_interfaceType);
+        NVUtil.append(properties, this.m_properties);
+    }
+    
+    /**
+     * {@.ja Interface情報を公開する}
+     * {@.en Publish interface information}
+     * <p>
+     * {@.ja Interface情報を公開する。引数で指定するプロパティ情報内の
+     * NameValue オブジェクトのdataport.interface_type 値を調べ、当該ポー
+     * トに設定されていなければNameValue に情報を追加する。すでに同一イ
+     * ンターフェースが登録済みの場合は何も行わない。}
+     * {@.en Publish interface information.  Check the
+     * dataport.interface_type value of the NameValue object specified
+     * by an argument in the property information, and add the
+     * information to the NameValue if this port is not specified.
+     * This does not do anything if the same interface is already
+     * subscribed.}
+     *
+     * @param properties 
+     *   {@.ja properties Interface情報を受け取るホルダオブジェクト}
+     *   {@.en Holder object to receive interface information}
+     * @return 
+     *   {@.ja true: 正常終了}
+     *   {@.en true: normal return}
+     */
+    public boolean publishInterface(NVListHolder properties) {
+
+        rtcout.println(Logbuf.TRACE, "publishInterface()");
+        rtcout.println(Logbuf.DEBUG, NVUtil.toString(properties));
+
+
+        if (! NVUtil.isStringValue(properties,
+                "dataport.interface_type",
+                this.m_interfaceType)) {
+            return false;
+        }
+
+        NVUtil.append(properties, this.m_properties);
+        return true;
+
+    }
+
+    /**
+     * {@.ja リスナを設定する。}
+     * {@.en Set the listener.}
+     * 
+     * <p>
+     * {@.ja InPort はデータ送信処理における各種イベントに対して特定のリスナ
+     * オブジェクトをコールするコールバック機構を提供する。詳細は
+     * ConnectorListener.h の ConnectorDataListener, ConnectorListener
+     * 等を参照のこと。InPortDirectProvider では、以下のコールバック
+     * が提供される。}
+     * {@.en InPort provides callback functionality that calls specific
+     * listener objects according to the events in the data publishing
+     * process. For details, see documentation of
+     * ConnectorDataListener class and ConnectorListener class in
+     * ConnectorListener.h. In this InPortDirectProvider provides
+     * the following callbacks.}
+     * <ul>
+     * <li>- ON_BUFFER_WRITE
+     * <li>- ON_BUFFER_FULL
+     * <li>- ON_BUFFER_WRITE_TIMEOUT
+     * <li>- ON_BUFFER_OVERWRITE
+     * <li>- ON_RECEIVED
+     * <li>- ON_RECEIVER_FULL
+     * <li>- ON_RECEIVER_FULL
+     * <li>- ON_RECEIVER_TIMEOUT
+     * <li>- ON_RECEIVER_ERROR </li></ul>
+     * 
+     *
+     * @param info 
+     *   {@.ja 接続情報}
+     *   {@.en Connector information}
+     * @param listeners 
+     *   {@.ja リスナオブジェクト}
+     *   {@.en Listener objects}
+     */
+    public void setListener(ConnectorBase.ConnectorInfo info, 
+                            ConnectorListeners listeners) {
+        m_profile = info;
+        m_listeners = listeners;
+    }
+    /**
+     * {@.ja Connectorを設定する。}
+     * {@.en set Connector}
+     * <p>
+     * {@.ja InPort は接続確立時に InPortConnector オブジェクトを生成し、生
+     * 成したオブジェクトのポインタと共にこの関数を呼び出す。所有権は
+     * InPort が保持するので InPortProvider は InPortConnector を削
+     * 除してはいけない。}
+     * {@.en InPort creates InPortConnector object when it establishes
+     * connection between InPort and InPort, and it calls this
+     * function with a pointer to the connector object. Since the
+     * InPort has the ownership of this connector, InPortProvider
+     * should not delete it.}
+     *
+     * @param connector 
+     *   {@.ja InPortConnector}
+     *   {@.en InPortConnector}
+     */
+    public void setConnector(InPortConnector connector) {
+        m_connector = connector;
+    }
+
+    /**
+     * {@.ja インタフェースプロフィールのデータタイプを設定する。}
+     * {@.en Sets DataType of the interface profile}
+     * 
+     * @param dataType 
+     *   {@.ja データタイプ}
+     *   {@.en dataType} 
+     */
+/*
+    protected void setDataType(final String dataType) {
+        this.m_dataType = dataType;
+    }
+*/    
+    /**
+     * {@.ja インタフェースプロフィールのインタフェースタイプを設定する。}
+     * {@.en Sets interface Type of the interface profile}
+     * 
+     * @param interfaceType 
+     *   {@.ja インタフェースタイプ}
+     *   {@.en Intereface Type}
+     */
+     protected void setInterfaceType(final String interfaceType) {
+        rtcout.println(Logbuf.TRACE, "setInterfaceType("+interfaceType+")");
+        this.m_interfaceType = interfaceType;
+    }
+    
+    /**
+     * {@.ja インタフェースプロフィールのデータフロータイプを設定する。}
+     * {@.en Sets data flow type of the interface profile}
+     * 
+     * @param dataflowType 
+     *   {@.ja データフロータイプ}
+     *   {@.en Data flow type}
+     */
+/*
+    protected void setDataFlowType(final String dataflowType) {
+        rtcout.println(Logbuf.TRACE, "setDataFlowType("+dataflowType+")");
+        this.m_dataflowType = dataflowType;
+    }
+*/  
+    /**
+     * {@.ja インタフェースプロフィールのサブスクリプションタイプを設定する。}
+     * {@.en Sets subscription type of the interface profile}
+     * 
+     * @param subscriptionType 
+     *   {@.ja サブスクリプションタイプ}
+     *   {@.en Subscription type}
+     */
+/*
+    protected void setSubscriptionType(final String subscriptionType) {
+        rtcout.println(Logbuf.TRACE,
+                       "setSubscriptionType("+subscriptionType+")");
+        this.m_subscriptionType = subscriptionType;
+    }
+*/
+
+    /**
+     * <p> Connector data listener functions </p>
+     */
+    /**
+     * {@.ja ON_BUFFER_WRITE のリスナへ通知する。}
+     * {@.en Notify an ON_BUFFER_WRITE event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onBufferWrite(final OutputStream data) {
+        m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_WRITE].notify(m_profile, data);
+    }
+
+    /**
+     * {@.ja ON_BUFFER_FULL のリスナへ通知する。}
+     * {@.en Notify an ON_BUFFER_FULL event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onBufferFull(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_FULL].notify(m_profile, data);
+    }
+
+    /**
+     * {@.ja ON_BUFFER_WRITE_TIMEOUT のリスナへ通知する。} 
+     * {@.en Notify an ON_BUFFER_WRITE_TIMEOUT event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onBufferWriteTimeout(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_WRITE_TIMEOUT].notify(m_profile, data);
+    }
+
+    /**
+     * {@.ja ON_BUFFER_WRITE_OVERWRITE のリスナへ通知する。}
+     * {@.en Notify an ON_BUFFER_WRITE_OVERWRITE event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onBufferWriteOverwrite(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_OVERWRITE].notify(m_profile, data);
+    }
+
+//    private void onBufferRead(final OutputStream data) {
+//      m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_READ].notify(m_profile, data);
+//    }
+
+//    private void onSend(final OutputStream data) {
+//      m_listeners.connectorData_[ConnectorDataListenerType.ON_SEND].notify(m_profile, data);
+//    }
+
+    /**
+     * {@.ja ON_RECEIVED のリスナへ通知する。} 
+     * {@.en Notify an ON_RECEIVED event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onReceived(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVED].notify(m_profile, data);
+    }
+
+    /**
+     * {@.ja ON_RECEIVER_FULL のリスナへ通知する。}
+     * {@.en Notify an ON_RECEIVER_FULL event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onReceiverFull(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVER_FULL].notify(m_profile, data);
+    }
+
+    /**
+     * {@.ja ON_RECEIVER_TIMEOUT のリスナへ通知する。}
+     * {@.en Notify an ON_RECEIVER_TIMEOUT event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onReceiverTimeout(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVER_TIMEOUT].notify(m_profile, data);
+    }
+
+    /**
+     * {@.ja ON_RECEIVER_ERRORのリスナへ通知する。}
+     * {@.en Notify an ON_RECEIVER_ERROR event to listeners}
+     * @param data
+     *   {@.ja OutputStream} 
+     *   {@.en OutputStream} 
+     */
+    private void onReceiverError(final OutputStream data) {
+      m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVER_ERROR].notify(m_profile, data);
+    }
+
+    /**
+     * <p> Connector listener functions </p>
+     */
+//    private void onBufferEmpty() {
+//      m_listeners.connector_[ConnectorDataListenerType.ON_BUFFER_EMPTY].notify(m_profile);
+//    }
+
+//    privaet void onBufferReadTimeout(){
+//      m_listeners.connector_[ConnectorDataListenerType.ON_BUFFER_READ_TIMEOUT].notify(m_profile);
+//    }
+
+//    privaet void onSenderEmpty() {
+//      m_listeners.connector_[ConnectorDataListenerType.ON_SENDER_EMPTY].notify(m_profile);
+//    }
+
+//    privaet void onSenderTimeout() {
+//      m_listeners.connector_[ConnectorDataListenerType.ON_SENDER_TIMEOUT].notify(m_profile);
+//    }
+
+//    private void onSenderError(){
+//      m_listeners.connector_[ConnectorDataListenerType.ON_SENDER_ERROR].notify(m_profile);
+//    }
+
+
+
+    /**
+     * <p>インタフェース情報を保持するオブジェクトです。</p>
+     */
+    protected NVListHolder m_properties = NVListHolderFactory.create();
+
+    private String m_dataType = new String();
+    private String m_interfaceType = new String();
+    private String m_dataflowType = new String();
+    private String m_subscriptionType = new String();
+
+    private BufferBase<OutputStream> m_buffer;
+    private OpenRTM.InPortCdr m_objref;
+
+//    private ORB m_orb;
+    private InPortConnector m_connector;
+    private ConnectorListeners m_listeners;
+    private ConnectorBase.ConnectorInfo m_profile; 
+}



More information about the openrtm-commit mailing list