Fixed showing QTermWidget.

Add reading informations about disks and partitions from libparted.
new_installer
ivan 14 years ago
parent 11ce97387a
commit c7004b3c59

@ -12,11 +12,11 @@ include(${QT_USE_FILE})
add_subdirectory(libs/qtermwidget)
include_directories(
${QT_INCLUDES}
include_directories(
${QT_INCLUDES}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
libs/qtermwidget
libs
)
set( cl_install_gui_SRCS
@ -31,6 +31,7 @@ set( cl_install_gui_SRCS
src/pagepartitioning.cpp
src/systeminstaller.cpp
src/tools.cpp
src/libparted.cpp
)
set (cl_install_gui_HDRS
@ -44,10 +45,11 @@ set (cl_install_gui_HDRS
src/pagemanager.h
src/pagepartitioning.h
src/systeminstaller.h
src/libparted.h
)
set( cl_install_gui_RCC
resources/systeminstaller.qrc
resources/systeminstaller.qrc
)
add_definitions( -DQT_GUI_LIB -DQT_CORE_LIB )
@ -70,6 +72,7 @@ target_link_libraries( cl-install-gui
${QT_QTCORE_LIBRARY}
${QT_QTGUI_LIBRARY}
qtermwidget
parted
)
install( TARGETS cl-install-gui DESTINATION /usr/sbin )

@ -1,68 +1,90 @@
project(qtermwidget)
###| CMAKE qtermwidget/lib |###
cmake_minimum_required(VERSION 2.6)
#| 2.6 is out, but most distros only have 2.4
cmake_minimum_required ( VERSION 2.6 )
set(QT_MIN_VERSION 4.6.0)
if(COMMAND cmake_policy)
cmake_policy (SET CMP0003 NEW)
endif(COMMAND cmake_policy)
find_package(Qt4 REQUIRED)
#| Project
project ( qtermwidget )
include(${QT_USE_FILE})
include_directories(
${QT_INCLUDES}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
.
#| Sources
set ( SRCS
TerminalCharacterDecoder.cpp
KeyboardTranslator.cpp
Screen.cpp History.cpp BlockArray.cpp konsole_wcwidth.cpp
ScreenWindow.cpp
Emulation.cpp
Vt102Emulation.cpp TerminalDisplay.cpp Filter.cpp
Pty.cpp kpty.cpp k3process.cpp k3processcontroller.cpp
Session.cpp ShellCommand.cpp
qtermwidget.cpp
)
link_directories(
.
#| Headers
#| Only the Headers that need to be moc'd go here
set ( HDRS
ScreenWindow.h
Emulation.h
Vt102Emulation.h TerminalDisplay.h Filter.h
Pty.h k3process.h k3processcontroller.h
Session.h
qtermwidget.h
)
set( qtermwidget_SRCS
qtermwidget.cpp
BlockArray.cpp
Emulation.cpp
Filter.cpp
History.cpp
k3processcontroller.cpp
k3process.cpp
KeyboardTranslator.cpp
konsole_wcwidth.cpp
kpty.cpp
Pty.cpp
Screen.cpp
ScreenWindow.cpp
Session.cpp
ShellCommand.cpp
TerminalCharacterDecoder.cpp
TerminalDisplay.cpp
Vt102Emulation.cpp
#| Library Output
#| CMake supports out-of-source builds, so the binary dir is not
#| necessarily the same as the source directory
set ( LIBRARY_OUTPUT_PATH
${PROJECT_SOURCE_DIR}/../.
)
set( qtermwidget_HDRS
qtermwidget.h
Emulation.h
Filter.h
k3processcontroller.h
k3process.h
Pty.h
ScreenWindow.h
Session.h
TerminalDisplay.h
Vt102Emulation.h
#| Library Versioning
#| Libraries are not versioned by default
set ( qtermwidget_VERSION_MAJOR "0" )
set ( qtermwidget_VERSION_MINOR "1" )
set ( qtermwidget_VERSION_PATCH "0" )
set ( qtermwidget_VERSION
"${qtermwidget_VERSION_MAJOR}.${qtermwidget_VERSION_MINOR}.${qtermwidget_VERSION_PATCH}"
)
add_definitions( -DQT_GUI_LIB -DQT_CORE_LIB -DHAVE_POSIX_OPENPT )
#| Qt4 Required Options
add_definitions ( -Wall )
find_package ( Qt4 REQUIRED ) # Finds Qt4 on the system
include ( ${QT_USE_FILE} ) # Includes Qt4 headers and libraries (the above command is needed first)
QT4_WRAP_CPP ( MOC_SRCS ${HDRS} ) # Moc's the headers
#include ( ${CMAKE_BINARY_DIR} ) # For including the heades generated by ui files
#| qtermwidget specific
include_directories ( ${PROJECT_SOURCE_DIR} ) # You mark some of the headers as global, so I just add the source directory to the includes
#| Defines
add_definitions ( -DHAVE_POSIX_OPENPT )
#add_definitions( -DHAVE_GETPT )
qt4_wrap_cpp( qtermwidget_MOC_SRCS
${qtermwidget_HDRS}
#| Create the Library
add_library( qtermwidget STATIC ${SRCS} ${MOC_SRCS} )
#add_library ( qtermwidget SHARED ${SRCS} ${MOC_SRCS} )
#| Set Build Type
set ( CMAKE_BUILD_TYPE
#"release"
"relwithdebinfo" # Default
#"debug"
#"debugfull"
)
add_library (qtermwidget STATIC
${qtermwidget_SRCS}
${qtermwidget_MOC_SRCS}
${QT_QTCORE_LIBRARY}
${QT_QTGUI_LIBRARY}
#| Library Properties
set_target_properties ( qtermwidget PROPERTIES
#OUTPUT_NAME "alternateName"
#PREFIX "lib"
SOVERSION ${qtermwidget_VERSION_MAJOR}
#SUFFIX "so"
VERSION ${qtermwidget_VERSION}
)
#| Link Qt4 Libraries
target_link_libraries ( qtermwidget ${QT_LIBRARIES} )

@ -0,0 +1,141 @@
#include "libparted.h"
#include <QStringList>
LibParted::LibParted(QObject *parent)
: QObject(parent)
{
// ped_exception_set_handler( )
Init();
}
LibParted::~LibParted()
{
}
QString LibParted::getVersion()
{
return QString( ped_get_version() );
}
void LibParted::Init()
{
ped_device_probe_all();
PedDevice* dsk = NULL;
while ( (dsk = ped_device_get_next(dsk)) != NULL )
{
m_DeviceList[ QString(dsk->path) ] = dsk;
}
}
QStringList LibParted::getDevices()
{
QStringList res;
Devices::const_iterator i = m_DeviceList.begin();
while ( i != m_DeviceList.constEnd() )
{
res << i.key();
++i;
}
return res;
}
DeviceInfo LibParted::getDeviceInfo(const QString& path) throw(LibPartedError)
{
if ( m_DeviceList.find(path) == m_DeviceList.end() )
throw LibPartedError();
return convertPedDevice(m_DeviceList[path]);
}
QList<PartitionInfo> LibParted::getPartitionList(const QString& path) throw(LibPartedError)
{
QList<PartitionInfo> PartInfo;
if ( m_DeviceList.find(path) == m_DeviceList.end() )
throw LibPartedError();
PedDevice* dev = m_DeviceList[path];
PedDisk* disk = NULL;
disk = ped_disk_new( dev );
if (!disk)
throw LibPartedError();
bool has_extended = ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_EXTENDED);
bool has_name = ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_PARTITION_NAME);
PedPartition* part = NULL;
while ( part = ped_disk_next_partition (disk, part) )
{
PartitionInfo part_inf;
if (part->type & PED_PARTITION_METADATA)
continue;
if ( part->num >= 0)
part_inf.num = part->num;
part_inf.begin = part->geom.start;
part_inf.end = (part->geom.end + 1) * dev->sector_size - 1;
part_inf.size = part->geom.length;
if (!(part->type & PED_PARTITION_FREESPACE))
{
if (has_extended)
{
char* type = const_cast<char*>( ped_partition_type_get_name(part->type) );
part_inf.type = QString(type);
//free(name);
}
part_inf.fs = part->fs_type ? QString(part->fs_type->name) : "";
if (has_name)
{
char* name = const_cast<char*>( ped_partition_get_name(part) );
part_inf.name = QString(name);
}
//part_inf. = QString(name);
//free(name);
//char *flags = const_cast<char*>( partition_print_flags(part) );
//Flags = QString(flags);
//free(flags);
} else {
part_inf.type = "Free space";
}
PartInfo << part_inf;
}
return PartInfo;
}
DeviceInfo LibParted::convertPedDevice(const PedDevice* dev)
{
DeviceInfo part_dev;
const char *const transport[] = {"unknown", "scsi", "ide", "dac960",
"cpqarray", "file", "ataraid", "i2o",
"ubd", "dasd", "viodasd", "sx8", "dm",
"xvd", "sd/mmc", "virtblk"};
part_dev.model = QString(dev->model);
part_dev.transport = QString("%1").arg(transport[dev->type]);
part_dev.size = dev->length * dev->sector_size;
part_dev.sec_ph = dev->phys_sector_size;
part_dev.sec_log = dev->sector_size;
return part_dev;
}

@ -0,0 +1,66 @@
#pragma once
#include <QObject>
#include <QMap>
#include <QList>
#include <parted/parted.h>
class DeviceInfo
{
public:
QString model;
QString transport;
long size;
long sec_ph;
long sec_log;
DeviceInfo(): size(0), sec_ph(0), sec_log(0) {}
};
class PartitionInfo
{
public:
int num;
long begin;
long end;
long size;
QString type;
QString fs;
QString name;
long flags;
PartitionInfo(): num(0), begin(0), end(0), size(0), flags(0) {}
};
typedef QMap<int, PedPartition*> Partitions;
typedef QMap<QString, PedDevice*> Devices;
class LibPartedError
{
public:
LibPartedError() {}
virtual ~LibPartedError() {}
};
class LibParted : public QObject
{
Q_OBJECT
public:
explicit LibParted(QObject *parent = 0);
~LibParted();
public:
QString getVersion();
void Init();
QStringList getDevices();
DeviceInfo getDeviceInfo(const QString& path) throw(LibPartedError);
QList<PartitionInfo> getPartitionList(const QString& path) throw(LibPartedError);
private:
DeviceInfo convertPedDevice(const PedDevice* dev);
private:
Devices m_DeviceList;
};

@ -3,6 +3,9 @@
#include <QTextCodec>
#include <QLocale>
#include <QTranslator>
#include <QMessageBox>
#include "systeminstaller.h"
@ -18,6 +21,12 @@ int main(int argc, char** argv)
// app.installTranslator();
if ( getuid() != 0)
{
QMessageBox::critical( 0, QObject::tr("Error"), QObject::tr("You do not have administrative privileges.") );
return -1;
}
SystemInstaller installer;
installer.show();

@ -7,7 +7,7 @@
//
#include <QMessageBox>
#include "libs/qtermwidget/qtermwidget.h"
#include "qtermwidget/qtermwidget.h"
PageCfdisk::PageCfdisk(const QString& title) :
InstallerPage(title)
@ -21,7 +21,7 @@ PageCfdisk::PageCfdisk(const QString& title) :
vbox_1->addWidget(label);
vbox_1->addWidget(widget);
m_Term = new QTermWidget;
m_Term = new QTermWidget(0);
QFont font = QApplication::font();
font.setFamily("Terminus");
@ -30,9 +30,16 @@ PageCfdisk::PageCfdisk(const QString& title) :
m_Term->setTerminalFont(font);
m_Term->setParent(widget);
QHBoxLayout* hbox_1 = new QHBoxLayout;
hbox_1->addWidget(m_Term);
widget->setLayout(hbox_1);
m_Widget->setLayout(vbox_1);
connect(m_Term, SIGNAL(finished()), this, SIGNAL(completed()));
m_Term->startShellProgram();
}
bool PageCfdisk::validate()
@ -45,7 +52,5 @@ void PageCfdisk::show()
QString cmd = "cfdisk /dev/sda && exit \r\n";
m_Term->sendText( cmd );
m_Term->setFocus();
m_Term->setSize(100, 200);
}

@ -3,13 +3,22 @@
#include <QRadioButton>
#include <QPushButton>
#include <QComboBox>
#include <QLabel>
#include <QBoxLayout>
#include <QScopedPointer>
#include <QtDebug>
#include "libparted.h"
PagePartitioning::PagePartitioning(const QString& title) :
InstallerPage(title)
{
// widgets
QLabel* labDisk = new QLabel( tr("Disk for install: ") );
m_ButExistPartition = new QRadioButton( tr("Use existing partition") );
m_ButAllDisk = new QRadioButton( tr("Use automatical partitioning") );
@ -20,40 +29,35 @@ PagePartitioning::PagePartitioning(const QString& title) :
// layouts
QHBoxLayout* hbox_1 = new QHBoxLayout;
hbox_1->addWidget( m_ButExistPartition );
hbox_1->addWidget( m_Partitions );
hbox_1->addWidget(labDisk);
hbox_1->addWidget(m_Disks);
QHBoxLayout* hbox_2 = new QHBoxLayout;
hbox_2->addWidget( m_ButAllDisk );
hbox_2->addWidget( m_Disks );
hbox_2->addStretch();
QHBoxLayout* hbox_3 = new QHBoxLayout;
hbox_3->addWidget( m_ButPartitioning );
hbox_3->addStretch();
hbox_3->addWidget( m_ButExistPartition );
hbox_3->addWidget( m_Partitions );
QHBoxLayout* hbox_4 = new QHBoxLayout;
hbox_4->addWidget( m_ButPartitioning );
hbox_4->addStretch();
QVBoxLayout* vbox_1 = new QVBoxLayout;
vbox_1->addLayout(hbox_1);
vbox_1->addLayout(hbox_2);
vbox_1->addLayout(hbox_3);
vbox_1->addLayout(hbox_4);
vbox_1->addStretch();
m_Widget->setLayout(vbox_1);
m_ButExistPartition->setChecked(true);
m_Disks->setEnabled(false);
connect(m_ButExistPartition, SIGNAL(toggled(bool)), m_Partitions, SLOT(setEnabled(bool)));
connect(m_ButAllDisk, SIGNAL(toggled(bool)), m_Disks, SLOT(setEnabled(bool)));
connect( m_ButExistPartition, SIGNAL(toggled(bool)), m_Partitions, SLOT(setEnabled(bool)));
connect( m_ButPartitioning, SIGNAL(clicked()), this, SIGNAL(manualyPartitioning()) );
// TODO: replace code and get data from libparted
m_Partitions->addItem( "/dev/sda1 (100G)" );
m_Partitions->addItem( "/dev/sda2 (100G)" );
m_Partitions->addItem( "/dev/sdb1 (80G)" );
m_Disks->addItem( "/dev/sda" );
m_Disks->addItem( "/dev/sdb" );
connect( m_Disks, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePartitions(int)) );
}
bool PagePartitioning::validate()
@ -63,5 +67,57 @@ bool PagePartitioning::validate()
void PagePartitioning::show()
{
m_Disks->clear();
m_Partitions->clear();
m_PartitionsMap.clear();
// get disk & partitions
QScopedPointer<LibParted> libParted( new LibParted );
qDebug() << "parted version: " << libParted->getVersion();
QStringList disks = libParted->getDevices();
foreach(const QString& dev, disks)
{
DeviceInfo dev_info = libParted->getDeviceInfo(dev);
QString disk_info = QString("%1 (%2) - %3 MB").arg(dev).arg(dev_info.model).arg(dev_info.size);
m_Disks->addItem(disk_info, QVariant(dev));
QList<PartitionInfo> part_list = libParted->getPartitionList(dev);
QStringList partitions;
foreach(const PartitionInfo& part, part_list)
{
if (part.type == "extended")
continue;
QString part_info = QString("%1%2\t%3 MB\t%4").arg(dev).arg(part.num).arg(part.size).arg(part.fs);
partitions << part_info;
}
m_PartitionsMap[dev] = partitions;
}
if (m_Disks->count() > 0)
{
m_Disks->setCurrentIndex(0);
updatePartitions(0);
}
}
void PagePartitioning::updatePartitions(int num)
{
m_Partitions->clear();
if (m_Disks->count() > 0 )
{
QString dev = m_Disks->itemData(num).toString();
if ( !dev.isEmpty() )
{
if ( m_PartitionsMap.find(dev) != m_PartitionsMap.end() )
{
QStringList part_list = m_PartitionsMap[dev];
m_Partitions->addItems(part_list);
}
}
}
}

@ -2,10 +2,15 @@
#include "installerpage.h"
#include <QString>
#include <QMap>
class QRadioButton;
class QPushButton;
class QComboBox;
typedef QMap<QString, QStringList> PartitionsMap;
class PagePartitioning : public InstallerPage
{
Q_OBJECT
@ -17,6 +22,9 @@ public:
public slots:
void show();
private slots:
void updatePartitions(int num);
signals:
void manualyPartitioning();
@ -27,5 +35,7 @@ private:
QComboBox* m_Partitions;
QComboBox* m_Disks;
PartitionsMap m_PartitionsMap;
};

@ -78,7 +78,7 @@ SystemInstaller::SystemInstaller(QWidget *parent) :
setCentralWidget( centralWidget );
// minimum size for window
setMinimumSize(640, 480);
setMinimumSize(800, 480);
QRect scr = QApplication::desktop()->screenGeometry();
move( scr.width() - scr.width()/2 - 640/2, scr.height() - scr.height()/2 - 480/2 );

Loading…
Cancel
Save