void MCF::dlHeaderFromHttp(const char* url) { gcTrace("Url: {0}", url); if (m_bStopped) return; if (!url) throw gcException(ERR_BADURL); //FIXME: Needs error checking on getweb HttpHandle wc(url); wc->setDownloadRange(0, MCFCore::MCFHeader::getSizeS()); wc->setUserAgent(USERAGENT_UPDATE); wc->getWeb(); if (wc->getDataSize() != MCFCore::MCFHeader::getSizeS()) throw gcException(ERR_BADHEADER); MCFCore::MCFHeader webHeader(wc->getData()); setHeader(&webHeader); if (!webHeader.isValid()) throw gcException(ERR_BADHEADER); wc->cleanUp(); wc->setUserAgent(USERAGENT_UPDATE); wc->setDownloadRange(webHeader.getXmlStart(), webHeader.getXmlSize()); wc->getWeb(); if (wc->getDataSize() == 0 || wc->getDataSize() != webHeader.getXmlSize()) throw gcException(ERR_WEBDL_FAILED, "Failed to download MCF xml from web (size is ether zero or didnt match header size)"); uint32 bz2BuffLen = webHeader.getXmlSize()*25; char* bz2Buff = nullptr; if ( isCompressed() ) { bz2Buff = new char[bz2BuffLen]; AutoDelete<char> ad(bz2Buff); UTIL::STRING::zeroBuffer(bz2Buff, bz2BuffLen); UTIL::BZIP::BZ2DBuff((char*)bz2Buff, &bz2BuffLen, const_cast<char*>(wc->getData()), wc->getDataSize()); parseXml(bz2Buff, bz2BuffLen); } else { parseXml(const_cast<char*>(wc->getData()), wc->getDataSize()); } //we remove the complete flag due to the files not existing in the MCF for (size_t x=0; x< m_pFileList.size(); x++) { m_pFileList[x]->delFlag(MCFCore::MCFFileI::FLAG_COMPLETE); } }
void MCF::dlMCFFromHttp( const char* url, const char* installDir ) { gcTrace( "Url: {0}", url ); if ( m_bStopped ) return; if ( !url ) throw gcException( ERR_BADURL ); //FIXME: Needs error checking on getweb HttpHandle wc( url ); wc->setDownloadRange( 0, MCFCore::MCFHeader::getSizeS() ); wc->setUserAgent( USERAGENT_UPDATE ); wc->getWeb(); if ( wc->getDataSize() != MCFCore::MCFHeader::getSizeS() ) throw gcException( ERR_BADHEADER ); MCFCore::MCFHeader webHeader( wc->getData() ); setHeader( &webHeader ); if ( !webHeader.isValid() ) throw gcException( ERR_BADHEADER ); unsigned int totalSize = webHeader.getXmlStart() + webHeader.getXmlSize(); wc->cleanUp(); wc->setUserAgent( USERAGENT_UPDATE ); wc->setDownloadRange( 0, totalSize ); wc->getWeb(); if ( wc->getDataSize() == 0 || wc->getDataSize() != totalSize ) throw gcException( ERR_WEBDL_FAILED, "Failed to download MCF xml from web (size is ether zero or didnt match header size)" ); UTIL::FS::FileHandle fh( installDir, UTIL::FS::FILE_WRITE ); fh.write( wc->getData(), wc->getDataSize() ); }
void MCF::dlHeaderFromWeb() { if (m_bStopped) return; if (m_vProviderList.size() == 0) throw gcException(ERR_ZEROFILE); gcException lastE; bool successful = false; OutBuffer out(MCF_HEADERSIZE_V2); MCFCore::Misc::MCFServerCon msc; for (size_t x=0; x<m_vProviderList.size(); x++) { try { msc.disconnect(); msc.connect(m_vProviderList[x]->getUrl(), m_pFileAuth); msc.downloadRange(0, 5, &out); //4 id bytes and 1 version byte if (out.m_uiTotalSize != 5) throw gcException(ERR_BADHEADER, "Did not get any data from mcf server."); const char* data = out.m_szBuffer; if ( !(data[0] == 'L' && data[1] == 'M' && data[2] == 'C' && data[3] == 'F') ) throw gcException(ERR_BADHEADER, "Failed magic check."); size_t headerSize = MCF_HEADERSIZE_V1; if (data[4] == 0x01) headerSize = MCF_HEADERSIZE_V1; else if (data[4] == 0x02) headerSize = MCF_HEADERSIZE_V2; else throw gcException(ERR_BADHEADER, "Bad version number"); out.reset(); msc.downloadRange(0, headerSize, &out); if (out.m_uiTotalSize != headerSize) throw gcException(ERR_BADHEADER, "Did not get correct ammount of data from server."); MCFCore::MCFHeader webHeader((uint8*)out.m_szBuffer); if (!webHeader.isValid()) throw gcException(ERR_BADHEADER, "Mcf header was not valid."); uint32 ths = webHeader.getXmlSize(); out = ths; msc.downloadRange(webHeader.getXmlStart(), webHeader.getXmlSize(), &out); if (out.m_uiTotalSize == 0 || out.m_uiTotalSize != webHeader.getXmlSize()) throw gcException(ERR_WEBDL_FAILED, "Failed to download MCF xml from web (size is ether zero or didnt match header size)"); data = out.m_szBuffer; if (data[0] == 'L' && data[1] == 'M' && data[2] == 'C' && data[3] == 'F') throw gcException(ERR_WEBDL_FAILED, "Server failed 4gb seek."); setHeader(&webHeader); successful = true; break; } catch (gcException &e) { lastE = e; Warning(gcString("Failed to download MCF Header from {1}: {0}\n", e, m_vProviderList[x]->getUrl())); } } if (!successful) throw lastE; uint32 bz2BuffLen = getHeader()->getXmlSize()*25; char* bz2Buff = NULL; if ( isCompressed() ) { bz2Buff = new char[bz2BuffLen]; UTIL::STRING::zeroBuffer(bz2Buff, bz2BuffLen); try { UTIL::BZIP::BZ2DBuff((char*)bz2Buff, &bz2BuffLen, out.m_szBuffer, out.m_uiTotalSize); parseXml(bz2Buff, bz2BuffLen); safe_delete(bz2Buff); } catch (gcException &) { safe_delete(bz2Buff); throw; } } else { parseXml(out.m_szBuffer, out.m_uiTotalSize); } //we remove the complete flag due to the files not existing in the MCF for (size_t x=0; x< m_pFileList.size(); x++) { m_pFileList[x]->delFlag(MCFCore::MCFFileI::FLAG_COMPLETE); } if (m_szFile != "") saveMCF_Header(); }