src/NPRAppEngine.cpp
changeset 0 0049171ecffb
--- /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 <DocumentHandler.h>
+#include <aknwaitdialog.h>
+#include <NPR_0xEEB0E481.rsg>
+
+#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<CNPRStation>* CNPRAppEngine::Stations()
+	{
+	return &iStationArray;
+	}
+
+const RPointerArray<CNPRStory>* 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;
+		}
+	}