Пример #1
0
    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;
    }
Пример #2
0
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);
}