⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 importrpm.cc

📁 About: Paco (pacKAGE oRGANIZER) is a simple, yet powerful tool to aid package management when insta
💻 CC
字号:
//=======================================================================// ImportRPM.cc//-----------------------------------------------------------------------// This file is part of the package paco// Copyright (C) 2004-2007 David Rosal <david.3r@gmail.com>// For more information visit http://paco.sourceforge.net//=======================================================================#include "config.h"#include "Config.h"#include "ImportRPM.h"#include "MainWindow.h"#include "globals.h"#include <gtkmm/checkbutton.h>#include <gtkmm/tooltips.h>#include <gtkmm/stock.h>#include <gtkmm/expander.h>#include <gtkmm/scrolledwindow.h>#include <gtkmm/box.h>#include <gtkmm/buttonbox.h>#include <gtkmm/sizegroup.h>#include <glibmm/iochannel.h>using std::string;using std::vector;using Glib::ustring;using Glib::RefPtr;using sigc::mem_fun;using namespace Gpaco;ImportRPM* ImportRPM::spImportRPM = NULL;ImportRPM::ImportRPM():	Gtk::Window(Gtk::WINDOW_TOPLEVEL),	mRpm2paco(Glib::find_program_in_path("rpm2paco")),	mProgressBar(),	mButtonImport(Gtk::Stock::EXECUTE, "_Import"),	mButtonClose(Gtk::Stock::CLOSE, "_Close"),	mButtonStop(Gtk::Stock::STOP, "_Stop"),	mTextView(),	mpTextBuffer(mTextView.get_buffer()),	mpTextTag(mpTextBuffer->create_tag()),	mOptOverwrite(false),	mOptStripRelease(false),	mOptSync(false),	mStop(false){	g_assert(Config::logdirWritable());	if (mRpm2paco.empty()) {		errorDialog(NULL, "Cannot find rpm2paco executable");		return;	}	set_default_size(200, -1);	set_title("gpaco :: import RPM");	set_modal();	try {		set_icon_from_file(DATADIR "/pixmaps/gpaco.png");	}	catch (...) { }		Gtk::CheckButton* pButtonOverwrite(Gtk::manage		(new Gtk::CheckButton("_Overwrite", true)));	pButtonOverwrite->signal_toggled().connect		(mem_fun(*this, &ImportRPM::onSwitchOverwrite));	gpTips->set_tip(*pButtonOverwrite,		"Force overwrite of already logged packages (option -f in rpm2paco)");	Gtk::CheckButton* pButtonStripRelease(Gtk::manage		(new Gtk::CheckButton("_Strip release", true)));	pButtonStripRelease->signal_toggled().connect		(mem_fun(*this, &ImportRPM::onSwitchStripRelease));	gpTips->set_tip(*pButtonStripRelease,		"Remove the RPM release suffix from the name of the packages, "		"(e.g. foo-2.0.2-1 --> foo-2.0.2) (option -s in rpm2paco)");	Gtk::CheckButton* pButtonSync(Gtk::manage		(new Gtk::CheckButton("Sync _versions", true)));	pButtonSync->signal_toggled().connect		(mem_fun(*this, &ImportRPM::onSwitchSync));	gpTips->set_tip(*pButtonSync,		"Remove obsolete versions of the packages from the paco database "		"(option -j in rpm2paco)");	Gtk::HBox* pHBox(Gtk::manage(new Gtk::HBox(false, 8)));	pHBox->pack_start(*pButtonOverwrite, Gtk::PACK_SHRINK);	pHBox->pack_start(*pButtonStripRelease, Gtk::PACK_SHRINK);	pHBox->pack_start(*pButtonSync, Gtk::PACK_SHRINK);	mTextView.set_editable(false);	mTextView.set_cursor_visible(false);	mTextView.set_left_margin(4);	mTextView.set_right_margin(4);	mTextView.modify_base(Gtk::STATE_NORMAL, Gdk::Color("black"));		mpTextTag->property_foreground() = "white";	mpTextTag->property_weight() = Pango::WEIGHT_BOLD;	mpTextTag->property_family() = "courier";		Gtk::ScrolledWindow* pScrolledWindow(Gtk::manage(new Gtk::ScrolledWindow));	pScrolledWindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);	pScrolledWindow->add(mTextView);	Gtk::Expander* pExpander(Gtk::manage		(new Gtk::Expander("rpm2paco output:")));	pExpander->add(*pScrolledWindow);		mProgressBar.set_pulse_step(0.005);	RefPtr<Gtk::SizeGroup> pSizeGroup = Gtk::SizeGroup::create		(Gtk::SIZE_GROUP_HORIZONTAL);	pSizeGroup->add_widget(mButtonClose);	pSizeGroup->add_widget(mButtonStop);		Gtk::HButtonBox* pHButtonBox = Gtk::manage		(new Gtk::HButtonBox(Gtk::BUTTONBOX_EDGE));	pHButtonBox->pack_start(mButtonImport, Gtk::PACK_SHRINK);	pHButtonBox->pack_end(mButtonClose, Gtk::PACK_SHRINK);	pHButtonBox->pack_end(mButtonStop, Gtk::PACK_SHRINK);	mButtonClose.signal_clicked().connect(mem_fun		(*this, &ImportRPM::onClose));	mButtonStop.signal_clicked().connect(mem_fun		(*this, &ImportRPM::onStop));	mButtonImport.signal_clicked().connect(mem_fun		(*this, &ImportRPM::onImport));	Gtk::VBox* pVBox = Gtk::manage(new Gtk::VBox);	pVBox->pack_start(*pHBox, Gtk::PACK_SHRINK, 4);	pVBox->pack_start(mProgressBar, Gtk::PACK_SHRINK, 8);	pVBox->pack_start(*pExpander, Gtk::PACK_EXPAND_WIDGET, 8);	pVBox->pack_start(*pHButtonBox, Gtk::PACK_SHRINK, 4);		set_border_width(8);	add(*pVBox);	show_all();	mButtonStop.hide();}ImportRPM::~ImportRPM(){ }void ImportRPM::instance(){	g_assert(spImportRPM == NULL);	spImportRPM = new ImportRPM();}// [virtual]bool ImportRPM::on_delete_event(GdkEventAny*){	mStop = true;	onClose();	return true;}void ImportRPM::onStop(){	g_assert(mStop == false);	mStop = true;}void ImportRPM::onClose(){	g_assert(spImportRPM != NULL);	delete spImportRPM;	spImportRPM = NULL;}void ImportRPM::onImport(){	mStop = false;	mButtonImport.set_sensitive(false);		mpTextBuffer->erase(mpTextBuffer->begin(), mpTextBuffer->end());	mpTextBuffer->insert(mpTextBuffer->end(), "\n");	mButtonStop.show();	mButtonClose.hide();	vector<string> argv;	argv.push_back(mRpm2paco);	argv.push_back("--all");	if (mOptOverwrite)		argv.push_back("--force");	if (mOptStripRelease)		argv.push_back("--strip-release");	if (mOptSync)		argv.push_back("--sync-version");	Glib::Pid pid;	int stdOut, stdErr, status, cnt = 0;	Glib::spawn_async_with_pipes(Glib::get_current_dir(), argv,		Glib::SPAWN_DO_NOT_REAP_CHILD, sigc::slot<void>(), &pid,		NULL, &stdOut, &stdErr);	RefPtr<Glib::IOChannel> ioOut = Glib::IOChannel::create_from_fd(stdOut);	ioOut->set_flags(Glib::IO_FLAG_NONBLOCK);	ioOut->set_close_on_unref(true);	RefPtr<Glib::IOChannel> ioErr = Glib::IOChannel::create_from_fd(stdErr);	ioErr->set_flags(Glib::IO_FLAG_NONBLOCK);	ioErr->set_close_on_unref(true);	ustring buf;	while (waitpid(pid, &status, WNOHANG) != pid) {		if (mStop) {			kill(pid, cnt++ ? SIGKILL : SIGTERM);			Glib::usleep(30000);		}		else {			mProgressBar.pulse();			refreshMainLoop();			if (ioOut->read(buf, 64) == Glib::IO_STATUS_NORMAL)				output(buf);			if (ioErr->read(buf, 1024) == Glib::IO_STATUS_NORMAL)				output(buf);		}		Glib::usleep(2000);	}	g_return_if_fail(spImportRPM != NULL);	if (ioOut->read_to_end(buf) == Glib::IO_STATUS_NORMAL)		output(buf);		if (!mStop && !WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS) {		if (ioErr->read_to_end(buf) == Glib::IO_STATUS_NORMAL)			output(buf + "\nError\n");	}	else		output(ustring("\n") + (mStop ? "\nStopped" : "Done") + "\n");	gpMainWindow->treeView().addNewPackages();	gpMainWindow->treeView().markUnloggedPackages();	mProgressBar.set_fraction(mStop ? 0 : 1);	mButtonClose.show();	mButtonStop.hide();	mButtonImport.set_sensitive();}void ImportRPM::output(ustring const& str){	mpTextBuffer->insert_with_tag(mpTextBuffer->end(), str, mpTextTag);	Gtk::TextIter end = mpTextBuffer->end();	mTextView.scroll_to(end);	refreshMainLoop();}void ImportRPM::onSwitchStripRelease(){	mOptStripRelease = !mOptStripRelease;}void ImportRPM::onSwitchOverwrite(){	mOptOverwrite = !mOptOverwrite;}void ImportRPM::onSwitchSync(){	mOptSync = !mOptSync;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -