summaryrefslogtreecommitdiff
path: root/internal/dynamic_depth/cameras.cc
diff options
context:
space:
mode:
Diffstat (limited to 'internal/dynamic_depth/cameras.cc')
-rw-r--r--internal/dynamic_depth/cameras.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/internal/dynamic_depth/cameras.cc b/internal/dynamic_depth/cameras.cc
new file mode 100644
index 0000000..7c5c29f
--- /dev/null
+++ b/internal/dynamic_depth/cameras.cc
@@ -0,0 +1,102 @@
+#include "dynamic_depth/cameras.h"
+
+#include "android-base/logging.h"
+#include "dynamic_depth/const.h"
+
+using photos_editing_formats::xml::Deserializer;
+using photos_editing_formats::xml::Serializer;
+
+namespace photos_editing_formats {
+namespace dynamic_depth {
+
+const char kNodeName[] = "Cameras";
+const char kCameraName[] = "Camera";
+
+// Private constructor.
+Cameras::Cameras() {}
+
+// Public methods.
+void Cameras::GetNamespaces(
+ std::unordered_map<string, string>* ns_name_href_map) {
+ if (ns_name_href_map == nullptr || camera_list_.empty()) {
+ LOG(ERROR) << "Namespace list is null or camera list is empty";
+ return;
+ }
+ for (const auto& camera : camera_list_) {
+ camera->GetNamespaces(ns_name_href_map);
+ }
+}
+
+std::unique_ptr<Cameras> Cameras::FromCameraArray(
+ std::vector<std::unique_ptr<Camera>>* camera_list) {
+ if (camera_list == nullptr || camera_list->empty()) {
+ LOG(ERROR) << "Camera list is empty";
+ return nullptr;
+ }
+ std::unique_ptr<Cameras> cameras(new Cameras());
+ cameras->camera_list_ = std::move(*camera_list);
+ return cameras;
+}
+
+std::unique_ptr<Cameras> Cameras::FromDeserializer(
+ const Deserializer& parent_deserializer) {
+ std::unique_ptr<Cameras> cameras(new Cameras());
+ int i = 0;
+ std::unique_ptr<Deserializer> deserializer =
+ parent_deserializer.CreateDeserializerFromListElementAt(
+ DynamicDepthConst::Namespace(kNodeName), kNodeName, 0);
+ while (deserializer) {
+ std::unique_ptr<Camera> camera = Camera::FromDeserializer(*deserializer);
+ if (camera == nullptr) {
+ LOG(ERROR) << "Unable to deserialize a camera";
+ return nullptr;
+ }
+ cameras->camera_list_.emplace_back(std::move(camera));
+ deserializer = parent_deserializer.CreateDeserializerFromListElementAt(
+ DynamicDepthConst::Namespace(kNodeName), kNodeName, ++i);
+ }
+
+ if (cameras->camera_list_.empty()) {
+ return nullptr;
+ }
+ return cameras;
+}
+
+const std::vector<const Camera*> Cameras::GetCameras() const {
+ std::vector<const Camera*> camera_list;
+ for (const auto& camera : camera_list_) {
+ camera_list.push_back(camera.get());
+ }
+ return camera_list;
+}
+
+bool Cameras::Serialize(Serializer* serializer) const {
+ if (camera_list_.empty()) {
+ LOG(ERROR) << "Camera list is empty";
+ return false;
+ }
+ std::unique_ptr<Serializer> cameras_serializer =
+ serializer->CreateListSerializer(DynamicDepthConst::Namespace(kNodeName),
+ kNodeName);
+ if (cameras_serializer == nullptr) {
+ // Error is logged in Serializer.
+ return false;
+ }
+ for (int i = 0; i < camera_list_.size(); i++) {
+ std::unique_ptr<Serializer> camera_serializer =
+ cameras_serializer->CreateItemSerializer(
+ DynamicDepthConst::Namespace(kCameraName), kCameraName);
+ if (camera_serializer == nullptr) {
+ LOG(ERROR) << "Could not create a list item serializer for Camera";
+ return false;
+ }
+ if (!camera_list_[i]->Serialize(camera_serializer.get())) {
+ LOG(ERROR) << "Could not serialize camera " << i;
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace dynamic_depth
+} // namespace photos_editing_formats