1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "util/zip_utils.h"
16 #include "directory_ex.h"
17 #include "dump_utils.h"
18 #include "util/zip/zip_writer.h"
19 #include "hilog_wrapper.h"
20 namespace OHOS {
21 namespace HiviewDFX {
ZipFolder(const std::string & srcPath,const std::string & dstFile,const ZipTickNotify notify)22 bool ZipUtils::ZipFolder(const std::string &srcPath, const std::string &dstFile, const ZipTickNotify notify)
23 {
24     DUMPER_HILOGD(MODULE_COMMON, "enter|srcPath=[%{public}s], dstFile=[%{public}s]",
25         srcPath.c_str(), dstFile.c_str());
26 
27     std::string srcFolder = IncludeTrailingPathDelimiter(srcPath);
28 
29     DUMPER_HILOGD(MODULE_COMMON, "debug|srcFolder=[%{public}s]", srcFolder.c_str());
30 
31     if (!DumpUtils::DirectoryExists(srcFolder)) {
32         DUMPER_HILOGE(MODULE_COMMON, "leave|ret=false, srcFolder=[%{public}s]", srcFolder.c_str());
33         return false;
34     }
35 
36     DUMPER_HILOGD(MODULE_COMMON, "debug|GetDirFiles, srcFolder=[%{public}s]", srcFolder.c_str());
37 
38     std::vector<std::string> allFiles;
39     GetDirFiles(srcFolder, allFiles);
40 
41     if ((notify != nullptr) && (notify(UNSET_PROGRESS, UNSET_PROGRESS))) {
42         DUMPER_HILOGE(MODULE_COMMON, "leave|notify");
43         return false;
44     }
45 
46     for (auto str : allFiles) {
47         DUMPER_HILOGD(MODULE_COMMON, "debug|str=[%{public}s]", str.c_str());
48     }
49 
50     size_t zipRootLen = srcFolder.length();
51     std::vector<std::pair<std::string, std::string>> zipItems;
52     std::transform(allFiles.begin(), allFiles.end(), std::back_inserter(zipItems),
53         [zipRootLen](const std::string &str) {
54             return std::make_pair(str, str.substr(zipRootLen)); // first:absolutePath, second:relativePath
55         });
56     allFiles.clear();
57 
58     for (auto zipItem : zipItems) {
59         DUMPER_HILOGD(MODULE_COMMON, "debug|zipItems, absPath=[%{public}s], relPath=[%{public}s]",
60             zipItem.first.c_str(), zipItem.second.c_str());
61     }
62 
63     DUMPER_HILOGD(MODULE_COMMON, "debug|Create, dstFile=[%{public}s]", dstFile.c_str());
64 
65     ZipWriter zipWriter(dstFile);
66     zipWriter.Open();
67     bool ret = zipWriter.Write(zipItems, notify);
68 
69     DUMPER_HILOGD(MODULE_COMMON, "leave|ret=%{public}d", ret);
70     return ret;
71 }
72 } // namespace HiviewDFX
73 } // namespace OHOS
74