PortConnectListener.py
Go to the documentation of this file.
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)]


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28