[M108 Migration][HBBTV] Implement ewk_context_register_jsplugin_mime_types API
[platform/framework/web/chromium-efl.git] / courgette / program_detector.cc
1 // Copyright 2016 The Chromium Authors
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/program_detector.h"
6
7 #include <memory>
8
9 #include "courgette/disassembler.h"
10 #include "courgette/disassembler_elf_32_x86.h"
11 #include "courgette/disassembler_win32_x64.h"
12 #include "courgette/disassembler_win32_x86.h"
13
14 namespace courgette {
15
16 std::unique_ptr<Disassembler> DetectDisassembler(const uint8_t* buffer,
17                                                  size_t length) {
18   std::unique_ptr<Disassembler> disassembler;
19
20   if (DisassemblerWin32X86::QuickDetect(buffer, length)) {
21     disassembler = std::make_unique<DisassemblerWin32X86>(buffer, length);
22     if (disassembler->ParseHeader())
23       return disassembler;
24   }
25   if (DisassemblerWin32X64::QuickDetect(buffer, length)) {
26     disassembler = std::make_unique<DisassemblerWin32X64>(buffer, length);
27     if (disassembler->ParseHeader())
28       return disassembler;
29   }
30   if (DisassemblerElf32X86::QuickDetect(buffer, length)) {
31     disassembler = std::make_unique<DisassemblerElf32X86>(buffer, length);
32     if (disassembler->ParseHeader())
33       return disassembler;
34   }
35   return nullptr;
36 }
37
38 Status DetectExecutableType(const uint8_t* buffer,
39                             size_t length,
40                             ExecutableType* type,
41                             size_t* detected_length) {
42   std::unique_ptr<Disassembler> disassembler(
43       DetectDisassembler(buffer, length));
44
45   if (!disassembler) {  // We failed to detect anything.
46     *type = EXE_UNKNOWN;
47     *detected_length = 0;
48     return C_INPUT_NOT_RECOGNIZED;
49   }
50
51   *type = disassembler->kind();
52   *detected_length = disassembler->length();
53   return C_OK;
54 }
55
56 }  // namespace courgette