bool KonqView::changePart(const QString &mimeType, const QString &serviceName, bool forceAutoEmbed) { // Caller should call stop first. assert( !m_bLoading ); //kDebug() << "mimeType=" << mimeType // << "requested serviceName=" << serviceName // << "current service name=" << m_service->desktopEntryName(); if (serviceName == m_service->desktopEntryName()) { m_serviceType = mimeType; return true; } if (isLockedViewMode()) { //kDebug() << "This view's mode is locked - can't change"; return false; // we can't do that if our view mode is locked } KService::List partServiceOffers, appServiceOffers; KService::Ptr service; KonqFactory konqFactory; KonqViewFactory viewFactory = konqFactory.createView( mimeType, serviceName, &service, &partServiceOffers, &appServiceOffers, forceAutoEmbed ); if ( viewFactory.isNull() ) { // Revert location bar's URL to the working one if(currentHistoryEntry()) setLocationBarURL( currentHistoryEntry()->locationBarURL ); return false; } m_serviceType = mimeType; m_partServiceOffers = partServiceOffers; m_appServiceOffers = appServiceOffers; // Check if that's already the kind of part we have -> no need to recreate it // Note: we should have an operator== for KService... if ( m_service && m_service->entryPath() == service->entryPath() ) { kDebug() << "Reusing service. Service type set to" << m_serviceType; if ( m_pMainWindow->currentView() == this ) m_pMainWindow->updateViewModeActions(); } else { m_service = service; switchView( viewFactory ); } return true; }
KonqViewFactory KonqFactory::createView( const QString &serviceType, const QString &serviceName, KService::Ptr *serviceImpl, KService::List *partServiceOffers, KService::List *appServiceOffers, bool forceAutoEmbed ) { kDebug() << "Trying to create view for" << serviceType << serviceName; // We need to get those in any case KService::List offers, appOffers; // Query the trader getOffers( serviceType, &offers, &appOffers ); if ( partServiceOffers ) (*partServiceOffers) = offers; if ( appServiceOffers ) (*appServiceOffers) = appOffers; // We ask ourselves whether to do it or not only if no service was specified. // If it was (from the View menu or from RMB + Embedding service), just do it. forceAutoEmbed = forceAutoEmbed || !serviceName.isEmpty(); // Or if we have no associated app anyway, then embed. forceAutoEmbed = forceAutoEmbed || ( appOffers.isEmpty() && !offers.isEmpty() ); // Or if the associated app is konqueror itself, then embed. if ( !appOffers.isEmpty() ) forceAutoEmbed = forceAutoEmbed || KonqMainWindow::isMimeTypeAssociatedWithSelf( serviceType, appOffers.first() ); if ( ! forceAutoEmbed ) { if ( ! KonqFMSettings::settings()->shouldEmbed( serviceType ) ) { kDebug() << "KonqFMSettings says: don't embed this servicetype"; return KonqViewFactory(); } } KService::Ptr service; // Look for this service if (!serviceName.isEmpty()) { KService::List::const_iterator it = offers.constBegin(); for ( ; it != offers.constEnd() && !service ; ++it ) { if ( (*it)->desktopEntryName() == serviceName ) { kDebug() << "Found requested service" << serviceName; service = *it; } } } KonqViewFactory viewFactory; if (service) { kDebug() << "Trying to open lib for requested service " << service->desktopEntryName(); viewFactory = tryLoadingService(service); // If this fails, then return an error. // When looking for konq_sidebartng or konq_aboutpage, we don't want to end up // with khtml or another Browser/View part in case of an error... } else { KService::List::Iterator it = offers.begin(); for ( ; viewFactory.isNull() /* exit as soon as we get one */ && it != offers.end() ; ++it ) { service = (*it); // Allowed as default ? QVariant prop = service->property( "X-KDE-BrowserView-AllowAsDefault" ); kDebug() << service->desktopEntryName() << " : X-KDE-BrowserView-AllowAsDefault is valid : " << prop.isValid(); if ( !prop.isValid() || prop.toBool() ) { // defaults to true //kDebug() << "Trying to open lib for service " << service->name(); viewFactory = tryLoadingService(service); // If this works, we exit the loop. } else { kDebug() << "Not allowed as default " << service->desktopEntryName(); } } } if (serviceImpl) (*serviceImpl) = service; if (viewFactory.isNull()) { if (offers.isEmpty()) kWarning() << "no part was associated with" << serviceType; else kWarning() << "no part could be loaded"; // full error was shown to user already return viewFactory; } QVariantList args; const QVariant prop = service->property( "X-KDE-BrowserView-Args" ); if (prop.isValid()) { Q_FOREACH(const QString& str, prop.toString().split(' ')) args << QVariant(str); }