166f3657fSopenharmony_ci/* 266f3657fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 366f3657fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 466f3657fSopenharmony_ci * you may not use this file except in compliance with the License. 566f3657fSopenharmony_ci * You may obtain a copy of the License at 666f3657fSopenharmony_ci * 766f3657fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 866f3657fSopenharmony_ci * 966f3657fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1066f3657fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1166f3657fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1266f3657fSopenharmony_ci * See the License for the specific language governing permissions and 1366f3657fSopenharmony_ci * limitations under the License. 1466f3657fSopenharmony_ci */ 1566f3657fSopenharmony_ci 1666f3657fSopenharmony_ci#include "dscreen_hidumper.h" 1766f3657fSopenharmony_ci 1866f3657fSopenharmony_ci#include "dscreen_errcode.h" 1966f3657fSopenharmony_ci#include "dscreen_log.h" 2066f3657fSopenharmony_ci#include "dscreen_util.h" 2166f3657fSopenharmony_ci 2266f3657fSopenharmony_cinamespace OHOS { 2366f3657fSopenharmony_cinamespace DistributedHardware { 2466f3657fSopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(DscreenHidumper); 2566f3657fSopenharmony_ci 2666f3657fSopenharmony_cinamespace { 2766f3657fSopenharmony_ciconst std::string ARGS_HELP = "-h"; 2866f3657fSopenharmony_ciconst std::string ARGS_DUMP_SCREEN_DATA = "--dump"; 2966f3657fSopenharmony_ciconst std::string ARGS_DUMP_SCREEN_DATA_RESTART = "--redump"; 3066f3657fSopenharmony_ciconst std::string ARGS_DUMP_SCREEN_DATA_STOP = "--stopdump"; 3166f3657fSopenharmony_ci 3266f3657fSopenharmony_ciconst std::map<std::string, HidumpFlag> ARGS_MAP = { 3366f3657fSopenharmony_ci { ARGS_HELP, HidumpFlag::GET_HELP }, 3466f3657fSopenharmony_ci { ARGS_DUMP_SCREEN_DATA, HidumpFlag::DUMP_SCREEN_DATA }, 3566f3657fSopenharmony_ci { ARGS_DUMP_SCREEN_DATA_RESTART, HidumpFlag::DUMP_SCREEN_DATA_RESTART }, 3666f3657fSopenharmony_ci { ARGS_DUMP_SCREEN_DATA_STOP, HidumpFlag::DUMP_SCREEN_DATA_STOP }, 3766f3657fSopenharmony_ci}; 3866f3657fSopenharmony_ci} 3966f3657fSopenharmony_ci 4066f3657fSopenharmony_ciDscreenHidumper::DscreenHidumper() 4166f3657fSopenharmony_ci{ 4266f3657fSopenharmony_ci DHLOGI("Distributed screen hidumper constructed."); 4366f3657fSopenharmony_ci} 4466f3657fSopenharmony_ci 4566f3657fSopenharmony_ciDscreenHidumper::~DscreenHidumper() 4666f3657fSopenharmony_ci{ 4766f3657fSopenharmony_ci DHLOGI("Distributed screen hidumper deconstructed."); 4866f3657fSopenharmony_ci} 4966f3657fSopenharmony_ci 5066f3657fSopenharmony_cibool DscreenHidumper::Dump(const std::vector<std::string> &args, std::string &result) 5166f3657fSopenharmony_ci{ 5266f3657fSopenharmony_ci DHLOGI("Distributed screen hidumper dump args.size():%{public}zu.", args.size()); 5366f3657fSopenharmony_ci result.clear(); 5466f3657fSopenharmony_ci int32_t argsSize = static_cast<int32_t>(args.size()); 5566f3657fSopenharmony_ci for (int32_t i = 0; i < argsSize; i++) { 5666f3657fSopenharmony_ci DHLOGI("Distributed screen hidumper dump args[%{public}d]: %{public}s.", i, args.at(i).c_str()); 5766f3657fSopenharmony_ci } 5866f3657fSopenharmony_ci 5966f3657fSopenharmony_ci if (args.empty()) { 6066f3657fSopenharmony_ci ShowHelp(result); 6166f3657fSopenharmony_ci return true; 6266f3657fSopenharmony_ci } 6366f3657fSopenharmony_ci 6466f3657fSopenharmony_ci if (args.size() > 1) { 6566f3657fSopenharmony_ci ShowIllegalInfomation(result); 6666f3657fSopenharmony_ci return true; 6766f3657fSopenharmony_ci } 6866f3657fSopenharmony_ci 6966f3657fSopenharmony_ci return ProcessDump(args[0], result) == DH_SUCCESS; 7066f3657fSopenharmony_ci} 7166f3657fSopenharmony_ci 7266f3657fSopenharmony_ciint32_t DscreenHidumper::ProcessDump(const std::string &args, std::string &result) 7366f3657fSopenharmony_ci{ 7466f3657fSopenharmony_ci DHLOGI("Process dump."); 7566f3657fSopenharmony_ci HidumpFlag hidumpFlag = HidumpFlag::UNKNOWN; 7666f3657fSopenharmony_ci auto operatorIter = ARGS_MAP.find(args); 7766f3657fSopenharmony_ci if (operatorIter != ARGS_MAP.end()) { 7866f3657fSopenharmony_ci hidumpFlag = operatorIter->second; 7966f3657fSopenharmony_ci } 8066f3657fSopenharmony_ci 8166f3657fSopenharmony_ci if (hidumpFlag == HidumpFlag::GET_HELP) { 8266f3657fSopenharmony_ci ShowHelp(result); 8366f3657fSopenharmony_ci return DH_SUCCESS; 8466f3657fSopenharmony_ci } 8566f3657fSopenharmony_ci result.clear(); 8666f3657fSopenharmony_ci switch (hidumpFlag) { 8766f3657fSopenharmony_ci case HidumpFlag::DUMP_SCREEN_DATA: { 8866f3657fSopenharmony_ci return DumpScreenData(result); 8966f3657fSopenharmony_ci } 9066f3657fSopenharmony_ci case HidumpFlag::DUMP_SCREEN_DATA_RESTART: { 9166f3657fSopenharmony_ci return ReDumpScreenData(result); 9266f3657fSopenharmony_ci } 9366f3657fSopenharmony_ci case HidumpFlag::DUMP_SCREEN_DATA_STOP: { 9466f3657fSopenharmony_ci SetFlagFalse(); 9566f3657fSopenharmony_ci return DH_SUCCESS; 9666f3657fSopenharmony_ci } 9766f3657fSopenharmony_ci default: { 9866f3657fSopenharmony_ci return ShowIllegalInfomation(result); 9966f3657fSopenharmony_ci } 10066f3657fSopenharmony_ci } 10166f3657fSopenharmony_ci} 10266f3657fSopenharmony_ci 10366f3657fSopenharmony_ciint32_t DscreenHidumper::DumpScreenData(std::string &result) 10466f3657fSopenharmony_ci{ 10566f3657fSopenharmony_ci DHLOGI("Dump screen data."); 10666f3657fSopenharmony_ci 10766f3657fSopenharmony_ci if (access(DUMP_FILE_PATH.c_str(), 0) < 0) { 10866f3657fSopenharmony_ci if (mkdir(DUMP_FILE_PATH.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) { 10966f3657fSopenharmony_ci DHLOGI("Create dir err."); 11066f3657fSopenharmony_ci DHLOGI("dir path : %{public}s", DUMP_FILE_PATH.c_str()); 11166f3657fSopenharmony_ci return DSCREEN_BAD_VALUE; 11266f3657fSopenharmony_ci } 11366f3657fSopenharmony_ci } 11466f3657fSopenharmony_ci 11566f3657fSopenharmony_ci if (fileFullFlag_ == false) { 11666f3657fSopenharmony_ci result.append("Dump..."); 11766f3657fSopenharmony_ci hidumperFlag_ = true; 11866f3657fSopenharmony_ci } else { 11966f3657fSopenharmony_ci result.append("File oversize 300M : stop dump, use parameter \"--redump\" to clear dumpfile and redump"); 12066f3657fSopenharmony_ci } 12166f3657fSopenharmony_ci return DH_SUCCESS; 12266f3657fSopenharmony_ci} 12366f3657fSopenharmony_ci 12466f3657fSopenharmony_ciint32_t DscreenHidumper::ReDumpScreenData(std::string &result) 12566f3657fSopenharmony_ci{ 12666f3657fSopenharmony_ci DHLOGI("Redump screen data."); 12766f3657fSopenharmony_ci 12866f3657fSopenharmony_ci if (access(DUMP_FILE_PATH.c_str(), 0) < 0) { 12966f3657fSopenharmony_ci if (mkdir(DUMP_FILE_PATH.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) { 13066f3657fSopenharmony_ci DHLOGI("Create dir err."); 13166f3657fSopenharmony_ci DHLOGI("dir path : %{public}s", DUMP_FILE_PATH.c_str()); 13266f3657fSopenharmony_ci return DSCREEN_BAD_VALUE; 13366f3657fSopenharmony_ci } 13466f3657fSopenharmony_ci } 13566f3657fSopenharmony_ci SetFileFlagFalse(); 13666f3657fSopenharmony_ci SetReDumpFlagTrue(); 13766f3657fSopenharmony_ci result.append("ReDumpStart..."); 13866f3657fSopenharmony_ci hidumperFlag_ = true; 13966f3657fSopenharmony_ci SetTransReDumpFlagTrue(); 14066f3657fSopenharmony_ci return DH_SUCCESS; 14166f3657fSopenharmony_ci} 14266f3657fSopenharmony_ci 14366f3657fSopenharmony_cibool DscreenHidumper::GetFlagStatus() 14466f3657fSopenharmony_ci{ 14566f3657fSopenharmony_ci return hidumperFlag_; 14666f3657fSopenharmony_ci} 14766f3657fSopenharmony_ci 14866f3657fSopenharmony_civoid DscreenHidumper::SetFlagFalse() 14966f3657fSopenharmony_ci{ 15066f3657fSopenharmony_ci hidumperFlag_ = false; 15166f3657fSopenharmony_ci} 15266f3657fSopenharmony_ci 15366f3657fSopenharmony_cibool DscreenHidumper::GetFileFlag() 15466f3657fSopenharmony_ci{ 15566f3657fSopenharmony_ci return fileFullFlag_; 15666f3657fSopenharmony_ci} 15766f3657fSopenharmony_ci 15866f3657fSopenharmony_civoid DscreenHidumper::SetFileFlagFalse() 15966f3657fSopenharmony_ci{ 16066f3657fSopenharmony_ci fileFullFlag_ = false; 16166f3657fSopenharmony_ci} 16266f3657fSopenharmony_ci 16366f3657fSopenharmony_civoid DscreenHidumper::SetFileFlagTrue() 16466f3657fSopenharmony_ci{ 16566f3657fSopenharmony_ci fileFullFlag_ = true; 16666f3657fSopenharmony_ci} 16766f3657fSopenharmony_ci 16866f3657fSopenharmony_cibool DscreenHidumper::GetReDumpFlag() 16966f3657fSopenharmony_ci{ 17066f3657fSopenharmony_ci return reDumpFlag_; 17166f3657fSopenharmony_ci} 17266f3657fSopenharmony_ci 17366f3657fSopenharmony_civoid DscreenHidumper::SetReDumpFlagFalse() 17466f3657fSopenharmony_ci{ 17566f3657fSopenharmony_ci reDumpFlag_ = false; 17666f3657fSopenharmony_ci} 17766f3657fSopenharmony_ci 17866f3657fSopenharmony_civoid DscreenHidumper::SetReDumpFlagTrue() 17966f3657fSopenharmony_ci{ 18066f3657fSopenharmony_ci reDumpFlag_ = true; 18166f3657fSopenharmony_ci} 18266f3657fSopenharmony_ci 18366f3657fSopenharmony_cibool DscreenHidumper::GetTransReDumpFlag() 18466f3657fSopenharmony_ci{ 18566f3657fSopenharmony_ci return transReDumpFlag_; 18666f3657fSopenharmony_ci} 18766f3657fSopenharmony_ci 18866f3657fSopenharmony_civoid DscreenHidumper::SetTransReDumpFlagFalse() 18966f3657fSopenharmony_ci{ 19066f3657fSopenharmony_ci transReDumpFlag_ = false; 19166f3657fSopenharmony_ci} 19266f3657fSopenharmony_ci 19366f3657fSopenharmony_civoid DscreenHidumper::SetTransReDumpFlagTrue() 19466f3657fSopenharmony_ci{ 19566f3657fSopenharmony_ci transReDumpFlag_ = true; 19666f3657fSopenharmony_ci} 19766f3657fSopenharmony_ci 19866f3657fSopenharmony_civoid DscreenHidumper::ShowHelp(std::string &result) 19966f3657fSopenharmony_ci{ 20066f3657fSopenharmony_ci DHLOGI("Show help."); 20166f3657fSopenharmony_ci result.append("Usage:dump <command> [options]\n") 20266f3657fSopenharmony_ci .append("Description:\n") 20366f3657fSopenharmony_ci .append("-h ") 20466f3657fSopenharmony_ci .append(": show help\n") 20566f3657fSopenharmony_ci .append("--dump ") 20666f3657fSopenharmony_ci .append(": dump screen data in /data/data/dscreen\n") 20766f3657fSopenharmony_ci .append("--redump ") 20866f3657fSopenharmony_ci .append(": clear file and restart dump screen data\n") 20966f3657fSopenharmony_ci .append("--stopdump ") 21066f3657fSopenharmony_ci .append(": stop dump screen data\n"); 21166f3657fSopenharmony_ci} 21266f3657fSopenharmony_ci 21366f3657fSopenharmony_ciint32_t DscreenHidumper::ShowIllegalInfomation(std::string &result) 21466f3657fSopenharmony_ci{ 21566f3657fSopenharmony_ci DHLOGI("Show illegal information."); 21666f3657fSopenharmony_ci result.append("unknown command, -h for help."); 21766f3657fSopenharmony_ci return DH_SUCCESS; 21866f3657fSopenharmony_ci} 21966f3657fSopenharmony_ci 22066f3657fSopenharmony_civoid DscreenHidumper::SaveFile(std::string file, const VideoData &video) 22166f3657fSopenharmony_ci{ 22266f3657fSopenharmony_ci DHLOGE("Saving File."); 22366f3657fSopenharmony_ci std::string fileName = DUMP_FILE_PATH + "/" + file + std::to_string(video.width) + ")_height(" + 22466f3657fSopenharmony_ci std::to_string(video.height) + ")_" + video.format + ".jpg"; 22566f3657fSopenharmony_ci DHLOGE("fileName = %{public}s", fileName.c_str()); 22666f3657fSopenharmony_ci if (GetReDumpFlag() == true) { 22766f3657fSopenharmony_ci std::remove(fileName.c_str()); 22866f3657fSopenharmony_ci SetReDumpFlagFalse(); 22966f3657fSopenharmony_ci } 23066f3657fSopenharmony_ci std::ofstream ofs(fileName, std::ios::binary | std::ios::out | std::ios::app); 23166f3657fSopenharmony_ci 23266f3657fSopenharmony_ci if (!ofs.is_open()) { 23366f3657fSopenharmony_ci DHLOGE("open file failed."); 23466f3657fSopenharmony_ci return; 23566f3657fSopenharmony_ci } 23666f3657fSopenharmony_ci DHLOGE("open Hidumper SaveFile file success."); 23766f3657fSopenharmony_ci ofs.seekp(0, std::ios::end); 23866f3657fSopenharmony_ci std::ofstream::pos_type fileSize = ofs.tellp(); 23966f3657fSopenharmony_ci if (fileSize < 0) { 24066f3657fSopenharmony_ci DHLOGE("filesize get err"); 24166f3657fSopenharmony_ci fileSize = 0; 24266f3657fSopenharmony_ci } 24366f3657fSopenharmony_ci if ((static_cast<size_t>(fileSize) + video.size) < DUMP_FILE_MAX_SIZE) { 24466f3657fSopenharmony_ci SetFileFlagFalse(); 24566f3657fSopenharmony_ci ofs.write(reinterpret_cast<const char *>(video.data), video.size); 24666f3657fSopenharmony_ci } else { 24766f3657fSopenharmony_ci SetFileFlagTrue(); 24866f3657fSopenharmony_ci } 24966f3657fSopenharmony_ci ofs.close(); 25066f3657fSopenharmony_ci} 25166f3657fSopenharmony_ci} // namespace DistributedHardware 25266f3657fSopenharmony_ci} // namespace OHOS