• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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