blob: 1370c6168d2a1f981d7c4403f20cd2be32c99975 [file] [log] [blame]
Marek Sokolowski8f193432017-09-29 17:14:09 +00001//===-- ResourceSerializator.h ----------------------------------*- C++-*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===---------------------------------------------------------------------===//
9//
10// This defines a visitor serializing resources to a .res stream.
11//
12//===---------------------------------------------------------------------===//
13
14#ifndef LLVM_TOOLS_LLVMRC_RESOURCESERIALIZATOR_H
15#define LLVM_TOOLS_LLVMRC_RESOURCESERIALIZATOR_H
16
17#include "ResourceScriptStmt.h"
18#include "ResourceVisitor.h"
19
20#include "llvm/Support/Endian.h"
21
22namespace llvm {
23namespace rc {
24
25class ResourceFileWriter : public Visitor {
26public:
27 ResourceFileWriter(std::unique_ptr<raw_fd_ostream> Stream)
28 : FS(std::move(Stream)) {
29 assert(FS && "Output stream needs to be provided to the serializator");
30 }
31
32 Error visitNullResource(const RCResource *) override;
Marek Sokolowski22fccd62017-09-29 19:07:44 +000033 Error visitAcceleratorsResource(const RCResource *) override;
Marek Sokolowski7f7745c2017-09-30 00:38:52 +000034 Error visitDialogResource(const RCResource *) override;
Marek Sokolowski8f193432017-09-29 17:14:09 +000035 Error visitHTMLResource(const RCResource *) override;
Marek Sokolowski42f494d2017-09-29 22:25:05 +000036 Error visitMenuResource(const RCResource *) override;
Marek Sokolowski8f193432017-09-29 17:14:09 +000037
Zachary Turner420090a2017-10-06 20:51:20 +000038 Error visitCaptionStmt(const CaptionStmt *) override;
Marek Sokolowski22fccd62017-09-29 19:07:44 +000039 Error visitCharacteristicsStmt(const CharacteristicsStmt *) override;
Zachary Turner420090a2017-10-06 20:51:20 +000040 Error visitFontStmt(const FontStmt *) override;
Marek Sokolowski8f193432017-09-29 17:14:09 +000041 Error visitLanguageStmt(const LanguageResource *) override;
Zachary Turner420090a2017-10-06 20:51:20 +000042 Error visitStyleStmt(const StyleStmt *) override;
Marek Sokolowski22fccd62017-09-29 19:07:44 +000043 Error visitVersionStmt(const VersionStmt *) override;
Marek Sokolowski8f193432017-09-29 17:14:09 +000044
45 struct ObjectInfo {
46 uint16_t LanguageInfo;
Marek Sokolowski22fccd62017-09-29 19:07:44 +000047 uint32_t Characteristics;
48 uint32_t VersionInfo;
Marek Sokolowski8f193432017-09-29 17:14:09 +000049
Zachary Turner420090a2017-10-06 20:51:20 +000050 Optional<uint32_t> Style;
51 StringRef Caption;
52 struct FontInfo {
53 uint32_t Size;
54 StringRef Typeface;
55 uint32_t Weight;
56 bool IsItalic;
57 uint32_t Charset;
58 };
59 Optional<FontInfo> Font;
60
Marek Sokolowski22fccd62017-09-29 19:07:44 +000061 ObjectInfo() : LanguageInfo(0), Characteristics(0), VersionInfo(0) {}
Marek Sokolowski8f193432017-09-29 17:14:09 +000062 } ObjectData;
63
64private:
65 Error handleError(Error &&Err, const RCResource *Res);
66
67 Error
68 writeResource(const RCResource *Res,
69 Error (ResourceFileWriter::*BodyWriter)(const RCResource *));
70
Marek Sokolowski22fccd62017-09-29 19:07:44 +000071 // NullResource
Marek Sokolowski8f193432017-09-29 17:14:09 +000072 Error writeNullBody(const RCResource *);
Marek Sokolowski22fccd62017-09-29 19:07:44 +000073
74 // AcceleratorsResource
75 Error writeSingleAccelerator(const AcceleratorsResource::Accelerator &,
76 bool IsLastItem);
77 Error writeAcceleratorsBody(const RCResource *);
78
Marek Sokolowski7f7745c2017-09-30 00:38:52 +000079 // DialogResource
80 Error writeSingleDialogControl(const Control &, bool IsExtended);
81 Error writeDialogBody(const RCResource *);
82
Marek Sokolowski22fccd62017-09-29 19:07:44 +000083 // HTMLResource
Marek Sokolowski8f193432017-09-29 17:14:09 +000084 Error writeHTMLBody(const RCResource *);
85
Marek Sokolowski42f494d2017-09-29 22:25:05 +000086 // MenuResource
87 Error writeMenuDefinition(const std::unique_ptr<MenuDefinition> &,
88 uint16_t Flags);
89 Error writeMenuDefinitionList(const MenuDefinitionList &List);
90 Error writeMenuBody(const RCResource *);
91
Marek Sokolowski8f193432017-09-29 17:14:09 +000092 // Output stream handling.
93 std::unique_ptr<raw_fd_ostream> FS;
94
95 uint64_t tell() const { return FS->tell(); }
96
97 uint64_t writeObject(const ArrayRef<uint8_t> Data);
98
99 template <typename T> uint64_t writeInt(const T &Value) {
100 support::detail::packed_endian_specific_integral<T, support::little,
101 support::unaligned>
102 Object(Value);
103 return writeObject(Object);
104 }
105
106 template <typename T> uint64_t writeObject(const T &Value) {
107 return writeObject(ArrayRef<uint8_t>(
108 reinterpret_cast<const uint8_t *>(&Value), sizeof(T)));
109 }
110
111 template <typename T> void writeObjectAt(const T &Value, uint64_t Position) {
112 FS->pwrite((const char *)&Value, sizeof(T), Position);
113 }
114
115 Error writeCString(StringRef Str, bool WriteTerminator = true);
116
117 Error writeIdentifier(const IntOrString &Ident);
118 Error writeIntOrString(const IntOrString &Data);
119
120 Error appendFile(StringRef Filename);
121
122 void padStream(uint64_t Length);
123};
124
125} // namespace rc
126} // namespace llvm
127
128#endif