Free handlers assigned to ManifestHandlerRegistry 53/64653/3
authorTomasz Iwanek <t.iwanek@samsung.com>
Mon, 4 Apr 2016 09:26:47 +0000 (11:26 +0200)
committerTomasz Iwanek <t.iwanek@samsung.com>
Tue, 5 Apr 2016 13:57:13 +0000 (15:57 +0200)
To verify, run smoke tests.

Change-Id: I80784d1580b5f883fe404d475ee6729b599a4bc7

src/manifest_parser/manifest_handler.cc
src/manifest_parser/manifest_handler.h
src/manifest_parser/manifest_parser_impl.cc

index 62b055108fca245141dc25098df9803871abe63a..5a47d237765cad9d9213124ed258f541f3d776b1 100644 (file)
@@ -82,7 +82,7 @@ ManifestHandlerRegistry::ManifestHandlerRegistry(
     const std::vector<ManifestHandler*>& handlers) {
   for (std::vector<ManifestHandler*>::const_iterator it = handlers.begin();
        it != handlers.end(); ++it) {
-    handlers_[(*it)->Key()] = *it;
+    handlers_[(*it)->Key()] = std::shared_ptr<ManifestHandler>(*it);
   }
 
   ReorderHandlersGivenDependencies();
@@ -93,21 +93,21 @@ ManifestHandlerRegistry::~ManifestHandlerRegistry() {
 
 void ManifestHandlerRegistry::RegisterManifestHandler(
     ManifestHandler* handler) {
-  handlers_[handler->Key()] = handler;
+  handlers_[handler->Key()] = std::shared_ptr<ManifestHandler>(handler);
   ReorderHandlersGivenDependencies();
 }
 
-ManifestHandlerMap ManifestHandlerRegistry::handlers() {
+const ManifestHandlerMap& ManifestHandlerRegistry::handlers() const {
   return handlers_;
 }
 
-ManifestHandlerOrderMap
-ManifestHandlerRegistry::get_manifest_handlers_order_map() {
+const ManifestHandlerOrderMap&
+ManifestHandlerRegistry::get_manifest_handlers_order_map() const {
   return order_map_;
 }
 
 void ManifestHandlerRegistry::ReorderHandlersGivenDependencies() {
-  std::set<ManifestHandler*> unsorted_handlers;
+  std::set<std::shared_ptr<ManifestHandler>> unsorted_handlers;
   for (ManifestHandlerMap::const_iterator iter = handlers_.begin();
        iter != handlers_.end(); ++iter) {
     unsorted_handlers.insert(iter->second);
@@ -115,11 +115,11 @@ void ManifestHandlerRegistry::ReorderHandlersGivenDependencies() {
 
   int order = 0;
   while (true) {
-    std::set<ManifestHandler*> next_unsorted_handlers;
-    for (std::set<ManifestHandler*>::const_iterator iter =
+    std::set<std::shared_ptr<ManifestHandler>> next_unsorted_handlers;
+    for (std::set<std::shared_ptr<ManifestHandler>>::const_iterator iter =
              unsorted_handlers.begin();
          iter != unsorted_handlers.end(); ++iter) {
-      ManifestHandler* handler = *iter;
+      auto handler = *iter;
       const std::vector<std::string>& prerequisites =
           handler->PrerequisiteKeys();
       int unsatisfied = prerequisites.size();
index e3de0b67d892847494331b9a1559c430dfd0a4bb..df4b3b898e6954179b6201cce2f7c101ba4fdae9 100644 (file)
@@ -96,8 +96,9 @@ const std::vector<const DictionaryValue*> GetOneOrMany(
     const DictionaryValue* dict, const std::string& path,
     const std::string& namespace_prefix);
 
-typedef std::map<std::string, ManifestHandler*> ManifestHandlerMap;
-typedef std::map<ManifestHandler*, int> ManifestHandlerOrderMap;
+typedef std::map<std::string, std::shared_ptr<ManifestHandler>>
+    ManifestHandlerMap;
+typedef std::map<std::shared_ptr<ManifestHandler>, int> ManifestHandlerOrderMap;
 
 class ManifestHandlerRegistry {
  public:
@@ -107,11 +108,12 @@ class ManifestHandlerRegistry {
   ~ManifestHandlerRegistry();
 
   // Register a manifest handler for key, which is provided by Key() method
-  // in ManifestHandler implementer.
+  // in ManifestHandler implementer. Registry takes ownership of registered
+  // handler.
   void RegisterManifestHandler(ManifestHandler* handler);
 
-  ManifestHandlerMap handlers();
-  ManifestHandlerOrderMap get_manifest_handlers_order_map();
+  const ManifestHandlerMap& handlers() const;
+  const ManifestHandlerOrderMap& get_manifest_handlers_order_map() const;
 
  private:
   // This function is sorting handlers as some of them might need to
index 0cf82f160bff6c4917d0929086088316fa2227bb..fcddb3140d4902bc89c90370ff7760c7633351d4 100644 (file)
@@ -67,7 +67,7 @@ bool ManifestParserImpl::ParseManifest(const bf::path& manifest_path) {
 bool ManifestParserImpl::ValidateAppManifest(std::string* error) {
   const ManifestHandlerMap& handlers = registry_->handlers();
   for (auto p : handlers) {
-    ManifestHandler* handler = p.second;
+    auto handler = p.second;
     if (manifest_data_.find(p.first) != manifest_data_.end() &&
         !handler->Validate(*GetManifestData(handler->Key()).get(),
             manifest_data_, error))
@@ -77,15 +77,15 @@ bool ManifestParserImpl::ValidateAppManifest(std::string* error) {
 }
 
 bool ManifestParserImpl::ParseAppManifest(std::string* error) {
-  std::map<int, ManifestHandler*> handlers_by_order;
+  std::map<int, std::shared_ptr<ManifestHandler>> handlers_by_order;
   const ManifestHandlerMap& handlers = registry_->handlers();
-  ManifestHandlerOrderMap order_map =
+  const ManifestHandlerOrderMap& order_map =
       registry_->get_manifest_handlers_order_map();
   for (auto p : handlers) {
-    ManifestHandler* handler = p.second;
+    auto handler = p.second;
     if (manifest_->HasPath(p.first) ||
         handler->AlwaysParseForKey()) {
-      handlers_by_order[order_map[handler]] = handler;
+      handlers_by_order[order_map.find(handler)->second] = handler;
     }
   }
   for (auto handler : handlers_by_order) {