xrdp/tcutils/mainwindow.cpp
2013-08-25 18:02:04 -07:00

235 lines
5.9 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
wtsChannel = NULL;
okToQuit = false;
savedGeometry = this->geometry();
/* setup tab to unmount drives */
ui->tabWidget->setTabText(0, "Unmount drives");
connect(ui->btnRefresh, SIGNAL(clicked()), this, SLOT(onBtnRefreshClicked()));
connect(ui->btnUnmount, SIGNAL(clicked()), this, SLOT(onBtnUnmountClicked()));
ui->tabWidget->setTabText(1, "");
if (initWtsChannel())
{
okToQuit = true;
QTimer::singleShot(10, qApp, SLOT(quit()));
return;
}
setupSystemTray();
/* set up status bar to display messages */
statusBar = new QStatusBar;
this->setStatusBar(statusBar);
setStatusMsg("Connected to client");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setupSystemTray()
{
trayMenu = new QMenu(this);
trayMenu->addAction("Launch Thinclient Utils", this, SLOT(onActionLaunch()));
trayMenu->addSeparator();
trayMenu->addAction("Quit", this, SLOT(onActionQuit()));
trayIcon = new QSystemTrayIcon;
trayIcon->setContextMenu(trayMenu);
trayIcon->setIcon(QIcon(":/images/resources/images/tools.gif"));
trayIcon->show();
trayIcon->showMessage("TCutils", "Click on the tcutils icon to launch tcutils",
QSystemTrayIcon::Information, 3000);
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this, SLOT(onSystemTrayClicked(QSystemTrayIcon::ActivationReason)));
}
/**
*
*****************************************************************************/
int MainWindow::initWtsChannel()
{
/* init the channel just once */
if (wtsChannel)
return 0;
/* open a WTS channel and connect to remote client */
wtsChannel = WTSVirtualChannelOpenEx(WTS_CURRENT_SESSION, "tcutils", 0);
if (wtsChannel == NULL)
{
QMessageBox::information(this, "Open virtual channel", "Error "
"connecting to remote client. This program "
"can only be used when connected via "
"NeutrinoRDP.\n\nClick ok to close this "
"application");
return -1;
}
return 0;
}
/**
*
*****************************************************************************/
int MainWindow::deinitWtsChannel()
{
if (!wtsChannel)
return -1;
WTSVirtualChannelClose(wtsChannel);
return 0;
}
/**
* Display a msg on the status bar
*
* @param msg message to display in status bar
*****************************************************************************/
void MainWindow::setStatusMsg(QString msg)
{
statusBar->showMessage(msg, 30000);
}
/**
*
*****************************************************************************/
void MainWindow::closeEvent(QCloseEvent *event)
{
if (!okToQuit)
{
savedGeometry = this->geometry();
this->hide();
event->ignore();
return;
}
if (wtsChannel)
deinitWtsChannel();
event->accept();
}
/******************************************************************************
** **
** slots go here **
** **
******************************************************************************/
#if 1
void MainWindow::onBtnRefreshClicked()
{
int i;
/* clear drive list */
if (itemList.count())
{
for (i = 0; i < itemList.count(); i++)
ui->listWidget->removeItemWidget(itemList.at(i));
itemList.clear();
}
ui->listWidget->clear();
if (Utils::getMountList(wtsChannel, &itemList))
{
QMessageBox::information(this, "Get device list", "\nError getting "
"device list from client");
return;
}
if (itemList.count() == 0)
{
QMessageBox::information(this, "Get device list",
"\nNo devices found!");
return;
}
/* add mount point to list widget */
for (i = 0; i < itemList.count(); i++)
ui->listWidget->insertItem(i, itemList.at(i));
}
#else
void MainWindow::onBtnRefreshClicked()
{
QListWidgetItem *item;
int i;
int j;
/* clear drive list */
if (itemList.count())
{
for (i = 0; i < itemList.count(); i++)
ui->listWidget->removeItemWidget(itemList.at(i));
itemList.clear();
}
ui->listWidget->clear();
QDir dir(QDir::homePath() + "/xrdp_client");
QStringList sl = dir.entryList();
for (i = 0, j = 0; i < sl.count(); i++)
{
/* skip files starting with . */
if (sl.at(i).startsWith("."))
continue;
/* add mount point to list widget */
item = new QListWidgetItem;
item->setText(sl.at(i));
ui->listWidget->insertItem(j++, item);
itemList.append(item);
}
}
#endif
void MainWindow::onBtnUnmountClicked()
{
QListWidgetItem *item = ui->listWidget->currentItem();
if (!item)
{
QMessageBox::information(this, "Unmount device", "\nNo device selected. "
"You must select a device to unmount");
return;
}
if (Utils::unmountDevice(wtsChannel, item->text(), statusBar) == 0)
{
delete ui->listWidget->takeItem(itemList.indexOf(item));
itemList.removeOne(item);
}
}
void MainWindow::onActionQuit()
{
okToQuit = true;
this->close();
}
void MainWindow::onActionLaunch()
{
this->show();
this->setGeometry(savedGeometry);
}
void MainWindow::onSystemTrayClicked(QSystemTrayIcon::ActivationReason)
{
trayMenu->popup(QCursor::pos());
}