1// Copyright (c) 2011 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 "courgette/ensemble.h"
6
7#include "base/basictypes.h"
8#include "base/strings/string_number_conversions.h"
9
10#include "courgette/region.h"
11#include "courgette/simple_delta.h"
12#include "courgette/streams.h"
13
14namespace courgette {
15
16Element::Element(ExecutableType kind,
17                 Ensemble* ensemble,
18                 const Region& region)
19    : kind_(kind), ensemble_(ensemble), region_(region) {
20}
21
22Element::~Element() {}
23
24std::string Element::Name() const {
25  return ensemble_->name() + "("
26      + base::IntToString(kind()) + ","
27      + base::Uint64ToString(offset_in_ensemble()) + ","
28      + base::Uint64ToString(region().length()) + ")";
29}
30
31// Scans the Ensemble's region, sniffing out Elements.  We assume that the
32// elements do not overlap.
33Status Ensemble::FindEmbeddedElements() {
34
35  size_t length = region_.length();
36  const uint8* start = region_.start();
37
38  size_t position = 0;
39  while (position < length) {
40    ExecutableType type;
41    size_t detected_length;
42
43    Status result = DetectExecutableType(start + position,
44                                         length - position,
45                                         &type, &detected_length);
46
47    if (result == C_OK) {
48      Region region(start + position, detected_length);
49
50      Element* element = new Element(type, this, region);
51      owned_elements_.push_back(element);
52      elements_.push_back(element);
53      position += region.length();
54    } else {
55      position++;
56    }
57  }
58  return C_OK;
59}
60
61Ensemble::~Ensemble() {
62  for (size_t i = 0;  i < owned_elements_.size();  ++i)
63    delete owned_elements_[i];
64}
65
66}  // namespace
67