xref: /haiku/src/add-ons/translators/rtf/RTFTranslator.cpp (revision 70d5966963513ff47a456ba70b7d2eec0f99648d)
19949213aSStephan Aßmus /*
29949213aSStephan Aßmus  * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
39949213aSStephan Aßmus  * Distributed under the terms of the MIT License.
49949213aSStephan Aßmus  */
59949213aSStephan Aßmus 
69949213aSStephan Aßmus 
79949213aSStephan Aßmus #include "RTFTranslator.h"
89949213aSStephan Aßmus #include "ConfigView.h"
99949213aSStephan Aßmus #include "RTF.h"
109949213aSStephan Aßmus #include "convert.h"
119949213aSStephan Aßmus 
12*70d59669SSiarzhuk Zharski #include <Catalog.h>
139949213aSStephan Aßmus #include <stdlib.h>
149949213aSStephan Aßmus #include <stdio.h>
159949213aSStephan Aßmus #include <string.h>
169949213aSStephan Aßmus 
17*70d59669SSiarzhuk Zharski #undef B_TRANSLATE_CONTEXT
18*70d59669SSiarzhuk Zharski #define B_TRANSLATE_CONTEXT "RTFTranslator"
199949213aSStephan Aßmus 
209949213aSStephan Aßmus #define READ_BUFFER_SIZE 2048
219949213aSStephan Aßmus #define DATA_BUFFER_SIZE 64
229949213aSStephan Aßmus 
239949213aSStephan Aßmus 
249949213aSStephan Aßmus // The input formats that this translator supports.
25bf243977SPhilippe Houdoin static const translation_format sInputFormats[] = {
269949213aSStephan Aßmus 	{
279949213aSStephan Aßmus 		RTF_TEXT_FORMAT,
289949213aSStephan Aßmus 		B_TRANSLATOR_TEXT,
299949213aSStephan Aßmus 		RTF_IN_QUALITY,
309949213aSStephan Aßmus 		RTF_IN_CAPABILITY,
319949213aSStephan Aßmus 		"text/rtf",
329949213aSStephan Aßmus 		"RichTextFormat file"
33bf243977SPhilippe Houdoin 	}
349949213aSStephan Aßmus };
359949213aSStephan Aßmus 
369949213aSStephan Aßmus // The output formats that this translator supports.
37bf243977SPhilippe Houdoin static const translation_format sOutputFormats[] = {
389949213aSStephan Aßmus 	{
399949213aSStephan Aßmus 		B_TRANSLATOR_TEXT,
409949213aSStephan Aßmus 		B_TRANSLATOR_TEXT,
419949213aSStephan Aßmus 		TEXT_OUT_QUALITY,
429949213aSStephan Aßmus 		TEXT_OUT_CAPABILITY,
439949213aSStephan Aßmus 		"text/plain",
449949213aSStephan Aßmus 		"Plain text file"
459949213aSStephan Aßmus 	},
469949213aSStephan Aßmus 	{
479949213aSStephan Aßmus 		B_STYLED_TEXT_FORMAT,
489949213aSStephan Aßmus 		B_TRANSLATOR_TEXT,
499949213aSStephan Aßmus 		STXT_OUT_QUALITY,
509949213aSStephan Aßmus 		STXT_OUT_CAPABILITY,
519949213aSStephan Aßmus 		"text/x-vnd.Be-stxt",
529949213aSStephan Aßmus 		"Be styled text file"
539949213aSStephan Aßmus 	}
549949213aSStephan Aßmus };
559949213aSStephan Aßmus 
569949213aSStephan Aßmus 
579949213aSStephan Aßmus RTFTranslator::RTFTranslator()
589949213aSStephan Aßmus {
599949213aSStephan Aßmus 	char info[256];
60*70d59669SSiarzhuk Zharski 	sprintf(info, B_TRANSLATE("Rich Text Format translator v%d.%d.%d %s"),
61*70d59669SSiarzhuk Zharski 		static_cast<int>(B_TRANSLATION_MAJOR_VERSION(RTF_TRANSLATOR_VERSION)),
62*70d59669SSiarzhuk Zharski 		static_cast<int>(B_TRANSLATION_MINOR_VERSION(RTF_TRANSLATOR_VERSION)),
63*70d59669SSiarzhuk Zharski 		static_cast<int>(B_TRANSLATION_REVISION_VERSION(
64*70d59669SSiarzhuk Zharski 			RTF_TRANSLATOR_VERSION)),
659949213aSStephan Aßmus 		__DATE__);
669949213aSStephan Aßmus 
679949213aSStephan Aßmus 	fInfo = strdup(info);
689949213aSStephan Aßmus }
699949213aSStephan Aßmus 
709949213aSStephan Aßmus 
719949213aSStephan Aßmus RTFTranslator::~RTFTranslator()
729949213aSStephan Aßmus {
739949213aSStephan Aßmus 	free(fInfo);
749949213aSStephan Aßmus }
759949213aSStephan Aßmus 
769949213aSStephan Aßmus 
779949213aSStephan Aßmus const char *
789949213aSStephan Aßmus RTFTranslator::TranslatorName() const
799949213aSStephan Aßmus {
80*70d59669SSiarzhuk Zharski 	return B_TRANSLATE("RTF text files");
819949213aSStephan Aßmus }
829949213aSStephan Aßmus 
839949213aSStephan Aßmus 
849949213aSStephan Aßmus const char *
859949213aSStephan Aßmus RTFTranslator::TranslatorInfo() const
869949213aSStephan Aßmus {
87*70d59669SSiarzhuk Zharski 	return B_TRANSLATE("Rich Text Format Translator");
889949213aSStephan Aßmus }
899949213aSStephan Aßmus 
909949213aSStephan Aßmus 
919949213aSStephan Aßmus int32
929949213aSStephan Aßmus RTFTranslator::TranslatorVersion() const
939949213aSStephan Aßmus {
949949213aSStephan Aßmus 	return RTF_TRANSLATOR_VERSION;
959949213aSStephan Aßmus }
969949213aSStephan Aßmus 
979949213aSStephan Aßmus 
989949213aSStephan Aßmus const translation_format *
999949213aSStephan Aßmus RTFTranslator::InputFormats(int32 *_outCount) const
1009949213aSStephan Aßmus {
1019949213aSStephan Aßmus 	if (_outCount == NULL)
1029949213aSStephan Aßmus 		return NULL;
1039949213aSStephan Aßmus 
1049949213aSStephan Aßmus 	*_outCount = sizeof(sInputFormats) / sizeof(translation_format);
1059949213aSStephan Aßmus 	return sInputFormats;
1069949213aSStephan Aßmus }
1079949213aSStephan Aßmus 
1089949213aSStephan Aßmus 
1099949213aSStephan Aßmus const translation_format *
1109949213aSStephan Aßmus RTFTranslator::OutputFormats(int32 *_outCount) const
1119949213aSStephan Aßmus {
1129949213aSStephan Aßmus 	*_outCount = sizeof(sOutputFormats) / sizeof(translation_format);
1139949213aSStephan Aßmus 	return sOutputFormats;
1149949213aSStephan Aßmus }
1159949213aSStephan Aßmus 
1169949213aSStephan Aßmus 
1179949213aSStephan Aßmus status_t
1189949213aSStephan Aßmus RTFTranslator::Identify(BPositionIO *stream,
1199949213aSStephan Aßmus 	const translation_format *format, BMessage *ioExtension,
1209949213aSStephan Aßmus 	translator_info *info, uint32 outType)
1219949213aSStephan Aßmus {
1229949213aSStephan Aßmus 	if (!outType)
1239949213aSStephan Aßmus 		outType = B_TRANSLATOR_TEXT;
1249949213aSStephan Aßmus 	if (outType != B_TRANSLATOR_TEXT && outType != B_STYLED_TEXT_FORMAT)
1259949213aSStephan Aßmus 		return B_NO_TRANSLATOR;
1269949213aSStephan Aßmus 
1279949213aSStephan Aßmus 	RTF::Parser parser(*stream);
1289949213aSStephan Aßmus 
1299949213aSStephan Aßmus 	status_t status = parser.Identify();
1309949213aSStephan Aßmus 	if (status != B_OK)
1319949213aSStephan Aßmus 		return B_NO_TRANSLATOR;
1329949213aSStephan Aßmus 
1339949213aSStephan Aßmus 	// return information about the data in the stream
1349949213aSStephan Aßmus 	info->type = B_TRANSLATOR_TEXT; //RTF_TEXT_FORMAT;
1359949213aSStephan Aßmus 	info->group = B_TRANSLATOR_TEXT;
1369949213aSStephan Aßmus 	info->quality = RTF_IN_QUALITY;
1379949213aSStephan Aßmus 	info->capability = RTF_IN_CAPABILITY;
138*70d59669SSiarzhuk Zharski 	strcpy(info->name, B_TRANSLATE("RichTextFormat file"));
1399949213aSStephan Aßmus 	strcpy(info->MIME, "text/rtf");
1409949213aSStephan Aßmus 
1419949213aSStephan Aßmus 	return B_OK;
1429949213aSStephan Aßmus }
1439949213aSStephan Aßmus 
1449949213aSStephan Aßmus 
1459949213aSStephan Aßmus status_t
1469949213aSStephan Aßmus RTFTranslator::Translate(BPositionIO *source,
1479949213aSStephan Aßmus 	const translator_info *inInfo, BMessage *ioExtension,
1489949213aSStephan Aßmus 	uint32 outType, BPositionIO *target)
1499949213aSStephan Aßmus {
1509949213aSStephan Aßmus 	if (target == NULL || source == NULL)
1519949213aSStephan Aßmus 		return B_BAD_VALUE;
1529949213aSStephan Aßmus 
1539949213aSStephan Aßmus 	if (!outType)
1549949213aSStephan Aßmus 		outType = B_TRANSLATOR_TEXT;
1559949213aSStephan Aßmus 	if (outType != B_TRANSLATOR_TEXT && outType != B_STYLED_TEXT_FORMAT)
1569949213aSStephan Aßmus 		return B_NO_TRANSLATOR;
1579949213aSStephan Aßmus 
1589949213aSStephan Aßmus 	RTF::Parser parser(*source);
1599949213aSStephan Aßmus 
1609949213aSStephan Aßmus 	RTF::Header header;
1619949213aSStephan Aßmus 	status_t status = parser.Parse(header);
1629949213aSStephan Aßmus 	if (status != B_OK)
1639949213aSStephan Aßmus 		return status;
1649949213aSStephan Aßmus 
1659949213aSStephan Aßmus 	// we support two different output formats
1669949213aSStephan Aßmus 
1679949213aSStephan Aßmus 	if (outType == B_TRANSLATOR_TEXT)
1689949213aSStephan Aßmus 		return convert_to_plain_text(header, *target);
1699949213aSStephan Aßmus 
1709949213aSStephan Aßmus 	return convert_to_stxt(header, *target);
1719949213aSStephan Aßmus }
1729949213aSStephan Aßmus 
1739949213aSStephan Aßmus 
1749949213aSStephan Aßmus status_t
175*70d59669SSiarzhuk Zharski RTFTranslator::MakeConfigurationView(BMessage *ioExtension, BView **_view,
176*70d59669SSiarzhuk Zharski 	BRect *_extent)
1779949213aSStephan Aßmus {
1789949213aSStephan Aßmus 	if (_view == NULL || _extent == NULL)
1799949213aSStephan Aßmus 		return B_BAD_VALUE;
1809949213aSStephan Aßmus 
1819949213aSStephan Aßmus 	BView *view = new ConfigView(BRect(0, 0, 225, 175));
1829949213aSStephan Aßmus 	if (view == NULL)
1839949213aSStephan Aßmus 		return BTranslator::MakeConfigurationView(ioExtension, _view, _extent);
1849949213aSStephan Aßmus 
1859949213aSStephan Aßmus 	*_view = view;
1869949213aSStephan Aßmus 	*_extent = view->Bounds();
1879949213aSStephan Aßmus 	return B_OK;
1889949213aSStephan Aßmus }
1899949213aSStephan Aßmus 
1909949213aSStephan Aßmus 
1919949213aSStephan Aßmus //	#pragma mark -
1929949213aSStephan Aßmus 
1939949213aSStephan Aßmus 
1949949213aSStephan Aßmus BTranslator *
1959949213aSStephan Aßmus make_nth_translator(int32 n, image_id you, uint32 flags, ...)
1969949213aSStephan Aßmus {
1979949213aSStephan Aßmus 	if (n != 0)
1989949213aSStephan Aßmus 		return NULL;
1999949213aSStephan Aßmus 
2009949213aSStephan Aßmus 	return new RTFTranslator();
2019949213aSStephan Aßmus }
2029949213aSStephan Aßmus 
203