xrdp/tcutils/utils.cpp

218 lines
5.3 KiB
C++
Raw Normal View History

#include "utils.h"
Utils::Utils()
{
}
int Utils::getMountList(void *wtsChannel, QList<QListWidgetItem *> *itemList)
{
QListWidgetItem *item;
STREAM s;
quint32 bytesToSend;
quint32 bytesWritten;
quint32 bytesRead;
quint32 cmdLen;
quint32 cmd;
int rv;
int i;
int nentries;
char buf[2048];
if (!wtsChannel)
return -1;
qstream_new(s, 1024 * 8);
/*
* command format:
* 4 bytes cmd_len length of this command
* 1 byte cmd TCU_CMD_GET_MOUNT_LIST
*/
/* setup command */
qstream_wr_u32(&s, 1);
qstream_wr_u8(&s, TCU_CMD_GET_MOUNT_LIST);
bytesToSend = 5;
/* send command */
rv = WTSVirtualChannelWrite(wtsChannel, s.data, bytesToSend, &bytesWritten);
if (rv == 0)
{
QMessageBox::information(NULL, "Get device list", "\nError sending "
"command to client");
return -1;
}
qstream_set_pos(&s, 0); /* reuse stream */
/* get response */
/*
* response format
* 4 bytes cmd_len length of this command
* 4 bytes cmd TCU_CMD_GET_MOUNT_LIST
* 1 byte nentries number of entries in this pkt
* n bytes entry_list nentries null terminated strings
*/
rv = WTSVirtualChannelRead(wtsChannel, 1000 * 5, s.data, 1024 * 8, &bytesRead);
if (rv == 0 || bytesRead == 0)
goto error;
/* did we get the entire cmd? */
qstream_rd_u32(&s, cmdLen);
if (cmdLen != bytesRead - 4)
goto error;
/* did we get the right response? */
qstream_rd_u32(&s, cmd);
if (cmd != TCU_CMD_GET_MOUNT_LIST)
goto error;
qstream_rd_u8(&s, nentries);
if (nentries == 0)
goto done;
for (i = 0; i < nentries; i++)
{
strcpy(buf, s.pos);
qstream_inc_pos(&s, strlen(buf) + 1);
item = new QListWidgetItem;
item->setText(QString(buf));
itemList->append(item);
}
done:
qstream_free(&s);
return 0;
error:
qstream_free(&s);
return -1;
}
int Utils::unmountDevice(void *wtsChannel, QString device, QStatusBar *statusBar)
{
STREAM s;
quint32 bytesRead;
quint32 cmdLen;
quint32 cmd;
quint32 bytesWritten;
int bytesToSend;
int rv;
int seconds = 0;
char status;
char* buf;
if (!wtsChannel)
return -1;
qstream_new(s, 1024);
buf = device.toAscii().data();
/*
* command format:
* 4 bytes cmd_len length of this command
* 4 bytes cmd TCU_CMD_UNMOUNT_DEVICE
* n bytes device null terminated device name
*/
/* setup command */
bytesToSend = 4 + 4 + device.count() + 1;
qstream_wr_u32(&s, bytesToSend - 4);
qstream_wr_u32(&s, TCU_CMD_UNMOUNT_DEVICE);
strcpy(s.pos, buf);
/* send command */
rv = WTSVirtualChannelWrite(wtsChannel, s.data, bytesToSend, &bytesWritten);
if (rv == 0)
{
QMessageBox::information(NULL, "Unmount device", "\nError sending "
"command to client");
return -1;
}
qstream_set_pos(&s, 0); /* reuse stream */
/* get response */
/*
* command format
* 4 bytes cmd_len number of bytes in this pkt
* 4 bytes cmd TCU_CMD_UNMOUNT_DEVICE
* 1 byte status operation status code
*/
while (1)
{
rv = WTSVirtualChannelRead(wtsChannel, 1000 * 1, s.data, 1024, &bytesRead);
if (rv == 0)
goto error;
if (bytesRead)
break;
statusBar->showMessage("Waiting for client to unmount device: " +
QString::number(++seconds) + " seconds", 30000);
}
statusBar->showMessage("");
/* did we get the entire pkt? */
qstream_rd_u32(&s, cmdLen);
if (cmdLen != bytesRead - 4)
goto error;
/* did we get the right response? */
qstream_rd_u32(&s, cmd);
if (cmd != TCU_CMD_UNMOUNT_DEVICE)
goto error;
/* get status */
qstream_rd_u8(&s, status);
switch(status)
{
case UMOUNT_SUCCESS:
goto done;
break;
case UMOUNT_BUSY:
QMessageBox::information(NULL, "Unmount error", "\nCannot unmount device "
"because it is in use");
break;
case UMOUNT_NOT_MOUNTED:
QMessageBox::information(NULL, "Unmount error", "\nCannot unmount device "
"because it is not mounted");
break;
case UMOUNT_OP_NOT_PERMITTED:
QMessageBox::information(NULL, "Unmount error", "\nOperation not "
"permitted. The device may be in use");
break;
case UMOUNT_PERMISSION_DENIED:
QMessageBox::information(NULL, "Unmount error", "\nYou don't have "
"permission to unmount this device");
break;
case UMOUNT_UNKNOWN:
QMessageBox::information(NULL, "Unmount error", "Cannot unmount "
"device, an unknown error has occurred. The "
"drive may be in use or you do not have "
"permission to unmount it");
break;
}
goto error;
done:
qstream_free(&s);
return 0;
error:
qstream_free(&s);
return -1;
}