The following example shows how an application can attach to an existing connection in order to gather information on the connection.
Note that error checking is included in this example.
//Open a session with the socket server RSocketServ socketServer; TInt err(KErrNone); err = socketServer.Connect(); if(err != KErrNone) return err; //Open a subsession with the socket server for the RConnection RConnection myConnection; err = myConnection.Open(socketServer); if(err != KErrNone) return err; //Start or attach the RConnection to an interface on the server TUint connectionCount; //Enumerate currently active connections across all socket servers err = myConnection.EnumerateConnections(connectionCount); if(err != KErrNone) return err; if(connectionCount == 0) // if no connections are started { err = myConnection.Start(); } else { TPckgBuf<TConnectionInfoV2> connectionInfo; err = myConnection.GetConnectionInfo(1, connectionInfo); // 1 = first active connection if(err!=KErrNone) return err; err = myConnection.Attach(connectionInfo, RConnection::EAttachTypeMonitor); }
At this point myConnection
points to a specific connection. Obviously the code snippet above could be expanded in several ways such as getting connection information for all connections and selecting a connection based on the information rather than simply selecting the first connection, as in this case.
Note for this and the next section that the number of connections and subconnections are not constant and can be expected to change during execution.
//Store subconnection information TUint subConnectionCount(0); err = myConnection.EnumerateSubConnections(subConnectionCount); if(err != KErrNone) return err; //TSubConnectionInfoGprsUmts is a superclass of TSubConnectionInfo, so we will use it //to hold either GPRS/UMTS or CSD connection information as required. (CSD connection //information is held in a plain TSubConnectionInfo object). TPckgBuf<TSubConnectionInfoGprsUmts> subConnectionInfo[subConnectionCount]; //note that for a CSD connection the subConnectionCount will be 1 for (TUint i=0; i<subConnectionCount; i++) { err = myConnection.GetSubConnectionInfo(i, subConnectionInfo[i]); if(err != KErrNone) return err; }
Once the connection has been attached it is possible to start querying individual subconnections.
From this point the client has access to subConnectionInfo().iSubConnectionUniqueId
, which is the unique identifier for the subconnection that has been queried. Now that this value is available the client can make any further calls to subconnection specific functionality within the RConnection
, for example querying the amount of data currently transferred by the specified subconnection.
TUint connectionuplinkVolume(0); TUint connectiondownlinkVolume(0); TUint subconnectionuplinkVolume(0); TUint subconnectiondownlinkVolume(0); TPckg<TUint> connectionUplinkVolume(connectionuplinkVolume); TPckg<TUint> connectionDownlinkVolume(connectiondownlinkVolume); TPckg<TUint> subConnectionUplinkVolume(subconnectionuplinkVolume); TPckg<TUint> subConnectionDownlinkVolume(subconnectiondownlinkVolume); TRequestStatus status; //Query data transfer over the connection myConnection.DataTransferredRequest(connectionUplinkVolume, connectionDownlinkVolume, status); //Query data transfer over a specified subconnection myConnection.DataTransferredRequest(subConnectionInfo[0]().iSubConnectionUniqueId, connectionUplinkVolume, connectionDownlinkVolume, status);