mirror of https://github.com/odrling/Aegisub
Use read_file_mapping for reading attachments
This commit is contained in:
parent
5750a660c2
commit
cb1f04481a
|
@ -87,7 +87,6 @@
|
||||||
<PrecompiledHeaderFile>lagi_pre.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>lagi_pre.h</PrecompiledHeaderFile>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="$(SrcDir)ass\dialogue_parser.cpp" />
|
<ClCompile Include="$(SrcDir)ass\dialogue_parser.cpp" />
|
||||||
<ClCompile Include="$(SrcDir)ass\uuencode.cpp" />
|
|
||||||
<ClCompile Include="$(SrcDir)common\cajun\elements.cpp" />
|
<ClCompile Include="$(SrcDir)common\cajun\elements.cpp" />
|
||||||
<ClCompile Include="$(SrcDir)common\cajun\reader.cpp" />
|
<ClCompile Include="$(SrcDir)common\cajun\reader.cpp" />
|
||||||
<ClCompile Include="$(SrcDir)common\cajun\writer.cpp" />
|
<ClCompile Include="$(SrcDir)common\cajun\writer.cpp" />
|
||||||
|
|
|
@ -265,9 +265,6 @@
|
||||||
<ClCompile Include="$(SrcDir)common\dispatch.cpp">
|
<ClCompile Include="$(SrcDir)common\dispatch.cpp">
|
||||||
<Filter>Source Files\Common</Filter>
|
<Filter>Source Files\Common</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="$(SrcDir)ass\uuencode.cpp">
|
|
||||||
<Filter>ASS</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="$(SrcDir)common\kana_table.cpp">
|
<ClCompile Include="$(SrcDir)common\kana_table.cpp">
|
||||||
<Filter>Source Files\Common</Filter>
|
<Filter>Source Files\Common</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -15,7 +15,6 @@ unix/path.o: CXXFLAGS += -DP_DATA=\"$(P_DATA)\" -DP_DOC=\"$(P_DOC)\" -DP_LOCALE=
|
||||||
SRC += \
|
SRC += \
|
||||||
common/parser.cpp \
|
common/parser.cpp \
|
||||||
ass/dialogue_parser.cpp \
|
ass/dialogue_parser.cpp \
|
||||||
ass/uuencode.cpp \
|
|
||||||
common/cajun/elements.cpp \
|
common/cajun/elements.cpp \
|
||||||
common/cajun/reader.cpp \
|
common/cajun/reader.cpp \
|
||||||
common/cajun/writer.cpp \
|
common/cajun/writer.cpp \
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
// Copyright (c) 2013, Thomas Goyne <plorkyeran@aegisub.org>
|
|
||||||
//
|
|
||||||
// Permission to use, copy, modify, and distribute this software for any
|
|
||||||
// purpose with or without fee is hereby granted, provided that the above
|
|
||||||
// copyright notice and this permission notice appear in all copies.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
//
|
|
||||||
// Aegisub Project http://www.aegisub.org/
|
|
||||||
|
|
||||||
#include "../config.h"
|
|
||||||
|
|
||||||
#include "libaegisub/ass/uuencode.h"
|
|
||||||
|
|
||||||
// Despite being called uuencoding by ass_specs.doc, the format is actually
|
|
||||||
// somewhat different from real uuencoding. Each 3-byte chunk is split into 4
|
|
||||||
// 6-bit pieces, then 33 is added to each piece. Lines are wrapped after 80
|
|
||||||
// characters, and files with non-multiple-of-three lengths are padded with
|
|
||||||
// zero.
|
|
||||||
|
|
||||||
namespace agi { namespace ass {
|
|
||||||
|
|
||||||
std::string UUEncode(std::vector<char> const& data) {
|
|
||||||
std::string ret;
|
|
||||||
ret.reserve((data.size() * 4 + 2) / 3 + data.size() / 80 * 2);
|
|
||||||
|
|
||||||
size_t written = 0;
|
|
||||||
for (size_t pos = 0; pos < data.size(); pos += 3) {
|
|
||||||
unsigned char src[3] = { '\0', '\0', '\0' };
|
|
||||||
memcpy(src, &data[pos], std::min<size_t>(3u, data.size() - pos));
|
|
||||||
|
|
||||||
unsigned char dst[4] = {
|
|
||||||
static_cast<unsigned char>(src[0] >> 2),
|
|
||||||
static_cast<unsigned char>(((src[0] & 0x3) << 4) | ((src[1] & 0xF0) >> 4)),
|
|
||||||
static_cast<unsigned char>(((src[1] & 0xF) << 2) | ((src[2] & 0xC0) >> 6)),
|
|
||||||
static_cast<unsigned char>(src[2] & 0x3F)
|
|
||||||
};
|
|
||||||
|
|
||||||
for (size_t i = 0; i < std::min<size_t>(data.size() - pos + 1, 4u); ++i) {
|
|
||||||
ret += dst[i] + 33;
|
|
||||||
|
|
||||||
if (++written == 80 && pos + 3 < data.size()) {
|
|
||||||
written = 0;
|
|
||||||
ret += "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
} }
|
|
|
@ -14,41 +14,79 @@
|
||||||
//
|
//
|
||||||
// Aegisub Project http://www.aegisub.org/
|
// Aegisub Project http://www.aegisub.org/
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace agi {
|
// Despite being called uuencoding by ass_specs.doc, the format is actually
|
||||||
namespace ass {
|
// somewhat different from real uuencoding. Each 3-byte chunk is split into 4
|
||||||
/// Encode a blob of data, using ASS's nonstandard variant
|
// 6-bit pieces, then 33 is added to each piece. Lines are wrapped after 80
|
||||||
std::string UUEncode(std::vector<char> const& data);
|
// characters, and files with non-multiple-of-three lengths are padded with
|
||||||
|
// zero.
|
||||||
|
|
||||||
/// Decode an ASS uuencoded string
|
namespace agi { namespace ass {
|
||||||
template<typename String>
|
|
||||||
std::vector<char> UUDecode(String const& str) {
|
|
||||||
std::vector<char> ret;
|
|
||||||
size_t len = std::end(str) - std::begin(str);
|
|
||||||
ret.reserve(len * 3 / 4);
|
|
||||||
|
|
||||||
for (size_t pos = 0; pos + 1 < len; ) {
|
/// Encode a blob of data, using ASS's nonstandard variant
|
||||||
size_t bytes = 0;
|
template<typename RandomAccessRange>
|
||||||
unsigned char src[4] = { '\0', '\0', '\0', '\0' };
|
std::string UUEncode(RandomAccessRange const& data) {
|
||||||
for (size_t i = 0; i < 4 && pos < len; ++pos) {
|
using std::begin;
|
||||||
char c = str[pos];
|
using std::end;
|
||||||
if (c && c != '\n' && c != '\r') {
|
|
||||||
src[i++] = c - 33;
|
|
||||||
++bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bytes > 1)
|
size_t size = std::distance(begin(data), end(data));
|
||||||
ret.push_back((src[0] << 2) | (src[1] >> 4));
|
std::string ret;
|
||||||
if (bytes > 2)
|
ret.reserve((size * 4 + 2) / 3 + size / 80 * 2);
|
||||||
ret.push_back(((src[1] & 0xF) << 4) | (src[2] >> 2));
|
|
||||||
if (bytes > 3)
|
size_t written = 0;
|
||||||
ret.push_back(((src[2] & 0x3) << 6) | (src[3]));
|
for (size_t pos = 0; pos < size; pos += 3) {
|
||||||
|
unsigned char src[3] = { '\0', '\0', '\0' };
|
||||||
|
memcpy(src, &data[pos], std::min<size_t>(3u, size - pos));
|
||||||
|
|
||||||
|
unsigned char dst[4] = {
|
||||||
|
static_cast<unsigned char>(src[0] >> 2),
|
||||||
|
static_cast<unsigned char>(((src[0] & 0x3) << 4) | ((src[1] & 0xF0) >> 4)),
|
||||||
|
static_cast<unsigned char>(((src[1] & 0xF) << 2) | ((src[2] & 0xC0) >> 6)),
|
||||||
|
static_cast<unsigned char>(src[2] & 0x3F)
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < std::min<size_t>(size - pos + 1, 4u); ++i) {
|
||||||
|
ret += dst[i] + 33;
|
||||||
|
|
||||||
|
if (++written == 80 && pos + 3 < size) {
|
||||||
|
written = 0;
|
||||||
|
ret += "\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Decode an ASS uuencoded string
|
||||||
|
template<typename String>
|
||||||
|
std::vector<char> UUDecode(String const& str) {
|
||||||
|
std::vector<char> ret;
|
||||||
|
size_t len = std::end(str) - std::begin(str);
|
||||||
|
ret.reserve(len * 3 / 4);
|
||||||
|
|
||||||
|
for (size_t pos = 0; pos + 1 < len; ) {
|
||||||
|
size_t bytes = 0;
|
||||||
|
unsigned char src[4] = { '\0', '\0', '\0', '\0' };
|
||||||
|
for (size_t i = 0; i < 4 && pos < len; ++pos) {
|
||||||
|
char c = str[pos];
|
||||||
|
if (c && c != '\n' && c != '\r') {
|
||||||
|
src[i++] = c - 33;
|
||||||
|
++bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes > 1)
|
||||||
|
ret.push_back((src[0] << 2) | (src[1] >> 4));
|
||||||
|
if (bytes > 2)
|
||||||
|
ret.push_back(((src[1] & 0xF) << 4) | (src[2] >> 2));
|
||||||
|
if (bytes > 3)
|
||||||
|
ret.push_back(((src[2] & 0x3) << 6) | (src[3]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} }
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "ass_attachment.h"
|
#include "ass_attachment.h"
|
||||||
|
|
||||||
#include <libaegisub/ass/uuencode.h>
|
#include <libaegisub/ass/uuencode.h>
|
||||||
|
#include <libaegisub/file_mapping.h>
|
||||||
#include <libaegisub/io.h>
|
#include <libaegisub/io.h>
|
||||||
|
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
|
@ -48,15 +49,10 @@ AssAttachment::AssAttachment(agi::fs::path const& name, AssEntryGroup group)
|
||||||
if (boost::iends_with(filename.get(), ".ttf"))
|
if (boost::iends_with(filename.get(), ".ttf"))
|
||||||
filename = filename.get().substr(0, filename.get().size() - 4) + "_0" + filename.get().substr(filename.get().size() - 4);
|
filename = filename.get().substr(0, filename.get().size() - 4) + "_0" + filename.get().substr(filename.get().size() - 4);
|
||||||
|
|
||||||
std::vector<char> data;
|
agi::read_file_mapping file(name);
|
||||||
std::unique_ptr<std::istream> file(agi::io::Open(name, true));
|
auto buff = file.read(0, file.size());
|
||||||
file->seekg(0, std::ios::end);
|
|
||||||
data.resize(file->tellg());
|
|
||||||
file->seekg(0, std::ios::beg);
|
|
||||||
file->read(&data[0], data.size());
|
|
||||||
|
|
||||||
entry_data = (group == AssEntryGroup::FONT ? "fontname: " : "filename: ") + filename.get() + "\r\n";
|
entry_data = (group == AssEntryGroup::FONT ? "fontname: " : "filename: ") + filename.get() + "\r\n";
|
||||||
entry_data = entry_data.get() + agi::ass::UUEncode(data);
|
entry_data = entry_data.get() + agi::ass::UUEncode(boost::make_iterator_range(buff, buff + file.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t AssAttachment::GetSize() const {
|
size_t AssAttachment::GetSize() const {
|
||||||
|
|
Loading…
Reference in New Issue