00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file PortConnectListener.py 00006 # @brief port's internal action listener classes 00007 # @date $Date$ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2011 00011 # Intelligent Systems Research Institute, 00012 # National Institute of 00013 # Advanced Industrial Science and Technology (AIST), Japan 00014 # All rights reserved. 00015 00016 import threading 00017 00018 class Lock: 00019 """ 00020 """ 00021 00022 ## 00023 # @if jp 00024 # @brief コンストラクタ 00025 # 00026 # コンストラクタ 00027 # 00028 # @param self 00029 # @param mutex ロック用ミューテックス 00030 # 00031 # @else 00032 # 00033 # @endif 00034 def __init__(self, mutex): 00035 self.mutex = mutex 00036 self.mutex.acquire() 00037 00038 00039 ## 00040 # @if jp 00041 # @brief デストラクタ 00042 # 00043 # デストラクタ 00044 # 00045 # @param self 00046 # 00047 # @else 00048 # 00049 # @endif 00050 def __del__(self): 00051 self.mutex.release() 00052 00053 #============================================================ 00054 00055 ## 00056 # @if jp 00057 # @brief PortConnectListener のタイプ 00058 # 00059 # - ON_NOTIFY_CONNECT: notify_connect() 関数内呼び出し直後 00060 # - ON_NOTIFY_DISCONNECT: notify_disconnect() 呼び出し直後 00061 # - ON_UNSUBSCRIBE_INTERFACES: notify_disconnect() 内のIF購読解除時 00062 # 00063 # @else 00064 # @brief The types of ConnectorDataListener 00065 # 00066 # - ON_NOTIFY_CONNECT: right after entering into notify_connect() 00067 # - ON_NOTIFY_DISCONNECT: right after entering into notify_disconnect() 00068 # - ON_UNSUBSCRIBE_INTERFACES: unsubscribing IF in notify_disconnect() 00069 # 00070 # @endif 00071 class PortConnectListenerType: 00072 """ 00073 """ 00074 00075 ON_NOTIFY_CONNECT = 0 00076 ON_NOTIFY_DISCONNECT = 1 00077 ON_UNSUBSCRIBE_INTERFACES = 2 00078 PORT_CONNECT_LISTENER_NUM = 3 00079 00080 def __init__(self): 00081 pass 00082 00083 00084 00085 ## 00086 # @if jp 00087 # @class PortConnectListener クラス 00088 # @brief PortConnectListener クラス 00089 # 00090 # 各アクションに対応するユーザーコードが呼ばれる直前のタイミング 00091 # でコールされるリスナクラスの基底クラス。 00092 # 00093 # - ON_NOTIFY_CONNECT: notify_connect() 関数内呼び出し直後 00094 # - ON_NOTIFY_DISCONNECT: notify_disconnect() 呼び出し直後 00095 # - ON_UNSUBSCRIBE_INTERFACES: notify_disconnect() 内のIF購読解除時 00096 # 00097 # @else 00098 # @class PortConnectListener class 00099 # @brief PortConnectListener class 00100 # 00101 # This class is abstract base class for listener classes that 00102 # provides callbacks for various events in rtobject. 00103 # 00104 # - ON_NOTIFY_CONNECT: right after entering into notify_connect() 00105 # - ON_NOTIFY_DISCONNECT: right after entering into notify_disconnect() 00106 # - ON_UNSUBSCRIBE_INTERFACES: unsubscribing IF in notify_disconnect() 00107 # 00108 # @endif 00109 class PortConnectListener: 00110 """ 00111 """ 00112 00113 def __init__(self): 00114 pass 00115 00116 ## 00117 # @if jp 00118 # 00119 # @brief PortConnectListenerType を文字列に変換 00120 # 00121 # PortConnectListenerType を文字列に変換する 00122 # 00123 # @param type 変換対象 PortConnectListenerType 00124 # 00125 # @return 文字列変換結果 00126 # 00127 # @else 00128 # 00129 # @brief Convert PortConnectListenerType into the string. 00130 # 00131 # Convert PortConnectListenerType into the string. 00132 # 00133 # @param type The target PortConnectListenerType for transformation 00134 # 00135 # @return Trnasformation result of string representation 00136 # 00137 # @endif 00138 #static const char* toString(PortConnectListenerType type); 00139 def toString(type): 00140 typeString = ["ON_NOTIFY_CONNECT", 00141 "ON_NOTIFY_DISCONNECT", 00142 "ON_UNSUBSCRIBE_INTERFACES", 00143 "ON_UPDATE_CONFIG_PARAM", 00144 ""] 00145 00146 if type < ConfigurationParamListenerType.CONFIG_PARAM_LISTENER_NUM: 00147 return typeString[type] 00148 00149 return ""; 00150 00151 toString = staticmethod(toString) 00152 00153 00154 ## 00155 # @if jp 00156 # @brief デストラクタ 00157 # @else 00158 # @brief Destructor 00159 # @endif 00160 def __del__(self): 00161 pass 00162 00163 00164 ## 00165 # @if jp 00166 # 00167 # @brief 仮想コールバック関数 00168 # 00169 # PortConnectListener のコールバック関数 00170 # 00171 # @else 00172 # 00173 # @brief Virtual Callback function 00174 # 00175 # This is a the Callback function for PortConnectListener. 00176 # 00177 # @endif 00178 #virtual void operator()(const char* portname, 00179 # RTC::ConnectorProfile& profile) = 0; 00180 def __call__(self, portname, profile): 00181 return 00182 00183 00184 00185 #============================================================ 00186 ## 00187 # @if jp 00188 # @brief PortConnectRetListenerType のタイプ 00189 # 00190 # - ON_CONNECT_NEXTPORT: notify_connect() 中のカスケード呼び出し直後 00191 # - ON_SUBSCRIBE_INTERFACES: notify_connect() 中のインターフェース購読直後 00192 # - ON_CONNECTED: nofity_connect() 接続処理完了時に呼び出される 00193 # - ON_DISCONNECT_NEXT: notify_disconnect() 中にカスケード呼び出し直後 00194 # - ON_DISCONNECTED: notify_disconnect() リターン時 00195 # 00196 # @else 00197 # @brief The types of PortConnectRetListenerType 00198 # 00199 # - ON_CONNECT_NEXTPORT: after cascade-call in notify_connect() 00200 # - ON_SUBSCRIBE_INTERFACES: after IF subscribing in notify_connect() 00201 # - ON_CONNECTED: completed nofity_connect() connection process 00202 # - ON_DISCONNECT_NEXT: after cascade-call in notify_disconnect() 00203 # - ON_DISCONNECTED: completed notify_disconnect() disconnection 00204 # 00205 # @endif 00206 class PortConnectRetListenerType: 00207 """ 00208 """ 00209 00210 ON_PUBLISH_INTERFACES = 0 00211 ON_CONNECT_NEXTPORT = 1 00212 ON_SUBSCRIBE_INTERFACES = 2 00213 ON_CONNECTED = 3 00214 ON_DISCONNECT_NEXT = 4 00215 ON_DISCONNECTED = 5 00216 PORT_CONNECT_RET_LISTENER_NUM = 6 00217 00218 def __init__(self): 00219 pass 00220 00221 00222 00223 ## 00224 # @if jp 00225 # @class PortConnectRetListener クラス 00226 # @brief PortConnectRetListener クラス 00227 # 00228 # 各アクションに対応するユーザーコードが呼ばれる直前のタイミング 00229 # でコールされるリスなクラスの基底クラス。 00230 # 00231 # - ON_PUBLISH_INTERFACES: notify_connect() 中のインターフェース公開直後 00232 # - ON_CONNECT_NEXTPORT: notify_connect() 中のカスケード呼び出し直後 00233 # - ON_SUBSCRIBE_INTERFACES: notify_connect() 中のインターフェース購読直後 00234 # - ON_CONNECTED: nofity_connect() 接続処理完了時に呼び出される 00235 # - ON_DISCONNECT_NEXT: notify_disconnect() 中にカスケード呼び出し直後 00236 # - ON_DISCONNECTED: notify_disconnect() リターン時 00237 # 00238 # @else 00239 # @class PortConnectRetListener class 00240 # @brief PortConnectRetListener class 00241 # 00242 # This class is abstract base class for listener classes that 00243 # provides callbacks for various events in rtobject. 00244 # 00245 # - ON_CONNECT_NEXTPORT: after cascade-call in notify_connect() 00246 # - ON_SUBSCRIBE_INTERFACES: after IF subscribing in notify_connect() 00247 # - ON_CONNECTED: completed nofity_connect() connection process 00248 # - ON_DISCONNECT_NEXT: after cascade-call in notify_disconnect() 00249 # - ON_DISCONNECTED: completed notify_disconnect() disconnection 00250 # 00251 # @endif 00252 class PortConnectRetListener: 00253 """ 00254 """ 00255 00256 def __init__(self): 00257 pass 00258 00259 00260 ## 00261 # @if jp 00262 # 00263 # @brief PortConnectRetListenerType を文字列に変換 00264 # 00265 # PortConnectRetListenerType を文字列に変換する 00266 # 00267 # @param type 変換対象 PortConnectRetListenerType 00268 # 00269 # @return 文字列変換結果 00270 # 00271 # @else 00272 # 00273 # @brief Convert PortConnectRetListenerType into string. 00274 # 00275 # Convert PortConnectRetListenerType into string. 00276 # 00277 # @param type The target PortConnectRetListenerType for transformation 00278 # 00279 # @return Trnasformation result of string representation 00280 # 00281 # @endif 00282 #static const char* toString(PortConnectRetListenerType type); 00283 def toString(type): 00284 return 00285 toString = staticmethod(toString) 00286 00287 00288 ## 00289 # @if jp 00290 # @brief デストラクタ 00291 # @else 00292 # @brief Destructor 00293 # @endif 00294 def __del__(self): 00295 pass 00296 00297 00298 ## 00299 # @if jp 00300 # 00301 # @brief 仮想コールバック関数 00302 # 00303 # PortConnectRetListener のコールバック関数 00304 # 00305 # @else 00306 # 00307 # @brief Virtual Callback function 00308 # 00309 # This is a the Callback function for PortConnectRetListener. 00310 # 00311 # @endif 00312 #virtual void operator()(const char* portname, 00313 # RTC::ConnectorProfile& profile, 00314 # ReturnCode_t ret) = 0; 00315 def __call__(self, portname, profile, ret): 00316 pass 00317 00318 00319 00320 class Entry: 00321 def __init__(self,listener, autoclean): 00322 self.listener = listener 00323 self.autoclean = autoclean 00324 return 00325 00326 #============================================================ 00327 ## 00328 # @if jp 00329 # @class PortConnectListenerHolder 00330 # @brief PortConnectListener ホルダクラス 00331 # 00332 # 複数の PortConnectListener を保持し管理するクラス。 00333 # 00334 # @else 00335 # @class PortConnectListenerHolder 00336 # @brief PortConnectListener holder class 00337 # 00338 # This class manages one ore more instances of 00339 # PortConnectListener class. 00340 # 00341 # @endif 00342 class PortConnectListenerHolder: 00343 """ 00344 """ 00345 00346 ## 00347 # @if jp 00348 # @brief コンストラクタ 00349 # @else 00350 # @brief Constructor 00351 # @endif 00352 def __init__(self): 00353 self._listeners = [] 00354 self._mutex = threading.RLock() 00355 return 00356 00357 00358 ## 00359 # @if jp 00360 # @brief デストラクタ 00361 # @else 00362 # @brief Destructor 00363 # @endif 00364 def __del__(self): 00365 pass 00366 00367 00368 ## 00369 # @if jp 00370 # 00371 # @brief リスナーの追加 00372 # 00373 # リスナーを追加する。 00374 # 00375 # @param listener 追加するリスナ 00376 # @param autoclean true:デストラクタで削除する, 00377 # false:デストラクタで削除しない 00378 # @else 00379 # 00380 # @brief Add the listener. 00381 # 00382 # This method adds the listener. 00383 # 00384 # @param listener Added listener 00385 # @param autoclean true:The listener is deleted at the destructor., 00386 # false:The listener is not deleted at the destructor. 00387 # @endif 00388 #void addListener(PortConnectListener* listener, bool autoclean); 00389 def addListener(self, listener, autoclean): 00390 guard = Lock(self._mutex) 00391 self._listeners.append(Entry(listener, autoclean)) 00392 del guard 00393 return 00394 00395 00396 ## 00397 # @if jp 00398 # 00399 # @brief リスナーの削除 00400 # 00401 # リスナを削除する。 00402 # 00403 # @param listener 削除するリスナ 00404 # @else 00405 # 00406 # @brief Remove the listener. 00407 # 00408 # This method removes the listener. 00409 # 00410 # @param listener Removed listener 00411 # @endif 00412 #void removeListener(PortConnectListener* listener); 00413 def removeListener(self, listener): 00414 guard = Lock(self._mutex) 00415 len_ = len(self._listeners) 00416 for i in range(len_): 00417 if (self._listeners[i].listener == listener) and self._listeners[i].autoclean: 00418 self._listeners[i].listener = None 00419 del self._listeners[i] 00420 del guard 00421 return 00422 del guard 00423 return 00424 00425 00426 ## 00427 # @if jp 00428 # 00429 # @brief リスナーへ通知する 00430 # 00431 # 登録されているリスナのコールバックメソッドを呼び出す。 00432 # 00433 # @param info ConnectorInfo 00434 # @else 00435 # 00436 # @brief Notify listeners. 00437 # 00438 # This calls the Callback method of the registered listener. 00439 # 00440 # @param info ConnectorInfo 00441 # @endif 00442 #void notify(const char* portname, RTC::ConnectorProfile& profile); 00443 def notify(self, portname, profile): 00444 guard = Lock(self._mutex) 00445 for listener in self._listeners: 00446 listener.listener(portname, profile) 00447 del guard 00448 return 00449 00450 00451 ## 00452 # @if jp 00453 # @class PortConnectRetListenerHolder 00454 # @brief PortConnectRetListener ホルダクラス 00455 # 00456 # 複数の PortConnectRetListener を保持し管理するクラス。 00457 # 00458 # @else 00459 # @class PortConnectRetListenerHolder 00460 # @brief PortConnectRetListener holder class 00461 # 00462 # This class manages one ore more instances of 00463 # PortConnectRetListener class. 00464 # 00465 # @endif 00466 class PortConnectRetListenerHolder: 00467 """ 00468 """ 00469 00470 ## 00471 # @if jp 00472 # @brief コンストラクタ 00473 # @else 00474 # @brief Constructor 00475 # @endif 00476 #PortConnectRetListenerHolder(); 00477 def __init__(self): 00478 self._listeners = [] 00479 self._mutex = threading.RLock() 00480 return 00481 00482 00483 ## 00484 # @if jp 00485 # @brief デストラクタ 00486 # @else 00487 # @brief Destructor 00488 # @endif 00489 def __del__(self): 00490 pass 00491 00492 00493 00494 ## 00495 # @if jp 00496 # 00497 # @brief リスナーの追加 00498 # 00499 # リスナーを追加する。 00500 # 00501 # @param listener 追加するリスナ 00502 # @param autoclean true:デストラクタで削除する, 00503 # false:デストラクタで削除しない 00504 # @else 00505 # 00506 # @brief Add the listener. 00507 # 00508 # This method adds the listener. 00509 # 00510 # @param listener Added listener 00511 # @param autoclean true:The listener is deleted at the destructor., 00512 # false:The listener is not deleted at the destructor. 00513 # @endif 00514 #void addListener(PortConnectRetListener* listener, bool autoclean); 00515 def addListener(self, listener, autoclean): 00516 guard = Lock(self._mutex) 00517 self._listeners.append(Entry(listener, autoclean)) 00518 del guard 00519 return 00520 00521 00522 ## 00523 # @if jp 00524 # 00525 # @brief リスナーの削除 00526 # 00527 # リスナを削除する。 00528 # 00529 # @param listener 削除するリスナ 00530 # @else 00531 # 00532 # @brief Remove the listener. 00533 # 00534 # This method removes the listener. 00535 # 00536 # @param listener Removed listener 00537 # @endif 00538 #void removeListener(PortConnectRetListener* listener); 00539 def removeListener(self, listener): 00540 guard = Lock(self._mutex) 00541 len_ = len(self._listeners) 00542 for i in range(len_): 00543 if (self._listeners[i].listener == listener) and self._listeners[i].autoclean: 00544 self._listeners[i].listener = None 00545 del self._listeners[i] 00546 del guard 00547 return 00548 del guard 00549 return 00550 00551 00552 ## 00553 # @if jp 00554 # 00555 # @brief リスナーへ通知する 00556 # 00557 # 登録されているリスナのコールバックメソッドを呼び出す。 00558 # 00559 # @param info ConnectorInfo 00560 # @param cdrdata データ 00561 # @else 00562 # 00563 # @brief Notify listeners. 00564 # 00565 # This calls the Callback method of the registered listener. 00566 # 00567 # @param info ConnectorInfo 00568 # @param cdrdata Data 00569 # @endif 00570 #void notify(const char* portname, RTC::ConnectorProfile& profile, 00571 # ReturnCode_t ret); 00572 def notify(self, portname, profile, ret): 00573 guard = Lock(self._mutex) 00574 for listener in self._listeners: 00575 listener.listener(portname, profile, ret) 00576 del guard 00577 return 00578 00579 00580 00581 ## 00582 # @if jp 00583 # @class PortConnectListeners 00584 # @brief PortConnectListeners クラス 00585 # 00586 # 00587 # @else 00588 # @class PortConnectListeners 00589 # @brief PortConnectListeners class 00590 # 00591 # 00592 # @endif 00593 class PortConnectListeners: 00594 """ 00595 """ 00596 00597 def __init__(self): 00598 pass 00599 00600 00601 ## 00602 # @if jp 00603 # @brief PortConnectListenerType リスナ配列 00604 # PortConnectListenerType リスナを格納 00605 # @else 00606 # @brief PortConnectListenerType listener array 00607 # The PortConnectListenerType listener is stored. 00608 # @endif 00609 portconnect_num = PortConnectListenerType.PORT_CONNECT_LISTENER_NUM 00610 portconnect_ = [PortConnectListenerHolder() for i in range(portconnect_num)] 00611 00612 ## 00613 # @if jp 00614 # @brief PortConnectRetTypeリスナ配列 00615 # PortConnectRetTypeリスナを格納 00616 # @else 00617 # @brief PortConnectRetType listener array 00618 # The PortConnectRetType listener is stored. 00619 # @endif 00620 portconnret_num = PortConnectRetListenerType.PORT_CONNECT_RET_LISTENER_NUM 00621 portconnret_ = [PortConnectRetListenerHolder() for i in range(portconnret_num)]