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(); }
void MCF::doDlHeaderFromWeb(MCFCore::Misc::MCFServerCon &msc) { gcException lastE; bool successful = false; OutBuffer out(MCF_HEADERSIZE_V2); std::vector<std::shared_ptr<const MCFCore::Misc::DownloadProvider>> vProviders; m_pDownloadProviders->getDownloadProviders(vProviders); if (vProviders.empty()) throw gcException(ERR_ZEROFILE); auto auth = m_pDownloadProviders->getDownloadAuth(); for (auto provider : vProviders) { if (m_bStopped) return; try { msc.disconnect(); msc.connect(*provider, *auth); 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"); if (m_bStopped) return; out.reset(); msc.downloadRange(0, headerSize, &out); if (out.m_uiTotalSize != headerSize) throw gcException(ERR_BADHEADER, "Did not get correct amount of data from server."); MCFCore::MCFHeader webHeader(out.m_szBuffer); if (!webHeader.isValid()) throw gcException(ERR_BADHEADER, "Mcf header was not valid."); uint32 ths = webHeader.getXmlSize(); out = ths; if (m_bStopped) return; 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; auto bIsUserCancel = (e.getErrId() == ERR_MCFSERVER && e.getSecErrId() == ERR_USERCANCELED); if (!bIsUserCancel) Warning("Failed to download MCF Header from {1}: {0}\n", e, provider->getUrl()); } } if (m_bStopped) return; if (!successful) throw lastE; uint32 bz2BuffLen = getHeader()->getXmlSize()*25; if ( isCompressed() ) { char* bz2Buff = new char[bz2BuffLen]; AutoDelete<char> ad(bz2Buff); UTIL::STRING::zeroBuffer(bz2Buff, bz2BuffLen); UTIL::BZIP::BZ2DBuff((char*)bz2Buff, &bz2BuffLen, out.m_szBuffer, out.m_uiTotalSize); parseXml(bz2Buff, bz2BuffLen); } 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(); }