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;
}