To verify, run smoke tests.
Change-Id: I80784d1580b5f883fe404d475ee6729b599a4bc7
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();
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);
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();
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:
~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
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))
}
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) {