/** * 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 "tars_patch.h" #include "util/tc_option.h" #include "servant/Application.h" #include using namespace tars; void usage(int argc, char *argv[]) { cout << "Usage:" << argv[0] << " --server=[server] --remote=[server-dir] --local=[local] [--remove]" << endl; cout << "server: PatchObj@tcp -h ip -p port -t timeout" << endl; cout << "remote: directory or file sync from server" << endl; cout << "local: directory sync to local" << endl; cout << "remove: remove local dir data" << endl; exit(0); } class PatchClientInterface : public TarsPatchNotifyInterface { public: virtual void onDownload(const FileInfo &fi) { cout << "------------------------------------" << endl; cout << "downloading [" << fi.path << "] [" << fi.size*1.0/1024 << "K]" << endl; } virtual void onDownloading(const FileInfo &fi, size_t pos, const string &dest) { cout << "downloading [" << fi.path << " ->] [" << dest << "] [" << pos*100/fi.size << "/100%]" << endl; } virtual void onDownloadOK(const FileInfo &fi, const string &dest) { cout << "download ok [" << fi.path << "] -> [" << dest << "]" << endl; } virtual void onListFile() { cout << "listing files" << endl; } virtual void onListFileOK(const vector &vf) { cout << "list ok total [" << vf.size() << "] files" << endl; } virtual void onRemoveLocalDirectory(const string &sDir) { cout << "------------------------------------" << endl; cout << "remove local directory [" << sDir << "]" << endl; } virtual void onRemoveLocalDirectoryOK(const string &sDir) { cout << "remove local directory ok [" << sDir << "]"<< endl; cout << "------------------------------------" << endl; } virtual void onSetExecutable(const FileInfo &fi) { cout << "executable [" << fi.path << "]" << endl; } virtual void onDownloadAllOK(const vector &vf, time_t timeBegin, time_t timeEnd) { cout << "------------------------------------" << endl; cout << "download all files succ." << endl; } virtual void onReportTime(const string & sFile, const time_t timeBegin, const time_t timeEnd) { cout << "------------------------------------" << endl; cout << "download '" << sFile << "', begin:" << timeBegin << ", end:" << timeEnd << endl; } }; typedef TC_AutoPtr PatchClientInterfacePtr; int main(int argc, char *argv[]) { if(argc < 2) { usage(argc, argv); } try { TC_Option option; option.decode(argc, argv); //远程目录的相对路径 string server = option.getValue("server"); if(server.empty()) { cout << "server must not be empty." << endl; return 0; } CommunicatorFactory::getInstance()->getCommunicator()->setProperty("sync-invoke-timeout", "60000"); PatchPrx pPtr; CommunicatorFactory::getInstance()->getCommunicator()->stringToProxy(server, pPtr); //远程目录的相对路径 string remote_dir = option.getValue("remote"); if(remote_dir.empty()) { cout << "remote_dir must not be empty." << endl; return 0; } //本地同步路径 string local_dir = option.getValue("local"); if(local_dir.empty()) { cout << "local_dir must not be empty." << endl; return 0; } //是否先清空本地目录 bool bRemove = option.hasParam("remove"); cout << "connecting to patch server" << endl; TarsPatch op; op.init(pPtr, remote_dir, local_dir); cout << "connect ok to patch server" << endl; op.setRemove(bRemove); PatchClientInterfacePtr p = new PatchClientInterface(); op.download(p); } catch(exception &ex) { cout << ex.what() << endl; } return 0; }