4.2.3 请求文档
当 socket 得到了对网络的连接后,它将该引擎的 iStatus 设定为 KErrNone,表 示已经建立了这种连接,现在可以读写了 AS : Engine : : RSocket CActiveScheduler CAOExampleEngine
RunReadyAOs( ) ... AS runs other active objects. When engine gets ready it is scheduled to run ... ...RSocket processes request in server thread asynchronously... SetStatusAndNotify(KErrNone)
ProcessRequest( )
RunReadyAOs( ) RunL( )
MakeHTTPRequest( )
iState = EWriting
Write(httpRequest, iStatus)
SetActive( ) ProcessRequest( )
4.2.4 读文档
当 socket 向 Web 服务器写入了 HTTP 请求之后,它将引擎的 iStatus 设定为 KErrNone(请见图 9)。活动调度器会调用该引擎的 RunL()。现在引擎请求这个 socket 读取 Web 服务器对缓冲区的响应。然后引擎激活自己,并从 RunL()方法返 回。
socket 服务器读取来自 socket 的数据,并当发生异步方法调用时将其填入到给定的 缓冲区中。当缓冲区满时,它将引擎的 iStatus 设定为 KErrNone。活动调度器运 行该引擎,而后者则将读入的数据从缓冲区复制到动态缓冲区,发起一轮新的读操 作,激活该引擎,然后返回。
AS : Engine : : RSocket CActiveScheduler CAOExampleEngine
RunReadyAOs( )
ProcessRequest( )
... AS runs other active objects. When engine gets ready it is scheduled to run ...
...RSocket processes request in server thread asynchronously...
SetStatusAndNotify(KErrNone)
RunReadyAOs( ) RunL( )
ReadHTTPResponse(TRUE) iState = EReading
RecvOneOrMore(buf,iStatus)
SetActive( ) ProcessRequest( ) 这个循环周而复始,直到 Web 服务器中没有更多的数据时,它就关闭这个 socket。 当 socket 服务器发现,该 socket 的远端已经被关闭了,它就将该引擎的 iStatus 设定为 KErrEof,这表示:在那个 socket 中已经没有任何数据了(见图 10)。
引擎向动态缓冲区复制剩下的数据,并通知用户界面,文件已经取到。由于引擎已 经完成了文件抓取,它不会发出任何异步请求,也不会激活自己。在引擎从 RunL() 中返回之前,它对自己进行重新设定,使得 socket 关闭。然后引擎就可以为下一个 FetchFileL()方法调用提供服务了。
AS : Engine : : RSocket CActiveScheduler CAOExampleEngine
RunReadyAOs( )
ProcessRequest( )
... AS runs other active objects. When engine gets ready it is scheduled to run ...
...RSocket processes request in server thread asynchronously...
SetStatusAndNotify(KErrEof)
RunReadyAOs( )
RunL( )
ReadHTTPResponse(FALSE)
Reset( )
4.3 引擎的解构
当不再需要引擎时,一般情况下用 delete 关键字将其删除。而引擎的解构器(请见图 11) 从活动调度器的活动对象队列中移除这个引擎。这个活动对象的 Deque()方法调用 Cancel(),而后者调用 DoCancel()。对 reset()的调用得到了实现,这确保了任何等待 中的请求都会被删除,且 socket(可能打开着)被关闭掉。最后,主机解析器及在构造时所 创建的 socket 服务器也都被关闭了。
Application Engine SocketServ HostResolver ActiveScheduler
~CAOExampleEngine( )
Deque( )
Cancel( ) DoCancel( )
Reset( )
Remove(this)
Close()
Close( )
|