Duda Networkaccesmanager de Qt.

Iniciado por Stakewinner00, 15 Julio 2013, 19:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Stakewinner00

Tengo un código que lee unas urls de un archivo y luego con por el método GET descarga las webs  y las guarda


   std::cout << urlname;
   manager = new QNetworkAccessManager(this);
   QUrl url = QUrl(urlname.c_str());
   connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onManagerFinished(QNetworkReply*)));
   manager->get(QNetworkRequest(url));
               std::cin.get();



Aqui es cuando descarga las webs
Código (cpp) [Seleccionar]
void downloader::onManagerFinished(QNetworkReply *r)
{
   QString filename=filename0.c_str(); //filename0 es el nombre del archivo que se llama temp+i (temp1,temp2,temp3)
   QFile file( filename );
   if ( file.open(QIODevice::ReadWrite) )
   {
       QTextStream stream( &file );
       stream << r->readAll() << endl;
   }
   file.close();
   delete r;
   delete manager;
   downloader(); //Esto representa la función que hay más arriba para que descargue la siguiente URL
}


EL problema es que la segunda vez que entra en la función de guardar el archivo no hace nada.
coge la primera url la guarda coge la segunda url pero ya no hace nada más

OmarHack

Podrías hacer un For para repetir la parte que funciona cambiándole los parámetros para la nueva url, no se me ocurre como arreglarlo. Pruébalo como un apaño temporal a ver si funciona.
I like to test things.

0xDani

De esto:

Código (cpp) [Seleccionar]
void downloader::onManagerFinished(QNetworkReply *r)

Deduzco que la clase en la que estás trabajando se llama "downloader", y que estás llamando al constructor de la clase desde la clase misma. Esto puede ser lo que ocasiona el problema, míralo, y si no postea más código porque está un poco incompleto.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Stakewinner00

#3
Coloque el código dentro del bucle pero entonces coge las 3 urls pero no descarga el contenido de las 3 sino solo de la primera
Código (cpp) [Seleccionar]
   int i=0;

downloader::downloader(QObject *parent) :
   QObject(parent)
{
   std::ifstream urls;
   urls.open("fuck/config",std::ios::binary);
   std::string urlname;

   char c;
   urls.seekg(0, std::ios::end);
   long size = urls.tellg();
   urls.seekg(0, std::ios::beg);
   long index=0;
   while (index!=size)
   {
       index++;
       c = urls.get();
       if (c==';') {
       manager = new QNetworkAccessManager(this);
       QUrl url = QUrl(urlname.c_str());
       connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onManagerFinished(QNetworkReply*)));
       manager->get(QNetworkRequest(url));
        urlname="";
       } else {
           urlname = urlname + c;
       }
   }
   urls.close();

}

void downloader::onManagerFinished(QNetworkReply *r)
{
   std::stringstream stream;
   stream << i;
   std::string filename0;
   filename0 = "fuck/temp";
   filename0 += stream.str()+".html";
   i++;
   QString filename=filename0.c_str();
   QFile file( filename );
   if ( file.open(QIODevice::ReadWrite) )
   {
       QTextStream stream( &file );
       stream << r->readAll() << endl;
   }
   file.close();
   delete r;
}



OmarHack

Será culpa del espacio o el salto de lineas entre urls? Prueba simplemente a imprimir en pantalla las urls que le indiques sin realizar ninguna operación con ellas. Si solo imprime la primera la culpa es de la manera de almacenar las urls, ya sea la forma de tomarlas o las variables que se usen.

Es una comprobación muy simple pero así podemos centrarnos en el culpable sin tener que mirar todo el código.
I like to test things.

Stakewinner00

Ya lo probé y devuelve la primera URL la carpeta destino luego imprime la segunda URL y ya no devuelve nada más.

Gracias de todos modos

OmarHack

No me entero del código pero ¿no será que al acabar la conexión con la primera url se cierra y hay que volver a abrirla?
Comprueba a ver..
I like to test things.

0xDani

Comprueba las URLs, el modo de apertura del archivo de URLs, procura liberar la memoria del manager, y fíjate que en las primeras iteraciones del bucle obtendrás una URL válida si está en el archivo como tú quieres, pero luego le sigues sumando caracteres al string urlname sin haberlo limpiado antes, y lógicamente no te funciona.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Stakewinner00

no funciona con nada. El error esta en el manager. Cuando carga la primera url la carga bien pero la segunda no escribe nada probé a poner delete manager; y manager->disconnect; pero no ha funcionado. 

Stakewinner00

Ya lo arregle. Gracias a 0xDanni vi que el error era al pasarlo a QUrl y vi que cuando mandaba la petición acababa con un %0D así que hice un  for (int i=0;i<urlname.size()-1;i++) y ya no dio error.

Gracias a todos por vuestra ayuda.