00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file ConnectorListener.py 00006 # @brief connector listener class 00007 # @date $Date$ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2009 00011 # Noriaki Ando 00012 # Task-intelligence Research Group, 00013 # Intelligent Systems Research Institute, 00014 # National Institute of 00015 # Advanced Industrial Science and Technology (AIST), Japan 00016 # All rights reserved. 00017 00018 from omniORB import * 00019 from omniORB import any 00020 00021 import OpenRTM_aist 00022 00023 00024 ## 00025 # @if jp 00026 # @brief ConnectorDataListener のタイプ 00027 # 00028 # - ON_BUFFER_WRITE: バッファ書き込み時 00029 # - ON_BUFFER_FULL: バッファフル時 00030 # - ON_BUFFER_WRITE_TIMEOUT: バッファ書き込みタイムアウト時 00031 # - ON_BUFFER_OVERWRITE: バッファ上書き時 00032 # - ON_BUFFER_READ: バッファ読み出し時 00033 # - ON_SEND: InProtへの送信時 00034 # - ON_RECEIVED: InProtへの送信完了時 00035 # - ON_RECEIVER_FULL: InProt側バッファフル時 00036 # - ON_RECEIVER_TIMEOUT: InProt側バッファタイムアウト時 00037 # - ON_RECEIVER_ERROR: InProt側エラー時 00038 # 00039 # @else 00040 # @brief The types of ConnectorDataListener 00041 # 00042 # - ON_BUFFER_WRITE: At the time of buffer write 00043 # - ON_BUFFER_FULL: At the time of buffer full 00044 # - ON_BUFFER_WRITE_TIMEOUT: At the time of buffer write timeout 00045 # - ON_BUFFER_OVERWRITE: At the time of buffer overwrite 00046 # - ON_BUFFER_READ: At the time of buffer read 00047 # - ON_SEND: At the time of sending to InPort 00048 # - ON_RECEIVED: At the time of finishing sending to InPort 00049 # - ON_RECEIVER_FULL: At the time of bufferfull of InPort 00050 # - ON_RECEIVER_TIMEOUT: At the time of timeout of InPort 00051 # - ON_RECEIVER_ERROR: At the time of error of InPort 00052 # 00053 # @endif 00054 # 00055 class ConnectorDataListenerType: 00056 def __init__(self): 00057 pass 00058 00059 ON_BUFFER_WRITE = 0 00060 ON_BUFFER_FULL = 1 00061 ON_BUFFER_WRITE_TIMEOUT = 2 00062 ON_BUFFER_OVERWRITE = 3 00063 ON_BUFFER_READ = 4 00064 ON_SEND = 5 00065 ON_RECEIVED = 6 00066 ON_RECEIVER_FULL = 7 00067 ON_RECEIVER_TIMEOUT = 8 00068 ON_RECEIVER_ERROR = 9 00069 CONNECTOR_DATA_LISTENER_NUM = 10 00070 00071 00072 00073 ## 00074 # @if jp 00075 # @class ConnectorDataListener クラス 00076 # 00077 # データポートの Connector において発生する各種イベントに対するコー 00078 # ルバックを実現するリスナクラスの基底クラス。 00079 # 00080 # コアロジックがOutPortに対してデータ書き込み、InPort側でデータが取 00081 # 得されるまでの間で発生する各種イベントをフックするコールバックを設 00082 # 定することができる。なお、リスナークラスは2種類存在し、バッファフ 00083 # ルや送信時のコールバックで、その時点で有効なデータをファンクタの引 00084 # 数として受け取る ConnectorDataListener であり、もう一方はデータエ 00085 # ンプティやバッファ読み込み時のタイムアウトなどデータが取得できない 00086 # 場合などにコールされるファンクタの引数に何もとらならい 00087 # ConnecotorListener がある。 00088 # 00089 # データポートには、接続時にデータの送受信方法についてデータフロー型、 00090 # サブスクリプション型等を設定することができる。 00091 # ConnectorDaataListener/ConnectorListener はともに、様々なイベント 00092 # に対するコールバックを設定することができるが、これらデータフロー型 00093 # およびサブスクリプション型の設定に応じて、利用可能なもの利用不可能 00094 # なものや、呼び出されるタイミングが異なる。 00095 # 以下に、インターフェースがCORBA CDR型の場合のコールバック一覧を示す。 00096 # 00097 # OutPort: 00098 # - Push型: Subscription Typeによりさらにイベントの種類が分かれる。 00099 # - Flush: Flush型にはバッファがないため ON_BUFFER 系のイベントは発生しない 00100 # - ON_SEND 00101 # - ON_RECEIVED 00102 # - ON_RECEIVER_FULL 00103 # - ON_RECEIVER_TIMEOUT 00104 # - ON_RECEIVER_ERROR 00105 # - ON_CONNECT 00106 # - ON_DISCONNECT 00107 # . 00108 # - New型 00109 # - ON_BUFFER_WRITE 00110 # - ON_BUFFER_FULL 00111 # - ON_BUFFER_WRITE_TIMEOUT 00112 # - ON_BUFFER_OVERWRITE 00113 # - ON_BUFFER_READ 00114 # - ON_SEND 00115 # - ON_RECEIVED 00116 # - ON_RECEIVER_FULL 00117 # - ON_RECEIVER_TIMEOUT 00118 # - ON_RECEIVER_ERROR 00119 # - ON_SENDER_ERROR 00120 # - ON_CONNECT 00121 # - ON_DISCONNECT 00122 # . 00123 # - Periodic型 00124 # - ON_BUFFER_WRITE 00125 # - ON_BUFFER_FULL 00126 # - ON_BUFFER_WRITE_TIMEOUT 00127 # - ON_BUFFER_READ 00128 # - ON_SEND 00129 # - ON_RECEIVED 00130 # - ON_RECEIVER_FULL 00131 # - ON_RECEIVER_TIMEOUT 00132 # - ON_RECEIVER_ERROR 00133 # - ON_BUFFER_EMPTY 00134 # - ON_SENDER_EMPTY 00135 # - ON_SENDER_ERROR 00136 # - ON_CONNECT 00137 # - ON_DISCONNECT 00138 # . 00139 # . 00140 # - Pull型 00141 # - ON_BUFFER_READ 00142 # - ON_SEND 00143 # - ON_BUFFER_EMPTY 00144 # - ON_BUFFER_READ_TIMEOUT 00145 # - ON_SENDER_EMPTY 00146 # - ON_SENDER_TIMEOUT 00147 # - ON_SENDER_ERROR 00148 # - ON_CONNECT 00149 # - ON_DISCONNECT 00150 # 00151 # InPort: 00152 # - Push型: 00153 # - ON_BUFFER_WRITE 00154 # - ON_BUFFER_FULL 00155 # - ON_BUFFER_WRITE_TIMEOUT 00156 # - ON_BUFFER_WRITE_OVERWRITE 00157 # - ON_RECEIVED 00158 # - ON_RECEIVER_FULL 00159 # - ON_RECEIVER_TIMEOUT 00160 # - ON_RECEIVER_ERROR 00161 # - ON_CONNECT 00162 # - ON_DISCONNECT 00163 # . 00164 # - Pull型 00165 # - ON_CONNECT 00166 # - ON_DISCONNECT 00167 # @else 00168 # @class ConnectorDataListener class 00169 # 00170 # This class is abstract base class for listener classes that 00171 # provides callbacks for various events in the data port's 00172 # connectors. 00173 # 00174 # @endif 00175 # 00176 class ConnectorDataListener: 00177 """ 00178 """ 00179 00180 def __del__(self): 00181 pass 00182 00183 # virtual void operator()(const ConnectorInfo& info, 00184 # const cdrMemoryStream& data) = 0; 00185 def __call__(self, info, data): 00186 pass 00187 00188 ## 00189 # @if jp 00190 # 00191 # @brief ConnectorDataListenerType を文字列に変換 00192 # 00193 # ConnectorDataListenerType を文字列に変換する 00194 # 00195 # @param type 変換対象 ConnectorDataListenerType 00196 # 00197 # @return 文字列変換結果 00198 # 00199 # @else 00200 # 00201 # @brief Convert ConnectorDataListenerType into the string. 00202 # 00203 # Convert ConnectorDataListenerType into the string. 00204 # 00205 # @param type The target ConnectorDataListenerType for transformation 00206 # 00207 # @return Trnasformation result of string representation 00208 # 00209 # @endif 00210 # 00211 def toString(type): 00212 typeString = ["ON_BUFFER_WRITE", 00213 "ON_BUFFER_FULL", 00214 "ON_BUFFER_WRITE_TIMEOUT", 00215 "ON_BUFFER_OVERWRITE", 00216 "ON_BUFFER_READ", 00217 "ON_SEND", 00218 "ON_RECEIVED", 00219 "ON_RECEIVER_FULL", 00220 "ON_RECEIVER_TIMEOUT", 00221 "ON_RECEIVER_ERROR", 00222 "CONNECTOR_DATA_LISTENER_NUM"] 00223 00224 if type < ConnectorDataListenerType.CONNECTOR_DATA_LISTENER_NUM: 00225 return typeString[type] 00226 00227 return "" 00228 00229 toString = staticmethod(toString) 00230 00231 00232 ## 00233 # @if jp 00234 # @class ConnectorDataListenerT クラス 00235 # 00236 # データポートの Connector において発生する各種イベントに対するコー 00237 # ルバックを実現するリスナクラスの基底クラス。 00238 # 00239 # このクラスは、operator()() の第2引数に cdrMemoryStream 型ではなく、 00240 # 実際にデータポートで使用される変数型をテンプレート引数として 00241 # 渡すことができる。 00242 # 00243 # @else 00244 # @class ConnectorDataListenerT class 00245 # 00246 # This class is abstract base class for listener classes that 00247 # provides callbacks for various events in the data port's 00248 # connectors. 00249 # 00250 # This class template can have practical data types that are used 00251 # as typed variable for DataPort as an argument of template instead 00252 # of cdrMemoryStream. 00253 # 00254 # @endif 00255 # 00256 class ConnectorDataListenerT(ConnectorDataListener): 00257 """ 00258 """ 00259 00260 def __del__(self): 00261 pass 00262 00263 00264 ## 00265 # @if jp 00266 # 00267 # @brief コールバックメソッド 00268 # 00269 # データをデータポートで使用される変数型に変換して ConnectorDataListenerT 00270 # のコールバックメソッドを呼び出す。 00271 # 00272 # @param info ConnectorInfo 00273 # @param cdrdata cdrMemoryStream型のデータ 00274 # 00275 # @else 00276 # 00277 # @brief Callback method 00278 # 00279 # This method invokes the callback method of ConnectorDataListenerT. 00280 # Data is converted into the variable type used in DataPort. 00281 # 00282 # @param info ConnectorInfo 00283 # @param cdrdata Data of cdrMemoryStream type 00284 # 00285 # @endif 00286 # 00287 # virtual void operator()(const ConnectorInfo& info, 00288 # const cdrMemoryStream& cdrdata) 00289 def __call__(self, info, cdrdata, data): 00290 endian = info.properties.getProperty("serializer.cdr.endian","little") 00291 if endian is not "little" and endian is not None: 00292 endian = OpenRTM_aist.split(endian, ",") # Maybe endian is ["little","big"] 00293 endian = OpenRTM_aist.normalize(endian) # Maybe self._endian is "little" or "big" 00294 00295 if endian == "little": 00296 endian = True 00297 elif endian == "big": 00298 endian = False 00299 else: 00300 endian = True 00301 00302 _data = cdrUnmarshal(any.to_any(data).typecode(), cdrdata, endian) 00303 return _data 00304 00305 00306 00307 ## 00308 # @if jp 00309 # @brief ConnectorListener のタイプ 00310 # 00311 # - ON_BUFFER_EMPTY: バッファが空の場合 00312 # - ON_BUFFER_READTIMEOUT: バッファが空でタイムアウトした場合 00313 # - ON_SENDER_EMPTY: OutPort側バッファが空 00314 # - ON_SENDER_TIMEOUT: OutPort側タイムアウト時 00315 # - ON_SENDER_ERROR: OutPort側エラー時 00316 # - ON_CONNECT: 接続確立時 00317 # - ON_DISCONNECT: 接続切断時 00318 # 00319 # @else 00320 # @brief The types of ConnectorListener 00321 # 00322 # - ON_BUFFER_EMPTY: At the time of buffer empty 00323 # - ON_BUFFER_READTIMEOUT: At the time of buffer read timeout 00324 # - ON_BUFFER_EMPTY: At the time of empty of OutPort 00325 # - ON_SENDER_TIMEOUT: At the time of timeout of OutPort 00326 # - ON_SENDER_ERROR: At the time of error of OutPort 00327 # - ON_CONNECT: At the time of connection 00328 # - ON_DISCONNECT: At the time of disconnection 00329 # 00330 # @endif 00331 # 00332 # enum ConnectorListenerType 00333 class ConnectorListenerType: 00334 00335 def __init__(self): 00336 pass 00337 00338 ON_BUFFER_EMPTY = 0 00339 ON_BUFFER_READ_TIMEOUT = 1 00340 ON_SENDER_EMPTY = 2 00341 ON_SENDER_TIMEOUT = 3 00342 ON_SENDER_ERROR = 4 00343 ON_CONNECT = 5 00344 ON_DISCONNECT = 6 00345 CONNECTOR_LISTENER_NUM = 7 00346 00347 00348 00349 ## 00350 # @if jp 00351 # @class ConnectorListener クラス 00352 # 00353 # データポートの Connector において発生する各種イベントに対するコー 00354 # ルバックを実現するリスナクラスの基底クラス。 00355 # 00356 # コアロジックがOutPortに対してデータ書き込み、InPort側でデータが取 00357 # 得されるまでの間で発生する各種イベントをフックするコールバックを設 00358 # 定することができる。なお、リスナークラスは2種類存在し、バッファフ 00359 # ルや送信時のコールバックで、その時点で有効なデータをファンクタの引 00360 # 数として受け取る ConnectorDataListener であり、もう一方はデータエ 00361 # ンプティやバッファ読み込み時のタイムアウトなどデータが取得できない 00362 # 場合などにコールされるファンクタの引数に何もとらならい 00363 # ConnecotorListener がある。 00364 # 00365 # データポートには、接続時にデータの送受信方法についてデータフロー型、 00366 # サブスクリプション型等を設定することができる。 00367 # ConnectorDaataListener/ConnectorListener は共にに、様々なイベント 00368 # に対するコールバックを設定することができるが、これらデータフロー型 00369 # およびサブスクリプション型の設定に応じて、利用できるもの、できない 00370 # もの、また呼び出されるタイミングが異なる。以下に、インターフェース 00371 # がCORBA CDR型の場合のコールバック一覧を示す。 00372 # 00373 # OutPort: 00374 # - Push型: Subscription Typeによりさらにイベントの種類が分かれる。 00375 # - Flush: Flush型にはバッファがないため ON_BUFFER 系のイベントは発生しない 00376 # - ON_SEND 00377 # - ON_RECEIVED 00378 # - ON_RECEIVER_FULL 00379 # - ON_RECEIVER_TIMEOUT 00380 # - ON_RECEIVER_ERROR 00381 # - ON_CONNECT 00382 # - ON_DISCONNECT 00383 # . 00384 # - New型 00385 # - ON_BUFFER_WRITE 00386 # - ON_BUFFER_FULL 00387 # - ON_BUFFER_WRITE_TIMEOUT 00388 # - ON_BUFFER_OVERWRITE 00389 # - ON_BUFFER_READ 00390 # - ON_SEND 00391 # - ON_RECEIVED 00392 # - ON_RECEIVER_FULL 00393 # - ON_RECEIVER_TIMEOUT 00394 # - ON_RECEIVER_ERROR 00395 # - ON_SENDER_ERROR 00396 # - ON_CONNECT 00397 # - ON_DISCONNECT 00398 # . 00399 # - Periodic型 00400 # - ON_BUFFER_WRITE 00401 # - ON_BUFFER_FULL 00402 # - ON_BUFFER_WRITE_TIMEOUT 00403 # - ON_BUFFER_READ 00404 # - ON_SEND 00405 # - ON_RECEIVED 00406 # - ON_RECEIVER_FULL 00407 # - ON_RECEIVER_TIMEOUT 00408 # - ON_RECEIVER_ERROR 00409 # - ON_BUFFER_EMPTY 00410 # - ON_SENDER_EMPTY 00411 # - ON_SENDER_ERROR 00412 # - ON_CONNECT 00413 # - ON_DISCONNECT 00414 # . 00415 # . 00416 # - Pull型 00417 # - ON_BUFFER_READ 00418 # - ON_SEND 00419 # - ON_BUFFER_EMPTY 00420 # - ON_BUFFER_READ_TIMEOUT 00421 # - ON_SENDER_EMPTY 00422 # - ON_SENDER_TIMEOUT 00423 # - ON_SENDER_ERROR 00424 # - ON_CONNECT 00425 # - ON_DISCONNECT 00426 # 00427 # InPort: 00428 # - Push型: 00429 # - ON_BUFFER_WRITE 00430 # - ON_BUFFER_FULL 00431 # - ON_BUFFER_WRITE_TIMEOUT 00432 # - ON_BUFFER_WRITE_OVERWRITE 00433 # - ON_RECEIVED 00434 # - ON_RECEIVER_FULL 00435 # - ON_RECEIVER_TIMEOUT 00436 # - ON_RECEIVER_ERROR 00437 # - ON_CONNECT 00438 # - ON_DISCONNECT 00439 # . 00440 # - Pull型 00441 # - ON_CONNECT 00442 # - ON_DISCONNECT 00443 # @else 00444 # @class ConnectorListener class 00445 # 00446 # This class is abstract base class for listener classes that 00447 # provides callbacks for various events in the data port's 00448 # connectors. 00449 # 00450 # @endif 00451 # 00452 class ConnectorListener: 00453 """ 00454 """ 00455 00456 def __del__(self): 00457 pass 00458 00459 # virtual void operator()(const ConnectorInfo& info) = 0; 00460 def __call__(self, info): 00461 pass 00462 00463 ## 00464 # @if jp 00465 # 00466 # @brief ConnectorListenerType を文字列に変換 00467 # 00468 # ConnectorListenerType を文字列に変換する 00469 # 00470 # @param type 変換対象 ConnectorListenerType 00471 # 00472 # @return 文字列変換結果 00473 # 00474 # @else 00475 # 00476 # @brief Convert ConnectorListenerType into the string. 00477 # 00478 # Convert ConnectorListenerType into the string. 00479 # 00480 # @param type The target ConnectorListenerType for transformation 00481 # 00482 # @return Trnasformation result of string representation 00483 # 00484 # @endif 00485 # 00486 def toString(type): 00487 typeString = ["ON_BUFFER_EMPTY", 00488 "ON_BUFFER_READ_TIMEOUT", 00489 "ON_SENDER_EMPTY", 00490 "ON_SENDER_TIMEOUT", 00491 "ON_SENDER_ERROR", 00492 "ON_CONNECT", 00493 "ON_DISCONNECT", 00494 "CONNECTOR_LISTENER_NUM"] 00495 00496 if type < ConnectorListenerType.CONNECTOR_LISTENER_NUM: 00497 return typeString[type] 00498 00499 return "" 00500 00501 toString = staticmethod(toString) 00502 00503 00504 ## 00505 # @if jp 00506 # @class ConnectorDataListener ホルダクラス 00507 # 00508 # 複数の ConnectorDataListener を保持し管理するクラス。 00509 # 00510 # @else 00511 # @class ConnectorDataListener holder class 00512 # 00513 # This class manages one ore more instances of ConnectorDataListener class. 00514 # 00515 # @endif 00516 # 00517 class ConnectorDataListenerHolder: 00518 """ 00519 """ 00520 00521 ## 00522 # @if jp 00523 # @brief コンストラクタ 00524 # @else 00525 # @brief Constructor 00526 # @endif 00527 # 00528 def __init__(self): 00529 self._listeners = [] 00530 return 00531 00532 00533 ## 00534 # @if jp 00535 # @brief デストラクタ 00536 # @else 00537 # @brief Destructor 00538 # @endif 00539 # 00540 def __del__(self): 00541 for listener in self._listeners: 00542 for (k,v) in listener.iteritems(): 00543 if v: 00544 del k 00545 return 00546 00547 00548 ## 00549 # @if jp 00550 # 00551 # @brief リスナーの追加 00552 # 00553 # リスナーを追加する。 00554 # 00555 # @param self 00556 # @param listener 追加するリスナ 00557 # @param autoclean true:デストラクタで削除する, 00558 # false:デストラクタで削除しない 00559 # @else 00560 # 00561 # @brief Add the listener. 00562 # 00563 # This method adds the listener. 00564 # 00565 # @param self 00566 # @param listener Added listener 00567 # @param autoclean true:The listener is deleted at the destructor., 00568 # false:The listener is not deleted at the destructor. 00569 # @endif 00570 # 00571 # void addListener(ConnectorDataListener* listener, bool autoclean); 00572 def addListener(self, listener, autoclean): 00573 self._listeners.append({listener:autoclean}) 00574 return 00575 00576 00577 ## 00578 # @if jp 00579 # 00580 # @brief リスナーの削除 00581 # 00582 # リスナを削除する。 00583 # 00584 # @param self 00585 # @param listener 削除するリスナ 00586 # @else 00587 # 00588 # @brief Remove the listener. 00589 # 00590 # This method removes the listener. 00591 # 00592 # @param self 00593 # @param listener Removed listener 00594 # @endif 00595 # 00596 # void removeListener(ConnectorDataListener* listener); 00597 def removeListener(self, listener): 00598 for (i, _listener) in enumerate(self._listeners): 00599 if listener in _listener: 00600 del self._listeners[i][listener] 00601 return 00602 00603 00604 ## 00605 # @if jp 00606 # 00607 # @brief リスナーへ通知する 00608 # 00609 # 登録されているリスナのコールバックメソッドを呼び出す。 00610 # 00611 # @param self 00612 # @param info ConnectorInfo 00613 # @param cdrdata データ 00614 # @else 00615 # 00616 # @brief Notify listeners. 00617 # 00618 # This calls the Callback method of the registered listener. 00619 # 00620 # @param self 00621 # @param info ConnectorInfo 00622 # @param cdrdata Data 00623 # @endif 00624 # 00625 # void notify(const ConnectorInfo& info, 00626 # const cdrMemoryStream& cdrdata); 00627 def notify(self, info, cdrdata): 00628 for listener in self._listeners: 00629 for (k,v) in listener.iteritems(): 00630 k(info, cdrdata) 00631 return 00632 00633 00634 ## 00635 # @if jp 00636 # @class ConnectorListener ホルダクラス 00637 # 00638 # 複数の ConnectorListener を保持し管理するクラス。 00639 # 00640 # @else 00641 # @class ConnectorListener holder class 00642 # 00643 # This class manages one ore more instances of ConnectorListener class. 00644 # 00645 # @endif 00646 # 00647 class ConnectorListenerHolder: 00648 """ 00649 """ 00650 00651 ## 00652 # @if jp 00653 # @brief コンストラクタ 00654 # @else 00655 # @brief Constructor 00656 # @endif 00657 # 00658 def __init__(self): 00659 self._listeners = [] 00660 return 00661 00662 00663 ## 00664 # @if jp 00665 # @brief デストラクタ 00666 # @else 00667 # @brief Destructor 00668 # @endif 00669 # 00670 def __del__(self): 00671 for listener in self._listeners: 00672 for (k,v) in listener.iteritems(): 00673 if v: 00674 del k 00675 return 00676 00677 00678 ## 00679 # @if jp 00680 # 00681 # @brief リスナーの追加 00682 # 00683 # リスナーを追加する。 00684 # 00685 # @param self 00686 # @param listener 追加するリスナ 00687 # @param autoclean true:デストラクタで削除する, 00688 # false:デストラクタで削除しない 00689 # @else 00690 # 00691 # @brief Add the listener. 00692 # 00693 # This method adds the listener. 00694 # 00695 # @param self 00696 # @param listener Added listener 00697 # @param autoclean true:The listener is deleted at the destructor., 00698 # false:The listener is not deleted at the destructor. 00699 # @endif 00700 # 00701 # void addListener(ConnectorListener* listener, bool autoclean); 00702 def addListener(self, listener, autoclean): 00703 self._listeners.append({listener:autoclean}) 00704 return 00705 00706 00707 ## 00708 # @if jp 00709 # 00710 # @brief リスナーの削除 00711 # 00712 # リスナを削除する。 00713 # 00714 # @param self 00715 # @param listener 削除するリスナ 00716 # @else 00717 # 00718 # @brief Remove the listener. 00719 # 00720 # This method removes the listener. 00721 # 00722 # @param self 00723 # @param listener Removed listener 00724 # @endif 00725 # 00726 # void removeListener(ConnectorListener* listener); 00727 def removeListener(self, listener): 00728 for (i, _listener) in enumerate(self._listeners): 00729 if listener in _listener: 00730 del self._listeners[i][listener] 00731 return 00732 00733 00734 ## 00735 # @if jp 00736 # 00737 # @brief リスナーへ通知する 00738 # 00739 # 登録されているリスナのコールバックメソッドを呼び出す。 00740 # 00741 # @param self 00742 # @param info ConnectorInfo 00743 # @else 00744 # 00745 # @brief Notify listeners. 00746 # 00747 # This calls the Callback method of the registered listener. 00748 # 00749 # @param self 00750 # @param info ConnectorInfo 00751 # @endif 00752 # 00753 # void notify(const ConnectorInfo& info); 00754 def notify(self, info): 00755 for listener in self._listeners: 00756 for (k,v) in listener.iteritems(): 00757 k(info) 00758 return 00759 00760 00761 00762 class ConnectorListeners: 00763 def __init__(self): 00764 self.connectorData_ = [ OpenRTM_aist.ConnectorDataListenerHolder() for i in range(OpenRTM_aist.ConnectorDataListenerType.CONNECTOR_DATA_LISTENER_NUM) ] 00765 self.connector_ = [ OpenRTM_aist.ConnectorListenerHolder() for i in range(OpenRTM_aist.ConnectorListenerType.CONNECTOR_LISTENER_NUM) ] 00766 return