src/NPRAppEngine.cpp
changeset 0 0049171ecffb
equal deleted inserted replaced
-1:000000000000 0:0049171ecffb
       
     1 /*
       
     2  ============================================================================
       
     3  Name	: NPRAppEngine.cpp
       
     4  Author	: Symsourcce
       
     5  
       
     6  Copyright (c) 2009 Symbian Foundation Ltd
       
     7  This component and the accompanying materials are made available
       
     8  under the terms of the License "Eclipse Public License v1.0"
       
     9  which accompanies this distribution, and is available
       
    10  at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
    11 
       
    12  Initial Contributors:
       
    13  - Symsource
       
    14  
       
    15  Contributors:
       
    16  - Symsource
       
    17  
       
    18  Description :
       
    19  ============================================================================
       
    20  */
       
    21 
       
    22 #include <DocumentHandler.h>
       
    23 #include <aknwaitdialog.h>
       
    24 #include <NPR_0xEEB0E481.rsg>
       
    25 
       
    26 #include "NPRAppEngine.h"
       
    27 #include "NPRAppUi.h"
       
    28 #include "NPRStationXmlParser.h"
       
    29 #include "NPRStation.h"
       
    30 #include "NPRStory.h"
       
    31 
       
    32 _LIT(KNPRQuery, "http://api.npr.org/query?id=1001&apiKey=MDAzNTk1Nzk0MDEyNDQ2NjI1NzgyNGExNg001");
       
    33 _LIT(KNPRApiKey, "MDAzNTk1Nzk0MDEyNDQ2NjI1NzgyNGExNg001");
       
    34 _LIT(KNPRStationQuery,"http://api.npr.org/stations?%S&apiKey=%S");
       
    35 _LIT(KSearching, "Searching...");
       
    36 
       
    37 _LIT(KStationStreamFile, "c:\\data\\npr_station_stream.rm");
       
    38 _LIT(KNewsStreamFile, "c:\\data\\npr_news_stream.rm");
       
    39 
       
    40 _LIT8(KDataTypeRAM,"audio/x-pn-realaudio-plugin");
       
    41 _LIT8(KXmlMimeType, "text/xml");
       
    42 
       
    43 
       
    44 CNPRAppEngine* CNPRAppEngine::NewL(CNPRAppUi& aNPRAppUi)
       
    45 	{	
       
    46 	CNPRAppEngine* self = new (ELeave) CNPRAppEngine(aNPRAppUi);
       
    47 	CleanupStack::PushL(self);
       
    48 	self->ConstructL();
       
    49 	CleanupStack::Pop(self);
       
    50 	return self;
       
    51 	}
       
    52 
       
    53 CNPRAppEngine::CNPRAppEngine(CNPRAppUi& aNPRAppUi)
       
    54 	:iNPRAppUi(aNPRAppUi)
       
    55 	{
       
    56 	}
       
    57 
       
    58 CNPRAppEngine::~CNPRAppEngine()
       
    59 	{
       
    60 	delete iDocHandler;
       
    61 	delete iHttp;
       
    62 	iStationArray.ResetAndDestroy();
       
    63 	iStationArray.Close();
       
    64 	iStoryArray.ResetAndDestroy();
       
    65 	iStoryArray.Close();
       
    66 	if(iWaitDialog)
       
    67 		{		
       
    68 	    delete iWaitDialog;
       
    69 	    iWaitDialog = NULL;
       
    70 		}
       
    71 	}
       
    72 
       
    73 void CNPRAppEngine::ConstructL()
       
    74 	{
       
    75 	this->iHttp = CHttpClient::NewL(*this);
       
    76     // Create the document handler
       
    77     iDocHandler = CDocumentHandler::NewL(CEikonEnv::Static()->Process());
       
    78 	}
       
    79 
       
    80 
       
    81 void CNPRAppEngine::SendNPRCommandL(const TNPRCommands aCommand, const TDesC& aField)
       
    82 	{
       
    83 	switch(aCommand)
       
    84 		{
       
    85 		case ENewsCmd:
       
    86 			{
       
    87 			SearchNewsL(aField);
       
    88 			ShowWaitingDialogL(KSearching());
       
    89 			break;
       
    90 			}
       
    91 		case EStationsCmd:
       
    92 			{
       
    93 			SearchStationsL(aField);
       
    94 			ShowWaitingDialogL(KSearching());
       
    95 			break;
       
    96 			}
       
    97 		case EPlayStationStream:
       
    98 			{
       
    99 			TFileName filename(KStationStreamFile);
       
   100 			LaunchFileL(filename);
       
   101 			break;
       
   102 			}
       
   103 		case EPlayNewsStream:
       
   104 			{
       
   105 			TFileName filename(KNewsStreamFile);
       
   106 			LaunchFileL(filename);
       
   107 			break;
       
   108 			}
       
   109 		default:
       
   110 			return;
       
   111 		}
       
   112 	}
       
   113 
       
   114 const RPointerArray<CNPRStation>* CNPRAppEngine::Stations()
       
   115 	{
       
   116 	return &iStationArray;
       
   117 	}
       
   118 
       
   119 const RPointerArray<CNPRStory>* CNPRAppEngine::Stories()
       
   120 	{
       
   121 	return &iStoryArray;
       
   122 	}
       
   123 
       
   124 void CNPRAppEngine::SearchStationsL(const TDesC& aField)
       
   125 	{
       
   126 	HBufC *uri = HBufC::NewLC(KNPRStationQuery().Length()
       
   127 			+ aField.Length() 
       
   128 			+ KNPRApiKey().Length()
       
   129 			);
       
   130 	TPtr uriPtr = uri->Des();
       
   131 	uriPtr.Format(KNPRStationQuery,&aField, &KNPRApiKey());
       
   132 	iHttp->SendRequestL(uriPtr);
       
   133 	CleanupStack::PopAndDestroy(uri);
       
   134 	iNPRCommand = EStationsCmd;
       
   135 	}
       
   136 
       
   137 void CNPRAppEngine::SearchNewsL(const TDesC& /*aField*/)
       
   138 	{
       
   139 	iHttp->SendRequestL(KNPRQuery());
       
   140 	iNPRCommand = ENewsCmd;
       
   141 	}
       
   142 
       
   143 void CNPRAppEngine::ResponseStatusL(TInt /*aStatusCode*/, const TDesC& /*aStatusText*/)
       
   144 	{
       
   145 	DismissWaitingDialogL();
       
   146 	}
       
   147 
       
   148 void CNPRAppEngine::ResponseReceivedL(const TDesC8& aResponseBuffer)
       
   149 	{
       
   150 	switch(iNPRCommand)
       
   151 		{
       
   152 		case ENewsCmd:
       
   153 			{
       
   154 			iStoryArray.ResetAndDestroy();
       
   155 			CNPRStoryXmlParser* newsParser = CNPRStoryXmlParser::NewLC(&iStoryArray);
       
   156 			CParser* parser = CParser::NewLC(KXmlMimeType, *newsParser);
       
   157 			parser->ParseL(aResponseBuffer);
       
   158 			CleanupStack::PopAndDestroy(parser); 
       
   159 			CleanupStack::PopAndDestroy(newsParser);
       
   160 			iNPRAppUi.ActivateLocalViewL(TUid::Uid(ENPRStoryListBoxViewId));
       
   161 			break;
       
   162 			}
       
   163 		case EStationsCmd:
       
   164 			{
       
   165 			DismissWaitingDialogL();
       
   166 			iStationArray.ResetAndDestroy();
       
   167 			CNPRStationXmlParser* stationParser = CNPRStationXmlParser::NewLC(&iStationArray);
       
   168 			CParser* parser = CParser::NewLC(KXmlMimeType, *stationParser);
       
   169 			parser->ParseL(aResponseBuffer);
       
   170 			CleanupStack::PopAndDestroy(parser); 
       
   171 			CleanupStack::PopAndDestroy(stationParser);
       
   172 			iNPRAppUi.ActivateLocalViewL(TUid::Uid(ENPRStationListBoxViewId));
       
   173 			break;
       
   174 			}
       
   175 		default:
       
   176 			DismissWaitingDialogL();
       
   177 			break;
       
   178 		}
       
   179 	}
       
   180 
       
   181 void CNPRAppEngine::LaunchFileL(const TDesC& aFilename)
       
   182     {
       
   183     TDataType dataType = TDataType(KDataTypeRAM());
       
   184     // Open a file in a standalone handler application
       
   185     TRAPD(err,iDocHandler->OpenFileL(aFilename, dataType));
       
   186  
       
   187     TUid handlerUid; 
       
   188     err = iDocHandler->HandlerAppUid(handlerUid);
       
   189     if (!err)
       
   190         {
       
   191         RefreshDocumentFileL(handlerUid, aFilename);
       
   192         }
       
   193     }
       
   194 
       
   195 /**
       
   196  * Refreshes the file opened in a standalone handler. Does nothing if the file
       
   197  * has not been already opened.
       
   198  */
       
   199 void CNPRAppEngine::RefreshDocumentFileL(const TUid& aUid, const TDesC& aFileName)
       
   200     {
       
   201     TApaTaskList taskList(CEikonEnv::Static()->WsSession());
       
   202     TApaTask task = taskList.FindApp(aUid);
       
   203  
       
   204     // If the standalone handler is already running, then update the file
       
   205     if (task.Exists())
       
   206         {
       
   207         User::LeaveIfError(task.SwitchOpenFile(aFileName));
       
   208         }
       
   209     }
       
   210 
       
   211 void CNPRAppEngine::ShowWaitingDialogL(const TDesC& aText)
       
   212 	{
       
   213 	DismissWaitingDialogL();
       
   214 	iWaitDialog = new(ELeave)CAknWaitDialog((REINTERPRET_CAST(CEikDialog**,&iWaitDialog)), EFalse );
       
   215 	iWaitDialog->SetTextL(aText); 
       
   216 	iWaitDialog->ExecuteLD(R_SINGULAR_WAIT_NOTE);
       
   217 	}
       
   218 
       
   219 void CNPRAppEngine::DismissWaitingDialogL()
       
   220 	{
       
   221 	if(iWaitDialog)
       
   222 		{			
       
   223 		iWaitDialog->ProcessFinishedL();
       
   224 		iWaitDialog=NULL;
       
   225 		}
       
   226 	}