Refactor highlight 94/224094/4
authorhyunho <hhstark.kang@samsung.com>
Thu, 6 Feb 2020 07:27:27 +0000 (16:27 +0900)
committerhyunho <hhstark.kang@samsung.com>
Fri, 14 Feb 2020 07:02:37 +0000 (16:02 +0900)
Change-Id: I0702857ad89b52ba8097613791c1ed47100ae9dc
Signed-off-by: hyunho <hhstark.kang@samsung.com>
14 files changed:
watchface-complication/complication-implementation.h
watchface-complication/complication.cc
watchface-complication/complication.h
watchface-complication/design-element-implementation.h
watchface-complication/design-element.cc
watchface-complication/design-element.h
watchface-complication/editable-interface.h
watchface-complication/editables-container.cc
watchface-complication/include/watchface-editable.h
watchface-complication/received-editable-implementation.h
watchface-complication/received-editable.cc
watchface-complication/received-editable.h
watchface-complication/shared-handle.h
watchface-complication/watchface-editable.cc

index cf1ca59..1900928 100644 (file)
@@ -96,7 +96,7 @@ class Complication::Impl : IGDBus::IGDBusEvent, IPackageManager::IPackageEvent {
   std::string default_provider_appid_;
   std::string default_provider_id_;
   ComplicationType default_type_;
-  std::unique_ptr<IEditable::Highlight> highlight_;
+  std::shared_ptr<IEditable::Highlight> highlight_;
   std::string cur_provider_appid_;
   std::string cur_provider_id_;
   ComplicationType cur_type_;
index 8c5e0cd..dcbaf52 100644 (file)
@@ -306,13 +306,13 @@ int Complication::SetEditableId(int id) {
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
-int Complication::SetHighlight(std::unique_ptr<IEditable::Highlight> highlight) {
-  impl_->highlight_ = std::move(highlight);
+int Complication::SetHighlight(std::shared_ptr<IEditable::Highlight> highlight) {
+  impl_->highlight_ = highlight;
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
-IEditable::Highlight* Complication::GetHighlight() const {
-  return impl_->highlight_.get();
+shared_ptr<IEditable::Highlight> Complication::GetHighlight() const {
+  return impl_->highlight_;
 }
 
 /*
index acfbc64..6a65aa8 100644 (file)
@@ -63,8 +63,8 @@ class EXPORT_API Complication : public IEditable
     int types_;
   };
 
-  int SetHighlight(std::unique_ptr<IEditable::Highlight> highlight) override;
-  IEditable::Highlight* GetHighlight() const override;
+  int SetHighlight(std::shared_ptr<IEditable::Highlight> highlight) override;
+  std::shared_ptr<IEditable::Highlight> GetHighlight() const override;
   std::list<std::shared_ptr<tizen_base::Bundle>> const& GetCandidates() const override;
   int SetCandidates(std::list<std::shared_ptr<tizen_base::Bundle>> candidates_list) override;
   std::shared_ptr<tizen_base::Bundle> GetCurData() const override;
index f2033b9..40b0fd3 100644 (file)
@@ -48,7 +48,7 @@ class DesignElement::Impl {
   int cur_data_idx_;
   int last_data_idx_;
   std::list<std::shared_ptr<tizen_base::Bundle>> candidates_list_;
-  std::unique_ptr<IEditable::Highlight> highlight_;
+  std::shared_ptr<IEditable::Highlight> highlight_;
   EditableShapeType shape_type_ = Circle;
   std::string name_;
   IEditable::EditableState ed_state_ = Complete;
index 465f0ae..c66d170 100644 (file)
@@ -58,13 +58,13 @@ int DesignElement::SetEditableId(int id) {
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
-int DesignElement::SetHighlight(std::unique_ptr<IEditable::Highlight> highlight) {
-  impl_->highlight_ = std::move(highlight);
+int DesignElement::SetHighlight(std::shared_ptr<IEditable::Highlight> highlight) {
+  impl_->highlight_ = highlight;
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
-IEditable::Highlight* DesignElement::GetHighlight() const {
-  return impl_->highlight_.get();
+shared_ptr<IEditable::Highlight> DesignElement::GetHighlight() const {
+  return impl_->highlight_;
 }
 
 int DesignElement::SetCandidates(
index 0a907ed..ac9f619 100644 (file)
@@ -38,8 +38,8 @@ class EXPORT_API DesignElement : public IEditable {
   DesignElement& operator=(DesignElement && other) = default;
 
  public:
-  int SetHighlight(std::unique_ptr<IEditable::Highlight> highlight) override;
-  IEditable::Highlight* GetHighlight() const override;
+  int SetHighlight(std::shared_ptr<IEditable::Highlight> highlight) override;
+  std::shared_ptr<IEditable::Highlight> GetHighlight() const override;
   std::list<std::shared_ptr<tizen_base::Bundle>> const& GetCandidates() const override;
   int SetCandidates(std::list<std::shared_ptr<tizen_base::Bundle>> candidates_list) override;
   std::shared_ptr<tizen_base::Bundle> GetCurData() const override;
index 2f9dfb3..5f2fb23 100644 (file)
@@ -51,6 +51,34 @@ class IEditable {
     Geometry(int x, int y, int w, int h) : x_(x), y_(y), w_(w), h_(h) {
     }
 
+    Geometry(Geometry&& info)
+        : x_(info.x_), y_(info.y_), w_(info.w_), h_(info.h_) {
+    }
+
+    Geometry(const Geometry& info)
+        : x_(info.x_), y_(info.y_), w_(info.w_), h_(info.h_) {
+    }
+
+    Geometry& operator = (const Geometry& info) {
+      if (this != &info) {
+        x_ = info.GetX();
+        y_ = info.GetY();
+        w_ = info.GetW();
+        h_ = info.GetH();
+      }
+      return *this;
+    }
+
+    Geometry& operator = (Geometry&& info) noexcept {
+      if (this != &info) {
+        x_ = info.GetX();
+        y_ = info.GetY();
+        w_ = info.GetW();
+        h_ = info.GetH();
+      }
+      return *this;
+    }
+
     const int GetX() const {
       return x_;
     }
@@ -97,6 +125,15 @@ class IEditable {
       : geo_(std::move(geo)), shape_type_(shape_type) {
     }
 
+    Highlight(tizen_base::Bundle encoded) {
+      Decode(encoded);
+    }
+
+    Highlight(const Highlight& hi) {
+      geo_ = std::unique_ptr<Geometry>(new Geometry(*hi.geo_));
+      shape_type_ = hi.shape_type_;
+    }
+
     const Geometry* GetGeometry() const {
       return geo_.get();
     }
@@ -110,6 +147,35 @@ class IEditable {
       geo_.get()->SetH(geo.GetH());
     }
 
+    void Encode(tizen_base::Bundle* encoded) {
+      encoded->Add("SHAPE_TYPE", std::to_string(shape_type_));
+      if (geo_ == nullptr)
+        return;
+
+      encoded->Add("GEO_X", std::to_string(geo_->GetX()));
+      encoded->Add("GEO_Y", std::to_string(geo_->GetY()));
+      encoded->Add("GEO_W", std::to_string(geo_->GetW()));
+      encoded->Add("GEO_H", std::to_string(geo_->GetH()));
+    }
+
+    void Decode(tizen_base::Bundle encoded) {
+      std::string shape_str = encoded.GetString("SHAPE_TYPE");
+      if (shape_str.empty())
+        return;
+
+      shape_type_ = (EditableShapeType)stoi(shape_str);
+      std::string x_str = encoded.GetString("GEO_X");
+      if (x_str.empty())
+        return;
+
+      std::string y_str = encoded.GetString("GEO_Y");
+      std::string w_str = encoded.GetString("GEO_W");
+      std::string h_str = encoded.GetString("GEO_H");
+
+      geo_ = std::unique_ptr<Geometry>(new Geometry(
+          stoi(x_str), stoi(y_str), stoi(w_str), stoi(h_str)));
+    }
+
     const EditableShapeType GetShapeType() const {
       return shape_type_;
     }
@@ -143,8 +209,8 @@ class IEditable {
   virtual std::unique_ptr<tizen_base::Bundle>& GetContext() const = 0;
   virtual int UpdateLastContext() = 0;
   virtual std::unique_ptr<tizen_base::Bundle>& GetLastContext() const = 0;
-  virtual Highlight* GetHighlight() const = 0;
-  virtual int SetHighlight(std::unique_ptr<Highlight> highlight) = 0;
+  virtual std::shared_ptr<Highlight> GetHighlight() const = 0;
+  virtual int SetHighlight(std::shared_ptr<Highlight> highlight) = 0;
 };
 
 }  // namespace watchface_complication
index ae8079a..8c59efd 100644 (file)
@@ -214,36 +214,11 @@ int EditablesContainer::RequestEdit() {
       if (ret != BUNDLE_ERROR_NONE)
         return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
 
-      IEditable::Highlight* hi = i->GetHighlight();
-      if (hi) {
-        if (hi->GetGeometry()) {
-          ret = b.Add("GEO_X", std::to_string(hi->GetGeometry()->GetX()));
-          if (ret != BUNDLE_ERROR_NONE)
-            return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
-
-          ret = b.Add("GEO_Y", std::to_string(hi->GetGeometry()->GetY()));
-          if (ret != BUNDLE_ERROR_NONE)
-            return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
-
-          ret = b.Add("GEO_W", std::to_string(hi->GetGeometry()->GetW()));
-          if (ret != BUNDLE_ERROR_NONE)
-            return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
-
-          ret = b.Add("GEO_H", std::to_string(hi->GetGeometry()->GetH()));
-          if (ret != BUNDLE_ERROR_NONE)
-            return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
-
-          LOGI("hi %d %d %d %d", hi->GetGeometry()->GetX(), hi->GetGeometry()->GetY(),
-              hi->GetGeometry()->GetW(), hi->GetGeometry()->GetH());
-        }
-
-        IEditable::EditableShapeType type = hi->GetShapeType();
-        ret = b.Add("SHAPE_TYPE", std::to_string(type));
-        if (ret != BUNDLE_ERROR_NONE)
-          return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
-      } else {
+      shared_ptr<IEditable::Highlight> hi = i->GetHighlight();
+      if (hi)
+        hi->Encode(&b);
+      else
         LOGW("Null highlight info !!");
-      }
 
       if (!i.get()->GetLabel().empty()) {
         ret = b.Add("NAME", i.get()->GetLabel());
index 8f17b87..2a49469 100644 (file)
@@ -53,7 +53,7 @@ typedef void *watchface_editable_container_h;
  * @brief The editable highlight info handle.
  * @since_tizen 5.0
  */
-typedef struct editable_highlight_ *watchface_editable_highlight_h;
+typedef void *watchface_editable_highlight_h;
 
 /**
  * @brief Enumeration for Editable state.
index efa315e..de19fb0 100644 (file)
@@ -45,7 +45,7 @@ class ReceivedEditable::Impl {
   int id_ = -1;
   tizen_base::Bundle* cur_data_ = nullptr;
   std::list<std::shared_ptr<tizen_base::Bundle>> candidates_list_;
-  std::unique_ptr<IEditable::Highlight> highlight_;
+  std::shared_ptr<IEditable::Highlight> highlight_;
   EditableShapeType shape_type_ = Circle;
   std::string name_;
   std::string setup_appid_;
index 902976a..252bf80 100644 (file)
@@ -62,38 +62,10 @@ ReceivedEditable::Impl::Impl(ReceivedEditable* parent, std::string raw)
       THROW(WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER);
     id_ = stoi(editable_id_str);
 
-    string val = data.GetString("GEO_X");
+    string val = data.GetString("SHAPE_TYPE");
     if (!val.empty()) {
-      int x = stoi(val);
-      val = data.GetString("GEO_Y");
-      if (val.empty())
-        THROW(WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER);
-
-      int y = stoi(val);
-      val = data.GetString("GEO_W");
-      if (val.empty())
-        THROW(WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER);
-
-      int w = stoi(val);
-      val = data.GetString("GEO_H");
-      if (val.empty())
-        THROW(WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER);
-
-      int h = stoi(val);
-      Geometry geo(x, y, w, h);
-      highlight_ = std::unique_ptr<IEditable::Highlight>(new IEditable::Highlight());
-      highlight_->SetGeometry(geo);
-    }
-
-    val = data.GetString("SHAPE_TYPE");
-    if (!val.empty()) {
-      if (highlight_.get() == nullptr) {
-        highlight_ = std::unique_ptr<IEditable::Highlight>(
-            new IEditable::Highlight());
-      }
-
-      highlight_->SetShapeType(
-          static_cast<IEditable::EditableShapeType>(stoi(val)));
+      highlight_ =
+        unique_ptr<IEditable::Highlight>(new IEditable::Highlight(data));
     }
     name_ = data.GetString("NAME");
   } catch (const std::bad_alloc &ba) {
@@ -114,13 +86,13 @@ int ReceivedEditable::SetEditableId(int id) {
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
-int ReceivedEditable::SetHighlight(std::unique_ptr<IEditable::Highlight> highlight) {
-  impl_->highlight_ = std::move(highlight);
+int ReceivedEditable::SetHighlight(std::shared_ptr<IEditable::Highlight> highlight) {
+  impl_->highlight_ = highlight;
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
-IEditable::Highlight* ReceivedEditable::GetHighlight() const {
-  return impl_->highlight_.get();
+shared_ptr<IEditable::Highlight> ReceivedEditable::GetHighlight() const {
+  return impl_->highlight_;
 }
 
 /* LCOV_EXCL_START */
index a41486f..7eadb1d 100644 (file)
@@ -38,8 +38,8 @@ class EXPORT_API ReceivedEditable : public IEditable {
   ReceivedEditable& operator=(ReceivedEditable && other) = default;
 
  public:
-  int SetHighlight(std::unique_ptr<IEditable::Highlight> highlight) override;
-  IEditable::Highlight* GetHighlight() const override;
+  int SetHighlight(std::shared_ptr<IEditable::Highlight> highlight) override;
+  std::shared_ptr<IEditable::Highlight> GetHighlight() const override;
   std::list<std::shared_ptr<tizen_base::Bundle>> const& GetCandidates() const override;
   int SetCandidates(std::list<std::shared_ptr<tizen_base::Bundle>> candidates_list) override;
   std::shared_ptr<tizen_base::Bundle> GetCurData() const override;
index 56718f9..ff681b2 100644 (file)
@@ -26,18 +26,34 @@ class SharedHandle {
     return new SharedHandle(ptr);
   }
 
+  static SharedHandle* Make(std::shared_ptr<T> ptr) {
+    return new SharedHandle(ptr);
+  }
+
   static std::shared_ptr<T> Share(SharedHandle* h) {
     return h->ptr_;
   }
 
+  std::shared_ptr<T> GetPtr() const {
+    if (ptr_ == nullptr)
+      return std::shared_ptr<T>({});
+    return ptr_;
+  }
+
+  T* GetRawPtr() const {
+    if (ptr_ == nullptr)
+      return nullptr;
+    return ptr_.get();
+  }
+
  private:
   SharedHandle(T* ptr) : ptr_(ptr) {}
+  SharedHandle(std::shared_ptr<T> ptr) : ptr_(ptr) {}
 
  private:
   std::shared_ptr<T> ptr_;
 };
 
-
 }  // namespace watchface_complication
 
 #endif  // WATCHFACE_COMPLICATION_SHARED_HANDLE_H_
index 8099e5c..1266907 100644 (file)
@@ -49,14 +49,6 @@ struct complication_candidates_list_ {
   GList* candidates_list;
 };
 
-struct editable_highlight_ {
-  int x;
-  int y;
-  int w;
-  int h;
-  watchface_editable_shape_type_e shape_type;
-};
-
 struct editable_color_ {
   int r;
   int g;
@@ -171,27 +163,6 @@ class EditablesContainerStub : public EditablesContainer {
 };
 
 static EditablesContainerStub* __container;
-static std::unique_ptr<IEditable::Highlight> __get_highlight_unique_ptr(
-    watchface_editable_highlight_h highlight) {
-  try {
-    std::unique_ptr<IEditable::Highlight> hi_ptr(new IEditable::Highlight());
-    if (highlight->x != -1) {
-      LOGI("highlight info %d %d %d %d", highlight->x, highlight->y,
-          highlight->w, highlight->h);
-      IEditable::Geometry editable_geo(highlight->x, highlight->y, highlight->w,
-          highlight->h);
-      hi_ptr.get()->SetGeometry(editable_geo);
-    }
-    hi_ptr.get()->SetShapeType(
-        static_cast<IEditable::EditableShapeType>(highlight->shape_type));
-    return hi_ptr;
-  } catch (const std::bad_alloc &ba) {
-    LOGE("Highlight::Exception bad_alloc");
-    return nullptr;
-  }
-
-  return nullptr;
-}
 
 extern "C" EXPORT_API int watchface_editable_add_design_element(
     watchface_editable_container_h handle, int edit_id, int cur_data_idx,
@@ -235,12 +206,13 @@ extern "C" EXPORT_API int watchface_editable_add_design_element(
     auto de = std::shared_ptr<IEditable>(
       new DesignElement(edit_id, cur_data_idx));
     if (highlight) {
-      std::unique_ptr<IEditable::Highlight> hi_ptr =
-          __get_highlight_unique_ptr(highlight);
-      if (hi_ptr == nullptr)
-        return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
-      de.get()->SetHighlight(std::move(hi_ptr));
+      /* Highlight should be copied */
+      IEditable::Highlight* high =
+          ((SharedHandle<IEditable::Highlight>*)highlight)->GetRawPtr();
+      de.get()->SetHighlight(
+          shared_ptr<IEditable::Highlight>(new IEditable::Highlight(*high)));
     }
+
     de.get()->SetLabel(std::string(editable_name));
     int ret = de.get()->SetCandidates(new_list);
     if (ret != WATCHFACE_COMPLICATION_ERROR_NONE)
@@ -276,13 +248,11 @@ extern "C" EXPORT_API int watchface_editable_add_complication(
     return ret;
 
   if (highlight) {
-    std::unique_ptr<IEditable::Highlight> hi_ptr =
-        __get_highlight_unique_ptr(highlight);
-
-    if (hi_ptr == nullptr)
-      return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
-
-    SharedHandle<IEditable>::Share(sh).get()->SetHighlight(std::move(hi_ptr));
+    /* Highlight should be copied */
+    IEditable::Highlight* high =
+        ((SharedHandle<IEditable::Highlight>*)highlight)->GetRawPtr();
+    SharedHandle<IEditable>::Share(sh).get()->SetHighlight(
+        shared_ptr<IEditable::Highlight>(new IEditable::Highlight(*high)));
   }
 
   if (ec->IsExist(edit_id)) {
@@ -771,18 +741,11 @@ extern "C" EXPORT_API int watchface_editable_highlight_create(
     return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
   }
 
-  h = (watchface_editable_highlight_h)calloc(1,
-      sizeof(struct editable_highlight_));
-
-  if (h == nullptr) {
-    LOGE("Out of memory");
-    return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
-  }
-  h->shape_type = shape;
-  h->x = -1;
-  h->y = -1;
-  h->w = -1;
-  h->h = -1;
+  h = (watchface_editable_highlight_h)SharedHandle<IEditable::Highlight>::Make(
+    make_shared<IEditable::Highlight>(
+      unique_ptr<IEditable::Geometry>(new IEditable::Geometry(-1, -1, -1, -1)),
+      (IEditable::EditableShapeType)shape)
+  );
   *handle = h;
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
@@ -798,10 +761,10 @@ extern "C" EXPORT_API int watchface_editable_highlight_set_geometry(
     return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
   }
 
-  handle->x = x;
-  handle->y = y;
-  handle->w = w;
-  handle->h = h;
+  shared_ptr<IEditable::Highlight> ptr =
+      ((SharedHandle<IEditable::Highlight>*)handle)->GetPtr();
+  IEditable::Geometry geo(x, y, w, h);
+  ptr->SetGeometry(geo);
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
@@ -815,10 +778,13 @@ extern "C" EXPORT_API int watchface_editable_highlight_get_geometry(
     LOGE("Invalid param");
     return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
   }
-  *x = handle->x;
-  *y = handle->y;
-  *w = handle->w;
-  *h = handle->h;
+
+  shared_ptr<IEditable::Highlight> ptr =
+      ((SharedHandle<IEditable::Highlight>*)handle)->GetPtr();
+  *x = ptr->GetGeometry()->GetX();
+  *y = ptr->GetGeometry()->GetY();
+  *w = ptr->GetGeometry()->GetW();
+  *h = ptr->GetGeometry()->GetH();
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
@@ -835,7 +801,9 @@ extern "C" EXPORT_API int watchface_editable_highlight_set_shape_type(
     LOGE("Invalid param");
     return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
   }
-  handle->shape_type = shape;
+  shared_ptr<IEditable::Highlight> ptr =
+      ((SharedHandle<IEditable::Highlight>*)handle)->GetPtr();
+  ptr->SetShapeType((IEditable::EditableShapeType)shape);
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
@@ -850,7 +818,9 @@ extern "C" EXPORT_API int watchface_editable_highlight_get_shape_type(
     LOGE("Invalid param");
     return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
   }
-  *shape = handle->shape_type;
+  shared_ptr<IEditable::Highlight> ptr =
+      ((SharedHandle<IEditable::Highlight>*)handle)->GetPtr();
+  *shape = (watchface_editable_shape_type_e)ptr->GetShapeType();
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
@@ -881,27 +851,13 @@ extern "C" EXPORT_API int watchface_editable_get_highlight(
   }
 
   IEditable* ie = static_cast<IEditable*>(handle);
-  IEditable::Highlight* info = ie->GetHighlight();
-
+  shared_ptr<IEditable::Highlight> info = ie->GetHighlight();
   if (info == nullptr) {
     LOGE("editor do not have highlight data");
     return WATCHFACE_COMPLICATION_ERROR_NO_DATA;
   }
 
-  watchface_editable_highlight_h hi = (watchface_editable_highlight_h)
-      calloc(1, sizeof(struct editable_highlight_));
-  if (hi == nullptr) {
-    LOGE("Out of Memory");
-    return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
-  }
-  hi->shape_type =
-      static_cast<watchface_editable_shape_type_e>(info->GetShapeType());
-
-  hi->x = info->GetGeometry()->GetX();
-  hi->y = info->GetGeometry()->GetY();
-  hi->w = info->GetGeometry()->GetW();
-  hi->h = info->GetGeometry()->GetH();
-  *highlight = hi;
+  *highlight = SharedHandle<IEditable::Highlight>::Make(info);
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }