diff -r 000000000000 -r 0049171ecffb src/NPRAppEngine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/NPRAppEngine.cpp Fri Jul 24 08:46:02 2009 +0100 @@ -0,0 +1,226 @@ +/* + ============================================================================ + Name : NPRAppEngine.cpp + Author : Symsourcce + + Copyright (c) 2009 Symbian Foundation Ltd + This component and the accompanying materials are made available + under the terms of the License "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: + - Symsource + + Contributors: + - Symsource + + Description : + ============================================================================ + */ + +#include +#include +#include + +#include "NPRAppEngine.h" +#include "NPRAppUi.h" +#include "NPRStationXmlParser.h" +#include "NPRStation.h" +#include "NPRStory.h" + +_LIT(KNPRQuery, "http://api.npr.org/query?id=1001&apiKey=MDAzNTk1Nzk0MDEyNDQ2NjI1NzgyNGExNg001"); +_LIT(KNPRApiKey, "MDAzNTk1Nzk0MDEyNDQ2NjI1NzgyNGExNg001"); +_LIT(KNPRStationQuery,"http://api.npr.org/stations?%S&apiKey=%S"); +_LIT(KSearching, "Searching..."); + +_LIT(KStationStreamFile, "c:\\data\\npr_station_stream.rm"); +_LIT(KNewsStreamFile, "c:\\data\\npr_news_stream.rm"); + +_LIT8(KDataTypeRAM,"audio/x-pn-realaudio-plugin"); +_LIT8(KXmlMimeType, "text/xml"); + + +CNPRAppEngine* CNPRAppEngine::NewL(CNPRAppUi& aNPRAppUi) + { + CNPRAppEngine* self = new (ELeave) CNPRAppEngine(aNPRAppUi); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CNPRAppEngine::CNPRAppEngine(CNPRAppUi& aNPRAppUi) + :iNPRAppUi(aNPRAppUi) + { + } + +CNPRAppEngine::~CNPRAppEngine() + { + delete iDocHandler; + delete iHttp; + iStationArray.ResetAndDestroy(); + iStationArray.Close(); + iStoryArray.ResetAndDestroy(); + iStoryArray.Close(); + if(iWaitDialog) + { + delete iWaitDialog; + iWaitDialog = NULL; + } + } + +void CNPRAppEngine::ConstructL() + { + this->iHttp = CHttpClient::NewL(*this); + // Create the document handler + iDocHandler = CDocumentHandler::NewL(CEikonEnv::Static()->Process()); + } + + +void CNPRAppEngine::SendNPRCommandL(const TNPRCommands aCommand, const TDesC& aField) + { + switch(aCommand) + { + case ENewsCmd: + { + SearchNewsL(aField); + ShowWaitingDialogL(KSearching()); + break; + } + case EStationsCmd: + { + SearchStationsL(aField); + ShowWaitingDialogL(KSearching()); + break; + } + case EPlayStationStream: + { + TFileName filename(KStationStreamFile); + LaunchFileL(filename); + break; + } + case EPlayNewsStream: + { + TFileName filename(KNewsStreamFile); + LaunchFileL(filename); + break; + } + default: + return; + } + } + +const RPointerArray* CNPRAppEngine::Stations() + { + return &iStationArray; + } + +const RPointerArray* CNPRAppEngine::Stories() + { + return &iStoryArray; + } + +void CNPRAppEngine::SearchStationsL(const TDesC& aField) + { + HBufC *uri = HBufC::NewLC(KNPRStationQuery().Length() + + aField.Length() + + KNPRApiKey().Length() + ); + TPtr uriPtr = uri->Des(); + uriPtr.Format(KNPRStationQuery,&aField, &KNPRApiKey()); + iHttp->SendRequestL(uriPtr); + CleanupStack::PopAndDestroy(uri); + iNPRCommand = EStationsCmd; + } + +void CNPRAppEngine::SearchNewsL(const TDesC& /*aField*/) + { + iHttp->SendRequestL(KNPRQuery()); + iNPRCommand = ENewsCmd; + } + +void CNPRAppEngine::ResponseStatusL(TInt /*aStatusCode*/, const TDesC& /*aStatusText*/) + { + DismissWaitingDialogL(); + } + +void CNPRAppEngine::ResponseReceivedL(const TDesC8& aResponseBuffer) + { + switch(iNPRCommand) + { + case ENewsCmd: + { + iStoryArray.ResetAndDestroy(); + CNPRStoryXmlParser* newsParser = CNPRStoryXmlParser::NewLC(&iStoryArray); + CParser* parser = CParser::NewLC(KXmlMimeType, *newsParser); + parser->ParseL(aResponseBuffer); + CleanupStack::PopAndDestroy(parser); + CleanupStack::PopAndDestroy(newsParser); + iNPRAppUi.ActivateLocalViewL(TUid::Uid(ENPRStoryListBoxViewId)); + break; + } + case EStationsCmd: + { + DismissWaitingDialogL(); + iStationArray.ResetAndDestroy(); + CNPRStationXmlParser* stationParser = CNPRStationXmlParser::NewLC(&iStationArray); + CParser* parser = CParser::NewLC(KXmlMimeType, *stationParser); + parser->ParseL(aResponseBuffer); + CleanupStack::PopAndDestroy(parser); + CleanupStack::PopAndDestroy(stationParser); + iNPRAppUi.ActivateLocalViewL(TUid::Uid(ENPRStationListBoxViewId)); + break; + } + default: + DismissWaitingDialogL(); + break; + } + } + +void CNPRAppEngine::LaunchFileL(const TDesC& aFilename) + { + TDataType dataType = TDataType(KDataTypeRAM()); + // Open a file in a standalone handler application + TRAPD(err,iDocHandler->OpenFileL(aFilename, dataType)); + + TUid handlerUid; + err = iDocHandler->HandlerAppUid(handlerUid); + if (!err) + { + RefreshDocumentFileL(handlerUid, aFilename); + } + } + +/** + * Refreshes the file opened in a standalone handler. Does nothing if the file + * has not been already opened. + */ +void CNPRAppEngine::RefreshDocumentFileL(const TUid& aUid, const TDesC& aFileName) + { + TApaTaskList taskList(CEikonEnv::Static()->WsSession()); + TApaTask task = taskList.FindApp(aUid); + + // If the standalone handler is already running, then update the file + if (task.Exists()) + { + User::LeaveIfError(task.SwitchOpenFile(aFileName)); + } + } + +void CNPRAppEngine::ShowWaitingDialogL(const TDesC& aText) + { + DismissWaitingDialogL(); + iWaitDialog = new(ELeave)CAknWaitDialog((REINTERPRET_CAST(CEikDialog**,&iWaitDialog)), EFalse ); + iWaitDialog->SetTextL(aText); + iWaitDialog->ExecuteLD(R_SINGULAR_WAIT_NOTE); + } + +void CNPRAppEngine::DismissWaitingDialogL() + { + if(iWaitDialog) + { + iWaitDialog->ProcessFinishedL(); + iWaitDialog=NULL; + } + }