This forum has been archived. All content is frozen. Please use KDE Discuss instead.

Loading QByteArray in kword

Tags: None
(comma "," separated)
xyfix
Registered Member
Posts
110
Karma
0

Loading QByteArray in kword

Thu Sep 23, 2010 7:55 pm
hi, I'm using kword as kpart, the part is loaded and shown when I open a .fodt so it works( situation 1). But now I wanted to get kword to show a QByteArray content. This QByteArray is a previous saved kword document. Debugging shows that the QByteArray contains data but the kword part is not shown ( you get the same when you don't supply a .fodt in situation 1). I guess the problem lies in the loadReportFromDB.

This is my code:

report.cpp

Code: Select all
ReportEditor::ReportEditor ( QWidget *parentW,
  const QString &name,
  bool loadDoc )
: QWidget(parentW),
  mo_kwDoc(0),
  m_loadDoc( loadDoc )
{
  setObjectName(name);
  setWindowTitle( tr( "Report Editor" ) );

  QVBoxLayout* reportEditorLayout = new QVBoxLayout( this );
  reportEditorLayout->setObjectName("reportEditorLayout");
  reportEditorLayout->setMargin(2);

  QSplitter *sessionSplitter = new QSplitter( this );
  sessionSplitter->setObjectName("sessionSplitter");
  sessionSplitter->setOrientation( Qt::Horizontal );

  QWidget* privateLayoutWidget = new QWidget( sessionSplitter );
  privateLayoutWidget->setObjectName("privateLayoutWidget");

  KLibFactory *factory = KLibLoader::self()->factory("libkwordpart");

  if (factory)
  {
    mo_kwDoc = static_cast<KWDocument* >(factory->create(this, "KWordPart" ));
    assert( mo_kwDoc );

    mo_kwDoc->setParent(this);
    sessionSplitter->addWidget( mo_kwDoc->widget() );

    if( m_loadDoc )
    {
      loadReportFromDB();
    }
    else
    {
      mo_kwDoc->openUrl( KUrl( QDir::currentPath() + "/setup/blank.fodt" ));
    }

  }
  else
  {
      qDebug("the KLibfactory could not be created");
  }


  registerKPart( this,mo_kwDoc,MAINMenuToolsManager::onlyWhenVisible );
  reportEditorLayout->addWidget( sessionSplitter );
}

void
ReportEditor::registerKPart( QWidget* widget,
                                          KParts::Part *part,
                                          PluginOption option )
{
  std::map< QWidget*, PluginWidgetInfo* >::iterator plugIter = m_pluginWidgetMap.find(widget);
  if( plugIter == m_pluginWidgetMap.end() )
  {
    registerWidgetPlugin(widget, option);
    plugIter = m_pluginWidgetMap.find(widget);
    assert(plugIter != m_pluginWidgetMap.end());
  }

  plugIter->second->pluginOption = option;
  plugIter->second->part = part;

  m_mainWindow->newPart(part);
  if( option == onlyWhenVisible )
  {
    unplugMyPlugins(widget);
  }
}

void
ReportEditor::saveReportToDB()
{

  DATABase *db = sessionKernel->getDataBase();
  assert(db);

  DATAWriteSection* section( db->openWriteSection(  m_report->getSectionLabel()));

  assert( section );

  QByteArray buffer, compressed;

  buffer = mo_kwDoc->convertToByteArray();
  compressed = qCompress( buffer );

  *section << compressed;

  delete section;
  section = 0;

  db->close();
}


void
ReportEditor::loadReportFromDB()
{
  DATABase *db = sessionKernel->getDataBase();
  assert(db);

  DATAReadSection* section( db->openReadSection(  m_report->getSectionLabel()));

  assert( section );

  QByteArray buffer, uncompressed;

  *section >> buffer;
  uncompressed = qUncompress( buffer );

  //this doesn't show the kpart
  if( ! mo_kwDoc->loadNativeFormatFromStore( uncompressed ))
  {
  }

  delete section;
  section = 0;

  db->close();

}


and in KWDocument.cpp
Code: Select all
QByteArray KWDocument::convertContentToByteArray()
{
    KoStore::Backend backend = KoStore::Auto;

    QByteArray mimeType = d->outputMimeType;
    QByteArray nativeOasisMime = nativeOasisMimeType();
    //bool oasis = !mimeType.isEmpty() && (mimeType == nativeOasisMime || mimeType == nativeOasisMime + "-template");
    QByteArray data;
    QBuffer buffer( &data );

    KoStore* store = KoStore::createStore( buffer, KoStore::Write, mimeType, backend );
    store->disallowNameExpansion();
    KoOdfWriteStore odfStore(store);
    KoXmlWriter* manifestWriter = odfStore.manifestWriter(mimeType);
    KoEmbeddedDocumentSaver embeddedSaver;
    SavingContext documentContext(odfStore, embeddedSaver);

    if (!saveOdf(documentContext))
  {
      kDebug(30003) << "saveOdf failed";
      delete store;
      return false;
    }

    if (!embeddedSaver.saveEmbeddedDocuments(documentContext))
  {
      kDebug(30003) << "save embedded documents failed";
      delete store;
      return false;
    }

  if (store->open("meta.xml"))
  {
       if (!d->docInfo->saveOasis(store) || !store->close())
     {
         delete store;
         return false;
       }

       manifestWriter->addManifestEntry("meta.xml", "text/xml");
  }

  if (!odfStore.closeManifestWriter())
  {
      d->lastErrorMessage = i18n("Error while trying to write '%1'. Partition full?", QString("META-INF/manifest.xml"));
      delete store;
      return false;
    }

  delete store;

  return data;
}

Last edited by xyfix on Thu Sep 30, 2010 6:52 am, edited 1 time in total.
xyfix
Registered Member
Posts
110
Karma
0

Loading QByteArray in kword

Tue Sep 28, 2010 5:57 am
I guess I need to do something extra after the loadNativeFormatFromStore routine in order to get the kpart to be shown, anyone?

Last edited by xyfix on Thu Sep 30, 2010 6:53 am, edited 1 time in total.
xyfix
Registered Member
Posts
110
Karma
0

Loading QByteArray in kword

Wed Sep 29, 2010 1:07 pm
I added these functions in my code but I get a segmentation fault in KWDocument.cpp in function endOfLoading()

KWDocument.cpp:
Code: Select all
   // Get the master page name of the first page.
    QString firstPageMasterName;
    if (mainFrameSet()) {
        QTextBlock block = mainFrameSet()->document()->firstBlock(); //segfault here.


added code in

reporteditor.cpp:

Code: Select all
void
ReportEditor::loadReportFromDB()
{
  DATABase *db = sessionKernel->getDataBase();
  assert(db);

  DATAReadSection* section( db->openReadSection(  m_report->getSectionLabel()));

  assert( section );

  QByteArray buffer, uncompressed;

  *section >> buffer;
  uncompressed = qUncompress( buffer );

  KUrl url =  mo_kwDoc->convertFromByteArray( uncompressed );

  mo_kwDoc->openUrl( url );

  delete section;
  section = 0;

  db->close();

}


kwdocument.cpp:
Code: Select all
KUrl KoDocument::convertFromByteArray( QByteArray& bytes)
{
  KUrl tempUrl( "/tmp/tmpfile.fodt" );

  loadNativeFormatFromStore( bytes );

  if( ! saveAs( tempUrl ))
        kDebug(30003) << "the temporary file could not be created";

  return tempUrl;
}
xyfix
Registered Member
Posts
110
Karma
0

Re: Loading QByteArray in kword

Thu Sep 30, 2010 6:56 am
I've tried to create a odfReadStore with the KoStore (createStore(...)) and then do a loadAndParse(..) but that didn't seem to help, it doesn't crash but nothing is shown in my app not even the kpart/kword.

Code: Select all
void KoDocument::convertFromByteArray( QByteArray& bytes)
{
  KoStore* store = KoStore::createStore( bytes, KoStore::Read, d->outputMimeType, KoStore::Auto );
  store->disallowNameExpansion();
  KoOdfReadStore odfStore(store);
  loadOdf( odfStore );
}

xyfix
Registered Member
Posts
110
Karma
0

Re: Loading QByteArray in kword

Sat Oct 02, 2010 6:40 pm
I changed the code to the previous one and I can see that the file is created in the /tmp directory but when I want to open the file like in the test I get an error in the KParts::ReadWritePart::openUrl(). But when I open the file on a second attempt via an other routine the kword/kpart gets loaded and it shows my file.
Why not the first time with the code below ??

Code: Select all
KUrl KWDocument::convertFromByteArray( QByteArray& bytes)
{
  KUrl tempUrl( "/tmp/tmpfile.fodt" );

  loadNativeFormatFromStore( bytes );

  if( ! saveAs( tempUrl ))
        kDebug(30003) << "the temporary file could not be created";

  openUrl( tempUrl ); //test code
  return tempUrl;
}


Bookmarks



Who is online

Registered users: Bing [Bot], claydoh, Google [Bot], markhm, rblackwell, sethaaaa, Sogou [Bot], Yahoo [Bot]