@@ -16,18 +16,23 @@ def __init__(self, name: str, value: Any):
1616
1717class IObjectSink (ProtocolType ):
1818 def olink_object_name () -> str :
19+ # return object name
1920 raise NotImplementedError ()
2021
2122 def olink_on_signal (self , name : str , args : list [Any ]) -> None :
23+ # called on signal message
2224 raise NotImplementedError ()
2325
2426 def olink_on_property_changed (self , name : str , value : Any ) -> None :
27+ # called on property changed message
2528 raise NotImplementedError ()
2629
2730 def olink_on_init (self , name : str , props : object , node : "ClientNode" ):
31+ # called on init message
2832 raise NotImplementedError ()
2933
3034 def olink_on_release (self ) -> None :
35+ # called when sink is released
3136 raise NotImplementedError ()
3237
3338class SinkToClientEntry :
@@ -39,72 +44,77 @@ def __init__(self, sink=None):
3944
4045
4146class ClientRegistry (Base ):
47+ # client side registry to link sinks to nodes
4248 entries : dict [str , SinkToClientEntry ] = {}
43- def attach_client_node (self , node : "ClientNode" ):
44- pass
4549
46- def detach_client_node (self , node : "ClientNode" ):
50+ def remove_node (self , node : "ClientNode" ):
51+ # remove node from all sinks
4752 for entry in self .entries .values ():
4853 if entry .node is node :
4954 entry .node = None
5055
51- def link_client_node (self , name : str , node : "ClientNode" ):
52- self .entry (name ).node = node
56+ def add_node_to_sink (self , name : str , node : "ClientNode" ):
57+ # add not to named sink
58+ self ._entry (name ).node = node
5359
54- def unlink_client_node (self , name : str , node : "ClientNode" ):
60+ def remove_node_from_sink (self , name : str , node : "ClientNode" ):
61+ # remove node from named sink
5562 resource = Name .resource_from_name (name )
5663 if resource in self .entries :
5764 if self .entries [resource ].node is node :
5865 self .entries [resource ].node = None
5966 else :
6067 self .emit_log (LogLevel .DEBUG , f"unlink node failed, not the same node: { resource } " )
6168
62- def add_object_sink (self , sink : IObjectSink ) -> "ClientNode" :
69+ def register_sink (self , sink : IObjectSink ) -> "ClientNode" :
70+ # register sink using object name
6371 name = sink .olink_object_name ()
64- entry = self .entry (name )
72+ entry = self ._entry (name )
6573 entry .sink = sink
6674 return entry .node
6775
68- def remove_object_sink (self , sink : IObjectSink ):
76+ def unregister_sink (self , sink : IObjectSink ):
77+ # unregister sink using object name
6978 name = sink .olink_object_name ()
70- self .remove_entry (name )
79+ self ._remove_entry (name )
7180
72- def get_object_sink (self , name : str ) -> Optional [IObjectSink ]:
73- return self .entry (name ).sink
81+ def get_sink (self , name : str ) -> Optional [IObjectSink ]:
82+ # get sink using name
83+ return self ._entry (name ).sink
7484
75- def get_client_node (self , name : str ) -> Optional ["ClientNode" ]:
76- return self .entry (name ).node
85+ def get_node (self , name : str ) -> Optional ["ClientNode" ]:
86+ # get node using name
87+ return self ._entry (name ).node
7788
78- def entry (self , name : str ) -> SinkToClientEntry :
89+ def _entry (self , name : str ) -> SinkToClientEntry :
90+ # get an entry by name
7991 resource = Name .resource_from_name (name )
8092 if not resource in self .entries :
8193 self .emit_log (LogLevel .DEBUG , f"add new resource: { resource } " )
8294 self .entries [resource ] = SinkToClientEntry ()
8395 return self .entries [resource ]
8496
85- def remove_entry (self , name : str ) -> None :
97+ def _remove_entry (self , name : str ) -> None :
98+ # remove an entry by name
8699 resource = Name .resource_from_name (name )
87100 del self .entries [resource ]
88101
89102
90-
91-
103+ # global client registry
92104_registry = ClientRegistry ()
93105
106+ def get_client_registry () -> ClientRegistry :
107+ return _registry
94108
95109class ClientNode (BaseNode ):
96110 invokes_pending : dict [int , InvokeReplyFunc ] = {}
97111 requestId = 0
98112
99- def __init__ (self ):
100- super ().__init__ ()
101- self .registry ().attach_client_node (self )
102-
103113 def registry (self ) -> ClientRegistry :
104- return _registry
114+ return get_client_registry ()
105115
106116 def detach (self ) -> None :
107- self .registry ().detach_client_node (self )
117+ self .registry ().remove_node (self )
108118
109119 def next_request_id (self ) -> int :
110120 self .requestId += 1
@@ -118,49 +128,60 @@ def invoke_remote(self, name: str, args: list[Any], func: Optional[InvokeReplyFu
118128 self .emit_write (Protocol .invoke_message (request_id , name , args ))
119129
120130 def set_remote_property (self , name : str , value : Any ) -> None :
131+ # send remote propertymessage
121132 self .emit_log (LogLevel .DEBUG , f"ClientNode.set_remote_property: { name } { value } " )
122133 self .emit_write (Protocol .set_property_message (name , value ))
123134
124135 def link_node (self , name : str ):
125- self .registry ().link_client_node (name , self )
136+ # register this node to sink
137+ self .registry ().add_node_to_sink (name , self )
126138
127139 def unlink_node (self , name : str ) -> None :
128- self .registry ().unlink_client_node (name , self )
140+ # unregister this node from sink
141+ self .registry ().remove_node_from_sink (name , self )
129142
130143 @staticmethod
131- def add_object_sink (sink : IObjectSink ) -> Optional ["ClientNode" ]:
132- return _registry .add_object_sink (sink )
144+ def register_sink (sink : IObjectSink ) -> Optional ["ClientNode" ]:
145+ # register sink to registry
146+ return get_client_registry ().register_sink (sink )
133147
134148 @staticmethod
135- def remove_object_sink (sink : IObjectSink ) -> None :
136- return _registry .remove_object_sink (sink )
149+ def unregister_sink (sink : IObjectSink ) -> None :
150+ # unregister sink from registry
151+ return get_client_registry ().unregister_sink (sink )
137152
138- def get_object_sink (self , name : str ) -> Optional [IObjectSink ]:
139- return self .registry ().get_object_sink (name )
153+ @staticmethod
154+ def get_sink (name : str ) -> Optional [IObjectSink ]:
155+ return get_client_registry ().get_sink (name )
140156
141- def link_remote (self , name : str ):
157+ def link_remote (self , name : str ):
158+ # register this node from sink and send a link message
142159 self .emit_log (LogLevel .DEBUG , f"ClientNode.linkRemote: { name } " )
143- self .registry ().link_client_node (name , self )
160+ self .registry ().add_node_to_sink (name , self )
144161 self .emit_write (Protocol .link_message (name ))
145162
146163 def unlink_remote (self , name : str ):
164+ # unlink this node froom sink and send an unlink message
147165 self .emit_log (LogLevel .DEBUG , f"ClientNode.unlink_remote: { name } " )
148166 self .emit_write (Protocol .unlink_message (name ))
149- self .registry ().unlink_client_node (name , self )
167+ self .registry ().remove_node_from_sink (name , self )
150168
151169 def handle_init (self , name : str , props : object ):
170+ # handle init message from source
152171 self .emit_log (LogLevel .DEBUG , f"ClientNode.handle_init: { name } " )
153- sink = self .get_object_sink (name )
172+ sink = self .get_sink (name )
154173 if sink :
155174 sink .olink_on_init (name , props , self )
156175
157176 def handle_property_change (self , name : str , value : Any ) -> None :
177+ # handle property change message from source
158178 self .emit_log (LogLevel .DEBUG , f"ClientNode.handle_property_change: { name } " )
159- sink = self .get_object_sink (name )
179+ sink = self .get_sink (name )
160180 if sink :
161181 sink .olink_on_property_changed (name , value )
162182
163183 def handle_invoke_reply (self , id : int , name : str , value : Any ) -> None :
184+ # handle invoke reply message from source
164185 self .emit_log (LogLevel .DEBUG , f"ClientNode.handle_invoke_reply: { id } { name } { value } " )
165186 if id in self .invokes_pending :
166187 func = self .invokes_pending [id ]
@@ -172,12 +193,14 @@ def handle_invoke_reply(self, id: int, name: str, value: Any) -> None:
172193 self .emit_log (LogLevel .DEBUG , f"no pending invoke: { id } { name } " )
173194
174195 def handle_signal (self , name : str , args : list [Any ]) -> None :
196+ # handle signal message from source
175197 self .emit_log (LogLevel .DEBUG , f"ClientNode.handle_signal: { name } { args } " )
176- sink = self .get_object_sink (name )
198+ sink = self .get_sink (name )
177199 if sink :
178200 sink .olink_on_signal (name , args )
179201
180202 def handle_error (self , msgType : MsgType , id : int , error : str ):
203+ # handle error message from source
181204 self .emit_log (LogLevel .DEBUG , f"ClientNode.handle_error: { msgType } { id } { error } " )
182205
183206
0 commit comments