The following example code illustrates successive IAS queries from the client side and subsequent closing of the RNetDatabase instance, ias. Note that the IASQuery() function employs two status words (one for the timeout and the other for the query). A much better way of handling the asynchroneity would be to use an active scheduler and queue the IAS request and timer on separate active objects.
// it is assumed here that addr is filled in from a successful // discovery // // IAS QUERY // RNetDatabase ias; ret=ias.Open(ss,protoInfo.addrFamily,protoInfo.protocol); if (ret==KErrNone) { // Successfully opened RNetDB } else { // Failed to open RNetDB } _LIT8(KTxtDevice,"Device"); _LIT8(KTxtDeviceName,"DeviceName"); _LIT8(KTxtIrDAIrCOMM,"IrDA:IrCOMM"); _LIT8(KTxtParameters,"Parameters"); _LIT8(KTxtIrDATinyTP,"IrDA:TinyTP:LsapSel"); TUint remDevAddr=addr.GetRemoteDevAddr(); IASQuery(ias,KTxtDevice,KTxtDeviceName,remDevAddr); IASQuery(ias,KTxtIrDAIrCOMM,KTxtParameters,remDevAddr); IASQuery(ias,KTxtIrDAIrCOMM,KTxtIrDATinyTP,remDevAddr); ias.Close(); // Close RNetDB ...
void IASQuery(RNetDatabase &aIAS,const TDesC8 &aClassName, const TDesC8 &aAttributeName,TUint aRemDevAddr) // // Synchronous IAS query. RTimer timeout of 5 seconds on the query. // { TBuf<64> res; TIASQuery querybuf(aClassName,aAttributeName,aRemDevAddr); TRequestStatus stat1,stat2; TIASResponse results; aIAS.Query(querybuf,results,stat2); RTimer tim; tim.CreateLocal(); tim.After(stat1,5000000L); User::WaitForRequest(stat1,stat2); if (stat1.Int()==KErrNone) // TIMER COMPLETED - IAS QUERY { // REQUEST HAS TIMED OUT. aIAS.Cancel(); return; } else if (stat2.Int()==KErrNone) // IAS QUERY COMPLETED OK. { switch(results.Type()) { case EIASDataMissing: // Missing break; case EIASDataInteger: // Integer TInt num; if (results.GetInteger(num)==KErrNone) { TinyTPPort=TUint8(num); } else { // Bad type } break; case EIASDataOctetSequence: // Byte sequence results.GetOctetSeq(res); DumpBuf(res); break; case EIASDataUserString: // String. Use break; // results.GetCharString8() // to get string default: // Bad type break; } tim.Cancel(); } else if (stat2.Int()!=KErrNone) // IAS QUERY COMPLETED { // UNSUCCESSFULLY. switch (stat2.Int()) { case KErrUnknown: // No such attribute break; case KErrBadName: // No such class break; default: // Unknown error break; } tim.Cancel(); } else { tim.Cancel(); // Unknown error on IAS query } };