--- /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 )