根据apn域名获取IapId

 from: http://www.developer.nokia.com/Community/Wiki/%E6%A0%B9%E6%8D%AEapn%E5%9F%9F%E5%90%8D%E8%8E%B7%E5%8F%96IapId

获取apn的代码网上挺多的了, 我自己以前也贴过2段式循环获取apn的代码, 但是不了解系统有关apn的7张表的结构, 使用起来始终有错误, 前段时间有需求, 就把它重新学习理解了一下, 重点参考

但是这个例子里面创建apn是有错误的(主要是对于使用dns有错误, 用它创建的iap, 无法进行dns), 而且选择apn的代码和我的需求不一致, 所以这里给出我的代码例子.

1. 根据需求, 使用cmnet或cmwap等apn域名字得到系统已存在的iap接入点的id. 如果找不到则返回0. 这里注意, 只有OUTGOING_GPRS表有apn域名字, 而IAP的id是你在建立连接时传给TCommDbConnPref.SetIapId的值. iap表的IAP_SERVICE字段是OUTGOING_GPRS表的id.

TUint32 ApnTools::GetApnL(const TDesC& aApnName)
{
    FUNC_U_TRACE();
    __UHEAP_MARK;
    TUint32 ret = 0;
 
    CCommsDatabase* db = CCommsDatabase::NewL(EDatabaseTypeIAP);
    CleanupStack::PushL(db);
 
    RArray<TUint32> gprsIds;
    CleanupClosePushL(gprsIds);
 
    LOG(_L("begin list OUTGOING_GPRS"));
    {
        CCommsDbTableView* view = db->OpenTableLC(TPtrC(OUTGOING_GPRS));
        TInt err = view->GotoFirstRecord();
        TInt record = 0;
        while ( err == KErrNone )
        {
            TBuf<100> name;
            TBuf<100> apn;
            TUint32 gprs_id = 0;
            view->ReadUintL(TPtrC(COMMDB_ID), gprs_id); //接入点ID
            view->ReadTextL(TPtrC(COMMDB_NAME), name); //连接名称
            view->ReadTextL(TPtrC(GPRS_APN), apn); //接入点名称,可以通过这个字段判断接入点是CMWAP还是CMNET
            LOG_FMT(_L("OUTGOING_GPRS %d: gprs_id = %d, name = %S, apn = %S"), record, gprs_id, &name, &apn);
            apn.LowerCase();
            if ( apn.Compare(aApnName) == 0 )
            {
                LOG_FMT(_L("in OUTGOING_GPRS, find record gprs_id = %d, name = %S"), gprs_id, &name);
                gprsIds.Append(gprs_id);
            }
            err = view->GotoNextRecord();
            record++;
        }
 
        if ( gprsIds.Count() <= 0 )
        {
            CleanupStack::PopAndDestroy(3, db);
            return 0;
        }
        CleanupStack::PopAndDestroy(view);
    }
 
    LOG(_L("begin list IAP"));
    {
        CCommsDbTableView* view = db->OpenTableLC(TPtrC(IAP));
        TInt err = view->GotoFirstRecord();
        TInt record = 0;
        while ( err == KErrNone )
        {
            TBuf<100> name;
            TUint32 iap_id = 0;
            TUint32 gprs_id;
            view->ReadUintL(TPtrC(COMMDB_ID), iap_id); //接入点ID
            view->ReadTextL(TPtrC(COMMDB_NAME), name); //连接名称
			view->ReadUintL(TPtrC(IAP_SERVICE), gprs_id); //gprs id
            LOG_FMT(_L("IAP %d: iap_id = %d, name = %S, gprs_id = %d"), record, iap_id, &name, gprs_id);
            if ( gprsIds.Find(gprs_id) != KErrNotFound )
            {
                LOG_FMT(_L("in IAP, Finded record iap_id = %d, name = %S, gprs_id = %d"), iap_id, &name, gprs_id);
                ret = iap_id;
                break;
            }
            err = view->GotoNextRecord();
            record++;
        }
        CleanupStack::PopAndDestroy(view);
    }
 
    CleanupStack::PopAndDestroy(2, db);
    __UHEAP_MARKEND;
    return ret;
}


 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值