diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/rconnection_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/rconnection_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,733 +0,0 @@ - -
-00001 // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -00002 // All rights reserved. -00003 // This component and the accompanying materials are made available -00004 // under the terms of "Eclipse Public License v1.0" -00005 // which accompanies this distribution, and is available -00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". -00007 // -00008 // Initial Contributors: -00009 // Nokia Corporation - initial contribution. -00010 // -00011 // Contributors: -00012 // -00013 // Description: -00014 // -00015 -00016 -00017 -00018 #include "rconnection.h" -00019 -00020 _LIT(KContinueNote,"Press any key to continue\n"); -00021 _LIT(KOpenErr,"Open() unsuccessful\n"); -00022 _LIT(KStartErr,"RConnection::Start() unsuccessful\n"); -00023 _LIT(KInterfaceUp,"Connection has started and interface is up\n"); -00024 _LIT(KInterfaceDown,"Connection has closed and interface is down\n"); -00025 _LIT(KConnectionUpNote,"Connection is up....\n"); -00026 _LIT(KConnectionStartNote,"Start() was called on the connection\n"); -00027 _LIT(KConnectionClosingNote,"The connection is about to be closed\n"); -00028 _LIT(KWaitNote,"Waiting for the connection to close.....\n"); -00029 _LIT(KUpLinkData,"Data volume on uplink=%d bytes\n"); -00030 _LIT(KDownLinkData,"Data volume on downlink=%d bytes\n"); -00031 _LIT(KDataTransferNote,"Calling DataSendAndReceive()\n"); -00032 _LIT(KSocketErrNote,"Socket preparation failed\n"); -00033 _LIT(KSocketSetNote,"Socket successfully established\n"); -00034 -00035 _LIT(KRow1,"**********************************************************\n"); -00036 _LIT(KRow2," Section Demonstrating : \n"); -00037 _LIT(KRow3,"**********************************************************\n"); -00038 _LIT(KTab,"\t"); -00039 _LIT(KNewLine,"\n"); -00040 -00041 #define KEchoPort 0xAB //Port value for client socket. -00042 #define KMaxBufferLength 2048 //Maximum length of buffer used to send and receive data. -00043 #define KDelay 1000000 //Time interval in microseconds to wait before carrying out the next task. -00044 -00048 CRConnection::CRConnection(CConsoleBase* aConsole) -00049 :iConsole(aConsole) -00050 { -00051 //Set the destination address and port. -00052 //Before running the example user should start an Echo server -00053 //and then specify the respective IP Address and port of the echo server -00054 //for iDestAddr. -00055 //Until the Echo Server is established send and receive functionality won't work properly. -00056 -00057 -00058 _LIT(KDestAddr,"127.0.0.1"); -00059 const TInt KSockPort= 7; -00060 -00061 iDestAddr.Input(KDestAddr); -00062 iDestAddr.SetPort(KSockPort); -00063 -00064 StartESOCK(); -00065 } -00066 -00067 -00071 CRConnection::~CRConnection() -00072 { -00073 //Closing the monitor and socket server session. -00074 iMonitor.Close(); -00075 iSocketServ.Close(); -00076 } -00077 -00083 void CRConnection::StartESOCK() -00084 { -00085 -00086 //Connects to the socket server. -00087 TInt err=iSocketServ.Connect(); -00088 if(err!=KErrNone) -00089 { -00090 _LIT(KConnectErr,"Connect failed\n"); -00091 User::Panic(KConnectErr,err); -00092 } -00093 -00094 //Opens the monitor to receive notification when another connection -00095 //that uses the same socket server goes up or down. -00096 err=iMonitor.Open(iSocketServ); -00097 if(err!=KErrNone) -00098 { -00099 iConsole->Printf(KOpenErr); -00100 return; -00101 } -00102 } -00103 -00111 TInt CRConnection::ConnectWithoutDbOverrideL() -00112 { -00113 // Opens an RConnection and associates it with the same socket server session as iMonitor. -00114 // To use an RConnection instance first it needs to be opened on an existing socket server session -00115 // and then Start() must be called to associate it with an underlying interface. -00116 TInt err=iConnection.Open(iSocketServ); -00117 if(err!=KErrNone) -00118 { -00119 iConsole->Printf(KOpenErr); -00120 return err; -00121 } -00122 -00123 //Starts the connection using default CommDb settings. -00124 err=iConnection.Start(); -00125 if(err!=KErrNone) -00126 { -00127 iConsole->Printf(KStartErr); -00128 return err; -00129 } -00130 else -00131 { -00132 iConsole->Printf(KConnectionStartNote); -00133 return err; -00134 } -00135 } -00136 -00140 TInt CRConnection::ConnectWithDbOverrideL() -00141 { -00142 // To use an RConnection instance first it needs to be opened on an existing socket server session -00143 // and then Start() must be called to associate it with an underlying interface. -00144 TInt err=iConnection.Open(iSocketServ); -00145 if(err!=KErrNone) -00146 { -00147 iConsole->Printf(KOpenErr); -00148 return err; -00149 } -00150 -00151 // Overrides some Commdb connection preferences. -00152 const TInt KIapId=9; -00153 TCommDbConnPref prefs; -00154 prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt); -00155 prefs.SetIapId(KIapId); //The commdb is set for Ethernet with Daemon Static IP. -00156 -00157 //Starts an outgoing connection. -00158 err=iConnection.Start(prefs); -00159 -00160 if(err==KErrNone) -00161 { -00162 iConsole->Printf(KConnectionStartNote); -00163 return err; -00164 } -00165 else -00166 { -00167 iConsole->Printf(KStartErr); -00168 return err; -00169 } -00170 } -00176 void CRConnection::GetProgressNotification() -00177 { -00178 TRequestStatus status; -00179 TNifProgressBuf buffer; //filled with progress/error information on completion -00180 while((TUint)(buffer().iStage)!=KConnectionUp) -00181 { -00182 iConnection.ProgressNotification(buffer,status); -00183 User::WaitForRequest(status); -00184 if(status==KErrNone&&(buffer().iError)==KErrNone) -00185 { -00186 DisplayProgressinfo(buffer()); -00187 } -00188 User::After(KDelay); -00189 } -00190 iConsole->Printf(KConnectionUpNote); //Link layer is now open. -00191 -00192 -00193 } -00194 -00199 void CRConnection::DisplayProgressinfo(const TNifProgress& aProgress) -00200 { -00201 switch(aProgress.iStage) -00202 { -00203 case KStartingSelection: -00204 { -00205 _LIT(KStartSelectionNote,"Starting Selection...........\n"); -00206 iConsole->Printf(KStartSelectionNote); -00207 break; -00208 } -00209 -00210 case KFinishedSelection: -00211 { -00212 _LIT(KFinishedSelectionNote,"Finished Selection...........\n"); -00213 iConsole->Printf(KFinishedSelectionNote); -00214 break; -00215 } -00216 -00217 case KConnectionOpen: -00218 { -00219 _LIT(KWlanAgtConnected,"Wlan agent connected....\n"); -00220 iConsole->Printf(KWlanAgtConnected); -00221 break; -00222 } -00223 -00224 //Generic progress notifications from the configuration daemon. -00225 case KConfigDaemonLoading: -00226 { -00227 _LIT(KConfigDaemonLoadingNote,"Daemon loading....\n"); -00228 iConsole->Printf(KConfigDaemonLoadingNote); -00229 break; -00230 } -00231 -00232 case KConfigDaemonLoaded: -00233 { -00234 _LIT(KConfigDaemonLoadedNote,"Daemon loaded....\n"); -00235 iConsole->Printf(KConfigDaemonLoadedNote); -00236 break; -00237 } -00238 -00239 case KConfigDaemonStartingRegistration: -00240 { -00241 _LIT(KConfigDaemonStartingRegistrationNote,"Daemon starting registration....\n"); -00242 iConsole->Printf(KConfigDaemonStartingRegistrationNote); -00243 break; -00244 } -00245 -00246 case KConfigDaemonFinishedRegistration: -00247 { -00248 _LIT(KConfigDaemonFinishedRegistrationNote,"Daemon registration finished....\n"); -00249 iConsole->Printf(KConfigDaemonFinishedRegistrationNote); -00250 break; -00251 } -00252 -00253 default: -00254 break; -00255 } -00256 } -00257 -00263 TInt CRConnection::PrepareSocket() -00264 { -00265 TInt err = iSocket.Open(iSocketServ, KAfInet, KSockDatagram, KProtocolInetUdp, iConnection); -00266 if (err != KErrNone) -00267 { -00268 return err; -00269 } -00270 -00271 //Sets a socket option. These options affect operations such as the routing of packets, -00272 //out-of-band data transfer, and so on. Here the option level "KSolInetIp" is set for an IP socket, -00273 //and the option being set is "KSoReuseAddr". This means the socket is allowed to be bound to a local -00274 //address that is already in use. -00275 //The third parameter i.e 1 states that the option is enabled.A value of 0 means disabled. -00276 -00277 err = iSocket.SetOpt(KSoReuseAddr, KSolInetIp, 1); -00278 if (err != KErrNone) -00279 { -00280 return err; -00281 } -00282 -00283 //Sets a local port for the socket. -00284 err = iSocket.SetLocalPort(KEchoPort); -00285 if (err != KErrNone) -00286 { -00287 return err; -00288 } -00289 return err; -00290 } -00296 TInt CRConnection::SendUdpData(TUint aPayloadSize) -00297 { -00298 -00299 TBuf8<KMaxBufferLength> buffer; -00300 // construct an ICMP packet to send on the socket. -00301 buffer.SetMax(); -00302 buffer.FillZ(); -00303 buffer[0] = (TUint8) 0x08; // ICMP type = 8. -00304 buffer[1] = (TUint8) 0x00; // ICMP code = 0. -00305 buffer[2] = (TUint8) 0xF7; // ICMP checksum high byte. -00306 buffer[3] = (TUint8) 0xFF; // ICMP checksum low byte. -00307 -00308 // NB the rest of the buffer is zero -00309 // hence the checksum (0xFFFF - 0x800) since 0x8 -00310 // is the only non-zero element of the buffer -00311 -00312 // set the length of the data to be sent to that specified (payload size!). -00313 buffer.SetLength(aPayloadSize); -00314 -00315 TRequestStatus status; -00316 -00317 // send the data out over the socket. -00318 iSocket.SendTo(buffer, iDestAddr, 0, status); -00319 User::WaitForRequest(status); -00320 -00321 return status.Int(); -00322 } -00323 -00329 TInt CRConnection::RecvUdpData(TUint aPayloadSize) -00330 { -00331 -00332 TInt timeoutInSecs = 30; -00333 RTimer timer; -00334 -00335 /* -00336 Creates a timer so that we can handle error situation arising due to lost udp packet -00337 and dont completely rely on being errored by esock alone. This code waits for 30sec for -00338 udp data packet to arrive from the server. If the data is not available within this -00339 time the socket waiting for data is closed and the error value of KErrTimedOut is -00340 returned. -00341 */ -00342 TInt ret; -00343 if ((ret = timer.CreateLocal()) != KErrNone) -00344 { -00345 timer.Close(); // closing the timer. -00346 return ret; -00347 } -00348 TRequestStatus timerStatus; -00349 timer.After(timerStatus, timeoutInSecs * 1000000); //setting timer. -00350 -00351 TBuf8<KMaxBufferLength> buffer; -00352 buffer.Zero(); -00353 buffer.SetLength(aPayloadSize); -00354 -00355 TRequestStatus status; -00356 iSocket.RecvFrom(buffer, iDestAddr, 0, status); //waiting on data from the server. -00357 User::WaitForRequest(status, timerStatus); -00358 -00359 // Timer expired, and if no data is received cancel the receive operation. -00360 if(timerStatus != KRequestPending) -00361 { -00362 iSocket.CancelAll(); -00363 User::WaitForRequest(status); -00364 timer.Close(); -00365 return KErrTimedOut; -00366 } -00367 // otherwise cancel the timer. -00368 timer.Cancel(); -00369 User::WaitForRequest(timerStatus); -00370 timer.Close(); -00371 -00372 //when data is successfully received, check against the previously sent buffer data, -00373 //to see what is received is what was sent. -00374 if (status != KErrNone) -00375 return status.Int(); -00376 else -00377 { -00378 if(buffer[0] == 0x08) -00379 { -00380 if(buffer[1] == 0x00) -00381 { -00382 if(buffer[2] == 0xF7) -00383 { -00384 if(buffer[3] == 0xFF) -00385 { -00386 ; -00387 } -00388 else -00389 { -00390 _LIT(KFourthDataSet,"Fourth set of data not received\n"); -00391 iConsole->Printf(KFourthDataSet); -00392 } -00393 } -00394 else -00395 { -00396 _LIT(KThirdDataSet,"Third set of data not received\n"); -00397 iConsole->Printf(KThirdDataSet); -00398 } -00399 -00400 } -00401 else -00402 { -00403 _LIT(KSecondDataSet,"Second set of data not received\n"); -00404 iConsole->Printf(KSecondDataSet); -00405 } -00406 } -00407 else -00408 { -00409 _LIT(KFirstDataSet,"First set of data not received\n"); -00410 iConsole->Printf(KFirstDataSet); -00411 } -00412 -00413 } -00414 return KErrNone; -00415 } -00416 -00420 void CRConnection::DataSendAndReceive(TUint aPayloadSize) -00421 { -00422 //Sends UDP Data. -00423 TInt err = SendUdpData(aPayloadSize); -00424 if (err != KErrNone) -00425 { -00426 _LIT(KDataSentErrNote,"DataSend Failed\n"); -00427 iConsole->Printf(KDataSentErrNote); -00428 return ; -00429 } -00430 else -00431 { -00432 _LIT(KDataSentNote,"DataSend Successful\n"); -00433 iConsole->Printf(KDataSentNote); -00434 } -00435 -00436 //Receives UDP Data. -00437 err = RecvUdpData(aPayloadSize); -00438 if(err!=KErrNone) -00439 { -00440 _LIT(KDataReceiveErrNote,"DataReceive Failed\n"); -00441 iConsole->Printf(KDataReceiveErrNote); -00442 return ; -00443 } -00444 else -00445 { -00446 _LIT(KDataReceiveNote,"DataReceive Successful\n"); -00447 iConsole->Printf(KDataReceiveNote); -00448 } -00449 -00450 } -00451 -00455 void CRConnection::DataTransferredRequest() -00456 { -00457 TPckg<TUint> uplinkVolumeDes(0); //holds the amount of data received. -00458 TPckg<TUint> downlinkVolumeDes(0); //holds the amount of data transmitted. -00459 -00460 TRequestStatus datastatus; -00461 -00462 iConnection.DataTransferredRequest(uplinkVolumeDes, downlinkVolumeDes, datastatus); -00463 User::WaitForRequest(datastatus); -00464 -00465 if(datastatus==KErrNone) -00466 { -00467 iConsole->Printf(KUpLinkData,uplinkVolumeDes()); -00468 iConsole->Printf(KDownLinkData,downlinkVolumeDes()); -00469 } -00470 -00471 } -00476 void CRConnection::DataTransferNotificationRequest() -00477 { -00478 const TUint KHundredBytes = 100; //The threshold value for notification. -00479 const TUint KThousandBytes = 1000; //The total amount of data to send/receive. -00480 TPckg< TUint > uplinkPkg(0); //Holds the amount of data sent. -00481 TPckg< TUint > downlinkPkg(0);//Holds the amount of data received. -00482 TRequestStatus dataSentStatus,dataReceivedStatus; -00483 -00484 //Registers for data sent notification. The process gets notified when 100 bytes of data are sent. -00485 iConnection.DataSentNotificationRequest(KHundredBytes, uplinkPkg, dataSentStatus ); -00486 -00487 //Registers for data received notification. The process gets notified when 100 bytes of data are received. -00488 iConnection.DataReceivedNotificationRequest(KHundredBytes, downlinkPkg, dataReceivedStatus ); -00489 iConsole->Printf(KDataTransferNote); -00490 -00491 //Sends and receives 1000 bytes of data. -00492 DataSendAndReceive(KThousandBytes); -00493 -00494 /* -00495 Gets the total data sent/received = datavolume+UdpPacketOverhead -00496 here datavolume=1000 bytes,thus total data send/receive > 1000 as -00497 some overhead gets added on top of the actual datavolume. -00498 */ -00499 -00500 User::WaitForRequest(dataSentStatus); -00501 User::WaitForRequest(dataReceivedStatus); -00502 if ((dataSentStatus.Int())== KErrNone) -00503 { -00504 _LIT(KSentSuccessNote,"DataSentNotificationRequest is successful and\n "); -00505 iConsole->Printf(KSentSuccessNote); -00506 } -00507 else -00508 { -00509 _LIT(KSentFailureNote,"DataSentNotificationRequest has failed and \n"); -00510 iConsole->Printf(KSentFailureNote); -00511 } -00512 iConsole->Printf(KUpLinkData,uplinkPkg()); -00513 -00514 if (dataReceivedStatus.Int()==KErrNone) -00515 { -00516 _LIT(KReceivedSuccessNote,"DataReceivedNotificationRequest is successful and \n"); -00517 iConsole->Printf(KReceivedSuccessNote); -00518 } -00519 else -00520 { -00521 _LIT(KReceivedFailureNote,"DataReceivedNotificationRequest has failed and \n"); -00522 iConsole->Printf(KReceivedFailureNote); -00523 } -00524 iConsole->Printf(KDownLinkData,downlinkPkg()); -00525 -00526 } -00527 -00528 void CRConnection::DisplaySectionToDemo(const TDesC& aText) -00529 { -00530 TBuf<120> newtext; -00531 newtext.Append(KTab); -00532 newtext.Append(aText); -00533 newtext.Append(KTab); -00534 newtext.Append(KNewLine); -00535 iConsole->Printf(KRow1); -00536 iConsole->Printf(KRow2); -00537 iConsole->Printf(newtext); -00538 iConsole->Printf(KRow3); -00539 iConsole->Printf(KNewLine); -00540 } -00541 -00552 void CRConnection::DemoApiWithoutDbOverrideL() -00553 { -00554 _LIT(KDemoApiWithoutDbOverride,"RConnection API without CommDb override\n"); -00555 iConsole->ClearScreen(); -00556 DisplaySectionToDemo(KDemoApiWithoutDbOverride); -00557 -00558 TRequestStatus status; -00559 TInterfaceNotificationBuf info; -00560 //Makes a request for notification when the interface goes up i.e. the connection starts. -00561 iMonitor.AllInterfaceNotification(info,status); -00562 -00563 //Makes an explicit connection without CommDb override. -00564 TInt err=ConnectWithoutDbOverrideL(); -00565 if(err!=KErrNone) -00566 return; -00567 -00568 //Waits on TRequestStatus until the interface is up. -00569 User::WaitForRequest(status); -00570 if(info().iState==EInterfaceUp) -00571 { -00572 iConsole->Printf(KInterfaceUp); -00573 } -00574 -00575 //Gets and prints progress notification for the connection. -00576 GetProgressNotification(); -00577 User::After(KDelay); // waits for a while and then proceeds. This helps to get a sequential flow. -00578 -00579 err=PrepareSocket(); // Once the socket is ready for data transfer, send and receive operations can be carried out. -00580 if(err!=KErrNone) -00581 { -00582 iConsole->Printf(KSocketErrNote); -00583 return; -00584 } -00585 else -00586 { -00587 iConsole->Printf(KSocketSetNote); -00588 } -00589 -00590 iConsole->Printf(KDataTransferNote); -00591 -00592 const TUint KPayLoadSize=512; -00593 //Sends and receives data through the socket. -00594 DataSendAndReceive(KPayLoadSize); -00595 -00596 DataTransferredRequest();// Gets and prints the amount of data that has been transferred. -00597 -00598 User::After(KDelay);//Wait for a while, before proceeding. -00599 -00600 //Makes a request for notification when the interface goes down i.e. the connection closes. -00601 iMonitor.AllInterfaceNotification(info,status); -00602 -00603 // All the operations related to the socket and connection are done, so close both. -00604 iSocket.Close(); -00605 iConsole->Printf(KConnectionClosingNote); -00606 iConnection.Close(); -00607 iConsole->Printf(KWaitNote); -00608 -00609 //Waits for the 'interface down' notification -00610 User::WaitForRequest(status); -00611 if(info().iState==EInterfaceDown) -00612 { -00613 iConsole->Printf(KInterfaceDown); -00614 } -00615 -00616 iConsole->Printf(KContinueNote); -00617 iConsole->Getch(); -00618 -00619 } -00620 -00631 void CRConnection::DemoApiWithDbOverrideL() -00632 { -00633 -00634 _LIT(KDemoApiWithDbOverride,"RConnection API with CommDb override\n"); -00635 iConsole->ClearScreen(); -00636 DisplaySectionToDemo(KDemoApiWithDbOverride); -00637 -00638 TRequestStatus status; -00639 TInterfaceNotificationBuf info; -00640 -00641 // Requests notification when the connection is established. -00642 // Notification request is issued before calling Start(). -00643 iMonitor.AllInterfaceNotification(info,status); -00644 -00645 //Start an explicit connection with CommDb override. -00646 TInt err=ConnectWithDbOverrideL(); -00647 if(err!=KErrNone) -00648 return; -00649 -00650 //Waits on TRequestStatus until the interface is up. -00651 User::WaitForRequest(status); -00652 if(info().iState==EInterfaceUp) -00653 { -00654 iConsole->Printf(KInterfaceUp); -00655 } -00656 -00657 //Gets and prints progress notification for the connection. -00658 GetProgressNotification(); -00659 -00660 //Waits for a while before next operation. -00661 User::After(KDelay); -00662 -00663 err=PrepareSocket(); //Once the socket is ready for data transfer, send and receive operations can be carried out. -00664 if(err!=KErrNone) -00665 { -00666 iConsole->Printf(KSocketErrNote); -00667 return; -00668 } -00669 else -00670 { -00671 iConsole->Printf(KSocketSetNote); -00672 } -00673 //Sends and receives data and requests notification when a threshold amount of data is transferred. -00674 DataTransferNotificationRequest(); -00675 User::After(KDelay); -00676 -00677 //Makes a request for notification when the interface goes down i.e. the connection closes. -00678 iMonitor.AllInterfaceNotification(info,status); -00679 -00680 //Closes socket -00681 iSocket.Close(); -00682 iConsole->Printf(KConnectionClosingNote); -00683 -00684 //Closes the connection. -00685 iConnection.Close(); -00686 iConsole->Printf(KWaitNote); -00687 -00688 //Waits on the TRequestStatus until the interface is down -00689 User::WaitForRequest(status); -00690 if(info().iState==EInterfaceDown) -00691 { -00692 iConsole->Printf(KInterfaceDown); -00693 } -00694 -00695 iConsole->Printf(KContinueNote); -00696 iConsole->Getch(); -00697 -00698 } -00699 -00709 void CRConnection::AttachToExistingInterfaceL() -00710 { -00711 -00712 _LIT(KAttachToConnection,"Attaching to a connection\n"); -00713 iConsole->ClearScreen(); -00714 DisplaySectionToDemo(KAttachToConnection); -00715 -00716 // Attaching to a connection is done as follows: -00717 // 1)first open a connection interface. -00718 // 2)on this connection interface, obtain the no. of active connections and their connection info. -00719 // 3)a second connection is opened. -00720 // 4)this 2nd connection is attached to the existing active connection interface. -00721 -00722 RConnection conn; -00723 -00724 //Opens the first RConnection. -00725 TInt err = conn.Open(iSocketServ); -00726 if(err==KErrNone) -00727 { -00728 CleanupClosePushL(conn); -00729 } -00730 else -00731 { -00732 iConsole->Printf(KOpenErr); -00733 return; -00734 } -00735 -00736 //Opens the 2nd connection. -00737 err = iConnection.Open(iSocketServ); -00738 if(err!=KErrNone) -00739 { -00740 iConsole->Printf(KOpenErr); -00741 return; -00742 } -00743 -00744 //Starts the 1st connection. -00745 err=conn.Start(); -00746 if(err!=KErrNone) -00747 { -00748 iConsole->Printf(KStartErr); -00749 return; -00750 } -00751 -00752 // Enumerates the total number of connections on the 1st connection interface. -00753 // This call returns a count of 1. -00754 TUint connectionCount; -00755 err = conn.EnumerateConnections(connectionCount); -00756 if((err != KErrNone) || (connectionCount < 1)) -00757 { -00758 return; -00759 } -00760 -00761 -00762 // Gets connection info for the 1st connection (conn) which will be used by the -00763 // 2nd connection to attach to. -00764 TConnectionInfoBuf connectionInfo; -00765 err = conn.GetConnectionInfo(connectionCount, connectionInfo); // gets connection info about the indexed connection -00766 // (the 1st connection). -00767 if(err != KErrNone) -00768 { -00769 return; -00770 } -00771 -00772 // Attaches iConnection to the existing underlying interface. -00773 // The connection is used for normal data transfer. -00774 // Both connections are now actively associated with an interface. -00775 err = iConnection.Attach(connectionInfo,RConnection::EAttachTypeNormal); -00776 if(err==KErrNone) -00777 { -00778 _LIT(KAttachNote,"Attached to interface\n"); -00779 iConsole->Printf(KAttachNote); -00780 } -00781 else -00782 return; -00783 -00784 // Gets progress info and prints it to the console. -00785 TNifProgress progress; -00786 err = iConnection.Progress(progress); -00787 if(err==KErrNone&&progress.iError==KErrNone) -00788 { -00789 if((TUint)(progress.iStage)==KConnectionUp) -00790 iConsole->Printf(KConnectionUpNote); -00791 } -00792 -00793 User::After(KDelay); //waits for a while before proceeding. -00794 -00795 iConsole->Printf(KConnectionClosingNote); -00796 -00797 //closes both connections. -00798 iConnection.Close(); -00799 CleanupStack::PopAndDestroy(&conn); //conn. -00800 -00801 _LIT(KConnectionClosedNote,"Connection Closed\n"); -00802 iConsole->Printf(KConnectionClosedNote); -00803 -00804 } -00805 -