1 /*
2 * Copyright (C) 2025 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
16 #define MLOG_TAG "MediaLibraryCloudBackupRestore"
17
18 #include "cloud_backup_restore.h"
19
20 #include "backup_const.h"
21 #include "backup_const_column.h"
22 #include "backup_file_utils.h"
23 #include "backup_log_utils.h"
24 #include "medialibrary_errno.h"
25 #include "result_set_utils.h"
26 #include "upgrade_restore_task_report.h"
27
28 namespace OHOS {
29 namespace Media {
Init(const std::string & backupRestoreDir,const std::string & upgradePath,bool isUpgrade)30 int32_t CloudBackupRestore::Init(const std::string &backupRestoreDir, const std::string &upgradePath, bool isUpgrade)
31 {
32 appDataPath_ = backupRestoreDir;
33 filePath_ = backupRestoreDir;
34 galleryDbPath_ = backupRestoreDir + "/" + GALLERY_DB_NAME;
35 audioDbPath_ = backupRestoreDir + INTERNAL_PREFIX + "/0/" + AUDIO_DB_NAME;
36 shouldIncludeSd_ = true;
37 SetCloneParameterAndStopSync();
38
39 int32_t errCode = InitDb(isUpgrade);
40 CHECK_AND_RETURN_RET(errCode == E_OK, errCode);
41
42 photoAlbumRestore_.OnStart(mediaLibraryRdb_, galleryRdb_);
43 photosRestore_.OnStart(mediaLibraryRdb_, galleryRdb_);
44 MEDIA_INFO_LOG("Init db succ.");
45 return E_OK;
46 }
47
GetAccountValid()48 void CloudBackupRestore::GetAccountValid()
49 {
50 isAccountValid_ = false;
51 }
52
GetSyncSwitchOn()53 void CloudBackupRestore::GetSyncSwitchOn()
54 {
55 isSyncSwitchOn_ = false;
56 }
57
ParseResultSetFromGallery(const std::shared_ptr<NativeRdb::ResultSet> & resultSet,FileInfo & info)58 bool CloudBackupRestore::ParseResultSetFromGallery(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
59 FileInfo &info)
60 {
61 // [basic info]display_name, data, media_type, size, title
62 CHECK_AND_RETURN_RET(IsBasicInfoValid(resultSet, info, GALLERY_DB_NAME), false);
63 info.title = GetStringVal(GALLERY_TITLE, resultSet);
64 info.fileIdOld = GetInt32Val(GALLERY_ID, resultSet);
65 info.localMediaId = info.fileIdOld;
66
67 // [album info]source_path, owner_album_id, package_name
68 info.sourcePath = GetStringVal(GALLERY_MEDIA_SOURCE_PATH, resultSet);
69 info.lPath = GetStringVal(GALLERY_ALBUM_IPATH, resultSet);
70 info.lPath = photosRestore_.FindlPath(info);
71 info.bundleName = photosRestore_.FindBundleName(info);
72 info.packageName = photosRestore_.FindPackageName(info);
73
74 // [special type]
75 info.photoQuality = GetInt32Val(PhotoColumn::PHOTO_QUALITY, resultSet);
76 info.photoQuality = photosRestore_.FindPhotoQuality(info);
77 info.isLivePhoto = photosRestore_.FindIsLivePhoto(info);
78 if (BackupFileUtils::IsLivePhoto(info) && !BackupFileUtils::ConvertToMovingPhoto(info)) {
79 ErrorInfo errorInfo(RestoreError::MOVING_PHOTO_CONVERT_FAILED, 1, "",
80 BackupLogUtils::FileInfoToString(sceneCode_, info));
81 UpgradeRestoreTaskReport().SetSceneCode(this->sceneCode_).SetTaskId(this->taskId_).ReportError(errorInfo);
82 return false;
83 }
84
85 // [time info]date_taken, date_modified, date_added
86 info.dateTaken = GetInt64Val(GALLERY_DATE_TAKEN, resultSet);
87 info.dateModified = GetInt64Val(EXTERNAL_DATE_MODIFIED, resultSet) * MSEC_TO_SEC;
88 info.firstUpdateTime = GetInt64Val(EXTERNAL_DATE_ADDED, resultSet) * MSEC_TO_SEC;
89
90 return true;
91 }
92
GetInsertValue(const FileInfo & fileInfo,const std::string & newPath,int32_t sourceType)93 NativeRdb::ValuesBucket CloudBackupRestore::GetInsertValue(const FileInfo &fileInfo, const std::string &newPath,
94 int32_t sourceType)
95 {
96 NativeRdb::ValuesBucket values;
97 // [basic info]display_name, data, media_type, title
98 values.PutString(MediaColumn::MEDIA_NAME, fileInfo.displayName);
99 values.PutString(MediaColumn::MEDIA_FILE_PATH, newPath);
100 values.PutInt(MediaColumn::MEDIA_TYPE, fileInfo.fileType);
101 values.PutString(MediaColumn::MEDIA_TITLE, fileInfo.title);
102
103 // [album info]source_path, owner_album_id, package_name
104 values.PutString(PhotoColumn::PHOTO_SOURCE_PATH, photosRestore_.FindSourcePath(fileInfo));
105 values.PutInt(PhotoColumn::PHOTO_OWNER_ALBUM_ID, photosRestore_.FindAlbumId(fileInfo));
106 CHECK_AND_EXECUTE(fileInfo.packageName.empty(),
107 values.PutString(PhotoColumn::MEDIA_PACKAGE_NAME, fileInfo.packageName));
108
109 // [special type]
110 values.PutInt(PhotoColumn::PHOTO_QUALITY, fileInfo.photoQuality);
111 values.PutInt(PhotoColumn::PHOTO_SUBTYPE, photosRestore_.FindSubtype(fileInfo));
112 values.PutInt(PhotoColumn::PHOTO_BURST_COVER_LEVEL, photosRestore_.FindBurstCoverLevel(fileInfo));
113 values.PutNull(PhotoColumn::PHOTO_BURST_KEY);
114 values.PutInt(PhotoColumn::PHOTO_STRONG_ASSOCIATION, photosRestore_.FindStrongAssociationByDisplayName(fileInfo));
115 values.PutInt(PhotoColumn::PHOTO_CE_AVAILABLE, photosRestore_.FindCeAvailableByDisplayName(fileInfo));
116
117 values.PutInt(PhotoColumn::PHOTO_SYNC_STATUS, static_cast<int32_t>(SyncStatusType::TYPE_BACKUP));
118 values.PutInt(PhotoColumn::PHOTO_DIRTY, photosRestore_.FindDirty(fileInfo));
119 return values;
120 }
121
SetValueFromMetaData(FileInfo & fileInfo,NativeRdb::ValuesBucket & value)122 void CloudBackupRestore::SetValueFromMetaData(FileInfo &fileInfo, NativeRdb::ValuesBucket &value)
123 {
124 std::unique_ptr<Metadata> data = make_unique<Metadata>();
125 SetMetaDataValue(fileInfo, data);
126
127 // [basic info]size
128 SetSize(data, fileInfo, value);
129
130 // [time info]date_taken, date_modified, date_added
131 SetTimeInfo(data, fileInfo, value);
132
133 // [metadata info]
134 value.PutString(MediaColumn::MEDIA_MIME_TYPE, data->GetFileMimeType());
135 value.PutString(PhotoColumn::PHOTO_MEDIA_SUFFIX, data->GetFileExtension());
136 value.PutInt(MediaColumn::MEDIA_DURATION, data->GetFileDuration());
137 value.PutLong(MediaColumn::MEDIA_TIME_PENDING, 0);
138 value.PutInt(PhotoColumn::PHOTO_HEIGHT, data->GetFileHeight());
139 value.PutInt(PhotoColumn::PHOTO_WIDTH, data->GetFileWidth());
140 value.PutDouble(PhotoColumn::PHOTO_LONGITUDE, data->GetLongitude());
141 value.PutDouble(PhotoColumn::PHOTO_LATITUDE, data->GetLatitude());
142 value.PutString(PhotoColumn::PHOTO_ALL_EXIF, data->GetAllExif());
143 value.PutString(PhotoColumn::PHOTO_SHOOTING_MODE, data->GetShootingMode());
144 value.PutString(PhotoColumn::PHOTO_SHOOTING_MODE_TAG, data->GetShootingModeTag());
145 value.PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME, data->GetLastVisitTime());
146 value.PutString(PhotoColumn::PHOTO_FRONT_CAMERA, data->GetFrontCamera());
147 value.PutInt(PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, data->GetDynamicRangeType());
148 value.PutString(PhotoColumn::PHOTO_USER_COMMENT, data->GetUserComment());
149 BaseRestore::SetOrientationAndExifRotate(fileInfo, value, data);
150
151 // [special type]live photo
152 SetCoverPosition(fileInfo, value);
153
154 value.PutString(PhotoColumn::PHOTO_DATE_YEAR,
155 MediaFileUtils::StrCreateTimeByMilliseconds(PhotoColumn::PHOTO_DATE_YEAR_FORMAT, fileInfo.dateTaken));
156 value.PutString(PhotoColumn::PHOTO_DATE_MONTH,
157 MediaFileUtils::StrCreateTimeByMilliseconds(PhotoColumn::PHOTO_DATE_MONTH_FORMAT, fileInfo.dateTaken));
158 value.PutString(PhotoColumn::PHOTO_DATE_DAY,
159 MediaFileUtils::StrCreateTimeByMilliseconds(PhotoColumn::PHOTO_DATE_DAY_FORMAT, fileInfo.dateTaken));
160 }
161
SetSize(const std::unique_ptr<Metadata> & data,FileInfo & info,NativeRdb::ValuesBucket & value)162 void CloudBackupRestore::SetSize(const std::unique_ptr<Metadata> &data, FileInfo &info,
163 NativeRdb::ValuesBucket &value)
164 {
165 // [basic info]size
166 info.fileSize = info.fileSize > 0 ? info.fileSize : data->GetFileSize();
167 value.PutLong(MediaColumn::MEDIA_SIZE, info.fileSize);
168 }
169
SetTimeInfo(const std::unique_ptr<Metadata> & data,FileInfo & info,NativeRdb::ValuesBucket & value)170 void CloudBackupRestore::SetTimeInfo(const std::unique_ptr<Metadata> &data, FileInfo &info,
171 NativeRdb::ValuesBucket &value)
172 {
173 // [time info]date_taken, date_modified, date_added
174 info.dateTaken = info.dateTaken > 0 ? info.dateTaken : data->GetDateTaken();
175 info.dateModified = info.dateModified > 0 ? info.dateModified : data->GetFileDateModified();
176 info.firstUpdateTime = info.firstUpdateTime > 0 ? info.firstUpdateTime : info.dateModified;
177
178 value.PutLong(MediaColumn::MEDIA_DATE_TAKEN, info.dateTaken);
179 value.PutLong(MediaColumn::MEDIA_DATE_MODIFIED, info.dateModified);
180 value.PutLong(MediaColumn::MEDIA_DATE_ADDED, info.firstUpdateTime);
181 InsertDetailTime(value, info);
182 }
183
RestoreAnalysisAlbum()184 void CloudBackupRestore::RestoreAnalysisAlbum()
185 {
186 return;
187 }
188
InsertPhotoRelated(std::vector<FileInfo> & fileInfos,int32_t sourceType)189 void CloudBackupRestore::InsertPhotoRelated(std::vector<FileInfo> &fileInfos, int32_t sourceType)
190 {
191 return;
192 }
193
ConvertPathToRealPath(const std::string & srcPath,const std::string & prefix,std::string & newPath,std::string & relativePath,FileInfo & fileInfo)194 bool CloudBackupRestore::ConvertPathToRealPath(const std::string &srcPath, const std::string &prefix,
195 std::string &newPath, std::string &relativePath, FileInfo &fileInfo)
196 {
197 if (MediaFileUtils::StartsWith(srcPath, INTERNAL_PREFIX)) {
198 return UpgradeRestore::ConvertPathToRealPath(srcPath, prefix, newPath, relativePath);
199 }
200 size_t pos = 0;
201 if (!BackupFileUtils::GetPathPosByPrefixLevel(sceneCode_, srcPath, SD_PREFIX_LEVEL, pos)) {
202 return false;
203 }
204 newPath = prefix + srcPath;
205 relativePath = srcPath.substr(pos);
206 fileInfo.isInternal = false;
207 return true;
208 }
209 } // namespace Media
210 } // namespace OHOS