[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdegraphics/okular/core
From:       Pino Toscano <pino () kde ! org>
Date:       2008-11-09 14:21:21
Message-ID: 1226240481.357863.2200.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 881991 by pino:

Shuffle a bit the way documents are opened:
- when there are no backends for handling the document mimetype, try harder using the \
                mimetype from the file content only
- when the backend fails loading, try again with the backend that handles the \
                mimetype of the file content
BUG: 166034


 M  +107 -62   document.cpp  
 M  +1 -0      document_p.h  


--- trunk/KDE/kdegraphics/okular/core/document.cpp #881990:881991
@@ -586,6 +586,86 @@
     return info.save;
 }
 
+bool DocumentPrivate::openDocumentInternal( const KService::Ptr& offer, bool \
isstdin, const QString& docFile, const QByteArray& filedata ) +{
+    QString propName = offer->name();
+    QHash< QString, GeneratorInfo >::const_iterator genIt = \
m_loadedGenerators.constFind( propName ); +    QString catalogName;
+    if ( genIt != m_loadedGenerators.constEnd() )
+    {
+        m_generator = genIt.value().generator;
+        catalogName = genIt.value().catalogName;
+    }
+    else
+    {
+        m_generator = loadGeneratorLibrary( offer );
+        if ( !m_generator )
+            return false;
+        genIt = m_loadedGenerators.constFind( propName );
+        Q_ASSERT( genIt != m_loadedGenerators.constEnd() );
+        catalogName = genIt.value().catalogName;
+    }
+    Q_ASSERT_X( m_generator, "Document::load()", "null generator?!" );
+
+    if ( !catalogName.isEmpty() )
+        KGlobal::locale()->insertCatalog( catalogName );
+
+    m_generator->d_func()->m_document = this;
+
+    // connect error reporting signals
+    QObject::connect( m_generator, SIGNAL( error( const QString&, int ) ), m_parent, \
SIGNAL( error( const QString&, int ) ) ); +    QObject::connect( m_generator, SIGNAL( \
warning( const QString&, int ) ), m_parent, SIGNAL( warning( const QString&, int ) ) \
); +    QObject::connect( m_generator, SIGNAL( notice( const QString&, int ) ), \
m_parent, SIGNAL( notice( const QString&, int ) ) ); +
+    QApplication::setOverrideCursor( Qt::WaitCursor );
+    bool openOk = false;
+    if ( !isstdin )
+    {
+        openOk = m_generator->loadDocument( docFile, m_pagesVector );
+    }
+    else if ( !filedata.isEmpty() )
+    {
+        if ( m_generator->hasFeature( Generator::ReadRawData ) )
+        {
+            openOk = m_generator->loadDocumentFromData( filedata, m_pagesVector );
+        }
+        else
+        {
+            m_tempFile = new KTemporaryFile();
+            if ( !m_tempFile->open() )
+            {
+                delete m_tempFile;
+                m_tempFile = 0;
+            }
+            else
+            {
+                m_tempFile->write( filedata );
+                QString tmpFileName = m_tempFile->fileName();
+                m_tempFile->close();
+                openOk = m_generator->loadDocument( tmpFileName, m_pagesVector );
+            }
+        }
+    }
+
+    QApplication::restoreOverrideCursor();
+    if ( !openOk || m_pagesVector.size() <= 0 )
+    {
+        if ( !catalogName.isEmpty() )
+            KGlobal::locale()->removeCatalog( catalogName );
+
+        m_generator->d_func()->m_document = 0;
+        QObject::disconnect( m_generator, 0, m_parent, 0 );
+        m_generator = 0;
+
+        qDeleteAll( m_pagesVector );
+        m_pagesVector.clear();
+        delete m_tempFile;
+        m_tempFile = 0;
+    }
+
+    return openOk;
+}
+
 void DocumentPrivate::saveDocumentInfo() const
 {
     if ( m_xmlFileName.isEmpty() )
@@ -1360,6 +1440,7 @@
     QByteArray filedata;
     qint64 document_size = -1;
     bool isstdin = url.fileName( KUrl::ObeyTrailingSlash ) == QLatin1String( "-" );
+    bool loadingMimeByContent = false;
     if ( !isstdin )
     {
         if ( mime.count() <= 0 )
@@ -1406,12 +1487,23 @@
         if ( !mime || mime->name() == QLatin1String( "application/octet-stream" ) )
             return false;
         document_size = filedata.size();
+        loadingMimeByContent = true;
     }
 
     // 0. load Generator
     // request only valid non-disabled plugins suitable for the mimetype
     QString constraint("([X-KDE-Priority] > 0) and (exist Library)") ;
     KService::List offers = \
KMimeTypeTrader::self()->query(mime->name(),"okular/Generator",constraint); +    if ( \
offers.isEmpty() && !isstdin ) +    {
+        KMimeType::Ptr newmime = KMimeType::findByFileContent( docFile );
+        loadingMimeByContent = true;
+        if ( newmime != mime )
+        {
+            mime = newmime;
+            offers = KMimeTypeTrader::self()->query( mime->name(), \
"okular/Generator", constraint ); +        }
+    }
     if (offers.isEmpty())
     {
         emit error( i18n( "Can not find a plugin which is able to handle the \
document being passed." ), -1 ); @@ -1443,77 +1535,30 @@
         }
     }
 
-    QString propName = offers.at(hRank)->name();
-    QHash< QString, GeneratorInfo >::const_iterator genIt = \
                d->m_loadedGenerators.constFind( propName );
-    QString catalogName;
-    if ( genIt != d->m_loadedGenerators.constEnd() )
+    KService::Ptr offer = offers.at( hRank );
+    // 1. load Document
+    bool openOk = d->openDocumentInternal( offer, isstdin, docFile, filedata );
+    if ( !openOk && !loadingMimeByContent )
     {
-        d->m_generator = genIt.value().generator;
-        catalogName = genIt.value().catalogName;
-    }
-    else
-    {
-        d->m_generator = d->loadGeneratorLibrary( offers.at(hRank) );
-        if ( !d->m_generator )
-            return false;
-        genIt = d->m_loadedGenerators.constFind( propName );
-        Q_ASSERT( genIt != d->m_loadedGenerators.constEnd() );
-        catalogName = genIt.value().catalogName;
-    }
-    Q_ASSERT_X( d->m_generator, "Document::load()", "null generator?!" );
-
-    if ( !catalogName.isEmpty() )
-        KGlobal::locale()->insertCatalog( catalogName );
-
-    d->m_generator->d_func()->m_document = d;
-
-    // connect error reporting signals
-    connect( d->m_generator, SIGNAL( error( const QString&, int ) ), this, SIGNAL( \
                error( const QString&, int ) ) );
-    connect( d->m_generator, SIGNAL( warning( const QString&, int ) ), this, SIGNAL( \
                warning( const QString&, int ) ) );
-    connect( d->m_generator, SIGNAL( notice( const QString&, int ) ), this, SIGNAL( \
                notice( const QString&, int ) ) );
-
-    // 1. load Document (and set busy cursor while loading)
-    QApplication::setOverrideCursor( Qt::WaitCursor );
-    bool openOk = false;
-    if ( !isstdin )
-    {
-        openOk = d->m_generator->loadDocument( docFile, d->m_pagesVector );
-    }
-    else if ( !filedata.isEmpty() )
-    {
-        if ( d->m_generator->hasFeature( Generator::ReadRawData ) )
+        KMimeType::Ptr newmime = KMimeType::findByFileContent( docFile );
+        loadingMimeByContent = true;
+        if ( newmime != mime )
         {
-            openOk = d->m_generator->loadDocumentFromData( filedata, \
                d->m_pagesVector );
-        }
-        else
-        {
-            d->m_tempFile = new KTemporaryFile();
-            if ( !d->m_tempFile->open() )
+            mime = newmime;
+            offers = KMimeTypeTrader::self()->query( mime->name(), \
"okular/Generator", constraint ); +            if ( !offers.isEmpty() )
             {
-                delete d->m_tempFile;
-                d->m_tempFile = 0;
+                offer = offers.first();
+                openOk = d->openDocumentInternal( offer, isstdin, docFile, filedata \
);  }
-            else
-            {
-                d->m_tempFile->write( filedata );
-                QString tmpFileName = d->m_tempFile->fileName();
-                d->m_tempFile->close();
-                openOk = d->m_generator->loadDocument( tmpFileName, d->m_pagesVector \
                );
-            }
         }
     }
-
-    QApplication::restoreOverrideCursor();
-    if ( !openOk || d->m_pagesVector.size() <= 0 )
+    if ( !openOk )
     {
-        if ( !catalogName.isEmpty() )
-            KGlobal::locale()->removeCatalog( catalogName );
-
-        d->m_generator = 0;
-        return openOk;
+        return false;
     }
 
-    d->m_generatorName = propName;
+    d->m_generatorName = offer->name();
 
     // 2. load Additional Data (our bookmarks and metadata) about the document
     d->loadDocumentInfo();
--- trunk/KDE/kdegraphics/okular/core/document_p.h #881990:881991
@@ -107,6 +107,7 @@
         void setRotationInternal( int r, bool notify );
         ConfigInterface* generatorConfig( GeneratorInfo& info );
         SaveInterface* generatorSave( GeneratorInfo& info );
+        bool openDocumentInternal( const KService::Ptr& offer, bool isstdin, const \
QString& docFile, const QByteArray& filedata );  
         // private slots
         void saveDocumentInfo() const;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic