//===-- ResourceSerializator.h ----------------------------------*- C++-*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===---------------------------------------------------------------------===// // // This defines a visitor serializing resources to a .res stream. // //===---------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVMRC_RESOURCESERIALIZATOR_H #define LLVM_TOOLS_LLVMRC_RESOURCESERIALIZATOR_H #include "ResourceScriptStmt.h" #include "ResourceVisitor.h" #include "llvm/Support/Endian.h" namespace llvm { namespace rc { class ResourceFileWriter : public Visitor { public: ResourceFileWriter(std::unique_ptr Stream) : FS(std::move(Stream)) { assert(FS && "Output stream needs to be provided to the serializator"); } Error visitNullResource(const RCResource *) override; Error visitAcceleratorsResource(const RCResource *) override; Error visitDialogResource(const RCResource *) override; Error visitHTMLResource(const RCResource *) override; Error visitMenuResource(const RCResource *) override; Error visitCharacteristicsStmt(const CharacteristicsStmt *) override; Error visitLanguageStmt(const LanguageResource *) override; Error visitVersionStmt(const VersionStmt *) override; struct ObjectInfo { uint16_t LanguageInfo; uint32_t Characteristics; uint32_t VersionInfo; ObjectInfo() : LanguageInfo(0), Characteristics(0), VersionInfo(0) {} } ObjectData; private: Error handleError(Error &&Err, const RCResource *Res); Error writeResource(const RCResource *Res, Error (ResourceFileWriter::*BodyWriter)(const RCResource *)); // NullResource Error writeNullBody(const RCResource *); // AcceleratorsResource Error writeSingleAccelerator(const AcceleratorsResource::Accelerator &, bool IsLastItem); Error writeAcceleratorsBody(const RCResource *); // DialogResource Error writeSingleDialogControl(const Control &, bool IsExtended); Error writeDialogBody(const RCResource *); // HTMLResource Error writeHTMLBody(const RCResource *); // MenuResource Error writeMenuDefinition(const std::unique_ptr &, uint16_t Flags); Error writeMenuDefinitionList(const MenuDefinitionList &List); Error writeMenuBody(const RCResource *); // Output stream handling. std::unique_ptr FS; uint64_t tell() const { return FS->tell(); } uint64_t writeObject(const ArrayRef Data); template uint64_t writeInt(const T &Value) { support::detail::packed_endian_specific_integral Object(Value); return writeObject(Object); } template uint64_t writeObject(const T &Value) { return writeObject(ArrayRef( reinterpret_cast(&Value), sizeof(T))); } template void writeObjectAt(const T &Value, uint64_t Position) { FS->pwrite((const char *)&Value, sizeof(T), Position); } Error writeCString(StringRef Str, bool WriteTerminator = true); Error writeIdentifier(const IntOrString &Ident); Error writeIntOrString(const IntOrString &Data); Error appendFile(StringRef Filename); void padStream(uint64_t Length); }; } // namespace rc } // namespace llvm #endif