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 1270d59669SSiarzhuk 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 1770d59669SSiarzhuk Zharski #undef B_TRANSLATE_CONTEXT 1870d59669SSiarzhuk 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]; 6070d59669SSiarzhuk Zharski sprintf(info, B_TRANSLATE("Rich Text Format translator v%d.%d.%d %s"), 6170d59669SSiarzhuk Zharski static_cast<int>(B_TRANSLATION_MAJOR_VERSION(RTF_TRANSLATOR_VERSION)), 6270d59669SSiarzhuk Zharski static_cast<int>(B_TRANSLATION_MINOR_VERSION(RTF_TRANSLATOR_VERSION)), 6370d59669SSiarzhuk Zharski static_cast<int>(B_TRANSLATION_REVISION_VERSION( 6470d59669SSiarzhuk 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 { 8070d59669SSiarzhuk 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 { 8770d59669SSiarzhuk 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*aec33db1SPhilippe Saint-Pierre strlcpy(info->name, B_TRANSLATE("RichTextFormat file"), 1393927bd3cSPhilippe Saint-Pierre sizeof(info->name)); 1409949213aSStephan Aßmus strcpy(info->MIME, "text/rtf"); 1419949213aSStephan Aßmus 1429949213aSStephan Aßmus return B_OK; 1439949213aSStephan Aßmus } 1449949213aSStephan Aßmus 1459949213aSStephan Aßmus 1469949213aSStephan Aßmus status_t 1479949213aSStephan Aßmus RTFTranslator::Translate(BPositionIO *source, 1489949213aSStephan Aßmus const translator_info *inInfo, BMessage *ioExtension, 1499949213aSStephan Aßmus uint32 outType, BPositionIO *target) 1509949213aSStephan Aßmus { 1519949213aSStephan Aßmus if (target == NULL || source == NULL) 1529949213aSStephan Aßmus return B_BAD_VALUE; 1539949213aSStephan Aßmus 1549949213aSStephan Aßmus if (!outType) 1559949213aSStephan Aßmus outType = B_TRANSLATOR_TEXT; 1569949213aSStephan Aßmus if (outType != B_TRANSLATOR_TEXT && outType != B_STYLED_TEXT_FORMAT) 1579949213aSStephan Aßmus return B_NO_TRANSLATOR; 1589949213aSStephan Aßmus 1599949213aSStephan Aßmus RTF::Parser parser(*source); 1609949213aSStephan Aßmus 1619949213aSStephan Aßmus RTF::Header header; 1629949213aSStephan Aßmus status_t status = parser.Parse(header); 1639949213aSStephan Aßmus if (status != B_OK) 1649949213aSStephan Aßmus return status; 1659949213aSStephan Aßmus 1669949213aSStephan Aßmus // we support two different output formats 1679949213aSStephan Aßmus 1689949213aSStephan Aßmus if (outType == B_TRANSLATOR_TEXT) 1699949213aSStephan Aßmus return convert_to_plain_text(header, *target); 1709949213aSStephan Aßmus 1719949213aSStephan Aßmus return convert_to_stxt(header, *target); 1729949213aSStephan Aßmus } 1739949213aSStephan Aßmus 1749949213aSStephan Aßmus 1759949213aSStephan Aßmus status_t 17670d59669SSiarzhuk Zharski RTFTranslator::MakeConfigurationView(BMessage *ioExtension, BView **_view, 17770d59669SSiarzhuk Zharski BRect *_extent) 1789949213aSStephan Aßmus { 1799949213aSStephan Aßmus if (_view == NULL || _extent == NULL) 1809949213aSStephan Aßmus return B_BAD_VALUE; 1819949213aSStephan Aßmus 1829949213aSStephan Aßmus BView *view = new ConfigView(BRect(0, 0, 225, 175)); 1839949213aSStephan Aßmus if (view == NULL) 1849949213aSStephan Aßmus return BTranslator::MakeConfigurationView(ioExtension, _view, _extent); 1859949213aSStephan Aßmus 1869949213aSStephan Aßmus *_view = view; 1879949213aSStephan Aßmus *_extent = view->Bounds(); 1889949213aSStephan Aßmus return B_OK; 1899949213aSStephan Aßmus } 1909949213aSStephan Aßmus 1919949213aSStephan Aßmus 1929949213aSStephan Aßmus // #pragma mark - 1939949213aSStephan Aßmus 1949949213aSStephan Aßmus 1959949213aSStephan Aßmus BTranslator * 1969949213aSStephan Aßmus make_nth_translator(int32 n, image_id you, uint32 flags, ...) 1979949213aSStephan Aßmus { 1989949213aSStephan Aßmus if (n != 0) 1999949213aSStephan Aßmus return NULL; 2009949213aSStephan Aßmus 2019949213aSStephan Aßmus return new RTFTranslator(); 2029949213aSStephan Aßmus } 2039949213aSStephan Aßmus 204