/*************************************************************************** * Copyright (C) 2003 by Sylvain Joyeux * * sylvain.joyeux@m4x.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include <config.h> #include "dpkg.h" #include "debug.h" #include <klocale.h> #include <kdebug.h> #include <tqstringlist.h> #include <tqregexp.h> Dpkg::Dpkg(TQObject *parent, const char *name) : PackageManager(parent, name) { connect(&m_process, TQT_SIGNAL(readReady (KProcIO *)), this, TQT_SLOT(readReady(KProcIO*))); } Dpkg::~Dpkg() { } int Dpkg::capabilities( int query ) const { if ( (query & SEARCH_FILE) && (query & OFFLINE) ) return query | INSTALLED_ONLY; if ( (query & LIST_FILES) && (query & OFFLINE) ) return query | INSTALLED_ONLY; if ( query & ONLINE ) return query; return NOT_SUPPORTED; } void Dpkg::readReady(KProcIO*) { bool partial; TQString newline; TQStringList lines; while(m_process.readln(newline, true, &partial) != -1) { if (partial) m_buffer += newline; else { newline.truncate(newline.length()); TQString line(m_buffer + newline); lines << line; m_buffer = ""; } } (this->*m_receive)(lines); } bool Dpkg::search( const TQString & file ) { m_process.resetAll(); m_buffer = TQString(); m_process.clearArguments(); m_process << "dpkg" << "-S" << file; m_receive = &Dpkg::receiveSearch; return m_process.start(KProcess::Block, KProcess::Stdout ); } void Dpkg::receiveSearch( const TQStringList & line ) { static TQRegExp rx_notfound("dpkg: (.*) not found"); // the format of the dpkg -S answer is // package1[, package2[, package3...]]: file for (TQStringList::ConstIterator i = line.begin(); i != line.end(); ++i) { //kdDebug(DEBUG_ZONE) << *i << endl; if ((*i).isEmpty()) continue; if (rx_notfound.exactMatch(*i)) { emit token("error", i18n("%1 not found").arg(rx_notfound.cap(1))); continue; } int semicolon = (*i).find(':'); if (semicolon == -1) { kdDebug(DEBUG_ZONE) << "receiveSearch unmatched line : " << *i << endl; continue; } TQStringList packages = TQStringList::split(',', (*i).left(semicolon)); TQString file = (*i).right( (*i).length() - semicolon - 1 ); emit token("file", file.stripWhiteSpace()); for (TQStringList::ConstIterator j = packages.begin(); j != packages.end(); ++j) emit token("package", (*j).stripWhiteSpace()); } } bool Dpkg::list( const TQString & package ) { m_process.resetAll(); m_buffer = TQString(); m_process.clearArguments(); m_process << "dpkg" << "-L" << package; m_receive = &Dpkg::receiveList; return m_process.start(KProcess::Block, KProcess::Stdout ); } void Dpkg::receiveList( const TQStringList & line ) { static TQRegExp rx_notfound("Package (.*) is not installed"); for (TQStringList::ConstIterator i = line.begin(); i != line.end(); ++i) { if (rx_notfound.search(*i) > -1) emit token("error", i18n("Package %1 is not installed").arg(rx_notfound.cap(1))); else if ((*i).startsWith("/")) emit token("file", *i); } } static const TQString html_form_begin("\n<form action=\"http://packages.ubuntu.com/cgi-bin/search_contents.pl\" method=\"GET\">\n" "<table class=\"query\">\n"); static TQString make_title(const TQString& title) { return "\t<tr><td class=\"title\" colspan=\"2\">" + title + "</td></tr>\n"; } static const TQString html_form_end("<tr>\n" "\t<td class=\"button\" colspan=\"2\">\n" "\t\t<input type=\"submit\" value=\"%1\">\n" "\t\t<input type=\"hidden\" name=\"searchmode\" value=\"searchfilesanddirs\">\n" "\t\t<input type=\"hidden\" name=\"case\" value=\"insensitive\">\n" "\t</td>\n" "</tr>\n" "</table>\n" "</form>\n"); static const TQString html_form_line_begin("<tr>\n" "\t<td><label for=\"%1\">%2</label></td>\n" "\t<td>\n"); static const TQString html_form_line_end("</td>\n</tr>\n"); static const TQString html_form_combo("<select name=\"%1\" id=\"%2\">"); static TQString make_form_text(const TQString& type, const TQString& label) { return html_form_line_begin.arg(type).arg(label) + TQString("<input type=\"text\" name=\"%1\" id=\"%2\">").arg(type).arg(type) + html_form_line_end; } static TQString begin_form_combo(const TQString& type, const TQString& label) { return html_form_line_begin.arg(type).arg(label) + TQString("\t<select name=\"%1\" id=\"%2\">\n").arg(type).arg(type); } static TQString make_form_option(const TQString& name, const TQString& text) { return "\t\t<option value=" + name + ">" + text + "</option>\n"; } static TQString end_form_combo() { return "\t</select>\n\t</td>\n</tr>\n"; } TQString Dpkg::getOnlineForm() { TQString buffer; TQTextOStream stream(&buffer); stream << html_form_begin << make_title( i18n("packages.ubuntu.com")) << make_form_text("word", i18n("File to search")) << begin_form_combo("arch", i18n("Architecture")) << make_form_option("i386", i18n("Intel x86")) << make_form_option("amd64", i18n("AMD64")) << make_form_option("sparc", i18n("SPARC")) << make_form_option("powerpc", i18n("PowerPC")) << make_form_option("hppa", i18n("HP PA/RISC")) << make_form_option("ia64", i18n("Intel IA-64")) << end_form_combo() << begin_form_combo("version", i18n("Version")) << make_form_option("gutsy", "gutsy") << make_form_option("feisty", "feisty") << make_form_option("edgy", "edgy") << make_form_option("dapper", "dapper") << make_form_option("breezy", "breezy") << make_form_option("hoary", "hoary") << make_form_option("warty", "warty") << end_form_combo() << html_form_end.arg(i18n("Go online!")); return buffer; } #include "dpkg.moc"