QString PixmapCollection::addPixmapPath(const KUrl &url) { QString name = url.filename(); while (m_pixmaps.contains(name)) { bool ok; int num = name.right(1).toInt(&ok, 10); if (ok) name = name.left(name.length() - 1) + QString::number(num + 1); else name += "2"; } m_pixmaps.insert(name, qMakePair(url.path(), 0)); return name; }
void CgiProtocol::get( const KUrl& url ) { kDebug(7124) << "CgiProtocol::get()"; kDebug(7124) << " URL: " << url.url(); #if 0 kDebug(7124) << " Path: " << url.path(); kDebug(7124) << " Query: " << url.query(); kDebug(7124) << " Protocol: " << url.protocol(); kDebug(7124) << " Filename: " << url.filename(); #endif QByteArray protocol = "SERVER_PROTOCOL=HTTP"; putenv( protocol.data() ); QByteArray requestMethod = "REQUEST_METHOD=GET"; putenv( requestMethod.data() ); QByteArray query = url.query().mid( 1 ).toLocal8Bit(); query.prepend( "QUERY_STRING=" ); putenv( query.data() ); QString path = url.path(); QString file; int pos = path.lastIndexOf('/'); if ( pos >= 0 ) file = path.mid( pos + 1 ); else file = path; QString cmd; bool stripHeader = false; bool forwardFile = true; QStringList::ConstIterator it; for( it = mCgiPaths.constBegin(); it != mCgiPaths.constEnd(); ++it ) { cmd = *it; if ( !(*it).endsWith('/') ) cmd += '/'; cmd += file; if ( KStandardDirs::exists( cmd ) ) { forwardFile = false; stripHeader = true; break; } } FILE *fd; if ( forwardFile ) { kDebug(7124) << "Forwarding to '" << path << "'"; QByteArray filepath = QFile::encodeName( path ); fd = fopen( filepath.data(), "r" ); if ( !fd ) { kDebug(7124) << "Error opening '" << filepath << "'"; error(KIO::ERR_CANNOT_OPEN_FOR_READING, path); return; } } else { kDebug(7124) << "Cmd: " << cmd; fd = popen( QFile::encodeName(KShell::quoteArg( cmd )).data(), "r" ); if ( !fd ) { kDebug(7124) << "Error running '" << cmd << "'"; error( KIO::ERR_CANNOT_OPEN_FOR_READING, cmd ); return; } } char buffer[ 4090 ]; while ( !feof( fd ) ) { int n = fread( buffer, 1, 2048, fd ); if ( n == -1 ) { // ERROR if ( forwardFile ) { fclose( fd ); } else { pclose( fd ); } return; } buffer[n] = 0; if ( stripHeader ) { QByteArray output = buffer; // this assumes buffer is text and not binary int colon = output.indexOf( ':' ); int newline = output.indexOf( '\n' ); int semicolon = output.lastIndexOf( ';', newline ); int end; if ( semicolon < 0 ) end = newline; else end = semicolon; #if 0 kDebug(7124) << " colon: " << colon; kDebug(7124) << " newline: " << newline; kDebug(7124) << " semicolon: " << semicolon; kDebug(7124) << " end: " << end; #endif // Set the charset meta data if one exists (BR# 241364). if (end == semicolon) { const int assignOp = output.indexOf('=', semicolon + 1); if (assignOp != -1) { const QByteArray charset (output.mid(assignOp+1, newline- assignOp -1).trimmed()); kDebug(7124) << "Charset:" << charset; setMetaData(QLatin1String("charset"), charset.toLower()); } } QByteArray contentType = output.mid( colon + 1, end - colon - 1 ); contentType = contentType.trimmed().toLower(); kDebug(7124) << "ContentType: '" << contentType << "'"; mimeType( contentType ); int start = output.indexOf( "\r\n\r\n" ); if ( start >= 0 ) start += 4; else { start = output.indexOf( "\n\n" ); if ( start >= 0 ) start += 2; } if ( start >= 0 ) output = output.mid( start ); stripHeader = false; data( output ); } else { data( QByteArray::fromRawData( buffer, n ) ); } } if ( forwardFile ) { fclose( fd ); } else { pclose( fd ); } finished(); kDebug(7124) << "CgiProtocol::get - done"; }