example/MusicLyricsPlugin/MusicLyricsPlugin.cpp
changeset 23 574948b60dab
child 26 83d6a149c755
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/MusicLyricsPlugin/MusicLyricsPlugin.cpp	Thu Sep 23 17:15:03 2010 +0530
@@ -0,0 +1,589 @@
+/*
+ * MusicLyricsPlugin.cpp
+ *
+ *  Created on: Aug 18, 2010
+ *      Author: sanpra
+ */
+
+//Include files
+#include <QtPlugin>
+#include <QCryptographicHash>
+#include <QDataStream>
+#include <QTextStream>
+#include <QFile>
+#include <QNetworkReply>
+#include <QMap>
+#include <QListIterator>
+#include <QXmlStreamReader>
+#include <SmfPicture.h>
+#include <QDebug>
+#include "musiclyricsplugin.h"
+
+
+
+//Added for testing - start
+//static const QString apiKey = "8823ece35e487bada68fa893d7ecf91e";
+static const QString apiKey = "1b76e55254f5f22ae";
+//static const QString apiSecret = "20ccb1cc62aa50caf7d8aae31808d429";
+//static const QString miniToken = "773193698 ";
+
+//QString fullToken = "72157624000326005-e6cba1c7665a778e";
+
+//Payload data array
+QByteArray payload;
+QString uids;
+/**
+ * Method called by plugins for logging
+ * @param log string to be logged
+ */
+void MusicLyricsPlugin::writeLog(QString log) const
+	{
+	QFile file("c:\\data\\LyricsPluginLogs.txt");
+    if (!file.open(QIODevice::Append | QIODevice::Text))
+	         ;
+    QTextStream out(&file);
+    out << log << "\n";
+    file.close();
+	}
+
+/**
+ * Destructor
+ */
+MusicLyricsPlugin::~MusicLyricsPlugin()
+	{
+	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 MusicLyricsPlugin::generateSignature(const QString aBaseString)
+	{
+	writeLog("MusicLyricsPlugin::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;
+	}
+
+
+SmfPluginError MusicLyricsPlugin::lyrics( SmfPluginRequestData &aRequest, 
+				const SmfTrackInfo &aTrack,
+				const int aPageNum , 
+				const int aItemsPerPage  ) 
+	{
+	 SmfPluginError error = SmfPluginErrUserNotLoggedIn;
+		
+	writeLog("MusicLyricsPlugin::lyrics()");
+		
+	QString baseString;
+	//spanda
+	QString Url1 = "http://api.lyricsfly.com/api/txt-api.php?";
+	Url1 += "i=7a48a610d6c65171a-temporary.API.access";//[USER ID]
+	Url1 += "&";
+	Url1 += "l=one_love";//[LYRICS TEXT STRING]
+	//till here
+	
+	//baseString.append(apiSecret);
+/*	baseString.append("api_key"+apiKey);
+	//baseString.append("auth_token");
+	//baseString.append("method=geo.getEvents");
+	writeLog("Url string is :"+baseString);
+	// Create the url
+	QUrl url("http://api.lyricsfly.com/api/");
+	//url.addQueryItem("method", "geo.getevents");
+	//url.addQueryItem("location","madrid");
+	url.addQueryItem("api_key", apiKey);
+	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(Url1);
+	aRequest.iRequestType = SmfMusicGetLyrics;
+	
+	//aRequest.iPostData = NULL;
+	aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
+	writeLog("/n/n responseAvailble() is getting called");
+	error = SmfPluginErrNone;
+	return error;	
+	}
+		
+SmfPluginError MusicLyricsPlugin::subtitles( SmfPluginRequestData &aRequest, 
+				const SmfTrackInfo &aTrack,
+				const SmfSubtitleSearchFilter &aFilter ,
+				const int aPageNum , 
+				const int aItemsPerPage ) 
+	{
+	//spanda_13
+	SmfPluginError error = SmfPluginErrUserNotLoggedIn;
+			
+		writeLog("MusicLyricsPlugin::subtitle()");
+			
+		QString baseString;
+		//spanda
+		QString Url2 = "http://api.allsubs.org/index.php?";
+		Url2 += "search=anaconda";
+		Url2 += "&";
+		Url2 += "language=en";
+		Url2 += "&";
+		Url2 += "limit=3";
+
+		
+		aRequest.iNetworkRequest.setUrl(Url2);
+		aRequest.iRequestType = SmfMusicGetSubtitle;
+		
+		//aRequest.iPostData = NULL;
+		aRequest.iHttpOperationType = QNetworkAccessManager::GetOperation;
+		//writeLog("/n/n responseAvailble() is getting called");
+		error = SmfPluginErrNone;
+		return error;	
+	//till here
+	}
+/**
+ * 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 MusicLyricsPlugin::customRequest( SmfPluginRequestData &aRequest, 
+		const int &aOperation, QByteArray *aData )
+	{
+	Q_UNUSED(aRequest)
+	Q_UNUSED(aOperation)
+	Q_UNUSED(aData)
+	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 MusicLyricsPlugin::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* MusicLyricsPlugin::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 SmfLyricsServicePlugin: If last operation was lyrics(), aResult will 
+ * be of type QList<SmfLyrics>. If last operation was subtitles(), aResult will 
+* be of type QList<SmfSubtitle>.
+ */
+SmfPluginError MusicLyricsPlugin::responseAvailable( 
+		const SmfRequestTypeID aOperation,
+		const SmfTransportResult &aTransportResult, 
+		QByteArray *aResponse, 
+		QVariant* aResult, 
+		SmfPluginRetType &aRetType,
+		SmfResultPage &aPageResult )
+	{
+	writeLog("MusicLyricsPlugin::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\\musiclyricsresponse.txt");
+		writeLog("response data written to c:\\data\\musiclyricsresponse.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)
+			{
+		      qDebug()<<"No transport error";
+			 
+			  if(SmfMusicGetLyrics == aOperation )
+				 {
+			       QList<SmfLyrics> SmfLyricsList;  
+				  //spanda_14
+                  qDebug()<<"Xml parsing";
+				
+				  //For getting contacts from xml response
+				  QXmlStreamReader xml(response);
+				  //int count = 0;
+				  while (!xml.atEnd())
+				  {
+					xml.readNext();
+					if (xml.tokenType() == QXmlStreamReader::StartElement)
+						{
+					 SmfLyrics lyrics;
+					     //SmfLyrics
+						if (xml.name() == "id")
+							{
+						   
+						   
+							qDebug()<<"id tag found";
+							QString id ;
+							QString message(xml.readElementText());
+							id.append(message);
+							qDebug()<<" IDS : "<< id;
+							 lyrics.setId(id);
+							//count++;
+
+							}
+						if (xml.name() == "tx")
+							{
+			                  
+								qDebug()<<"tx tag found";
+								QString tx;
+								QString message(xml.readElementText());
+								tx.append(message);
+								qDebug()<<" text : "<< tx;
+								QByteArray data;
+								QDataStream stream(&data, QIODevice::ReadWrite);
+								stream<<tx;
+								lyrics.setId(data);
+													//count++;
+
+							}
+						else if("error_msg" == xml.name())
+							{
+							qDebug()<<"error_msg tag found";
+							//errStr.append(xml.readElementText());
+							break;
+							}
+						}
+					}
+		
+
+			 		//aRetType = SmfRequestComplete;
+					error = SmfPluginErrNone;										
+				 }
+		
+			 else if (SmfMusicGetSubtitle == aOperation)
+				{
+				writeLog("SmfMusicGetEventsOnVenue = ");
+				
+				writeLog("Inside SmfMusicGetSubtitle ");
+			      QList<SmfSubtitle> SmfSubtitleList;  
+							  
+			      writeLog("Xml parsing");
+			      
+			      SmfSubtitle Lyricssubtiltle1;
+			      Lyricssubtiltle1.setSubtitleUrl(QUrl("http://www.allsubs.org/subs-download/anaconda/1276543/"));
+			  	  Lyricssubtiltle1.setLanguage("english");
+			  	  QDateTime dt = QDateTime::currentDateTime();
+			  	  Lyricssubtiltle1.setReleaseYear(dt);
+			  	  SmfSubtitleList.append(Lyricssubtiltle1);
+			  	
+			  	  SmfSubtitle Lyricssubtiltle2;
+			      Lyricssubtiltle2.setSubtitleUrl(QUrl("http://www.allsubs.org/subs-download/"));
+			      Lyricssubtiltle2.setLanguage("hindi");
+			      QDateTime dt1 = QDateTime::currentDateTime();
+			      Lyricssubtiltle2.setReleaseYear(dt1);
+			      SmfSubtitleList.append(Lyricssubtiltle2);
+			      
+			      SmfSubtitle Lyricssubtiltle3;
+			      Lyricssubtiltle3.setSubtitleUrl(QUrl("http://www.allsubs.org"));
+			      Lyricssubtiltle3.setLanguage("hindi");
+			      QDateTime dt2 = QDateTime::currentDateTime();
+			      Lyricssubtiltle3.setReleaseYear(dt2);
+			      SmfSubtitleList.append(Lyricssubtiltle3);
+							
+				    //For getting contacts from xml response
+					QXmlStreamReader xml(response);
+					//int count = 0;
+					/*while (!xml.atEnd())
+					{
+					    SmfSubtitle Lyricssubtiltle;
+						xml.readNext();
+						
+						if(xml.tokenType() == QXmlStreamReader::StartDocument) 
+							{
+									continue;
+							}
+						
+						   if (xml.tokenType() == QXmlStreamReader::StartElement)
+						   {
+						     if (xml.name() == "AllSubsAPI")
+							 {
+						       continue;
+							 }
+						    //writeLog("START ELEMNT"+xml.name().toString());
+						   	if (xml.name() == "items")
+						   		continue;
+						   			
+						   	if (xml.name() == "item")
+						   		{
+						   	    //   xml.readNext();
+						   	       while(!(xml.tokenType() == QXmlStreamReader::EndElement &&
+						   	    			xml.name() == "item")) 
+						   	    	   {
+						   	              writeLog("loop");
+						   	    		  if(xml.tokenType() == QXmlStreamReader::StartElement) 
+						   	    			{
+						   	    			
+						   	    			//}
+						   	    			// We've found link. 
+						   	    			if(xml.name() == "link") 
+						   	    			{
+						   	    			
+						   	    			Lyricssubtiltle.setSubtitleUrl(xml.readElementText());
+						   	    			writeLog("link "+ Lyricssubtiltle.subtitleUrl());
+						   	    			writeLog("LINK"+xml.readElementText());
+						   	    				
+						   	    			}
+						   	    			// We've found email. 
+						   	    			if(xml.name() == "languages") 
+						   	    			{
+						   	    			Lyricssubtiltle.setLanguage(xml.readElementText());
+						   	    			writeLog("languages "+Lyricssubtiltle.language());
+						   	    			writeLog("languages"+xml.readElementText());
+						   	    									   	    				
+						   	    				
+						   	    			}
+						   	    			// We've found website. 
+						   	    			if(xml.name() == "added_on") 
+						   	    			{
+						   	    			QDateTime dt = QDateTime::fromString(xml.readElementText());//stringToTime()
+						   	    			Lyricssubtiltle.setReleaseYear(dt);
+						   	    			writeLog("added_on "+Lyricssubtiltle.releaseYear().toString());
+						   	    			writeLog("added_on"+xml.readElementText());
+						   	    			}
+						   	    		
+						   	    		}
+						   	    		 SmfSubtitleList.append(Lyricssubtiltle);
+						   	    		// ...and next... 
+						   	    		xml.readNext();
+						   		}//while
+						   			
+						   		//}
+						   						      									
+						   		}//end OF IF iem
+						   						//	}//end of If
+						       }//end of start elementIF
+						 
+						  
+						
+					  }//end of while*/
+					
+						//}
+					writeLog("End Of Log");
+					writeLog("Count of subtitlles List:"+QString::number(SmfSubtitleList.count(),10));
+					aResult->setValue(SmfSubtitleList);
+					aRetType = SmfRequestComplete;
+													
+				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
+	{
+	return m_authAppId;
+	}
+
+/**
+ * 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 = "LyricsFly";
+	  m_description = "Description";
+	  m_serviceUrl =  QUrl(QString("http://api.lyricsfly.com"));
+	  m_serviceType << m_serviceName << m_description;// << (QString)(m_serviceUrl);
+	  m_supportedLanguages << "English" ;
+	  m_pluginId =    "musiclyricsplugin.qtplugin";
+	  m_authAppId =   "0xEFE2FD23";
+	  m_smfRegToken = "hsdfusdghf";
+	  
+	  //sandeep_Added_13-08-2010
+	 /* m_serviceName = "allsubs";
+	  m_description = "Description";
+	  //m_serviceUrl =  QUrl(QString//("http://api.allsubs.org"));
+	  
+	 // m_serviceType << m_serviceName << m_description;// << (QString)(m_serviceUrl);
+	  m_supportedLanguages << "English" ;
+	  m_pluginId =    "musiclyricsplugin.qtplugin";
+	  m_authAppId =   "0xEFE2FD23";
+	  m_smfRegToken = "hsdfusdghf";
+	  //m_smfRegToken = "hsdfusdghf";  //yet to be recvd*/
+
+	}
+
+
+/*
+ * Export Macro
+ * plugin name : MusicLyricsPlugin
+ * plugin class : MusicLyricsPlugin
+ */
+Q_EXPORT_PLUGIN2( musiclyricsplugin, MusicLyricsPlugin )