diff --git a/interfaces/kits/js/src/file_manager_napi.cpp b/interfaces/kits/js/src/file_manager_napi.cpp index 5968fb1f21da43d4858e8b2f55a5f72741db8ae4..4b3a8f3af91845bd95af9a37b47abd6833373dc1 100644 --- a/interfaces/kits/js/src/file_manager_napi.cpp +++ b/interfaces/kits/js/src/file_manager_napi.cpp @@ -31,7 +31,7 @@ using namespace std; using namespace DistributedFS; struct AsyncFileInfoArg { NRef ref_; - vector fileRes_; + vector> fileRes_; explicit AsyncFileInfoArg(NVal ref) : ref_(ref), fileRes_() {}; ~AsyncFileInfoArg() = default; }; @@ -127,13 +127,13 @@ void CreateFileArray(napi_env env, shared_ptr arg) { for (unsigned int i = 0; i < arg->fileRes_.size(); i++) { NVal obj = NVal::CreateObject(env); - FileInfo res = arg->fileRes_[i]; - obj.AddProp("name", NVal::CreateUTF8String(env, res.GetName()).val_); - obj.AddProp("path", NVal::CreateUTF8String(env, res.GetPath()).val_); - obj.AddProp("type", NVal::CreateUTF8String(env, res.GetType()).val_); - obj.AddProp("size", NVal::CreateInt64(env, res.GetSize()).val_); - obj.AddProp("added_time", NVal::CreateInt64(env, res.GetAddedTime()).val_); - obj.AddProp("modified_time", NVal::CreateInt64(env, res.GetModifiedTime()).val_); + unique_ptr &res = arg->fileRes_[i]; + obj.AddProp("name", NVal::CreateUTF8String(env, res->GetName()).val_); + obj.AddProp("path", NVal::CreateUTF8String(env, res->GetPath()).val_); + obj.AddProp("type", NVal::CreateUTF8String(env, res->GetType()).val_); + obj.AddProp("size", NVal::CreateInt64(env, res->GetSize()).val_); + obj.AddProp("added_time", NVal::CreateInt64(env, res->GetAddedTime()).val_); + obj.AddProp("modified_time", NVal::CreateInt64(env, res->GetModifiedTime()).val_); napi_set_property(env, arg->ref_.Deref(env).val_, NVal::CreateInt32(env, i).val_, obj.val_); } } @@ -155,9 +155,7 @@ napi_value FileManagerNapi::GetRoot(napi_env env, napi_callback_info info) if (!succ) { return UniError(ESRCH); } - vector fileRes; - int err = client->GetRoot("local", fileRes); - arg->fileRes_ = fileRes; + int err = client->GetRoot("local", arg->fileRes_); return DealWithErrno(err); }; auto cbComplete = [arg](napi_env env, UniError err) -> NVal { @@ -271,10 +269,7 @@ napi_value FileManagerNapi::ListFile(napi_env env, napi_callback_info info) if (!succ) { return UniError(ESRCH); } - vector fileRes; - int err = client->ListFile(type, path, option, fileRes); - - arg->fileRes_ = fileRes; + int err = client->ListFile(type, path, option, arg->fileRes_); return DealWithErrno(err); }; diff --git a/services/src/client/file_manager_proxy.cpp b/services/src/client/file_manager_proxy.cpp index 4bcf53f8357e88929e7fca2c9f4b5b211d2c4371..f3ee9466037a1084adfc54b3a33eb723db4ac122 100644 --- a/services/src/client/file_manager_proxy.cpp +++ b/services/src/client/file_manager_proxy.cpp @@ -27,8 +27,7 @@ namespace OHOS { namespace FileManagerService { FileManagerProxy::FileManagerProxy(const sptr &impl) : IRemoteProxy(impl) {} - -int FileManagerProxy::GetRoot(const std::string &devName, vector &fileRes) +int FileManagerProxy::GetRoot(const std::string &devName, vector> &fileRes) { if (devName == "external_storage") { MessageParcel data; @@ -46,15 +45,20 @@ int FileManagerProxy::GetRoot(const std::string &devName, vector &file for (int i = 0; i < count; i++) { string rootPath; reply.ReadString(rootPath); - fileRes.emplace_back(FILE_ROOT_NAME, rootPath, ALBUM_TYPE); + unique_ptr file = make_unique(FILE_ROOT_NAME, rootPath, ALBUM_TYPE); + fileRes.emplace_back(move(file)); } reply.ReadInt32(err); return err; } else { - fileRes.emplace_back(IMAGE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(VIDEO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(AUDIO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(FILE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + unique_ptr image = make_unique(IMAGE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileRes.emplace_back(move(image)); + unique_ptr video = make_unique(VIDEO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileRes.emplace_back(move(video)); + unique_ptr audio = make_unique(AUDIO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileRes.emplace_back(move(audio)); + unique_ptr file = make_unique(FILE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileRes.emplace_back(move(file)); return SUCCESS; } } @@ -93,7 +97,7 @@ IFmsClient *IFmsClient::GetFmsInstance() } int FileManagerProxy::ListFile(const std::string &type, const std::string &path, const CmdOptions &option, - std::vector &fileRes) + std::vector> &fileRes) { MessageParcel data; CmdOptions op(option); @@ -122,9 +126,8 @@ int FileManagerProxy::ListFile(const std::string &type, const std::string &path, int fileInfoNum = 0; reply.ReadInt32(fileInfoNum); while (fileInfoNum) { - FileInfo file; - MediaFileUtils::PopFileInfo(file, reply); - fileRes.emplace_back(file); + unique_ptr file(reply.ReadParcelable()); + fileRes.emplace_back(move(file)); fileInfoNum--; } reply.ReadInt32(err); diff --git a/services/src/client/file_manager_proxy.h b/services/src/client/file_manager_proxy.h index 2d24e616d01421e05f41592970d638c0db27493e..3f733b05a15e5630055108a2f07725388d3c34e8 100644 --- a/services/src/client/file_manager_proxy.h +++ b/services/src/client/file_manager_proxy.h @@ -29,9 +29,9 @@ public: virtual ~FileManagerProxy() = default; int Mkdir(const std::string &name, const std::string &path) override; int ListFile(const std::string &type, const std::string &path, const CmdOptions &option, - std::vector &fileRes) override; + std::vector> &fileRes) override; int CreateFile(const std::string &name, const std::string &path, std::string &uri) override; - int GetRoot(const std::string &devName, std::vector &fileRes) override; + int GetRoot(const std::string &devName, std::vector> &fileRes) override; private: static inline BrokerDelegator delegator_; }; diff --git a/services/src/client/ifms_client.h b/services/src/client/ifms_client.h index e069f10bf6b289fa6b8bb26c2aceff78dd7a157d..c03898f6ec03a21cdb12fc6acc61fbe595c74949 100644 --- a/services/src/client/ifms_client.h +++ b/services/src/client/ifms_client.h @@ -24,8 +24,8 @@ public: static IFmsClient *GetFmsInstance(); virtual int Mkdir(const std::string &name, const std::string &path) = 0; virtual int ListFile(const std::string &type, const std::string &path, const CmdOptions &option, - std::vector &fileRes) = 0; - virtual int GetRoot(const std::string &devName, std::vector &fileRes) = 0; + std::vector> &fileRes) = 0; + virtual int GetRoot(const std::string &devName, std::vector> &fileRes) = 0; virtual int CreateFile(const std::string &name, const std::string &path, std::string &uri) = 0; }; } // namespace FileManagerService { diff --git a/services/src/fileoper/external_storage_utils.cpp b/services/src/fileoper/external_storage_utils.cpp index 620728bb23c3295e533eefe9a33369aed2ae90d1..8edf3678392c4fca276462990be1e968a59104c8 100644 --- a/services/src/fileoper/external_storage_utils.cpp +++ b/services/src/fileoper/external_storage_utils.cpp @@ -59,7 +59,7 @@ static bool GetRealPath(string &path) return true; } -static bool GetFileInfo(const std::string &path, const std::string &name, FileInfo &fileInfo) +static bool GetFileInfo(const std::string &path, const std::string &name, unique_ptr &fileInfo) { std::string fullPath(""); fullPath.append(path).append("/").append(name); @@ -71,13 +71,13 @@ static bool GetFileInfo(const std::string &path, const std::string &name, FileIn std::string fPath(path.c_str()); std::string fName(name.c_str()); - fileInfo.SetPath(fPath); + fileInfo->SetPath(fPath); std::string type = "file"; - fileInfo.SetType(type); - fileInfo.SetName(fName); - fileInfo.SetSize(st.st_size); - fileInfo.SetAddedTime(static_cast(st.st_ctim.tv_sec)); - fileInfo.SetModifiedTime(static_cast(st.st_mtim.tv_sec)); + fileInfo->SetType(type); + fileInfo->SetName(fName); + fileInfo->SetSize(st.st_size); + fileInfo->SetAddedTime(static_cast(st.st_ctim.tv_sec)); + fileInfo->SetModifiedTime(static_cast(st.st_mtim.tv_sec)); return true; } @@ -113,16 +113,16 @@ int ExternalStorageUtils::DoListFile(const std::string &type, const std::string ERR_LOG("opendir path[%{public}s] fail.", path.c_str()); return E_NOEXIST; } - std::vector fileList; + std::vector> fileList; for (struct dirent *ent = readdir(dir); ent != nullptr; ent = readdir(dir)) { if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) { continue; } - FileInfo fileInfo; + unique_ptr fileInfo = make_unique(); if (!GetFileInfo(path, ent->d_name, fileInfo)) { continue; } - fileList.push_back(fileInfo); + fileList.push_back(move(fileInfo)); } closedir(dir); int fileCount = static_cast(fileList.size()); @@ -130,13 +130,8 @@ int ExternalStorageUtils::DoListFile(const std::string &type, const std::string if (fileCount == 0) { return E_EMPTYFOLDER; } - for (auto file : fileList) { - reply.WriteString(file.GetPath()); - reply.WriteString(file.GetType()); - reply.WriteString(file.GetName()); - reply.WriteInt64(file.GetSize()); - reply.WriteInt64(file.GetAddedTime()); - reply.WriteInt64(file.GetModifiedTime()); + for (int i = 0; i < fileCount; i++) { + reply.WriteParcelable(fileList[i].get()); } return SUCCESS; } diff --git a/services/src/fileoper/media_file_utils.cpp b/services/src/fileoper/media_file_utils.cpp index 31e1bc4095a5da5cda1d34854108ea205bb14b5a..bf30808a928c336652603c5941b22db7b037aba7 100644 --- a/services/src/fileoper/media_file_utils.cpp +++ b/services/src/fileoper/media_file_utils.cpp @@ -360,18 +360,23 @@ bool MediaFileUtils::PushFileInfo(shared_ptr resu result->GetString(mediaTableMap[index++].first, id); string uri; result->GetString(mediaTableMap[index++].first, uri); - reply.WriteString(uri + "/" + id); - for (int i = index; i < mediaTableMap.size(); i++) { - if (mediaTableMap[i].second == "string") { - string value; - result->GetString(mediaTableMap[i].first, value); - reply.WriteString(value); - } else { - int64_t value; - result->GetLong(mediaTableMap[i].first, value); - reply.WriteInt64(value); - } - } + unique_ptr file = make_unique(); + string path = uri + "/" + id; + file->SetPath(path); + string type; + result->GetString(mediaTableMap[index++].first, type); + file->SetType(type); + string name; + result->GetString(mediaTableMap[index++].first, name); + file->SetName(name); + int64_t value; + result->GetLong(mediaTableMap[index++].first, value); + file->SetSize(value); + result->GetLong(mediaTableMap[index++].first, value); + file->SetAddedTime(value); + result->GetLong(mediaTableMap[index++].first, value); + file->SetModifiedTime(value); + reply.WriteParcelable(file.get()); return true; }