Skip to content

Commit a9e7f13

Browse files
committed
draft
1 parent eb4ad4b commit a9e7f13

24 files changed

Lines changed: 665 additions & 0 deletions

CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@ set(ODR_SOURCE_FILES
143143
"src/odr/internal/odf/odf_parser.cpp"
144144
"src/odr/internal/odf/odf_style.cpp"
145145

146+
"src/odr/internal/oldms/structs/fc_lcb.cpp"
147+
"src/odr/internal/oldms/structs/fib.cpp"
148+
"src/odr/internal/oldms/structs/fib_base.cpp"
149+
"src/odr/internal/oldms/structs/fib_rg_csw_new.cpp"
150+
"src/odr/internal/oldms/structs/fib_rg_fc_lcb.cpp"
151+
"src/odr/internal/oldms/structs/fib_rg_fc_lcb_97.cpp"
152+
"src/odr/internal/oldms/structs/fib_rg_fc_lcb_2000.cpp"
153+
"src/odr/internal/oldms/structs/fib_rg_fc_lcb_2002.cpp"
154+
"src/odr/internal/oldms/structs/fib_rg_fc_lcb_2003.cpp"
155+
"src/odr/internal/oldms/structs/fib_rg_fc_lcb_2007.cpp"
146156
"src/odr/internal/oldms/oldms_file.cpp"
147157

148158
"src/odr/internal/ooxml/presentation/ooxml_presentation_document.cpp"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include <odr/internal/oldms/structs/fc_lcb.hpp>
2+
3+
namespace odr::internal {
4+
5+
static_assert(sizeof(oldms::FcLcb) == 8, "FcLcb should be 8 bytes");
6+
7+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
5+
namespace odr::internal::oldms {
6+
7+
#pragma pack(push, 1)
8+
9+
struct FcLcb {
10+
std::uint32_t fc;
11+
std::uint32_t lcb;
12+
};
13+
14+
#pragma pack(pop)
15+
16+
} // namespace odr::internal::oldms
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include <odr/internal/oldms/structs/fib.hpp>
2+
3+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb.hpp>
4+
#include <odr/internal/util/byte_stream_util.hpp>
5+
#include <odr/internal/util/stream_util.hpp>
6+
7+
namespace odr::internal {
8+
9+
void oldms::read(std::istream &in, Fib &fib) {
10+
read(in, fib.base);
11+
12+
util::byte_stream::read(in, fib.csw);
13+
if (fib.csw * 2 < sizeof(fib.fibRgW)) {
14+
throw std::runtime_error("Unexpected Fib.csw value: " +
15+
std::to_string(fib.csw));
16+
}
17+
18+
const std::streampos offsetFibRgW = in.tellg();
19+
util::byte_stream::read(in, fib.fibRgW);
20+
in.seekg(offsetFibRgW + static_cast<std::streamoff>(fib.csw * 2));
21+
22+
util::byte_stream::read(in, fib.cslw);
23+
if (fib.cslw * 4 < sizeof(fib.fibRgLw)) {
24+
throw std::runtime_error("Unexpected Fib.cslw value: " +
25+
std::to_string(fib.cslw));
26+
}
27+
28+
const std::streampos offsetFibRgLw = in.tellg();
29+
util::byte_stream::read(in, fib.fibRgLw);
30+
in.seekg(offsetFibRgLw + static_cast<std::streamoff>(fib.cslw * 4));
31+
32+
util::byte_stream::read(in, fib.cbRgFcLcb);
33+
34+
const std::streampos offsetFibRgFcLcb = in.tellg();
35+
in.seekg(offsetFibRgFcLcb + static_cast<std::streamoff>(fib.cbRgFcLcb * 8));
36+
37+
util::byte_stream::read(in, fib.cswNew);
38+
39+
const std::streampos offsetFibRgCswNew = in.tellg();
40+
read(in, fib.fibRgCswNew);
41+
in.seekg(offsetFibRgCswNew + static_cast<std::streamoff>(fib.cswNew * 2));
42+
43+
const std::uint16_t nFib =
44+
(fib.cswNew != 0) ? fib.fibRgCswNew.nFibNew : fib.base.nFib;
45+
46+
in.seekg(offsetFibRgFcLcb);
47+
fib.fibRgFcLcb = read_fib_rg_fc_lcb(in, nFib);
48+
}
49+
50+
} // namespace odr::internal
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#pragma once
2+
3+
#include <array>
4+
#include <iosfwd>
5+
#include <string>
6+
7+
#include <odr/internal/oldms/structs/fib_base.hpp>
8+
#include <odr/internal/oldms/structs/fib_rg_csw_new.hpp>
9+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb_97.hpp>
10+
11+
namespace odr::internal::oldms {
12+
13+
struct Fib {
14+
FibBase base;
15+
std::uint16_t csw;
16+
std::array<std::uint16_t, 14> fibRgW;
17+
std::uint16_t cslw;
18+
std::array<std::uint16_t, 44> fibRgLw;
19+
std::uint16_t cbRgFcLcb;
20+
std::unique_ptr<FibRgFcLcb97> fibRgFcLcb;
21+
std::uint16_t cswNew;
22+
FibRgCswNew fibRgCswNew;
23+
};
24+
25+
void read(std::istream &in, Fib &fib);
26+
27+
} // namespace odr::internal::oldms
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <odr/internal/oldms/structs/fib_base.hpp>
2+
3+
#include <odr/internal/util/byte_stream_util.hpp>
4+
5+
namespace odr::internal {
6+
7+
void oldms::read(std::istream &in, FibBase &fibBase) {
8+
util::byte_stream::read(in, fibBase);
9+
}
10+
11+
} // namespace odr::internal
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <iosfwd>
5+
6+
namespace odr::internal::oldms {
7+
8+
#pragma pack(push, 1)
9+
10+
struct FibBase {
11+
std::uint16_t wIdent;
12+
std::uint16_t nFib;
13+
std::uint16_t unused;
14+
std::uint16_t lid;
15+
std::uint16_t pnNext;
16+
std::uint16_t flags1;
17+
std::uint16_t nFibBack;
18+
std::uint32_t lKey;
19+
std::uint8_t envr;
20+
std::uint8_t flags2;
21+
std::uint16_t reserved3;
22+
std::uint16_t reserved4;
23+
std::uint32_t reserved5;
24+
std::uint32_t reserved6;
25+
};
26+
27+
#pragma pack(pop)
28+
29+
void read(std::istream &in, FibBase &fibBase);
30+
31+
} // namespace odr::internal::oldms
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <odr/internal/oldms/structs/fib_rg_csw_new.hpp>
2+
3+
#include "n_fib_values.hpp"
4+
5+
#include <odr/internal/util/byte_stream_util.hpp>
6+
7+
namespace odr::internal {
8+
9+
void oldms::read(std::istream &in, FibRgCswNew &out) {
10+
util::byte_stream::read(in, out.nFibNew);
11+
12+
switch (out.nFibNew) {
13+
case nFib97:
14+
break;
15+
case nFib2000:
16+
case nFib2002:
17+
case nFib2003: {
18+
auto rgCswNewData = std::make_unique<FibRgCswNewData2000>();
19+
util::byte_stream::read(in, *rgCswNewData);
20+
out.rgCswNewData = std::move(rgCswNewData);
21+
} break;
22+
case nFib2007: {
23+
auto rgCswNewData = std::make_unique<FibRgCswNewData2007>();
24+
util::byte_stream::read(in, *rgCswNewData);
25+
out.rgCswNewData = std::move(rgCswNewData);
26+
} break;
27+
default:
28+
throw std::runtime_error("Unsupported nFibNew value: " +
29+
std::to_string(out.nFibNew));
30+
}
31+
}
32+
33+
} // namespace odr::internal
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <iosfwd>
5+
#include <memory>
6+
7+
namespace odr::internal::oldms {
8+
9+
#pragma pack(push, 1)
10+
11+
struct FibRgCswNewData2000 {
12+
std::uint16_t cQuickSavesNew;
13+
};
14+
15+
struct FibRgCswNewData2007 : FibRgCswNewData2000 {
16+
std::uint16_t lidThemeOther;
17+
std::uint16_t lidThemeFE;
18+
std::uint16_t lidThemeCS;
19+
};
20+
21+
struct FibRgCswNew {
22+
std::uint16_t nFibNew;
23+
std::unique_ptr<FibRgCswNewData2000> rgCswNewData;
24+
};
25+
26+
#pragma pack(pop)
27+
28+
void read(std::istream &in, FibRgCswNew &out);
29+
30+
} // namespace odr::internal::oldms
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb.hpp>
2+
3+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb_2000.hpp>
4+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb_2002.hpp>
5+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb_2003.hpp>
6+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb_2007.hpp>
7+
#include <odr/internal/oldms/structs/fib_rg_fc_lcb_97.hpp>
8+
#include <odr/internal/oldms/structs/n_fib_values.hpp>
9+
#include <odr/internal/util/byte_stream_util.hpp>
10+
11+
namespace odr::internal {
12+
13+
std::unique_ptr<oldms::FibRgFcLcb97>
14+
oldms::read_fib_rg_fc_lcb(std::istream &in, const std::uint16_t nFib) {
15+
switch (nFib) {
16+
case nFib97: {
17+
auto result = std::make_unique<FibRgFcLcb97>();
18+
read(in, *result);
19+
return result;
20+
}
21+
case nFib2000: {
22+
auto result = std::make_unique<FibRgFcLcb2000>();
23+
read(in, *result);
24+
return result;
25+
}
26+
case nFib2002: {
27+
auto result = std::make_unique<FibRgFcLcb2002>();
28+
read(in, *result);
29+
return result;
30+
}
31+
case nFib2003: {
32+
auto result = std::make_unique<FibRgFcLcb2003>();
33+
read(in, *result);
34+
return result;
35+
}
36+
case nFib2007: {
37+
auto result = std::make_unique<FibRgFcLcb2007>();
38+
read(in, *result);
39+
return result;
40+
}
41+
default:
42+
throw std::runtime_error("Unknown nFib value: " + std::to_string(nFib));
43+
}
44+
}
45+
46+
} // namespace odr::internal

0 commit comments

Comments
 (0)