void STTBF::init( U16 lid, OLEStreamReader* reader, const U8* ptr ) { bool extended = false; U16 count = readU16( reader, &ptr ); // "extended" characters? if ( count == 0xffff ) { extended = true; // read the real size count = readU16( reader, &ptr ); } m_extraDataLength = readU16( reader, &ptr ); // If we don't read unicode strings we have to set up a text converter TextConverter* textconverter = 0; if ( !extended ) textconverter = new TextConverter( lid ); // read one string after the other for ( U16 i = 0; i < count; ++i ) { U16 len = 0; if ( extended ) // double byte count! len = readU16( reader, &ptr ); else len = readU8( reader, &ptr ); if ( len != 0 ) { if ( extended ) { XCHAR* string = new XCHAR[ len ]; for ( U16 j = 0; j < len; ++j ) string[ j ] = readU16( reader, &ptr ); UString ustring( reinterpret_cast<const wvWare::UChar *>( string ), len ); delete [] string; m_strings.push_back( ustring ); } else { U8* string = new U8[ len ]; read( reader, &ptr, string, len ); UString ustring( textconverter->convert( reinterpret_cast<char*>( string ), static_cast<unsigned int>( len ) ) ); delete [] string; m_strings.push_back( ustring ); } } else m_strings.push_back( UString("") ); if ( m_extraDataLength != 0 ) { U8* extra = new U8[ m_extraDataLength ]; read( reader, &ptr, extra, m_extraDataLength ); m_extraData.push_back( extra ); } } delete textconverter; }
std::string RTFParser::plainText() { impl->m_error = false; UString text; TextConverter* converter = NULL; FILE* f = fopen(impl->m_file_name.c_str(), "r"); if (f == NULL) { *impl->m_log_stream << "Error opening file " << impl->m_file_name << ".\n"; impl->m_error = true; return ""; } int ch; RTFParserState state; state.groups.push(RTFGroup()); state.groups.top().uc = 1; state.last_font_ref_num = 0; int skip = 0; while ((ch = fgetc(f)) != EOF) { switch (ch) { case '\\': RTFCommand cmd; long int arg; if (!parseCommand(f, cmd, arg, impl->m_verbose_logging, *impl->m_log_stream)) break; execCommand(f, text, skip, state, cmd, arg, converter, impl->m_verbose_logging, *impl->m_log_stream); break; case '{': state.groups.push(state.groups.top()); break; case '}': state.groups.pop(); if (skip > state.groups.size() - 1) skip = 0; break; default: if (skip == 0 && ch != '\n' && ch != '\r') { if (converter != NULL) text += converter->convert((const char*)&ch, sizeof(ch)); else text += UString((UChar)ch); } } } fclose(f); if (converter != NULL) delete converter; return ustring_to_string(text); }