diff -r da856f45b798 -r ff5174af067c zeroconf/zeroconfsharing/bjrhttpserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/zeroconfsharing/bjrhttpserver.cpp Wed Jul 21 14:28:48 2010 +0530 @@ -0,0 +1,789 @@ +/* +* Copyright (c) 2001-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include +//#include +#include +#include +#include +#include +#include +#include "bjrhttpserver.h" +#include + +const TChar KHttpSlash = '/'; +const TChar KFileSlash = '\\'; + +// format for output of data/time values +//_LIT(KDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3"); + +// Format for hook file name and location for hooks +//_LIT(KHookFormat, "Z:\\httptest\\%S.esk"); +//_LIT(KHookDir, "C:\\System\\Data\\"); + +//_LIT(KEnterProx, "Enter Proxy authority"); +//_LIT(KEnterHook, "Enter Hook name (preface with '-' to delete)"); +//_LIT(KEnterSessId, "Enter Session ID (positive integer or 'none')"); + +_LIT8 (KAbsDocumentRoot, "/Images/"); +_LIT8 (KRelDocumentRoot, "/Images"); +_LIT8 (KRoot, "c:\\data\\"); +_LIT8 (KHomePage, "Images/index.html"); +_LIT8 (KFound, "Found"); +_LIT8 (KOk, "OK"); +_LIT8 (KNotFound, "Not Found"); +_LIT8(KTextContent, "text/"); +_LIT8(KImageContent, "image/"); +_LIT(KHtml, "html"); +_LIT8(KGif, "gif"); +/* If the file httpexampleclient.txt exists in the root directory of a drive + it will be used to provide default initial values for when setting the URL, + proxy, etc. The file format is: + [var] = [value] + for example: + PROXY = my.proxy.co.uk:5473 + URL = http://www.example.org/dir/file.html + whitespace is ignored. + + Note: these are the the values set at run time, they are merely the default + options presented to the user. In the above example the proxy is not turned + on by default, but the string "my.proxy.co.uk:5473" is presetned as the default + option when the use hits "p", saving them the need to have to type it in. + */ +// Defaults +_LIT(KDefaultFileFormat,"%c:\\httpexampleserver.txt"); +_LIT(KHookString, "HOOK"); +_LIT(KProxyString, "PROXY"); +_LIT(KURLString, "URL"); +_LIT(KSessionIdString, "SESSIONID"); +//_LIT(KNone, "none"); +//_LIT(KSchemeHttps, "https"); + + + +// File system root +//_LIT(KFileSystemRoot,"C:\\"); +//added on July13,09 +_LIT(KFileName,"c:\\logs\\logs.txt"); +_LIT(KFileName2,"c:\\logs\\logs2.txt"); + +_LIT(KServerLog,"c:\\httpserverlog.txt"); + +const TInt endpos = 0; +enum THttpExampleClientPanics + { + EReqBodySumitBufferNotAllocated, + KBodyWithInvalidSize, + KCouldntNotifyBodyDataPart + }; + +// Size of buffer used when submitting request bodies +//const TInt KMaxSubmitSize = 1024; +//const TInt KMaxHeaderNameLen = 32; +//const TInt KMaxHeaderValueLen = 128; + + +// +// Implementation of CHttpServer +// + + +// Supplied as the name of the test program to CHttpExampleUtils +_LIT(KHttpExampleClientTestName, "HttpExampleServer"); + +CHttpServer::CHttpServer () + { + __FLOG_OPEN ( "http", "httpexampleserver.txt" ); + __FLOG_0 ( _T8 ( "CHttpServer::CHttpServer ")); + // Initial timestamp is time now + ResetTimeElapsed(); + } + + +CHttpServer::~CHttpServer() + { + __FLOG_0 ( _T8 ( "CHttpServer::~CHttpServer")); + CleanupTransactions (); + //iLogFile.Close(); + iSess.Close(); + //delete iUtils; + iFileServ.Close(); + iConnection.Close(); + iSocketServ.Close(); + + iIPAddr.Close(); + } + +CHttpServer* CHttpServer::NewLC() + { + CHttpServer* me = new(ELeave) CHttpServer; + CleanupStack::PushL(me); + me->ConstructL(); + return me; + } + +CHttpServer* CHttpServer::NewL() + { + CHttpServer* me = NewLC(); + CleanupStack::Pop(me); + return me; + } + +void CHttpServer::ConstructL() + { + __FLOG_0 ( _T8 ( "CHttpServer::ConstructL")); + //iUtils = CHttpExampleUtils::NewL(KHttpExampleClientTestName, *this ); + User::LeaveIfError(iFileServ.Connect()); + iLogFile.Replace(iFileServ,KServerLog,EFileWrite); + _LIT8(Kmsg,"\nChttpServer::ConstructL"); + iLogFile.Write(Kmsg); + User::LeaveIfError( iSocketServ.Connect() ); + + } + +RHTTPTransaction CHttpServer::NewTransactionL ( const TUriC8& aUri, RStringF aMethod ) + { + __FLOG_0 ( _T8 ( "CHttpServer::NewTransactionL ")); + CHttpServerTransactionBase* trans = CHttpDataTransmitter::NewL (*this, /*iUtils,*/ iFileServ, iSess, aUri, aMethod); + iTransactions.Append(trans); + return trans->Transaction (); + } + +// to avoid code bloat +#define CHECKVAL(name) if(var==K ##name##String) {a##name.Copy(val);} + +void CHttpServer::SetDefaults(TDes& aURL, TDes& aProxy, TDes& aHook, TDes& aSessionId) + { + __FLOG_4 ( _T8 ( "CHttpServer::SetDefaults [aURL=%S,aProxy=%S,aHook=%S,aSessionId=%S]"), &aURL, &aProxy, &aHook, &aSessionId); + TFileName filename; + RFile file; + filename.Format(KDefaultFileFormat, 'C'); + TInt err = file.Open(iFileServ, filename, EFileRead); + if(err != KErrNone) + { + filename.Format(KDefaultFileFormat, 'Z'); + err = file.Open(iFileServ, filename, EFileRead); + } + if(err == KErrNone) + { + TFileText line; + line.Set(file); + TInt err = line.Read(filename); + while(err == KErrNone || err ==KErrTooBig) + { + filename.Trim(); + TInt div = filename.Locate('='); + if(div>0) + { + TInt i; + for (i=div-1;i>0 && filename[i]==' ';i--); // ibid + TPtrC var = filename.Left(i+1); + for (i=div+1;i url; + TBuf<256> prox; + TBuf<256> hook; + TBuf<16> sessid; + SetDefaults(url, prox, hook, sessid); + + + //iUtils->Test().Console()->ClearScreen(); + _LIT(KSelectOption, "\n\n Select an option \n\n"); + //iUtils->Test().Printf(KSelectOption); + _LIT(KPossibleSelectionsText, " 1 Start \n 2 Stop \n 3 Exit\n"); + _LIT(KPossibleSelections,"123"); + //iUtils->RequestSelection ( KPossibleSelectionsText, KPossibleSelections ); + } + +void CHttpServer::StartConnectionL(TInt aIapId) + { + // Connection preferences + TCommDbConnPref commDbConnPref; + TUint32 iap(aIapId); + _LIT8(Kmsg,"\nCHttpServer::StartConnectionL"); + iLogFile.Write(Kmsg); + commDbConnPref.SetIapId( iap ); + commDbConnPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + commDbConnPref.SetBearerSet( ECommDbBearerWLAN ); + + User::LeaveIfError( iConnection.Open( iSocketServ ) ); + User::LeaveIfError( iConnection.Start( commDbConnPref ) ); + _LIT8(Kmsg2,"\nConnection started"); + iLogFile.Write(Kmsg2); + } + + +TInt CHttpServer::GetLocalHost ( TSockAddr& aAddr ) + { + RSocket socket; + TInt err = socket.Open ( iSocketServ, KAfInet, KSockStream, KProtocolInetTcp ); + + if ( err == KErrNone ) + { + TInetAddr localHost; + localHost.SetAddress ( KInetAddrAny ); + TPckgBuf query; + query ().iDstAddr = localHost; + + err = socket.GetOpt ( KSoInetIfQueryByDstAddr, KSolInetIfQuery, query ); + + if ( err == KErrNone ) + { + // its local IP address + localHost = query ().iSrcAddr; + aAddr = localHost; + } + } + socket.Close (); + return err; + } + +TDesC8& CHttpServer::GetIPAddress() + { + return iIPAddr; + } + + +void CHttpServer::ProcessSelectionL ( TInt aSelection ) + { + __FLOG_1 ( _T8 ( "CHttpServer::ProcessSelection [aSelection =%d]"), aSelection ); + //_LIT8(Kmsg,"\n CHttpServer::ProcessSelection"); + //iLogFile.Write(Kmsg); + switch ( aSelection ) + { + case EStart: + { + _LIT8 ( KHTTPServer, "HTTd/TCP" ); + + //_LIT8(Kmsg2,"Opening server RHTTPClientServerSession - "); + //iLogFile.Write(Kmsg2); + //iLogFile.Write(KHTTPServer); + // Open the RHTTPClientServerSession + _LIT8(Kmsg2,"\nTrying to connect..."); + iLogFile.Write(Kmsg2); + //StartConnectionL(aIapId); + + iSess.OpenL ( KHTTPServer () ); + _LIT8(Kmsg3,"\nRHTTPClientServerSession opened"); + iLogFile.Write(Kmsg3); + /* + RHTTPConnectionInfo connInfo = iSess.ConnectionInfo(); + + //Attach to socket server + connInfo.SetPropertyL( iSess.StringPool().StringF(HTTP::EHttpSocketServ, + RHTTPClientServerSession::GetTable() ), + THTTPHdrVal(iSocketServ.Handle() ) ); + + //Attach to connection + TInt connPtr = reinterpret_cast( &iConnection ); + connInfo.SetPropertyL( iSess.StringPool().StringF( + HTTP::EHttpSocketConnection, + RHTTPClientServerSession::GetTable() ), + THTTPHdrVal(connPtr) ); + */ + + iSess.RegisterDocumentRootL ( KAbsDocumentRoot, *this ); + _LIT8(Kmsg4,"\nDocumentRoot registered"); + iLogFile.Write(Kmsg4); + iSess.SetSessionEventCallback ( this ); + + //iUtils->Test ().Console ()->ClearScreen (); + _LIT ( KServerStartedMsg, "Http Server Started at Root..." ); + + //_LIT8(Kmsg3,"server started"); + //iLogFile.Write(Kmsg3); + + //iUtils->Test ().Printf ( KServerStartedMsg ); + __FLOG_0 ( _T8 ( "Http Server Started at Root... ")); + + RStringPool stringPool = iSess.StringPool (); + THTTPHdrVal ipValue; + iSess.PropertySet ().Property ( stringPool.StringF ( HTTP::ELocalHost, RHTTPClientServerSession::GetTable () ), ipValue ); + //RBuf ipBuf; + //ipBuf.Create ( ipValue.StrF ().DesC ().Length () ); + //ipBuf.Copy ( ipValue.StrF ().DesC () ); + //iUtils->Test ().Printf ( _L ( "http://" ) ); + //iUtils->Test ().Printf ( ipBuf ); + //iUtils->Test ().Printf ( _L ( "/pws/" ) ); + //ipBuf.Close (); + TInt length = ipValue.StrF ().DesC ().Length (); + + iIPAddr.Create(length); + iIPAddr.Copy(ipValue.StrF ().DesC ()); + + _LIT8(Kmsg5,"\nIP addr obtained"); + iLogFile.Write(Kmsg5); + + + _LIT ( KSelectOption, "\n\n Select an option \n\n" ); + //iUtils->Test ().Printf ( KSelectOption ); + _LIT ( KPossibleSelectionsText, " 2 Stop \n 3 Exit\n" ); + _LIT ( KPossibleSelections,"23" ); + //iUtils->RequestSelection ( KPossibleSelectionsText, KPossibleSelections ); + break; + } + case EStop: + { + //iUtils->Test ().Console ()->ClearScreen (); + _LIT ( KServerStoppedMsg, "Server Stopped..." ); + //iUtils->Test ().Printf ( KServerStoppedMsg ); + + CleanupTransactions (); + iSess.Close (); + + //SetupClientL (); + + break; + } + case EExit: + { + //CActiveScheduler::Stop (); + } + break; + default: + break; + } + } + + +void CHttpServer::CleanupTransactions () + { + __FLOG_0 ( _T8 ( "CHttpServer::CleanupTransactions ")); + TInt i = iTransactions.Count () - 1; + while ( iTransactions.Count () ) + { + iTransactions[i]->Transaction ().Cancel (); + CHttpServerTransactionBase* trans = iTransactions[i]; + iTransactions.Remove ( i ); + delete trans; + --i; + } + iTransactions.Close (); + } + +void CHttpServer::SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue) + { + __FLOG_1 ( _T8 ( "CHttpServer::SetHeaderL [aHdrField=%d]"), aHdrField); + RStringF valStr = iSess.StringPool().OpenFStringL(aHdrValue); + CleanupClosePushL(valStr); + THTTPHdrVal val(valStr); + aHeaders.SetFieldL(iSess.StringPool().StringF(aHdrField,RHTTPClientServerSession::GetTable()), val); + CleanupStack::PopAndDestroy(&valStr); + } + +void CHttpServer::ResetTimeElapsed() +// Resets timestamp to time now + { + __FLOG_0 ( _T8 ( "CHttpServer::ResetTimeElapsed")); + iLastTimeStamp.UniversalTime(); + } + + +void CHttpServer::DisplayTimeElapsed() +// Calculate elapsed time since last measurement, and display + { + __FLOG_0 ( _T8 ( "CHttpServer::DisplayTimeElapsed")); + TTime timeNow; + timeNow.UniversalTime(); + TTimeIntervalMicroSeconds elapsedMicroSec = + timeNow.MicroSecondsFrom(iLastTimeStamp); + iLastTimeStamp = timeNow; + /* + iUtils->Test().Printf( + _L("Time elapsed since last measurement is: %d ms\n"), + elapsedMicroSec.Int64()/1000 + ); + */ + } + +void CHttpServer::OnTransactionCompleted ( CHttpServerTransactionBase* iTrans ) + { + __FLOG_1 ( _T8 ( "CHttpServer::OnTransactionCompleted [iTrans =0x%X]"), iTrans ); + for ( TInt i = 0; i < iTransactions.Count (); ++i) + { + if (iTransactions[i] == iTrans) + { + delete iTrans; + iTransactions.Remove (i); + break; + } + } + } + +void CHttpServer::MHFSessionRunL ( const THTTPSessionEvent& aEvent ) + { + if ( aEvent.iStatus < 0 ) + { + iSess.Close (); + } + } + +TInt CHttpServer::MHFSessionRunError ( TInt /*aError*/, const THTTPSessionEvent& /*aEvent*/ ) + { + return KErrNone; + } +/* +void CHttpServer::StartHttpServer() + { + SetupClientL(); + } +*/ + +// ------------------------------------------------------ + +CHttpServerTransactionBase::~CHttpServerTransactionBase () + { + __FLOG_0 ( _T8 ( "CHttpServerTransactionBase::~CHttpServerTransactionBase ")); + iFile.Close (); + } + +CHttpServerTransactionBase::CHttpServerTransactionBase ( MTransactionNotify& aNotify,/*CHttpExampleUtils& aUtils,*/ RFs& aFileServ ) +: iNotify (aNotify), +iFileServ ( aFileServ ) +//iUtils ( aUtils ) + { + __FLOG_OPEN ( "http", "httpexampleserver.txt" ); + __FLOG_0 ( _T8 ( "CHttpServerTransactionBase::CHttpServerTransactionBase ")); + } + +void CHttpServerTransactionBase::ConstructL ( RHTTPClientServerSession& aSession, const TUriC8& aUri, RStringF aMethod ) + { + __FLOG_0 ( _T8 ( "CHttpServerTransactionBase::ConstructL ")); + iTransaction = aSession.OpenTransactionL(aUri, *this, aMethod); + } + + +void CHttpServerTransactionBase::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent) + { + __FLOG_0 ( _T8 ( "CHttpServerTransactionBase::MHFRunL")); + switch(aEvent.iStatus) + { + case THTTPEvent::ESucceeded: + case THTTPEvent::EFailed: + { + aTransaction.Close(); + iNotify.OnTransactionCompleted(this); + } break; + default: + { + if (aEvent.iStatus < 0) + { + aTransaction.Close (); + iNotify.OnTransactionCompleted ( this ); + } + } break; + } + } + + + + +TInt CHttpServerTransactionBase::MHFRunError(TInt aError, RHTTPTransaction /* aTransaction */, const THTTPEvent& /* aEvent */) + { + __FLOG_1 ( _T8 ( "CHttpServerTransactionBase::MHFRunError [aError=%d]"), aError); + //iUtils.Test().Printf(_L("MHFRunError fired with error code %d\n"), aError); + return KErrNone; + } + +void CHttpServerTransactionBase::SetHeaderL(RStringPool& aStringPool, RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue) + { + __FLOG_1 ( _T8 ( "CHttpServerTransactionBase::SetHeaderL [aHdrField=%d]"), aHdrField); + RStringF valStr = aStringPool.OpenFStringL(aHdrValue); + CleanupClosePushL(valStr); + THTTPHdrVal val(valStr); + aHeaders.SetFieldL(aStringPool.StringF(aHdrField,RHTTPClientServerSession::GetTable()), val); + CleanupStack::PopAndDestroy(&valStr); + } + + +// ------------------------------------------------------- + +CHttpDataTransmitter* CHttpDataTransmitter::NewL ( MTransactionNotify& aNotify,/*CHttpExampleUtils& aUtils,*/ RFs& aFileServ, RHTTPClientServerSession& aSession, const TUriC8& aUri, RStringF aMethod ) + { + CHttpDataTransmitter* self = new (ELeave) CHttpDataTransmitter (aNotify, /*aUtils,*/ aFileServ); + CleanupStack::PushL ( self ); + self->ConstructL ( aSession, aUri, aMethod ); + CleanupStack::Pop (); // self + return self; + } + +// +// methods from MHTTPTransactionCallback +// +void CHttpDataTransmitter::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent) + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::MHFRunL")); + switch (aEvent.iStatus) + { + case THTTPEvent::EGotRequestHeaders: + { + const TUriC8& uri = aTransaction.Request ().URI (); + const TDesC8& uriDes = uri.UriDes (); + + if ( uriDes.CompareF ( KAbsDocumentRoot ) == 0 + || uriDes.CompareF ( KRelDocumentRoot ) == 0 ) + { + RHTTPResponse response = aTransaction.Response (); + RStringPool stringPool = aTransaction.Session ().StringPool (); + RHTTPHeaders headers = response.GetHeaderCollection(); + TBuf8<128> referer; + referer.Copy (_L("http://")); + RStringF hostStr = stringPool.StringF (HTTP::EHost, RHTTPClientServerSession::GetTable()); + THTTPHdrVal hostVal; + aTransaction.Request().GetHeaderCollection().GetField(hostStr, 0, hostVal); + referer.Append(hostVal.StrF().DesC()); + referer.Append(KHttpSlash); +// SetHeaderL (stringPool, headers, HTTP::EReferer, referer); + referer.Append(KHomePage); + // Root path. Redirect to the home page. + SetHeaderL (stringPool, headers, HTTP::ELocation, referer); + THTTPHdrVal hdr (0); + headers.SetFieldL (stringPool.StringF (HTTP::EContentLength, RHTTPClientServerSession::GetTable()), hdr); + response.SetStatusCode(HTTPStatus::EFound); + RStringF statusText = stringPool.OpenFStringL ( KFound ); + + response.SetStatusText (statusText); + statusText.Close (); + aTransaction.SubmitL (); + //iTransSubmitted = ETrue; + } + } + break; + case THTTPEvent::EGotRequestBodyData: + { + User::Invariant (); + } + break; + case THTTPEvent::ERequestComplete: + { + if ( !iTransSubmitted ) + { + const TDesC8& uriDes = aTransaction.Request ().URI ().UriDes(); +// __FLOG_1 ( _T8 ("CHttpdProtocolHandler::MHFRunL: [uriDes = %S]"), uriDes ); + + if ( OpenFile (uriDes) == KErrNone ) + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::MHFRunL: Sending Ok")); + RHTTPResponse response = aTransaction.Response(); + response.SetBody(*this); + RHTTPHeaders headers = aTransaction.Response().GetHeaderCollection(); + RStringPool stringPool = aTransaction.Session().StringPool(); + SetHeaderL(stringPool, headers, HTTP::EContentType, iContentType); + response.SetStatusCode (HTTPStatus::EOk); + RStringF statusText = stringPool.OpenFStringL ( KOk ); + + response.SetStatusText (statusText); + statusText.Close (); + THTTPHdrVal hdr (OverallDataSize()); + headers.SetFieldL (stringPool.StringF (HTTP::EContentLength, RHTTPClientServerSession::GetTable()), hdr); + } + else + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::MHFRunL: Sending Not Found")); + + RHTTPResponse response = aTransaction.Response(); + response.SetStatusCode (HTTPStatus::ENotFound); + RStringF statusText = aTransaction.Session().StringPool().OpenFStringL ( KNotFound ); + + response.SetStatusText (statusText); + statusText.Close (); + THTTPHdrVal hdr (0); + response.GetHeaderCollection().SetFieldL (aTransaction.Session().StringPool().StringF (HTTP::EContentLength, RHTTPClientServerSession::GetTable()), hdr); + } + aTransaction.SubmitL (); + iTransSubmitted = ETrue; + + } + } + break; + default: + CHttpServerTransactionBase::MHFRunL(aTransaction, aEvent); + } + } + +TInt CHttpDataTransmitter::MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent) + { + __FLOG_1 ( _T8 ( "CHttpDataTransmitter::MHFRunError [aError=%d]"), aError); + return CHttpServerTransactionBase::MHFRunError(aError, aTransaction, aEvent); + } + +TInt CHttpDataTransmitter::OpenFile( const TDesC8& aHttpPath ) + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::OpenFile")); + + TBuf8<256> fileName; + fileName.Copy(KRoot); + if (aHttpPath.Locate(KHttpSlash) == 0) + { + // Skip that + TPtrC8 ptr (aHttpPath.Mid(1)); + fileName.Append(ptr); + //replace forward slash with backward + for ( TInt index = 0; index < fileName.Length (); index++ ) + { + if ( fileName[index] == TChar ( KHttpSlash ) ) + { + fileName[index] = TChar ( '\\' ); + } + } + } + + HBufC* fileName16 = EscapeUtils::ConvertToUnicodeFromUtf8L (fileName); + TInt err = iFile.Open(iFileServ, *fileName16, EFileShareReadersOnly); + + TPtr ptr2 ( fileName16->Des() ); + //iUtils.Test().Printf(_L("File Name: %S"), &ptr2); + __FLOG_1 ( _T8 ( "CHttpDataTransmitter::OpenFile [Error=%d]"), err); + + // For Hardware + if ( err != KErrNone ) + { + ptr2[0] = TChar ( 'Z' ); + err = iFile.Open ( iFileServ, ptr2, EFileShareReadersOnly ); + } + __FLOG_1 ( _T8 ( "CHttpDataTransmitter::OpenFile [Error=%d]"), err); + + if ( err != KErrNone ) + { + delete fileName16; + return err; + } + + TParse parser; + parser.Set(ptr2, NULL, NULL); + + if ( ptr2.Find(KHtml) != KErrNotFound ) + { + iContentType.Copy(KTextContent); + iContentType.Copy(KHtml); + } + else + { + iContentType.Copy(KImageContent); + iContentType.Copy(KGif); + } + delete fileName16; + iFile.Size(iDataToSend); + return KErrNone; + } + +CHttpDataTransmitter::CHttpDataTransmitter (MTransactionNotify& aNotify,/*CHttpExampleUtils& aUtils,*/ RFs& aFileServ) +: CHttpServerTransactionBase (aNotify, /*aUtils,*/ aFileServ) + { + __FLOG_OPEN ( "http", "httpexampleserver.txt" ); + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::CHttpDataTransmitter ")); + } + +TBool CHttpDataTransmitter::GetNextDataPart(TPtrC8& aDataPart) + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::GetNextDataPart")); + iFile.Read (iData); + iDataToSend -= iData.Length (); + aDataPart.Set (iData); + return iDataToSend == 0; + } + +void CHttpDataTransmitter::ReleaseData() + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::ReleaseData")); + iData.SetLength (0); + if (iDataToSend > 0) + iTransaction.NotifyNewRequestBodyPartL (); + else + iFile.Close (); + } + +TInt CHttpDataTransmitter::OverallDataSize() + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::OverallDataSize")); + TInt size; + iFile.Size (size); + return size; + } + +TInt CHttpDataTransmitter::Reset() + { + __FLOG_0 ( _T8 ( "CHttpDataTransmitter::Reset")); + return KErrNone; + } + + + +/* +// ------------------------------------------------------------ + +LOCAL_D void TestL() +// Create a test object, invoke the tests using it and remove + { + + //TRAPD(err,CHttpExampleUtils::InitCommsL()); + // create an active scheduler to use + CActiveScheduler* scheduler = new(ELeave) CActiveScheduler(); + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + // Create and start the client + CHttpServer* httpCli = CHttpServer::NewL(); + + CZeroconfClient* browser = CZeroconfClient::NewL(*httpCli); + browser->ConnectL(); + + CActiveScheduler::Start(); + // + CleanupStack::PopAndDestroy(1); // scheduler + delete httpCli; + delete browser; + } + + +GLDEF_C TInt E32Main() +// Main program - run the tests within a TRAP harness, reporting any errors that +// occur via the panic mechanism. Test for memory leaks using heap marking. + { + + __UHEAP_MARK; + CTrapCleanup* tc=CTrapCleanup::New(); + + TRAPD(err,TestL()); + + if (err!=KErrNone) + User::Panic(_L("Test failed with error code: %i"), err); + delete tc; + __UHEAP_MARKEND; + return KErrNone; + } +*/ +