diff options
Diffstat (limited to 'tcutils/utils.cpp')
| -rw-r--r-- | tcutils/utils.cpp | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/tcutils/utils.cpp b/tcutils/utils.cpp new file mode 100644 index 00000000..1b8548c7 --- /dev/null +++ b/tcutils/utils.cpp @@ -0,0 +1,217 @@ +#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) + { + 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) + { + 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; +} |
