• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 namespace courgette {
15 
Element(ExecutableType kind,Ensemble * ensemble,const Region & region)16 Element::Element(ExecutableType kind,
17                  Ensemble* ensemble,
18                  const Region& region)
19     : kind_(kind), ensemble_(ensemble), region_(region) {
20 }
21 
~Element()22 Element::~Element() {}
23 
Name() const24 std::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.
FindEmbeddedElements()33 Status 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 
~Ensemble()61 Ensemble::~Ensemble() {
62   for (size_t i = 0;  i < owned_elements_.size();  ++i)
63     delete owned_elements_[i];
64 }
65 
66 }  // namespace
67