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