example/lastfmmusiceventplugin/lastfmmusiceventplugin.cpp
author cgandhi
Mon, 11 Oct 2010 21:59:54 +0530
changeset 26 83d6a149c755
parent 23 574948b60dab
permissions -rw-r--r--
Submitting following changes - AuthApps for Last.fm and Twitter added API for checking ServiceAuthorization added for SMFCredMgrClient API added for forcefully removing credential details from SMFCredMgr Extra argument checks in SMfClient APIs APIs for service login and logout from SMFClient Redundant members removed from SmfServerSymbian DSM bug fixes Test Apps included

/*
 * lastfmmusiceventplugin.cpp
 *
 *  Created on: Jun 21, 2010
 *      Author: ankitg
 */

//Include files
#include <QtPlugin>
#include <QCryptographicHash>
#include <QDataStream>
#include <QTextStream>
#include <QFile>
#include <QNetworkReply>
#include <QMap>
#include <QListIterator>
#include <QXmlStreamReader>
#include <SmfPicture.h>
#include <QSettings>
#include "lastfmmusiceventplugin.h"



//Added for testing - start
//static const QString apiKey = "8823ece35e487bada68fa893d7ecf91e";
//static const QString apiKey = "50ac6d6581c3784efe40748fe87d8413";
//static const QString apiSecret = "20ccb1cc62aa50caf7d8aae31808d429";
//static const QString apiSecret = "623f4274bcea772fd6f411cf298b6bfa";
//static const QString miniToken = "773193698 ";

//static const QString apiKey = "eb3a2d8361718782ebf3887f2bb8775b";
//static const QString apiSecret = "7a390c4c1ec4fef41cef4d77354b30f8"; // created on 12th Aug

static const QString apiKey = "50ac6d6581c3784efe40748fe87d8413";
static const QString apiSecret = "623f4274bcea772fd6f411cf298b6bfa"; // created on 23th Aug

//QString fullToken = "72157624000326005-e6cba1c7665a778e";

//Payload data array
QByteArray payload;
QString uids;
/**
 * Method called by plugins for logging
 * @param log string to be logged
 */
void MusicEventPlugin::writeLog(QString log) const
	{
	QFile file("c:\\data\\PluginLogs.txt");
    if (!file.open(QIODevice::Append | QIODevice::Text))
	         ;
    QTextStream out(&file);
    out << log << "\n";
    file.close();
	}
/**
 * Method to interpret the key sets obtained from credential manager 
 * @param aApiKey [out] The api key
 * @param aApiSecret [out] The api secret
 * @param aSessionKey [out] The session key
 * @param aSessionSecret [out] The session secret
 * @param aAppId [out] The application ID
 */
void MusicEventPlugin::fetchKeys( QString &aApiKey, 
		QString &aApiSecret, 
		QString &aSessionKey, 
		QString &aSessionSecret )
	{
	writeLog("Inside MusicEventPlugin::fetchKeys()");

	writeLog("Reg Token = "+m_provider->m_smfRegToken);
	writeLog("Expiry Date as int = "+m_provider->m_validity.toTime_t());
	
	SmfAuthParams keys;
	SmfPluginUtil util;
	util.getAuthKeys(keys, m_provider->m_smfRegToken, 
			m_provider->m_validity, m_provider->m_pluginId);
	
	writeLog("Number of key-value pairs = "+keys.count());
	
    QByteArray keyName;
    keyName.append("ApiKey");
	aApiKey.append(keys.value(keyName));
	
    keyName.clear();
    keyName.append("ApiSecret");
	aApiSecret.append(keys.value(keyName));
	
	keyName.clear();
    keyName.append("SessionKey");
	aSessionKey.append(keys.value(keyName));
	
	keyName.clear();
    keyName.append("SessionSecret");
	aSessionSecret.append(keys.value(keyName));
	
	writeLog("Api Key = "+aApiKey);
	writeLog("Api Secret = "+aApiSecret);
	writeLog("session Key = "+aSessionKey);
	writeLog("session Secret = "+aSessionSecret);
	}
/**
 * Destructor
 */
MusicEventPlugin::~MusicEventPlugin()
	{
	if(m_provider)
		delete m_provider;
	}


/**
 * Method called by plugins to generate a signature string from a base string
 * @param aBaseString The base string
 * @return The md5 hash of the base string
 */
QString MusicEventPlugin::generateSignature(const QString aBaseString)
	{
	writeLog("MusicEventPlugin::generateSignature");
	
	// Create md5 hash of the signature string
    QByteArray byteArray;
    byteArray.insert(0, aBaseString.toAscii());

    QByteArray md5Hash = QCryptographicHash::hash(byteArray,QCryptographicHash::Md5 ).toHex();
    QString returnString (md5Hash);
    return returnString;
	}

/**
 * Method to get the events based on location
 * @param aRequest [out] The request data to be sent to network
 * @param aLocation Location of the event
 * @param aPageNum The page to be extracted
 * @param aItemsPerPage Number of items per page
 * @return SmfPluginError Plugin error if any, else SmfPluginErrNone
 */
/*SmfPluginError MusicEventPlugin::events( SmfPluginRequestData &aRequest,
		const QGeoPositionInfo &aLocation,const int aPageNum, 
		const int aItemsPerPage)
	{
	Q_UNUSED(aItemsPerPage);
	SmfPluginError error = SmfPluginErrUserNotLoggedIn;
	
	writeLog("MusicEventPlugin::events()");
	
	QString baseString;
	baseString.append(apiSecret);
	baseString.append("api_key"+apiKey);
	baseString.append("auth_token");
	baseString.append("formatjson");
	baseString.append("location=Delhi");
	baseString.append("method=geo.getEvents");
	writeLog("Url string is :"+baseString);
	
	// Create the url
	 QUrl url("http://ws.audioscrobbler.com/2.0/?");
	 url.addQueryItem("method", "geo.getevents");
	 url.addQueryItem("location","madrid");
	 url.addQueryItem("api_key", apiKey);
	 url.addQueryItem("format","json");				
	 url.addQueryItem("auth_token","");
	 url.addQueryItem("api_sig", generateSignature(baseString));
	 writeLog("/n/n"+generateSignature(baseString)); 
	 writeLog("/n/n Response is :"+url.toString());
				// Create the request, set the url
	 aRequest.iNetworkRequest.setUrl(url);
	 aRequest.iRequestType = SmfMusicGetEventsOnLoc;
	 aRequest.iPostData = NULL;
	 aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
	 error = SmfPluginErrNone;
	 return error;	
	}
		*/
/**
 * Method to get the venues based on location
 * @param aRequest [out] The request data to be sent to network
 * @param aLocation Location of the venue
 * @param aPageNum The page to be extracted
 * @param aItemsPerPage Number of items per page
 * @return SmfPluginError Plugin error if any, else SmfPluginErrNone
 */
SmfPluginError MusicEventPlugin::venues( SmfPluginRequestData &aRequest,
		const SmfLocation &aLocation,const int aPageNum, 
		const int aItemsPerPage)
	{
		Q_UNUSED(aItemsPerPage);
		Q_UNUSED(aPageNum);
		Q_UNUSED(aLocation)
		
		SmfPluginError error = SmfPluginErrUserNotLoggedIn;
		 	
		// Get the key sets from SMF Plugin Utility class.
		QString apiKey;
		QString apiSecret;
		QString sessionKey;
		QString sessionSecret;
		fetchKeys(apiKey, apiSecret, sessionKey, sessionSecret);
		writeLog("API KEY"+apiKey);
		writeLog("API SECRET"+apiSecret);
		writeLog("SessionKey"+sessionKey);
		writeLog("sessionSecret"+sessionSecret);
		writeLog("MusicEventPlugin::Venues()");
		//QString qName("New York");
		//aLocation.setCity(qName);
		//QString qLocation = aLocation.city();
		//640418
		//QString qLocation("New York");
/*		QString baseString;
		baseString.append(apiSecret);
		baseString.append("api_key"+apiKey);
		baseString.append("auth_token");
		baseString.append("formatjson");
		baseString.append("location ="+aLocation.city());
		baseString.append("method=geo.getEvents");
		writeLog("Url string is :"+baseString);
		 	
		//Create the url
		QUrl url("http://ws.audioscrobbler.com/2.0/?");
		url.addQueryItem("method", "geo.getevents");
		url.addQueryItem("location",aLocation.city());
		url.addQueryItem("api_key", apiKey);
		url.addQueryItem("api_key", apiKey);
		url.addQueryItem("format","json");				
		url.addQueryItem("auth_token","");
		url.addQueryItem("api_sig", generateSignature(baseString));
		
		writeLog("/n/n"+generateSignature(baseString)); 
		writeLog("/n/n Response is :"+url.toString());
		//Create the request, set the url
		aRequest.iNetworkRequest.setUrl(url);
		aRequest.iRequestType = SmfEventsGetVenues;
		aRequest.iPostData = NULL;
		aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
		error = SmfPluginErrNone;
		return error;	*/
		

	    QString baseString;
		baseString.append(apiSecret);
		baseString.append("api_key"+apiKey);
		baseString.append("auth_token");
		baseString.append("formatjson");
		baseString.append("location=Newyork");
		baseString.append("method=geo.getEvents");
		writeLog("Url string is :"+baseString);
		
		// Create the url
		 QUrl url("http://ws.audioscrobbler.com/2.0/?");
		 url.addQueryItem("method", "geo.getevents");
		 url.addQueryItem("location","Newyork");
		 url.addQueryItem("api_key", apiKey);
		 url.addQueryItem("format","json");				
		 url.addQueryItem("auth_token","");
		 url.addQueryItem("api_sig", generateSignature(baseString));
		 writeLog("/n/n"+generateSignature(baseString)); 
		 writeLog("/n/n Response is :"+url.toString());
					// Create the request, set the url
		 aRequest.iNetworkRequest.setUrl(url);
		 aRequest.iRequestType = SmfEventsGetEvents;
		 aRequest.iPostData = NULL;
		 aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
		 error = SmfPluginErrNone;
		 return error;	

	
	}

/**
 * Method to get the events based on venues
 * @param aRequest [out] The request data to be sent to network
 * @param aVenue Venue of the event
 * @param aPageNum The page to be extracted
 * @param aItemsPerPage Number of items per page
 * @return SmfPluginError Plugin error if any, else SmfPluginErrNone
 */
SmfPluginError MusicEventPlugin::events( SmfPluginRequestData &aRequest,
		const SmfLocation &aVenue,const int aPageNum, 
		const int aItemsPerPage)
	{
	Q_UNUSED(aItemsPerPage);
	Q_UNUSED(aPageNum);
	
	SmfPluginError error = SmfPluginErrUserNotLoggedIn;
		
	
	// Get the key sets from SMF Plugin Utility class.
		QString apiKey;
		QString apiSecret;
		QString sessionKey;
		QString sessionSecret;
		fetchKeys(apiKey, apiSecret, sessionKey, sessionSecret);
		writeLog("API KEY"+apiKey);
		writeLog("API SECRET"+apiSecret);
		writeLog("SessionKey"+sessionKey);
		writeLog("sessionSecret"+sessionSecret);
	
	    QString baseString;
		baseString.append(apiSecret);
		baseString.append("api_key"+apiKey);
		baseString.append("auth_token");
		baseString.append("formatjson");
		baseString.append("location="+aVenue.city());
		baseString.append("method=geo.getEvents");
		writeLog("Url string is :"+baseString);
		
		// Create the url
		 QUrl url("http://ws.audioscrobbler.com/2.0/?");
		url.addQueryItem("method", "geo.getevents");
		url.addQueryItem("location",aVenue.city());
		url.addQueryItem("api_key", apiKey);
		url.addQueryItem("format","json");				
		url.addQueryItem("auth_token","");
		url.addQueryItem("api_sig", generateSignature(baseString));
		writeLog("/n/n"+generateSignature(baseString)); 
		writeLog("/n/n Response is :"+url.toString());
		//Create the request, set the url
		 aRequest.iNetworkRequest.setUrl(url);
		 aRequest.iRequestType = SmfEventsGetEvents;
		 aRequest.iPostData = NULL;
		 aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
		 error = SmfPluginErrNone;
		 return error;	

	}

/**
 * Method to post events
 * @param aRequest [out] The request data to be sent to network
 * @param aEventList The list of events to be posted
 * @return SmfPluginError Plugin error if any, else SmfPluginErrNone
 */
SmfPluginError MusicEventPlugin::postEvents( SmfPluginRequestData &aRequest,
		const QList<SmfEvent> &aEventList )
	{
	       Q_UNUSED(aEventList)
		   SmfPluginError error = SmfPluginErrUserNotLoggedIn;
		   writeLog("MusicEventPlugin::events()");
		   int count =aEventList.count();
		   for(int i=0;i<count;i++)
			   { 
		        SmfEvent ievent=aEventList[i];
		        writeLog("Event List"+ievent.id());
			   }
			// Get the key sets from SMF Plugin Utility class.
			QString apiKey;
			QString apiSecret;
			QString sessionKey;
			QString sessionSecret;
			fetchKeys(apiKey, apiSecret, sessionKey, sessionSecret);
			writeLog("API KEY"+apiKey);
			writeLog("API SECRET"+apiSecret);
			writeLog("SessionKey"+sessionKey);
			writeLog("sessionSecret"+sessionSecret);
		/*	QString baseString;
			
			baseString.append(apiSecret);
			baseString.append("api_key"+apiKey);
			baseString.append("auth_token");
			baseString.append("formatjson");
		//	baseString.append("method=event.shout"); // needs authentication
		//	baseString.append("Event"+"aEventList.at(0)");
			writeLog("Url string is :"+baseString);
			
		   //Create the url
			 QUrl url("http://ws.audioscrobbler.com/2.0/?");
			 url.addQueryItem("method", "event.shout");   // needs authentication
			 url.addQueryItem("api_key", apiKey);
			 url.addQueryItem("format","json");	
		//	 url.addQueryItem("Event","aEventList.at(0)");
			 url.addQueryItem("auth_token","");
			 url.addQueryItem("api_sig", generateSignature(baseString));
			 writeLog("/n/n Response is :"+url.toString());
						// Create the request, set the url
			 aRequest.iNetworkRequest.setUrl(url);
			 aRequest.iRequestType = SmfEventsPostEvents;
			 aRequest.iPostData = NULL;
			 
			 aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
			 error = SmfPluginErrNone;
			 return error;	*/
			
		   //For Testing Only      
		    QString baseString;
					
		    //QString strId("328799");
			
		    QString eventId("328799");//= aEvent.id();
			//QString eventId;
			//eventId = aEvent.id();
			baseString.append(apiSecret);
		    baseString.append("api_key"+apiKey);
					//baseString.append("auth_token");
			baseString.append("formatjson");
			baseString.append("method=event.getattendees");
			baseString.append("event"+eventId);
			writeLog("Url string is :"+baseString);
					
			//Create the url
			QUrl url("http://ws.audioscrobbler.com/2.0/?");
			url.addQueryItem("method", "event.getattendees");
			url.addQueryItem("event",eventId);
			url.addQueryItem("api_key", apiKey);
			url.addQueryItem("format","json");					 
			//url.addQueryItem("auth_token","");
			//url.addQueryItem("api_sig", generateSignature(baseString));
			writeLog("/n/n Response is :"+url.toString());
			//Create the request, set the url
			aRequest.iNetworkRequest.setUrl(url);
			aRequest.iRequestType = SmfEventsPostEvents;
			aRequest.iPostData = NULL;
		
			aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
			error = SmfPluginErrNone;
			return error;	
	}
		
/**
 * Customised method for SmfMusicEventsPlugin interface
 * @param aRequest [out] The request data to be sent to network
 * @param aOperation The operation type (should be known between 
 * the client interface and the plugin)
 * @param aData The data required to form the request (The type 
 * of data should be known between client and the plugin)
 * @return SmfPluginError Plugin error if any, else SmfPluginErrNone
 */
SmfPluginError MusicEventPlugin::attendees( SmfPluginRequestData &aRequest,
			const SmfEvent &aEvent, 
			const int aPageNum ,
			const int aItemsPerPage )
	{
		Q_UNUSED(aPageNum)
		Q_UNUSED(aItemsPerPage);
		SmfPluginError error = SmfPluginErrUserNotLoggedIn;
		writeLog("MusicEventPlugin::events()");
				
		// Get the key sets from SMF Plugin Utility class.
		QString apiKey;
		QString apiSecret;
		QString sessionKey;
		QString sessionSecret;
		fetchKeys(apiKey, apiSecret, sessionKey, sessionSecret);
		writeLog("API KEY"+apiKey);
		writeLog("API SECRET"+apiSecret);
		writeLog("SessionKey"+sessionKey);
		writeLog("sessionSecret"+sessionSecret);
	    QString baseString;
				
	    //QString strId("328799");
		//aEvent.setId(strId);
	    //QString eventId = aEvent.id();
		QString eventId;
		eventId = aEvent.id();
		baseString.append(apiSecret);
	    baseString.append("api_key"+apiKey);
				//baseString.append("auth_token");
		baseString.append("formatjson");
		baseString.append("method=event.getattendees");
		baseString.append("event"+eventId);
		writeLog("Url string is :"+baseString);
				
		//Create the url
		QUrl url("http://ws.audioscrobbler.com/2.0/?");
		url.addQueryItem("method", "event.getattendees");
		url.addQueryItem("event",eventId);
		url.addQueryItem("api_key", apiKey);
		url.addQueryItem("format","json");					 
				// url.addQueryItem("auth_token","");
				// url.addQueryItem("api_sig", generateSignature(baseString));
		writeLog("/n/n Response is :"+url.toString());
		//Create the request, set the url
		aRequest.iNetworkRequest.setUrl(url);
		aRequest.iRequestType = SmfEventsGetEventAttendees;
		aRequest.iPostData = NULL;
				 
				
				 
		aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
		error = SmfPluginErrNone;
		return error;	
	}
SmfPluginError MusicEventPlugin::customRequest( SmfPluginRequestData &aRequest, 
		const int &aOperation, QByteArray *aData )
	{
	Q_UNUSED(aRequest)
	Q_UNUSED(aOperation)
	Q_UNUSED(aData)
    //SmfEventsCustomRequest
	return SmfPluginErrServiceNotSupported; 
	}

/**
 * The first method to be called in the plugin that implements this interface.
 * If this method is not called, plugin may not behave as expected.
 * Plugins are expected to save the aUtil handle and use and when required.
 * @param aUtil The instance of SmfPluginUtil
 */
void MusicEventPlugin::initialize(/* SmfPluginUtil *aUtil */)
	{
	// Save the SmfPluginUtil handle
	//m_util = aUtil;
	
	// Create an instance of MusicProviderBase
	m_provider = new MusicProviderBase;
	m_provider->initialize();
	}

/**
 * Method to get the provider information
 * @return Instance of SmfProviderBase
 */
SmfProviderBase* MusicEventPlugin::getProviderInfo( )
	{
	return m_provider;
	}

/**
 * Method to get the result for a network request.
 * @param aOperation The type of operation to be requested
 * @param aTransportResult The result of transport operation
 * @param aResponse The QByteArray instance containing the network response.
 * The plugins should delete this instance once they have read the 
 * data from it.
 * @param aResult [out] An output parameter to the plugin manager.If the 
 * return value is SmfSendRequestAgain, QVariant will be of type 
 * SmfPluginRequestData.
 * For SmfGalleryPlugin: If last operation was pictures(), aResult will 
 * be of type QList<SmfPicture>. If last operation was description(), 
 * aResult will be of type QString. If last operation was upload() or 
 * postComment(), aResult will be of type bool.
 * @param aRetType [out] SmfPluginRetType
 * @param aPageResult [out] The SmfResultPage structure variable
 */
SmfPluginError MusicEventPlugin::responseAvailable( 
		const SmfRequestTypeID aOperation,
		const SmfTransportResult &aTransportResult, 
		QByteArray *aResponse, 
		QVariant* aResult, 
		SmfPluginRetType &aRetType,
		SmfResultPage &aPageResult )
	{
	writeLog("MusicEventPlugin::responseAvailable");
		Q_UNUSED(aPageResult)
		SmfPluginError error = SmfPluginErrNetworkError;
		
		if( !aResponse || (0 == aResponse->size()) ) 
			{
			writeLog("Response is NULL or empty");
			aRetType = SmfRequestError;
			return error;
			}
		
		QByteArray response(*aResponse);
		delete aResponse;
		
		//Write the response to a file
		QFile file("c:\\data\\musiceventresponse.txt");
		writeLog("response data written to c:\\data\\musiceventresponse.txt");
				
		if (!file.open(QIODevice::Append | QIODevice::Text));
		file.write(response);
		file.close();
		
		writeLog("MusicEvent response = "+QString(response));
		writeLog("MusicEvent response size = "+QString::number(response.size(), 10));
		
		if(SmfTransportOpNoError == aTransportResult)
			{
			  writeLog("No transport error");
			//  QVariantMap map1;
			 // bool resType=response.startsWith("<?xml");
			 /* if(resType) //XML REsponse
				{
				   writeLog("Before XML Parser--");
				  
			  }
			  else //JSON RESPONSE
			  {
				  bool ok;
				  writeLog("Before JSON Parser--");
		
				  SmfPluginUtil util;
				  QVariant result = util.parse(response, &ok);
				  if (!ok) 
				   {
						writeLog("An error occurred during json parsing");
						aRetType = SmfRequestError;
						return SmfPluginErrParsingFailed;
				   }
													
			 //map1 = result.toMap();*/
			  //}
			  if(SmfEventsGetEvents == aOperation /*|| SmfMusicGetEventsOnVenue == aOperation*/)
				 {
			       
			        QDateTime dt = QDateTime::currentDateTime();
			        QList<SmfEvent> eventlist;
			      
			        
			        
			        //Tested By Hardcoding
			        
			        SmfEvent event;
			        event.setId("111111");
			        event.setTitle("bangalore");
			      	event.setEventDateTime(dt);
			        QStringList stringList; //for artist
			        stringList.append("sssss");
			        stringList.append("aaaa");
			        SmfArtists artists;
			        artists.setNames(stringList);
					event.setArtists(artists);
					
					SmfLocation Location;
					Location.setCity("Bangalore");
					Location.setCountry("india");
					
					event.setVenue(Location);
					eventlist.append(event);
					
					//2nd Event
					SmfEvent event1;
					event1.setId("2222");
					event1.setTitle("delhi");
					event1.setEventDateTime(dt);
					QStringList stringList1; //for artist
					stringList1.append("ddddd");
				    stringList1.append("rrrrrr");
				    SmfArtists artists1;
					artists1.setNames(stringList1);
					event1.setArtists(artists1);
										
					SmfLocation Location1;
					Location1.setCity("Delhi");
					Location1.setCountry("india");
										
					event1.setVenue(Location1);
					eventlist.append(event1);
										
					writeLog("SmfEventsGetEvents = ");
					/*QVariantMap eventmap = map1["events"].toMap();
					QList<QVariant> list1 = eventmap["event"].toList();
					
					QListIterator<QVariant> iter(list1);
					writeLog("SmfEventsGetEvents123 = ");
					while(iter.hasNext())  //not runing for one event
					{
					  SmfEvent event;
					  QVariantMap map2 = iter.next().toMap();
					  writeLog("id = "+map2["id"].toString());
					  event.setId(map2["id"].toString());
					  writeLog("title = "+map2["title"].toString());
					  event.setTitle(map2["title"].toString());
					  writeLog("EventDateTime= "+map2["startDate"].toString());
					  event.setEventDateTime(map2["startDate"].toDateTime());
					 // writeLog("SetdUration= "+map2["startDate"].toDateTime());  //didn't find that
					  //for Getting the Artist List
					  QVariantMap map4 = map2["artists"].toMap();
					  QList<QVariant> artistList =map4["artist"].toList();
					  
					  writeLog("artist"+map4["artist"].toString());
					 					  
					 //  writeLog("artists"+artistList["artist"].toString());
					 // QList<QVariant> artistList =map2["artists"].toList();
					
					  
					 QListIterator<QVariant> iterartists(artistList);
					  SmfArtists artists;
					  QStringList stringList;
					  while(iterartists.hasNext())
					  {
						
						//QString artistName;
						QString artistName = iterartists.next().toString();
						writeLog("artist Name = "+ artistName);
						//artistName.append(map2["artist"].toString());
						stringList.append(artistName);
						
					  }//end while
					  //writeLog("artists= "+stringList[0]);
					  
					  artists.setNames(stringList);
					  event.setArtists(artists);
					  
					  //all Artist list we got 
					  //For Venue
					  SmfLocation Location;
					  QVariantMap map3 = map2["venue"].toMap();
					  writeLog("LocationId : "+map3["id"].toString());
					  Location.setId(map3["id"].toString());
					  //for city
					  QVariantMap map6 = map3["location"].toMap();
					  writeLog("Location city : "+map6["city"].toString());
					  Location.setCity(map6["city"].toString());
					  writeLog("Location city : "+map6["country"].toString());
					  Location.setCountry(map6["country"].toString());
					 // Location.geoPositionInfo()  dont know how to set 
					  event.setVenue(Location);
					  eventlist.append(event);
					}//end While*/
					aResult->setValue(eventlist);
					aRetType = SmfRequestComplete;
					error = SmfPluginErrNone;										
				 }
			 else if(SmfEventsGetVenues == aOperation)
				{
				writeLog("SmfEventsGetVenues = ");
				QList<SmfLocation> LocationList;
				SmfLocation Location;
			    Location.setId("111111");
				//for city
				Location.setCity("delhi");
				Location.setCountry("India");
				Location.setUrl(QUrl("http://wwwqqqqq/ee"));
				LocationList.append(Location);
				
				SmfLocation Location1;
				Location1.setId("22222");
				//for city
				Location1.setCity("bangalore");
				Location1.setCountry("India");
				LocationList.append(Location1);
				
				aResult->setValue(LocationList);
				aRetType = SmfRequestComplete;
				error = SmfPluginErrNone;
				 
				
				}
			
			 else if (SmfEventsPostEvents == aOperation)
				{
				writeLog("SmfEventsPostEvents = ");
				bool postEvent=true;	
				aResult->setValue(postEvent);
				aRetType = SmfRequestComplete;
				error = SmfPluginErrNone;
				
				}
			 else if (SmfEventsGetEventAttendees == aOperation)
				 {
			  
				        QList<SmfContact> contactList;
				        
			             writeLog("SmfMusicGetEventsAttendees = ");
			             bool ok;
			           	writeLog("Before Parser--");

			           	SmfPluginUtil util;
			           	QVariantMap result = util.parse(response, &ok).toMap();
			           	if (!ok) 
			           	{
			           	writeLog("An error occurred during json parsing");
			           	aRetType = SmfRequestError;
			           	return SmfPluginErrParsingFailed;
			           		
			           	}
			           							
			           	//QVariantMap map1 = result.toMap();
			        	writeLog("MAP1");
			            
			           
			           	QVariantMap map1 = result["attendees"].toMap();
			        	//QVariantMap map2 = map1["attendees"].toMap();
			           	writeLog("MAP2");
			           	//int page = map2["page"].toInt(&ok);
			           	QList<QVariant> list1 = map1["user"].toList();
			           	writeLog("list count"+QString::number(list1.count(),10));
			           				
			           	QListIterator<QVariant> i(list1);
			           	writeLog("iterate list"); //While loop not work if there is only one attendee
			            while(i.hasNext())
			           	{
			                writeLog("inside loop");
			           		SmfContact contact;
			           		QVariantMap map2 = i.next().toMap();
			           		writeLog("name= "+map2["name"].toString());
			           		writeLog("realname = "+map2["realname"].toString());
			           					
			           		//Contact Name
			           		QContactName contactname;
			           		QString username = map2["name"].toString();
			           		writeLog("name = "+username);
			           		contactname.setFirstName(username);
			           		contactname.setLastName(username);
			           		QVariant nameVar = QVariant::fromValue(contactname);
			           		contact.setValue("Name",nameVar);
			           		contactList.append(contact);
			           	}
			             aResult->setValue(contactList);										
			 		     aRetType = SmfRequestComplete;
			 		     error = SmfPluginErrNone;
			 			
				 }
			 else
				{
				writeLog("Service unsupported!!!");
				aRetType = SmfRequestError;
				error = SmfPluginErrServiceNotSupported;
				}
			}//end if of if(SmfTransportOpNoError == aTransportResult)

		else if(SmfTransportOpOperationCanceledError == aTransportResult)
			{
			writeLog("Operation Cancelled !!!");
			error = SmfPluginErrCancelComplete;
			aRetType = SmfRequestComplete;
			}

		else
			{
			writeLog("Transport Error !!!");
			error = SmfPluginErrNetworkError;
			aRetType = SmfRequestError;
			}
		
		return error;
	}


/**
 * Destructor
 */
MusicProviderBase::~MusicProviderBase( )
	{
	}

/**
 * Method to get the Localisable name of the service.
 * @return The Localisable name of the service.
 */
QString MusicProviderBase::serviceName( ) const
	{
	return m_serviceName;
	}

/**
 * Method to get the Logo of the service
 * @return The Logo of the service
 */
QImage MusicProviderBase::serviceIcon( ) const
	{
	return m_serviceIcon;
	}

/**
 * Method to get the Readable service description
 * @return The Readable service description
 */
QString MusicProviderBase::description( ) const
	{
	return m_description;
	}

/**
 * Method to get the Website of the service
 * @return The Website of the service
 */
QUrl MusicProviderBase::serviceUrl( ) const
	{
	return m_serviceUrl;
	}

/**
 * Method to get the URL of the Application providing this service
 * @return The URL of the Application providing this service
 */
QUrl MusicProviderBase::applicationUrl( ) const
	{
	return m_applicationUrl;
	}

/**
 * Method to get the Icon of the application
 * @return The Icon of the application
 */
QImage MusicProviderBase::applicationIcon( ) const
	{
	return m_applicationIcon;
	}
/**
* Method to get the list of interfaces that this provider support
* @return List of supported Interafces
*/
QList<QString> MusicProviderBase::supportedInterfaces( ) const
	{
	return m_serviceType;
	}

/**
* Method to get the list of languages supported by this service provider
* @return a QStringList of languages supported by this service 
* provider in 2 letter ISO 639-1 format.
*/
QStringList MusicProviderBase::supportedLanguages( ) const
	{
	return m_supportedLanguages;
	}

/**
 * Method to get the Plugin specific ID
 * @return The Plugin specific ID
 */
QString MusicProviderBase::pluginId( ) const
	{
	return m_pluginId;
	}

/**
 * Method to get the ID of the authentication application 
 * for this service
 * @param aProgram The authentication application name
 * @param aArguments List of arguments required for authentication app
 * @param aMode Strting mode for authentication application
 * @return The ID of the authentication application 
 */
QString MusicProviderBase::authenticationApp( QString &aProgram, 
		QStringList & aArguments, 
		QIODevice::OpenModeFlag aMode ) const
	{
	Q_UNUSED(aProgram)
	Q_UNUSED(aArguments)
	Q_UNUSED(aMode)
	return m_authAppId;
	}

/**
 * Method to get the authentication application process name
 * @return The authentication application process name (eg: "FlickrAuthApp.exe")
 */
QString MusicProviderBase::authenticationAppName( ) const
	{
	return m_authAppName;
	}

/**
 * Method to get the unique registration ID provided by the 
 * Smf for authorised plugins
 * @return The unique registration ID/token provided by the Smf for 
 * authorised plugins
 */
QString MusicProviderBase::smfRegistrationId( ) const
	{
	return m_smfRegToken;
	}

void MusicProviderBase::initialize()
	{
	
	  m_serviceName = "Last.fm";
	  m_description = "Description";
	  m_serviceUrl =  QUrl(QString("http://ws.audioscrobbler.com"));
	 // m_serviceType << m_serviceName << m_description;// << (QString)(m_serviceUrl);
	  m_supportedLanguages << "English" ;
	  m_pluginId =    "lastfmmusiceventplugin.qtplugin";
	  m_authAppId =   "0xE1D8C7D8";
	  m_authAppName = "LastFm.exe";
	  QSettings iSettings;
	  m_smfRegToken = iSettings.value("CMLastFmRegToken").toString();
	  m_validity = iSettings.value("LastFmExpiryTime").toDateTime();
	  //m_smfRegToken = "hsdfusdghf";  //yet to be recvd

	}


/*
 * Export Macro
 * plugin name : musiceventplugin
 * plugin class : MusicEventPlugin
 */
Q_EXPORT_PLUGIN2( musiceventplugin, MusicEventPlugin )