今天主题是针对statm的目录, 看目录的名称就知道是针对state machine的操作。__init__.py没有什么内容。base.py:定义了一个基类,StateMachineMixin,这个类是为了实现INotificationListener的接口。同时定义了一个方法:on_notification_received(self,notification),这和INotificationListener的抽象类几乎没有什么区别。auth.pyclass AuthStateMachine是继承于StateMachineMixin,和Modal,Modal类是一个比较奇怪的东西,还没有搞懂。而Modal拥有member,modeAttribute,initialMode.和方法transitionTo()而AuthStateMachine类除了这些还有以下成员:有__init__(self,device,factory,*args,**kwds)device: 来自参数devicecollaborator:来自factory的方法get_collaborator(device,*args,**kwds)deffered:来自于与defer.Deffered.num_sim_errorsnum_sim_busy同时重载隐含的方法:__repr__(self)这个类还有众多的方法:notify_auth_ok(self):这里还是和collaborator相关。notify_auth_failure(self,failure)_______________________get_pin_cb(self,pin):把pin设置在self.collaborator.pin中,转到"pin_needed_status"状态,调用do_next()._get_puk_cb(self,auth):把auth设置在self.collaborator.puk和pin中,转到“puk_needed_status”状态,调用do_next()_get_puk2_cb(self,auth)这上面相同,只是转入到“puk2_needed_status”状态。-----------------------check_pin_cb(self,resp):对于不同的Response,不同的callback.'READY':直接调用notify_auth_ok().'SIM PIN':通过self.collaborator.get_pin()取得defer,add callback _get_pin_cb'SIM PUK':同上,只是add callback _get_puk_cb'SIM PUK2':同上,只是add callback _get_puk2_cb.get_pin_status_cb(self,enabled):如果enable为false,同上的ready,如果为true,同上"SIM PIN"incorrect_pin_eb(self,failure)incorrect_puk_eb(self,failure)incorrect_puk2_eb(self,failure)都是从collaborator.get_XXX的Defer调用add callback(XXX).puk_required_eb(self,failure)puk2_required_eb(self,failure)与上面很相似,不多强调。sim_failure_eb(self,failure)当错误出现大于某个数值时,调用,self.notify_auth_failure(),否则,在delay后继续调用do_next().sim_busy_eb(self,failure)这个与上面一个类似,只是判断busy的数目。sim_no_present_cb(self,failure):调用notify_auth_failure().这里要注意的是,上面的错误有很多种,CMEErrorSIMXXX(包括,NotInserted,BUSY,Failure)还有PUKRequired,IncorrectPassword等等。______________________start_auth(self):调用,self.do_next,返回self.deferred.甚至还有一些嵌入式的类,和behavior还是什么很相似的。class get_pin_status 继承mode:do_next:d = self.device.sconn.check_pin(),增加callback check_pin_cb和三个errback:sim_failure_cb,sim_busy_cb,sim_no_present_cb.class pin_needed_status 继承mode:do_next:从self.collaborator.pin取得pin,从self.device.sconn.send_pin(pin)返回d,增加callback:notify_auth_ok()和errback:incorrect_pin_cb,和puk_required_eb.class puk_needed_status 继承mode:do_next:一样从collaborator.puk,pin取得auth info,由self.device.sconn.send_puk()增加callback:notify_auth_ok,和errback:incorrect_puk_eb和puk2_required_eb.class puk2_needed_status继承mode:同样,由self.device.sconn.send_puk(auth info)增加callback,和errback:incorrect_puk2_eb,和puk2_required_eb.上述每个类都有__enter__,__exit__,这个可能和Modal或者是嵌入式类相关。这个文件也主要集中在sconn和collaborator.connection.py文件她和authStateMachine相似,都是继承于StateMachineMixin,Modal。拥有Modal类的member:modeAttribute和initialMode。并且重载了__repr__函数。有私有的成员:start和dialer,在初始化的时候,dialer来自于__init__(self,dialer)方法:connect(self):如果当前的状态是connecting和connected报告异常。defer.fail(ex.AlreadyConnecting)或者是ex.AlreadyConnected.否则转到connecting状态,然后调用self.do_next().close(self,hotplug=False)如果已经在hotplug状态,就抱错,否则转换到disconnected状态,并且do_next().还有嵌入的类,如下class disconnected(mode)do_next:如果hotplug is true,调用self._cleanup(),并且defer.succeed(True)否则,self.dialer.disconnect().class connecting(mode)do_next:调用dialer.connect(),然后增加callback.callback是将状态转到connected.class connected(mode)do_next:pass上述和前面的类似,都有__enter__,__exit__和do_next()这个文件的操作时对应dialer.最后是networkreg.py文件,是class NetworkRegStateMachine和上面的两个类一样,继承StateMachineMixin,Modal有member,modeAttribute,initialMode.并且有私有成员:__init__(self,device)device:来自参数prefix:netobj:cached_roaming_ids:cID:deferred并且重载__repr__.拥有方法:on_notification_received(self,notification):首先调用基类的同名函数,如果self.mode是wait_for_register,并且notification是N.NetworkRegNotification的实例,那么如果notification.args=1:self.cID.cancel(),进入“obtain_netinfo”状态,并且do_next()=2: pass=3:self.cID.cancel(),进入"registration_failed",do_next()=4:cID.cancel(),进入“registration_failed”,do_next()=5: cID.cancel(),进入"registration_finished",do_next()._couldnt_register_with_any_net_cb(self)同上3,4,只是timerout的原因而已。_process_netreg_status(self,netregstatus):这里也是个状态的转换mode,status来自参数netregstatus=0:进入'wait_to_register',do_next=1:进入registration_finished,do_next=2:如果mode=0,self.device.sconn.set_netreg_notification,进入wait_to_register,do_next=3:进入registration_failed,do_next()=5:进入registration_failed,do_next._process_imsi_cb(self,imsi_prefix)首先涉及self.prefix=imsi_prefix.后调用,self.device.sconn.set_network_info_format()在调用self.device.sconn.get_network_info()返回Deffer,添加callback.这个callback也是做状态的转化。get_net_names_cb(self,net_objs)process_roaming_ids(self,net_objs)start_netreg(self):有嵌入的class:class check_registered(mode):class wait_to_register(mode):class obtain_netinfo(mode):class search_operators(mode):class international_roaming(mode):class register_with_operator(mode):class registration_finished(mode):class registration_failed(mode):其他的内容这里不再详述,只是可以看出,这里调用了很多sconn的内容。每一个操作似乎都是对应sconn。另外今天画了一下系列1对象图的关系。明天希望有时间画出今天这个关系图。今天就到此为止