STXTTranslator: Fix truncated "be:encoding" attribute write.

Same issue as the mail_util fix.

Also while I'm here, alter behavior so that the Be-style attribute
gets overwritten with the Haiku-style one, instead of getting left
as is.

Should potentially help with #14674.
This commit is contained in:
Augustin Cavalier
2018-11-11 15:58:45 -05:00
parent 398bb93961
commit 5f5cc39c2c
+11 -14
View File
@@ -247,7 +247,7 @@ identify_text(uint8* data, int32 bytesRead, BPositionIO* source,
outInfo->quality = TEXT_IN_QUALITY; outInfo->quality = TEXT_IN_QUALITY;
outInfo->capability = capability; outInfo->capability = capability;
strlcpy(outInfo->name, B_TRANSLATE("Plain text file"), strlcpy(outInfo->name, B_TRANSLATE("Plain text file"),
sizeof(outInfo->name)); sizeof(outInfo->name));
//strlcpy(outInfo->MIME, type.Type(), sizeof(outInfo->MIME)); //strlcpy(outInfo->MIME, type.Type(), sizeof(outInfo->MIME));
@@ -474,7 +474,7 @@ output_styles(BPositionIO *outDestination, uint32 text_size,
styled text in outDestination styled text in outDestination
*/ */
status_t status_t
translate_from_text(BPositionIO* source, const char* encoding, bool forceEncoding, translate_from_text(BPositionIO* source, const char* outEncoding, bool forceEncoding,
BPositionIO* destination, uint32 outType) BPositionIO* destination, uint32 outType)
{ {
if (outType != B_TRANSLATOR_TEXT && outType != B_STYLED_TEXT_FORMAT) if (outType != B_TRANSLATOR_TEXT && outType != B_STYLED_TEXT_FORMAT)
@@ -524,17 +524,16 @@ translate_from_text(BPositionIO* source, const char* encoding, bool forceEncodin
BMallocIO encodingIO; BMallocIO encodingIO;
BNode* node = dynamic_cast<BNode*>(source); BNode* node = dynamic_cast<BNode*>(source);
BString name(encoding); BString encoding(outEncoding);
if (node != NULL) { if (node != NULL) {
// determine encoding, if available // determine encoding, if available
bool hasAttribute = false; bool hasAttribute = false;
if (encoding != NULL && !forceEncoding) { if (encoding.String() && !forceEncoding) {
attr_info info; attr_info info;
node->GetAttrInfo("be:encoding", &info); node->GetAttrInfo("be:encoding", &info);
if ((info.type == B_STRING_TYPE) && (node->ReadAttrString( if ((info.type == B_STRING_TYPE) && (node->ReadAttrString(
"be:encoding", &name) == B_OK)) { "be:encoding", &encoding) == B_OK)) {
encoding = name.String();
hasAttribute = true; hasAttribute = true;
} else if (info.type == B_INT32_TYPE) { } else if (info.type == B_INT32_TYPE) {
// Try the BeOS version of the atribute, which used an int32 // Try the BeOS version of the atribute, which used an int32
@@ -543,7 +542,6 @@ translate_from_text(BPositionIO* source, const char* encoding, bool forceEncodin
ssize_t bytesRead = node->ReadAttr("be:encoding", B_INT32_TYPE, 0, ssize_t bytesRead = node->ReadAttr("be:encoding", B_INT32_TYPE, 0,
&value, sizeof(value)); &value, sizeof(value));
if (bytesRead == (ssize_t)sizeof(value)) { if (bytesRead == (ssize_t)sizeof(value)) {
hasAttribute = true;
if (value != 65535) { if (value != 65535) {
const BCharacterSet* characterSet const BCharacterSet* characterSet
= BCharacterSetRoster::GetCharacterSetByConversionID(value); = BCharacterSetRoster::GetCharacterSetByConversionID(value);
@@ -557,21 +555,20 @@ translate_from_text(BPositionIO* source, const char* encoding, bool forceEncodin
// we don't write the encoding in this case // we don't write the encoding in this case
} }
if (encoding != NULL) if (!encoding.IsEmpty())
encodingBuffer.Allocate(READ_BUFFER_SIZE * 4); encodingBuffer.Allocate(READ_BUFFER_SIZE * 4);
if (!hasAttribute && encoding != NULL) { if (!hasAttribute && !encoding.IsEmpty()) {
// add encoding attribute, so that someone opening the file can // add encoding attribute, so that someone opening the file can
// retrieve it for persistance // retrieve it for persistance
node->WriteAttr("be:encoding", B_STRING_TYPE, 0, encoding, node->WriteAttrString("be:encoding", &encoding);
strlen(encoding));
} }
} }
off_t outputSize = 0; off_t outputSize = 0;
ssize_t bytesRead; ssize_t bytesRead;
BPrivate::BTextEncoding codec(encoding); BPrivate::BTextEncoding codec(encoding.String());
// output the actual text part of the data // output the actual text part of the data
do { do {
@@ -682,7 +679,7 @@ translate_from_text(BPositionIO* source, const char* encoding, bool forceEncodin
STXTTranslator::STXTTranslator() STXTTranslator::STXTTranslator()
: BaseTranslator(B_TRANSLATE("StyledEdit files"), : BaseTranslator(B_TRANSLATE("StyledEdit files"),
B_TRANSLATE("StyledEdit file translator"), B_TRANSLATE("StyledEdit file translator"),
STXT_TRANSLATOR_VERSION, STXT_TRANSLATOR_VERSION,
sInputFormats, kNumInputFormats, sInputFormats, kNumInputFormats,
@@ -805,7 +802,7 @@ STXTTranslator::Translate(BPositionIO* source, const translator_info* info,
BView * BView *
STXTTranslator::NewConfigView(TranslatorSettings *settings) STXTTranslator::NewConfigView(TranslatorSettings *settings)
{ {
return new STXTView(BRect(0, 0, 225, 175), return new STXTView(BRect(0, 0, 225, 175),
B_TRANSLATE("STXTTranslator Settings"), B_TRANSLATE("STXTTranslator Settings"),
B_FOLLOW_ALL, B_WILL_DRAW, settings); B_FOLLOW_ALL, B_WILL_DRAW, settings);
} }