I have got a UIQ Symbian application in which i connect to a ssl server (IIS), download the server certificate and a web page. I am using Thread,but is AO.
Example code:
iTotalBytesRead = 0;
_LIT(KFile,"c:\\secsocout.txt");
iOutputFileName = KFile;
iConnectSettings.iPortNum =8443;
iConnectSettings.iAddress=_L("192.168.100.56");
iConnectSettings.iPage=_L8("/sony_cn/servlet/jp.co.softbrain.wes.sfa.esm_offl.msserver.MainServlet");
iSndBuffer.Set((TUint8*)User::AllocL(KSendBufferSize),0,KSendBufferSize);
iRcvBuffer.Set((TUint8*)User::AllocL(KReceiveBufferSize),0,KReceiveBufferSize);
//self->iOutputFile->Replace(iEikonEnv->FsSession(),self->iOutputFileName,EFileWrite);
User::LeaveIfError( iSocketServ.Connect());
if (iInetAddr.Input(iConnectSettings.iAddress) != KErrNone)
{
User::LeaveIfError( iHostResolver.Open( iSocketServ, KAfInet, KProtocolInetTcp ));
TNameEntry nameEntry;
User::LeaveIfError (iHostResolver.GetByName(iConnectSettings.iAddress, nameEntry ));
TSockAddr sockAddr = nameEntry().iAddr;
iInetAddr = iInetAddr.Cast( sockAddr );
iHostResolver.Close();
}
iInetAddr.SetPort( iConnectSettings.iPortNum );
User::LeaveIfError( iSocket.Open( iSocketServ, KAfInet, KSockStream, KProtocolInetTcp ) );
iSocket.Connect( iInetAddr, iStatus );
User::WaitForRequest(iStatus);
User::LeaveIfError(iStatus.Int());
_LIT(KTLS1,"SSL3.0");
User::After(2000000);
if (iStatus == KErrNone)
{
iTlsSocket = CSecureSocket::NewL( iSocket, KTLS1 );
iTlsSocket->FlushSessionCache();
//TBuf8<2> buf;
//buf.SetLength(2);
//buf[0]=0; buf[1]=10;
// iTlsSocket->SetAvailableCipherSuites( buf );
//iTlsSocket->StartServerHandshake( iStatus );
//User::WaitForRequest(iStatus);
iTlsSocket->StartClientHandshake( iStatus );
User::WaitForRequest(iStatus);
// User::LeaveIfError(iStatus.Int());
}
iSndBuffer.SetLength( 0 );
iRcvBuffer.SetLength( 0 );
_LIT8(KSimpleGet, "GET ");
_LIT8(KNewLine, "\n");
iSndBuffer+=KSimpleGet;
iSndBuffer+=iConnectSettings.iPage;
iSndBuffer+=KNewLine;
iTlsSocket->Send( iSndBuffer, iStatus);
User::WaitForRequest(iStatus);
//if (iStatus == KErrNone)
iTlsSocket->RecvOneOrMore( iRcvBuffer, iStatus, iBytesSent);
User::WaitForRequest( iStatus );
iTotalBytesRead += iRcvBuffer.Length();
iOutputFile->Write(iRcvBuffer);
User::After( 9000000 );
while(true)
{
// Put the received data in the output file & reset the receive buffer
//iConsole->Printf(KFileErrorMessage);
iRcvBuffer.SetLength( 0 );
iTlsSocket->RecvOneOrMore( iRcvBuffer, iStatus,iBytesSent );
User::WaitForRequest( iStatus );
iTotalBytesRead += iRcvBuffer.Length();
iOutputFile->Write(iRcvBuffer);
// Case 1: error is KErrEof (message complete) or no data received, so stop
if ( ( iStatus==KErrEof ) || ( iRcvBuffer.Length() == 0 ) )
{
//iConsole->Printf(KCompleteMessage, iTotalBytesRead);
// Close the socket neatly
//iRunState = EConnectionClosed;
iTimer.After( iStatus, 1000000 );
return;
}
1.Created Socket Connection
2.Created CSecureSocket::NewL
3.Call CSecureSocket->StartClientHandshake(iStatus)
4.User::WaitForRequest(iStatus)
Application is hanging at this place.
StartClientHandshake(iStatus) doesn't return proper status.
How to resolve this.






