metadata_parser_manager.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/parsers/metadata_parser_manager.h"
6
7#include "base/logging.h"
8#include "base/file_util.h"
9#include "base/singleton.h"
10#include "base/stl_util-inl.h"
11#include "build/build_config.h"
12#include "chrome/browser/parsers/metadata_parser_factory.h"
13#include "chrome/browser/parsers/metadata_parser_jpeg_factory.h"
14
15static const int kAmountToRead = 256;
16
17// Gets the singleton
18MetadataParserManager* MetadataParserManager::Get() {
19    // Uses the LeakySingletonTrait because cleanup is optional.
20    return
21        Singleton<MetadataParserManager,
22        LeakySingletonTraits<MetadataParserManager> >::get();
23  }
24
25bool MetadataParserManager::RegisterParserFactory(
26    MetadataParserFactory* parser) {
27  factories_.push_back(parser);
28  return true;
29}
30
31MetadataParserManager::MetadataParserManager() {
32  MetadataParserJpegFactory *factory = new MetadataParserJpegFactory();
33  RegisterParserFactory(factory);
34}
35
36MetadataParser* MetadataParserManager::GetParserForFile(const FilePath& path) {
37
38  char buffer[kAmountToRead];
39  int amount_read = 0;
40  DLOG(ERROR) << path.value();
41  amount_read = file_util::ReadFile(path, buffer, sizeof(buffer));
42  if (amount_read <= 0) {
43    DLOG(ERROR) << "Unable to read file";
44    return NULL;
45  }
46  for (size_t x = 0; x < factories_.size(); ++x) {
47    if (factories_[x]->CanParse(path, buffer, amount_read)) {
48      return factories_[x]->CreateParser(path);
49    }
50  }
51  return NULL;
52}
53