File attachment loading/saving supposedly all done
Originally committed to SVN as r442.
This commit is contained in:
parent
fe43cb641d
commit
59364bb272
2 changed files with 86 additions and 59 deletions
|
@ -106,12 +106,18 @@ const wxString AssAttachment::GetEntryData() {
|
|||
entryData += filename + _T("\r\n");
|
||||
|
||||
// Read three bytes
|
||||
while (pos+3 <= size) {
|
||||
while (pos < size) {
|
||||
// Number to read
|
||||
int read = size - pos;
|
||||
if (read > 3) read = 3;
|
||||
|
||||
// Read source
|
||||
src[0] = dat[pos];
|
||||
src[1] = dat[pos+1];
|
||||
src[2] = dat[pos+2];
|
||||
pos += 3;
|
||||
if (read >= 2) src[1] = dat[pos+1];
|
||||
else src[1] = 0;
|
||||
if (read == 3) src[2] = dat[pos+2];
|
||||
else src[2] = 0;
|
||||
pos += read;
|
||||
|
||||
// Codify
|
||||
dst[0] = src[0] >> 2;
|
||||
|
@ -119,13 +125,16 @@ const wxString AssAttachment::GetEntryData() {
|
|||
dst[2] = ((src[1] & 0xF) << 2) | ((src[2] & 0xC0) >> 6);
|
||||
dst[3] = src[2] & 0x3F;
|
||||
|
||||
// Number to write
|
||||
int toWrite = read+1;
|
||||
|
||||
// Convert to text
|
||||
for (int i=0;i<4;i++) {
|
||||
for (int i=0;i<toWrite;i++) {
|
||||
entryData += wxChar(dst[i]+33);
|
||||
written++;
|
||||
|
||||
// Line break
|
||||
if (written == 80) {
|
||||
if (written == 80 && pos < size) {
|
||||
written = 0;
|
||||
entryData += _T("\r\n");
|
||||
}
|
||||
|
@ -177,22 +186,24 @@ void AttachData::Finish() {
|
|||
// Read buffer
|
||||
while (ok) {
|
||||
// Find characters left
|
||||
int left = buffer.Length() - bufPos;
|
||||
int read = buffer.Length() - bufPos;
|
||||
if (read > 4) read = 4;
|
||||
int nbytes;
|
||||
|
||||
// At least four, proceed normally
|
||||
if (left >= 4) {
|
||||
if (read >= 2) {
|
||||
// Move 4 bytes from buffer to src
|
||||
for (int i=0;i<4;i++) {
|
||||
for (int i=0;i<read;i++) {
|
||||
src[i] = (unsigned char) buffer[bufPos] - 33;
|
||||
bufPos++;
|
||||
}
|
||||
for (int i=read;i<4;i++) src[i] = 0;
|
||||
ok = true;
|
||||
nbytes = 3;
|
||||
nbytes = read-1;
|
||||
}
|
||||
|
||||
// Zero, end
|
||||
else if (left == 0) {
|
||||
else {
|
||||
ok = false;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -233,10 +233,74 @@ wxString AssFile::GetString() {
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////
|
||||
// Appends line to Ass
|
||||
// -------------------
|
||||
// I strongly advice you against touching this function unless you know what you're doing;
|
||||
// even moving things out of order might break ASS parsing - AMZ.
|
||||
//
|
||||
int AssFile::AddLine (wxString data,wxString group,int lasttime,bool &IsSSA) {
|
||||
// Group
|
||||
AssEntry *entry = NULL;
|
||||
wxString origGroup = group;
|
||||
static wxString keepGroup;
|
||||
if (!keepGroup.IsEmpty()) group = keepGroup;
|
||||
|
||||
// Attachment
|
||||
if (group == _T("[Fonts]") || group == _T("[Graphics]")) {
|
||||
// Check if it's valid data
|
||||
size_t dataLen = data.Length();
|
||||
bool validData = (dataLen > 0) && (dataLen <= 80);
|
||||
for (size_t i=0;i<dataLen;i++) {
|
||||
if (data[i] < 33 || data[i] >= 97) validData = false;
|
||||
}
|
||||
|
||||
// Is the filename line?
|
||||
bool isFilename = (data.Left(10) == _T("fontname: ") && group == _T("[Fonts]")) || (data.Left(10) == _T("filename: ") && group == _T("[Graphics]"));
|
||||
|
||||
// The attachment file is static, since it is built through several calls to this
|
||||
// After it's done building, it's reset to NULL
|
||||
static AssAttachment *attach = NULL;
|
||||
|
||||
// Attachment exists, and data is over
|
||||
if (attach && (!validData || isFilename)) {
|
||||
attach->Finish();
|
||||
keepGroup.Clear();
|
||||
group = origGroup;
|
||||
Line.push_back(attach);
|
||||
attach = NULL;
|
||||
}
|
||||
|
||||
// Create attachment if needed
|
||||
if (isFilename) {
|
||||
attach = new AssAttachment(data.Mid(10));
|
||||
attach->StartMS = lasttime;
|
||||
attach->group = group;
|
||||
keepGroup = group;
|
||||
return lasttime;
|
||||
}
|
||||
|
||||
// Valid data?
|
||||
if (validData) {
|
||||
// Insert data
|
||||
attach->AddData(data);
|
||||
|
||||
// Done building
|
||||
if (data.Length() < 80) {
|
||||
attach->Finish();
|
||||
keepGroup.Clear();
|
||||
group = origGroup;
|
||||
entry = attach;
|
||||
attach = NULL;
|
||||
}
|
||||
|
||||
// Not done
|
||||
else {
|
||||
return lasttime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dialogue
|
||||
if (group == _T("[Events]")) {
|
||||
|
@ -270,54 +334,6 @@ int AssFile::AddLine (wxString data,wxString group,int lasttime,bool &IsSSA) {
|
|||
}
|
||||
}
|
||||
|
||||
// Attachment
|
||||
else if (group == _T("[Fonts]") || group == _T("[Graphics]")) {
|
||||
// Check if it's valid data
|
||||
size_t dataLen = data.Length();
|
||||
bool validData = (dataLen > 0) && (dataLen <= 80);
|
||||
for (size_t i=0;i<dataLen;i++) {
|
||||
if (data[i] < 33 || data[i] >= 97) validData = false;
|
||||
}
|
||||
|
||||
// Is the filename line?
|
||||
bool isFilename = (data.Left(10) == _T("fontname: ") && group == _T("[Fonts]")) || (data.Left(10) == _T("filename: ") && group == _T("[Graphics]"));
|
||||
|
||||
// The attachment file is static, since it is built through several calls to this
|
||||
// After it's done building, it's reset to NULL
|
||||
static AssAttachment *attach = NULL;
|
||||
|
||||
// Attachment exists, and data is over
|
||||
if (attach && (!validData || isFilename)) {
|
||||
attach->Finish();
|
||||
Line.push_back(attach);
|
||||
attach = NULL;
|
||||
}
|
||||
|
||||
// Create attachment if needed
|
||||
if (isFilename) {
|
||||
attach = new AssAttachment(data.Mid(10));
|
||||
attach->StartMS = lasttime;
|
||||
attach->group = group;
|
||||
return lasttime;
|
||||
}
|
||||
|
||||
// Valid data?
|
||||
if (validData) {
|
||||
// Insert data
|
||||
attach->AddData(data);
|
||||
|
||||
// Done building
|
||||
if (data.Length() < 80) {
|
||||
attach->Finish();
|
||||
entry = attach;
|
||||
attach = NULL;
|
||||
}
|
||||
|
||||
// Not done
|
||||
else return lasttime;
|
||||
}
|
||||
}
|
||||
|
||||
// Script info
|
||||
else if (group == _T("[Script Info]")) {
|
||||
// Comment
|
||||
|
|
Loading…
Reference in a new issue