/*** Tencent is pleased to support the open source community by making Tars available.** Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.** Licensed under the BSD 3-Clause License (the "License"); you may not use this file except* in compliance with the License. You may obtain a copy of the License at** https://opensource.org/licenses/BSD-3-Clause** Unless required by applicable law or agreed to in writing, software distributed* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR* CONDITIONS OF ANY KIND, either express or implied. See the License for the* specific language governing permissions and limitations under the License.*/#include "SingleFileDownloader.h"#include "servant/TarsLogger.h"#include "util.h"DownloadTaskFactory* DownloadTaskFactory::_instance = new DownloadTaskFactory();int SingleFileDownloader::download(const PatchPrx &patchPrx, const string &remoteFile, const string &localFile, const DownloadEventPtr &pPtr, std::string & sResult){vector<tars::FileInfo> vFiles;int ret = 0;for( int i = 0; i < 2; i ++){try{ret = patchPrx->listFileInfo(remoteFile, vFiles);break;}catch(TarsException& ex){TLOGERROR("SingleFileDownloader::download " << (remoteFile + " TarsException " + ex.what())<< endl);}}//1表示是文件if(ret != 1){sResult = remoteFile + " is not an file";return -1;}if(vFiles.size() < 1){sResult = remoteFile + " not exist";return -2;}tars::FileInfo fileInfo = vFiles[0];FILE *fp = fopen(localFile.c_str(), "wb");if (!fp){sResult = localFile + " can not write";return -3;}//循环下载文件到本地vector<char> buffer;int pos = 0;int downloadRet = 0;bool fileEnded = false;while (true){buffer.clear();//最多尝试两次for( int i = 0; i < 2; i ++){try{downloadRet = patchPrx->download(remoteFile, pos, buffer);break;}catch(TarsException& ex){TLOGERROR("SingleFileDownloader::download "<< (remoteFile + " TarsException " + ex.what()) << endl);}}if (downloadRet < 0){TLOGERROR("SingleFileDownloader::download " << "|downloadRet:" << downloadRet << "|remoteFile:" << remoteFile << endl);sResult = remoteFile + " download from tarspatch error " + TC_Common::tostr(downloadRet);ret = downloadRet - 100;break;}else if (downloadRet == 0){size_t r = fwrite((void*)&buffer[0], 1, buffer.size(), fp);if (r == 0){TLOGERROR("SingleFileDownloader::download fwrite file '" + localFile + "' error!" << endl);sResult = "fwrite file '" + localFile + "' error!";ret = -5;break;}pos += r;if(pPtr){pPtr->onDownloading(fileInfo, pos);}}else if (downloadRet == 1){TLOGDEBUG("SingleFileDownloader::download load succ " << remoteFile << "|pos:"<<pos<<endl);ret = 0;fileEnded = true;break;}}if(!fileEnded){ret = -6;sResult = remoteFile + " not end";}fclose(fp);return ret;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型