QIBusPlatformInputContext::QIBusPlatformInputContext () : d(new QIBusPlatformInputContextPrivate()) { if (d->context) { connect(d->context, SIGNAL(CommitText(QDBusVariant)), SLOT(commitText(QDBusVariant))); connect(d->context, SIGNAL(UpdatePreeditText(QDBusVariant,uint,bool)), this, SLOT(updatePreeditText(QDBusVariant,uint,bool))); }
QIBusPlatformInputContext::QIBusPlatformInputContext () : d(new QIBusPlatformInputContextPrivate()) { if (d->context) { connect(d->context, SIGNAL(CommitText(QDBusVariant)), SLOT(commitText(QDBusVariant))); connect(d->context, SIGNAL(UpdatePreeditText(QDBusVariant,uint,bool)), this, SLOT(updatePreeditText(QDBusVariant,uint,bool))); connect(d->context, SIGNAL(DeleteSurroundingText(int,uint)), this, SLOT(deleteSurroundingText(int,uint))); connect(d->context, SIGNAL(RequireSurroundingText()), this, SLOT(surroundingTextRequired())); }
// m_buf_pos points to first byte of char void LVRtfParser::AddChar( lChar16 ch ) { if ( txtpos >= MAX_TXT_SIZE || ch==13 ) { CommitText(); m_stack.getDestination()->OnAction(LVRtfDestination::RA_PARA); } if ( txtpos==0 ) txtfstart = m_buf_fpos + m_buf_pos; txtbuf[txtpos++] = ch; }
void LVRtfParser::OnControlWord( const char * control, int param, bool asterisk ) { const rtf_control_word * cw = findControlWord( control ); if ( cw ) { switch ( cw->type ) { case CWT_CHAR: { lChar16 ch = (lChar16)cw->index; if ( ch==13 ) { // TODO: end of paragraph CommitText(); m_stack.getDestination()->OnAction(LVRtfDestination::RA_PARA); } else { AddChar(ch); } } break; case CWT_STYLE: break; case CWT_ACT: CommitText(); m_stack.getDestination()->OnAction(cw->index); break; case CWT_TPROP: CommitText(); if ( param == PARAM_VALUE_NONE ) param = cw->defvalue; m_stack.getDestination()->OnTblProp( cw->index, param ); break; case CWT_DEST: #ifdef LOG_RTF_PARSING CRLog::trace("DEST: \\%s", cw->name); #endif switch ( cw->index ) { case dest_upr: m_stack.set( pi_skip_ansi, 1 ); break; case dest_ud: m_stack.set( pi_skip_ansi, 0 ); break; case dest_fonttbl: m_stack.set( new LVRtfNullDestination(*this) ); break; case dest_stylesheet: m_stack.set( new LVRtfNullDestination(*this) ); break; case dest_footnote: m_stack.set( new LVRtfNullDestination(*this) ); break; case dest_info: case dest_header: case dest_footer: case dest_colortbl: m_stack.set( new LVRtfNullDestination(*this) ); break; case dest_pict: m_stack.set( new LVRtfPictDestination(*this) ); break; } break; case CWT_IPROP: CommitText(); if ( param == PARAM_VALUE_NONE ) param = cw->defvalue; #ifdef LOG_RTF_PARSING CRLog::trace("PROP: \\%s %d", cw->name, param); #endif m_stack.set( cw->index, param ); break; } } else { #ifdef LOG_RTF_PARSING CRLog::trace("CW: %s\\%s %d", asterisk?"\\*":"", control, param==PARAM_VALUE_NONE ? 0 : param); #endif if ( asterisk ) { // ignore text after unknown keyword m_stack.set( new LVRtfNullDestination(*this) ); #ifdef LOG_RTF_PARSING CRLog::trace("Ignoring unknown destination %s !!!", control ); #endif } } }
void LVRtfParser::OnBraceClose() { CommitText(); m_stack.restore(); }
void LVRtfParser::OnBraceOpen() { CommitText(); m_stack.save(); }
/// parses input stream bool LVRtfParser::Parse() { //m_conv_table = GetCharsetByte2UnicodeTable( L"cp1251" ); bool errorFlag = false; m_callback->OnStart(this); // make fb2 document structure m_callback->OnTagOpen( NULL, L"?xml" ); m_callback->OnAttribute( NULL, L"version", L"1.0" ); m_callback->OnAttribute( NULL, L"encoding", L"utf-8" ); //m_callback->OnEncoding( GetEncodingName().c_str(), GetCharsetTable( ) ); m_callback->OnTagBody(); m_callback->OnTagClose( NULL, L"?xml" ); m_callback->OnTagOpenNoAttr( NULL, L"FictionBook" ); // DESCRIPTION m_callback->OnTagOpenNoAttr( NULL, L"description" ); m_callback->OnTagOpenNoAttr( NULL, L"title-info" ); // lString16 bookTitle = LVExtractFilenameWithoutExtension( getFileName() ); //m_stream->GetName(); m_callback->OnTagOpenNoAttr( NULL, L"book-title" ); if ( !bookTitle.empty() ) m_callback->OnText( bookTitle.c_str(), bookTitle.length(), 0 ); //queue.DetectBookDescription( m_callback ); m_callback->OnTagOpenNoAttr( NULL, L"title-info" ); m_callback->OnTagClose( NULL, L"description" ); // BODY m_callback->OnTagOpenNoAttr( NULL, L"body" ); //m_callback->OnTagOpen( NULL, L"section" ); // process text //queue.DoTextImport( m_callback ); //m_callback->OnTagClose( NULL, L"section" ); txtbuf = new lChar16[ MAX_TXT_SIZE+1 ]; txtpos = 0; txtfstart = 0; char cwname[33]; while ( !Eof() && !errorFlag && !m_stopped ) { // load next portion of data if necessary if ( m_buf_len - m_buf_pos < MIN_BUF_DATA_SIZE ) { if ( !FillBuffer( MIN_BUF_DATA_SIZE*2 ) ) { errorFlag = true; break; } } int len = (int)m_buf_len - (int)m_buf_pos; // check end of file if ( len <=0 ) break; //EOF const lUInt8 * p = m_buf + m_buf_pos; lUInt8 ch = *p++; if ( ch=='{' ) { OnBraceOpen(); m_buf_pos++; continue; } else if ( ch=='}' ) { OnBraceClose(); m_buf_pos++; continue; } lUInt8 ch2 = *p; if ( ch=='\\' && *p!='\'' ) { // control bool asteriskFlag = false; if ( ch2=='*' ) { ch = *(++p); ch2 = *(++p); asteriskFlag = true; } if ( (ch2>='A' && ch2<='Z') || (ch2>='a' && ch2<='z') ) { // control word int cwi = 0; do { cwname[cwi++] = ch2; ch2 = *++p; } while ( ( (ch2>='A' && ch2<='Z') || (ch2>='a' && ch2<='z') ) && cwi<32 ); cwname[cwi] = 0; int param = PARAM_VALUE_NONE; if ( ch2==' ' ) { p++; } else { if ( ch2 == '-' ) { p++; param = 0; for ( ;; ) { ch2 = *++p; if ( ch2<'0' || ch2>'9' ) break; param = param * 10 + (ch2-'0'); } param = -param; } else if ( ch2>='0' && ch2<='9' ) { param = 0; while ( ch2>='0' && ch2<='9' ) { param = param * 10 + (ch2-'0'); ch2 = *++p; } } if ( *p == ' ' ) p++; } // \uN -- unicode character if ( cwi==1 && cwname[0]=='u' ) { AddChar( (lChar16) (param & 0xFFFF) ); // if ( m_stack.getInt( pi_skip_ch_count )==0 ) // m_stack.set( pi_skip_ch_count, 1 ); } else { // usual control word OnControlWord( cwname, param, asteriskFlag ); } } else { // control char cwname[0] = ch2; cwname[1] = 0; p++; OnControlWord( cwname, PARAM_VALUE_NONE, asteriskFlag ); } m_buf_pos += p - (m_buf + m_buf_pos); } else { //lChar16 txtch = 0; if ( ch=='\\' ) { p++; int digit1 = charToHex( p[0] ); int digit2 = charToHex( p[1] ); p+=2; if ( digit1>=0 && digit2>=0 ) { AddChar8( (lChar8)((digit1 << 4) | digit2) ); } else { AddChar('\\'); AddChar('\''); AddChar8(digit1); AddChar8(digit2); p+=2; } } else { if ( ch>=' ' ) { AddChar8( ch ); } else { // wrong char } } //======================================================= //======================================================= m_buf_pos += p - (m_buf + m_buf_pos); } } m_callback->OnStop(); delete[] txtbuf; txtbuf = NULL; CommitText(); m_stack.getDestination()->OnAction(LVRtfDestination::RA_SECTION); m_callback->OnTagClose( NULL, L"body" ); m_callback->OnTagClose( NULL, L"FictionBook" ); return !errorFlag; }