2009年7月22日星期三

ISMPEntity之三,2.x和3.x对包月非包月业务的处理流程

包com.qualcomm.bss.bsg.ismpentity.ismpcore中的类ProductPriceObject值得关注,它里面包含了几乎所有重要信息:priceHandle,productID, priceMethod,priceBasis,optionPrice(就是pricevalue),regionId,contentId和optionValue。所以得到ProductPriceObject的实例就可以知道productID等信息。
在 包com.qualcomm.bss.bsg.ismpentity.devices的类Device中有个方 法:getProductPriceObject,可以用它获得ProductPriceObject,getProductPriceObject其实 是去查询数据库来获得ProductPriceObject:
productPriceObject = operationalDataDAO.getPriceHandleMap(String.valueOf(priceHandle), itemId, regionId);

如 果在数据库里查找不到,那么getProductPriceObject会去ISMPConfig里查找postactivition的地 址:String strPostACtivationIPANdURL = ISMPConfig.postActivationURL,根据这个地址,调用方法submitRequest,实际上是去这个地址去访问,返回值是个 字符串,里面包含了ProductPriceObject的所有信息。

3.x手机,下载非包月应用,处理的流程:
1,用户选择好应用后,点击下载
2,手机发出下载鉴权请求给ADS
3,ADS将请求发给BSG
4,经过BSG的router,最终ISMPEntity收到鉴权请求。
5,RequestHandler::doGet->ISMPEntity::invokeService->Locator::locateDeviceHandle->Device::handleRequest
6,Device::handleRequest根据请求的类型来做相应处理,有三种类型的请求:
public enum RequestTypeStatusCodes {
PurAuth,
MsgDownloadAck,
DeleteAck
}
因为是非包月下载请求,所以这里是PurAuth。
7,用Device::getProductPriceObject获得ProductPriceObject对象,该包含了pricehandle,productID等等信息。
8,进入PurAuth处理流程,判读是否包月(这里是非包月),进入非包月处理分支,获得PurchaseAuthorizationHandlerImpl对象。
9, 进入PurchaseAuthorizationHandlerImpl::handleRequest方法,生成 messageID(messageID是联系request和response的桥梁,ISMPEntity会有多个不同的request放在 queue里并发送给ISMP,同时ISMP也会有多个不同的response,request和response必须成对出现,有request必须有 response,某对request和response之间就靠messageID联系,它们必有相同的messageID)并和其它信息 (ismi,itemID,pricehandle等)一起保存到数据库。
10,调用preparePDU构建PDU,然后调用PDURequestHandlerInterface::sendPDU发送PDU。

3.x手机,下载包月应用,处理的流程:
前7步和3.x非包月相同。
8, 进入PurAuth处理流程,判读是包月,进入包月处理分支,获得CreateSubscriptionHandlerImpl对象。
9,进入CreateSubscriptionHandlerImpl::handleRequest方法,包月的创建是用SOAP的,所以调用了方法prepareSOAPRequest去构建并发送SOAP request。

当 ISMP返回成功后,3.x下载包月应用的流程应该和下载非包月的流程一样,再次进入 PurchaseAuthorizationHandlerImpl::handleRequest方法去发送PDU,但是3.x如果再次进入 PurchaseAuthorizationHandlerImpl的处理流程,目前还没有看出来(参考电信文档第8.3.2节"有下载鉴权的包月应用下 载",BSG和ISMP之间是先用SOAP发送了createSubscriptionReq和createSubscriptionResp,然后再和 下载非包月应用一样,发送AuthPrice request和response。我估计因为SOAP还是建立在http协议之上的,所以当ISMP发送createSubscription response给BSG后,ISMPEntitiy还是先进入RequestHandler::doGet,后面的流程就和下载非包月一样了)。

2.x手机,下载非包月应用,处理流程:
前10步和3.x非包月相同。
11,AuthPrice的request PDU发送后,PurchaseAuthorizationHandlerImpl::handleRequest返回到TwoXDeviceImpl::handleRequest。
12, 调用Device::duplicateMsgDownloadAckCheck,这个方法是用来验证MsgDownloadAck是否是已经发送过的 (duplicated),如果是,表明MsgDownloadAck已经被处理过,不用再处理。如果不是,到13步。
13,进入DownloadConfirmationHandlerImpl,调用DownloadConfirmationHandlerImpl::handleRequest方法,发送AuthPricecnfm的PDU。

没有评论:

发表评论