株式会社セック 池添様
お世話になっております。
栗原です。
ご連絡頂き、誠に有難うございます。
> CORBAのプログラミング作法的に _narrow せずにCORBAメソッドを
> 呼び出しても問題ないものなのでしょうか?
いえ、基本的には_narrowする必要がございます。
ただ、IORをstring_to_object()にてCORBAオブジェクトへ変換した
場合は、_narrowしなくてもCORBA呼び出しが可能な場合もあるようです。
以下URLの「Narrowing object references」を参照下さい。
http://ports.gnu-darwin.org/devel/py-omniorb/work/omniORBpy-3.1/doc/omniORBpy.pdf
ただし、今回の場合は、単純に_narrowし忘れでして、たまたまC++,
Java,Python間では問題になっていなかっただけの事ですので、
_narrowするように修正致します。
修正しましたら、再度ご連絡させて頂きます。
ご迷惑をお掛け致しまして申し訳ございません。
宜しくお願い致します。
On Thu, 17 Jun 2010 11:30:32 +0900
池添明宏 wrote:
> セックの池添です。
> # 連投、申し訳ありません。
>
> 私はOpenRTM.NETというRTミドルウェア実装を開発しているのですが、
> OpenRTM-aist-Python-1.0.0-RELEASEとのデータポートの連携に
> おいて問題が発生しております。
>
> OpenRTM-aist-Python-1.0.0-RELEASEのOutPortと、OpenRTM.NETのInPort
> を接続しデータを送信すると、接続が切れてしまいます。
> InPortCorbaCdrConsumer.pyのputメソッドの実装は下記のようになって
> いるのですが、self._ptr()を_narrowしていないため、self._ptr().put()
> の呼び出しに失敗してしまいます。
>
> def put(self, data):
> self._rtcout.RTC_PARANOID("put()")
>
> try:
> if self._ptr():
> return self.convertReturnCode(self._ptr().put(data))
> return self.CONNECTION_LOST
> except:
> self._rtcout.RTC_ERROR(sys.exc_info()[0])
> return self.CONNECTION_LOST
>
> return self.UNKNOWN_ERROR
>
>
> これを下記のように _narrow するように変更すれば、OpenRTM.NETとの
> 連携が可能になります。
> (この変更を加えても、C++版、Python版との連携に問題はありません)
>
> def put(self, data):
> self._rtcout.RTC_PARANOID("put()")
>
> try:
> if self._ptr():
> ptr = self._ptr()
> inportcdr = ptr._narrow(OpenRTM__POA.InPortCdr)
> return self.convertReturnCode(inportcdr.put(data))
> return self.CONNECTION_LOST
> except:
> self._rtcout.RTC_ERROR(sys.exc_info()[0])
> return self.CONNECTION_LOST
>
> return self.UNKNOWN_ERROR
>
>
> CORBAのプログラミング作法的に _narrow せずにCORBAメソッドを
> 呼び出しても問題ないものなのでしょうか?
> OpenRTM.NETの実装の方に問題があるのかもしれませんので、
> ご見解をお聞かせください。
>
> ちなみに、C++版では_narrow、 Java版ではcastTypeをして型を定めているので、
> Python版のような問題は発生しません。
>
> よろしくお願いいたします。
>
> 以上
>
セックの池添です。
# 連投、申し訳ありません。
私はOpenRTM.NETというRTミドルウェア実装を開発しているのですが、
OpenRTM-aist-Python-1.0.0-RELEASEとのデータポートの連携に
おいて問題が発生しております。
OpenRTM-aist-Python-1.0.0-RELEASEのOutPortと、OpenRTM.NETのInPort
を接続しデータを送信すると、接続が切れてしまいます。
InPortCorbaCdrConsumer.pyのputメソッドの実装は下記のようになって
いるのですが、self._ptr()を_narrowしていないため、self._ptr().put()
の呼び出しに失敗してしまいます。
def put(self, data):
self._rtcout.RTC_PARANOID("put()")
try:
if self._ptr():
return self.convertReturnCode(self._ptr().put(data))
return self.CONNECTION_LOST
except:
self._rtcout.RTC_ERROR(sys.exc_info()[0])
return self.CONNECTION_LOST
return self.UNKNOWN_ERROR
これを下記のように _narrow するように変更すれば、OpenRTM.NETとの
連携が可能になります。
(この変更を加えても、C++版、Python版との連携に問題はありません)
def put(self, data):
self._rtcout.RTC_PARANOID("put()")
try:
if self._ptr():
ptr = self._ptr()
inportcdr = ptr._narrow(OpenRTM__POA.InPortCdr)
return self.convertReturnCode(inportcdr.put(data))
return self.CONNECTION_LOST
except:
self._rtcout.RTC_ERROR(sys.exc_info()[0])
return self.CONNECTION_LOST
return self.UNKNOWN_ERROR
CORBAのプログラミング作法的に _narrow せずにCORBAメソッドを
呼び出しても問題ないものなのでしょうか?
OpenRTM.NETの実装の方に問題があるのかもしれませんので、
ご見解をお聞かせください。
ちなみに、C++版では_narrow、 Java版ではcastTypeをして型を定めているので、
Python版のような問題は発生しません。
よろしくお願いいたします。
以上