or' content='cgit v1.2.3-13-gbd6f'/>
aboutsummaryrefslogblamecommitdiff
path: root/src/plugins/Transports/http/httpstreamreader.cpp
blob: 3df0c432c93243a2a40c4a1391cc98f91cec1325 (plain) (tree)
1
2
                                                                            
                                                                            
















                                                                             
                       
                      
               

                     
                   
                   
                              

                              
                             




                                                                    
                                                       







                                                                                    
                      





                                                                
                                                       

                                    


                              
                         
     



                                                               
                                     
     
                                                    



                                         
                                                              
                                             
     
        
     
                                                                     
                                                                               
                                                
                                                                                       
 
                                 

                                                      
                                               
         

                          
                     



                                                                                            



                      
                                                       







                                         


                                                                       

                


                                      
                                   
                            


                             
                        
                                        
                                                                 


                                                                                                     

                                                     

                   
                                                  


                                                                                                 

 
                                     

            
                          
                            

                          
                           

                     



                                       

 






































                                                       
 





                                                            
 

                   
                   


                                                             
     



















                                                                                       

                     
               

 
                                          



                     
                                 



                    
                                       
 
                                                 

                                                               

 
                              







                         
                            
                     
                     




                                    

 
                                               
 
                                                           

 
                            
 
                                                         
                                      
                                
           
                                                   
                                                 


                                                                                              
                                   

                                                         
      
                                                 
                                                        

                                                                                     
                                                           
 
                          
                                                                                 





                                                                       
                  
                                                              
                                                          
                            
                                                      



                                                                        
                                                   



                                                          

                                                       
                 

                                                                          
                                                                            

                                                                 







                                                                                 
                             
                             
                     
                    
                                                 

                                              





                                                                                                 
 
 
                                                              











                                                                     
                                    
 
                                                      
     
                        
                                          
                        

                                                   




                                                                                 


                                                         
                     
     

                      
                                                                                          

                              

 
                                        




                                                          
                         


                                    
                                                                 




                                  
                                            
                                                             
                                    

                     
 
 
                                                                










                                                                                                       
                                                            






                                                                             






                                                                             
                                                   
                                   









                                                           




                                                                                
                               



                  











                                                                          
/***************************************************************************
 *   Copyright (C) 2006-2011 by Ilya Kotov                                 *
 *   forkotov02@hotmail.ru                                                 *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include <QApplication>
#include <QStringList>
#include <QDir>
#include <QSettings>
#include <QTextCodec>
#include <stdint.h>
#include <stdlib.h>
#include <qmmp/qmmpsettings.h>
#include <qmmp/qmmp.h>
#include <qmmp/statehandler.h>
#include "httpstreamreader.h"

//curl callbacks
static size_t curl_write_data(void *data, size_t size, size_t nmemb,
                              void *pointer)
{
    HttpStreamReader *dl = (HttpStreamReader *)pointer;
    dl->mutex()->lock ();
    size_t buf_start = dl->stream()->buf_fill;
    size_t data_size = size * nmemb;
    dl->stream()->buf_fill += data_size;

    dl->stream()->buf = (char *)realloc (dl->stream()->buf, dl->stream()->buf_fill);
    memcpy (dl->stream()->buf + buf_start, data, data_size);
    dl->mutex()->unlock();
    dl->checkBuffer();
    return data_size;
}

static size_t curl_header(void *data, size_t size, size_t nmemb,
                          void *pointer)
{
    HttpStreamReader *dl = (HttpStreamReader *)pointer;
    dl->mutex()->lock ();
    size_t data_size = size * nmemb;
    if (data_size < 3)
    {
        dl->mutex()->unlock();
        return data_size;
    }

    //qDebug("header received: %s", (char*) data);
    QString str = QString::fromAscii((char *) data, data_size);
    str = str.trimmed ();
    if (str.left(4).contains("HTTP"))
    {
        qDebug("HttpStreamReader: header received");
        //TODO open metadata socket
    }
    else if (str.left(4).contains("ICY"))
    {
        qDebug("HttpStreamReader: shoutcast header received");
        //dl->stream()->icy_meta_data = true;
    }
    else
    {
        QString key = str.left(str.indexOf(":")).trimmed().toLower();
        QString value = str.right(str.size() - str.indexOf(":") - 1).trimmed();
        dl->stream()->header.insert(key, value);
        qDebug("HttpStreamReader: key=%s, value=%s",qPrintable(key),qPrintable(value));

        if (key == "icy-metaint")
        {
            dl->stream()->icy_metaint = value.toInt();
            dl->stream()->icy_meta_data = true;
        }
    }
    dl->mutex()->unlock();
    return data_size;
}

int curl_progress(void *pointer, double dltotal, double dlnow, double ultotal, double ulnow)
{
    Q_UNUSED(dltotal);
    Q_UNUSED(dlnow);
    Q_UNUSED(ultotal);
    Q_UNUSED(ulnow);
    HttpStreamReader *dl = (HttpStreamReader *)pointer;
    dl->mutex()->lock ();
    bool aborted = dl->stream()->aborted;
    dl->mutex()->unlock();
    if (aborted)
        return -1;
    return 0;
}


HttpStreamReader::HttpStreamReader(const QString &url, QObject *parent)
        : QIODevice(parent)
{
    m_url = url;
    curl_global_init(CURL_GLOBAL_ALL);
    m_stream.buf_fill = 0;
    m_stream.buf = 0;
    m_stream.icy_meta_data = false;
    m_stream.aborted = true;
    m_stream.icy_metaint = 0;
    m_handle = 0;
    m_metacount = 0;
    m_meta_sent = false;
    m_thread = new DownloadThread(this);
    QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
    settings.beginGroup("HTTP");
    m_codec = QTextCodec::codecForName(settings.value("icy_encoding","windows-1252").toByteArray ());
    m_buffer_size = settings.value("buffer_size",128).toInt() * 1000;
    if (!m_codec)
        m_codec = QTextCodec::codecForName ("UTF-8");
#ifdef WITH_ENCA
    m_analyser = 0;
    if(settings.value("use_enca", false).toBool())