MythTV  0.26-pre
internetContent.cpp
Go to the documentation of this file.
00001 // Program Name: internetContent.cpp
00002 //
00003 // Purpose - Html & XML status HttpServerExtension
00004 //
00005 // Created By  : David Blain                    Created On : Oct. 24, 2005
00006 // Modified By : Daniel Kristjansson            Modified On: Oct. 31, 2007
00007 //
00009 
00010 #include <QTextStream>
00011 #include <QDir>
00012 #include <QFile>
00013 #include <QRegExp>
00014 #include <QBuffer>
00015 #include <QEventLoop>
00016 #include <QImage>
00017 
00018 #include "internetContent.h"
00019 
00020 #include "mythcorecontext.h"
00021 #include "mythmiscutil.h"
00022 #include "mythsystem.h"
00023 #include "mythdirs.h"
00024 
00025 #include "rssparse.h"
00026 #include "netutils.h"
00027 #include "netgrabbermanager.h"
00028 
00030 //
00032 
00033 InternetContent::InternetContent( const QString &sSharePath)
00034         : HttpServerExtension( "InternetContent", sSharePath)
00035 {
00036 }
00037 
00039 //
00041 
00042 InternetContent::~InternetContent()
00043 {
00044 }
00045 
00047 //
00049 
00050 QStringList InternetContent::GetBasePaths()
00051 {
00052     return QStringList( "/InternetContent" );
00053 }
00054 
00056 //
00058 
00059 bool InternetContent::ProcessRequest( HTTPRequest *pRequest )
00060 {
00061     try
00062     {
00063         if (pRequest)
00064         {
00065             if (pRequest->m_sBaseUrl != "/InternetContent")
00066                 return false;
00067 
00068             LOG(VB_UPNP, LOG_INFO,
00069                 QString("InternetContent::ProcessRequest: %1 : %2")
00070                     .arg(pRequest->m_sMethod)
00071                     .arg(pRequest->m_sRawRequest));
00072 
00073             // --------------------------------------------------------------
00074 
00075             if (pRequest->m_sMethod == "GetInternetSearch")
00076             {
00077                 GetInternetSearch( pRequest );
00078                 return true;
00079             }
00080             
00081             // --------------------------------------------------------------
00082 
00083             if (pRequest->m_sMethod == "GetInternetSources")
00084             {
00085                 GetInternetSources( pRequest );
00086                 return true;
00087             }
00088 
00089             // --------------------------------------------------------------
00090 
00091             if (pRequest->m_sMethod == "GetInternetContent")
00092             {
00093                 GetInternetContent( pRequest );
00094                 return true;
00095             }
00096         }
00097     }
00098     catch( ... )
00099     {
00100         LOG(VB_GENERAL, LOG_ERR,
00101             "InternetContent::ProcessRequest() - Unexpected Exception" );
00102     }
00103 
00104     return false;
00105 }
00106 
00107 // ==========================================================================
00108 // Request handler Methods
00109 // ==========================================================================
00110 
00112 //
00114 
00115 void InternetContent::GetInternetSearch( HTTPRequest *pRequest )
00116 {
00117     pRequest->m_eResponseType   = ResponseTypeHTML;
00118 
00119     QString grabber =  pRequest->m_mapParams[ "Grabber" ];
00120     QString query   =  pRequest->m_mapParams[ "Query" ];
00121     QString page    =  pRequest->m_mapParams[ "Page" ];
00122 
00123     if (grabber.isEmpty() || query.isEmpty() || page.isEmpty())
00124         return;
00125 
00126     uint pagenum = page.toUInt();
00127     QString command = QString("%1internetcontent/%2").arg(GetShareDir())
00128                         .arg(grabber);
00129 
00130     if (!QFile::exists(command))
00131     {
00132         pRequest->FormatRawResponse( QString("<HTML>Grabber %1 does "
00133                   "not exist!</HTML>").arg(command) );
00134         return;
00135     }
00136 
00137     LOG(VB_GENERAL, LOG_INFO,
00138         QString("InternetContent::GetInternetSearch Executing "
00139                 "Command: %1 -p %2 -S '%3'")
00140             .arg(command).arg(pagenum).arg(query));
00141 
00142     Search *search = new Search();
00143     QEventLoop loop;
00144 
00145     QObject::connect(search, SIGNAL(finishedSearch(Search *)),
00146                      &loop, SLOT(quit(void)));
00147     QObject::connect(search, SIGNAL(searchTimedOut(Search *)),
00148                      &loop, SLOT(quit(void)));
00149 
00150     search->executeSearch(command, query, pagenum);
00151     loop.exec();
00152 
00153     search->process();
00154 
00155     QDomDocument ret;
00156     ret.setContent(search->GetData());
00157 
00158     delete search;
00159 
00160     if (ret.isNull())
00161         return;
00162 
00163     pRequest->FormatRawResponse( ret.toString() );
00164 }
00165 
00167 //
00169 
00170 void InternetContent::GetInternetSources( HTTPRequest *pRequest )
00171 {
00172     pRequest->m_eResponseType   = ResponseTypeHTML;
00173 
00174     QString ret;
00175     QString GrabberDir = QString("%1/internetcontent/").arg(GetShareDir());
00176     QDir GrabberPath(GrabberDir);
00177     QStringList Grabbers = GrabberPath.entryList(QDir::Files | QDir::Executable);
00178 
00179     for (QStringList::const_iterator i = Grabbers.begin();
00180             i != Grabbers.end(); ++i)
00181     {
00182         QString commandline = GrabberDir + (*i);
00183         MythSystem scriptcheck(commandline, QStringList("-v"),
00184                                kMSRunShell | kMSStdOut | kMSBuffered);
00185         scriptcheck.Run();
00186         scriptcheck.Wait();
00187         QByteArray result = scriptcheck.ReadAll();
00188 
00189         if (!result.isEmpty() && result.toLower().startsWith("<grabber>"))
00190             ret += result;
00191     }
00192 
00193     NameValues list;
00194 
00195     list.push_back( NameValue( "InternetContent", ret ));
00196 
00197     pRequest->FormatActionResponse( list );
00198 }
00199 
00201 //
00203 
00204 void InternetContent::GetInternetContent( HTTPRequest *pRequest )
00205 {
00206     pRequest->m_eResponseType   = ResponseTypeHTML;
00207 
00208     QString grabber =  pRequest->m_mapParams[ "Grabber" ];
00209 
00210     if (grabber.isEmpty())
00211         return;
00212 
00213     QString contentDir = QString("%1internetcontent/").arg(GetShareDir());
00214     QString htmlFile(contentDir + grabber);
00215 
00216     // Try to prevent directory traversal
00217     QFileInfo fileInfo(htmlFile);
00218     if (fileInfo.canonicalFilePath().startsWith(contentDir) &&
00219         QFile::exists( htmlFile ))
00220     {
00221         pRequest->m_eResponseType   = ResponseTypeFile;
00222         pRequest->m_nResponseStatus = 200;
00223         pRequest->m_sFileName       = htmlFile;
00224     }
00225     else
00226     {
00227         pRequest->FormatRawResponse( QString("<HTML>File %1 does "
00228                   "not exist!</HTML>").arg(htmlFile) );
00229     }
00230 }
00231 
00232 // vim:set shiftwidth=4 tabstop=4 expandtab:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends