235 lines
5.9 KiB
C++
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());
|
||
|
}
|