comparison data/fileio/FileSource.cpp @ 913:b9d7352336ce

Fixes to FileSource from Ted Felix (for Rosegarden): avoid blowing up through calling abort() from cleanup() when error occurred; set status correctly for FTP transfers
author Chris Cannam
date Mon, 19 May 2014 10:54:45 +0100
parents 55e552b4f1b7
children 613ee830de5e
comparison
equal deleted inserted replaced
911:73c2fd9a7dbe 913:b9d7352336ce
483 } 483 }
484 m_done = true; 484 m_done = true;
485 if (m_reply) { 485 if (m_reply) {
486 QNetworkReply *r = m_reply; 486 QNetworkReply *r = m_reply;
487 m_reply = 0; 487 m_reply = 0;
488 r->abort(); 488 // Can only call abort() when there are no errors.
489 if (r->error() == QNetworkReply::NoError) {
490 r->abort();
491 }
489 r->deleteLater(); 492 r->deleteLater();
490 } 493 }
491 if (m_localFile) { 494 if (m_localFile) {
492 delete m_localFile; // does not actually delete the file 495 delete m_localFile; // does not actually delete the file
493 m_localFile = 0; 496 m_localFile = 0;
516 bool 519 bool
517 FileSource::isAvailable() 520 FileSource::isAvailable()
518 { 521 {
519 waitForStatus(); 522 waitForStatus();
520 bool available = true; 523 bool available = true;
521 if (!m_ok) available = false; 524 if (!m_ok) {
522 else available = (m_lastStatus / 100 == 2); 525 available = false;
523 #ifdef DEBUG_FILE_SOURCE 526 } else {
524 cerr << "FileSource::isAvailable: " << (available ? "yes" : "no") 527 // http 2xx status codes mean success
525 << endl; 528 available = (m_lastStatus / 100 == 2);
529 }
530 #ifdef DEBUG_FILE_SOURCE
531 cerr << "FileSource::isAvailable: " << (available ? "yes" : "no") << endl;
526 #endif 532 #endif
527 return available; 533 return available;
528 } 534 }
529 535
530 void 536 void
632 if (!m_reply) { 638 if (!m_reply) {
633 cerr << "WARNING: FileSource::metaDataChanged() called without a reply object being known to us" << endl; 639 cerr << "WARNING: FileSource::metaDataChanged() called without a reply object being known to us" << endl;
634 return; 640 return;
635 } 641 }
636 642
643 // Handle http transfer status codes.
644
637 int status = 645 int status =
638 m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 646 m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
639 647
648 // If this is a redirection (3xx) code, do the redirect
640 if (status / 100 == 3) { 649 if (status / 100 == 3) {
641 QString location = m_reply->header 650 QString location = m_reply->header
642 (QNetworkRequest::LocationHeader).toString(); 651 (QNetworkRequest::LocationHeader).toString();
643 #ifdef DEBUG_FILE_SOURCE 652 #ifdef DEBUG_FILE_SOURCE
644 cerr << "FileSource::metaDataChanged: redirect to \"" 653 cerr << "FileSource::metaDataChanged: redirect to \""
663 } 672 }
664 } 673 }
665 } 674 }
666 675
667 m_lastStatus = status; 676 m_lastStatus = status;
677
678 // 400 and up are failures, get the error string
668 if (m_lastStatus / 100 >= 4) { 679 if (m_lastStatus / 100 >= 4) {
669 m_errorString = QString("%1 %2") 680 m_errorString = QString("%1 %2")
670 .arg(status) 681 .arg(status)
671 .arg(m_reply->attribute 682 .arg(m_reply->attribute
672 (QNetworkRequest::HttpReasonPhraseAttribute).toString()); 683 (QNetworkRequest::HttpReasonPhraseAttribute).toString());
710 #ifdef DEBUG_FILE_SOURCE 721 #ifdef DEBUG_FILE_SOURCE
711 cerr << "FileSource::replyFinished()" << endl; 722 cerr << "FileSource::replyFinished()" << endl;
712 #endif 723 #endif
713 724
714 if (m_done) return; 725 if (m_done) return;
726
727 QString scheme = m_url.scheme().toLower();
728 // For ftp transfers, replyFinished() will be called on success.
729 // metaDataChanged() is never called for ftp transfers.
730 if (scheme == "ftp") {
731 m_lastStatus = 200; // http ok
732 }
715 733
716 bool error = (m_lastStatus / 100 >= 4); 734 bool error = (m_lastStatus / 100 >= 4);
717 735
718 cleanup(); 736 cleanup();
719 737