Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Stakewinner00 en 15 Julio 2013, 19:31 PM

Título: Duda Networkaccesmanager de Qt.
Publicado por: Stakewinner00 en 15 Julio 2013, 19:31 PM
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
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: OmarHack en 15 Julio 2013, 22:21 PM
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.
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: 0xDani en 16 Julio 2013, 00:49 AM
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.
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: Stakewinner00 en 16 Julio 2013, 00:55 AM
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;
}


Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: OmarHack en 16 Julio 2013, 01:31 AM
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.
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: Stakewinner00 en 16 Julio 2013, 09:09 AM
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
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: OmarHack en 16 Julio 2013, 13:53 PM
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..
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: 0xDani en 16 Julio 2013, 15:38 PM
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.
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: Stakewinner00 en 16 Julio 2013, 16:11 PM
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. 
Título: Re: Duda Networkaccesmanager de Qt.
Publicado por: Stakewinner00 en 17 Julio 2013, 10:24 AM
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.