#include "casmsubmitpage.h"
#include "tfilepath.h"
#include "tconvert.h"
#include "tsystem.h"
#include "tw/mainshell.h"
#include "tw/textfield.h"
#include "tw/label.h"
#include "tw/optionmenu.h"
#include "tw/button.h"
#include "tw/checkbox.h"
#include "filebrowserpopup.h"
#include "casmconfigpanel.h"
#include "casmfileinfo.h"
#include "tfarmcontroller.h"
#include "application.h"
#include "util.h"
#include "tw/message.h"
//==============================================================================
class CasmSubmitPage::Data {
public:
Data(CasmSubmitPage *cspage);
~Data() { delete m_casmTask; }
void configureNotify(const TDimension &size);
void browseCasmFiles();
void submit();
void loadCasm(const TFilePath &fp);
CasmSubmitPage *m_cspage;
TLabel *m_taskNameLabel;
TTextField *m_taskNameTextField;
TCheckBox *m_submitAsSuspended;
TButton *m_submit;
TLabel *m_filepathLabel;
TTextField *m_filepathTextField;
TButton *m_casmBrowseBtn;
CasmConfigPanel *m_configPanel;
CasmTask *m_casmTask;
};
//------------------------------------------------------------------------------
CasmSubmitPage::Data::Data(CasmSubmitPage *cspage)
: m_cspage(cspage), m_casmTask(0) {
m_taskNameLabel = new TLabel(cspage);
m_taskNameLabel->setText("Task Name:");
m_submitAsSuspended = new TCheckBox(cspage, "Submit as Suspended");
m_taskNameTextField = new TTextField(cspage);
m_filepathLabel = new TLabel(cspage);
m_filepathLabel->setText("File Path:");
m_filepathTextField = new TTextField(cspage);
m_casmBrowseBtn = new TButton(cspage);
m_casmBrowseBtn->setTitle("...");
tconnect(*m_casmBrowseBtn, this, &CasmSubmitPage::Data::browseCasmFiles);
m_submit = new TButton(cspage);
m_submit->setTitle("Submit");
tconnect(*m_submit, this, &CasmSubmitPage::Data::submit);
m_configPanel = new CasmConfigPanel(cspage);
}
//------------------------------------------------------------------------------
void CasmSubmitPage::Data::configureNotify(const TDimension &size) {
int x0 = 20;
int y = size.ly - 1 - 10;
int x = x0;
m_taskNameLabel->setGeometry(x, y - 15, x + 100, y);
m_taskNameTextField->setGeometry(x + 104, y - 15, x + 250, y);
x += 280;
m_submitAsSuspended->setGeometry(x, y - 15, x + 120, y);
x += 150;
m_submit->setGeometry(x, y - 15, x + 80, y);
x = x0;
y -= 40;
m_filepathLabel->setGeometry(x, y - 15, x + 100, y);
m_filepathTextField->setGeometry(x + 104, y - 15, x + 650, y);
m_casmBrowseBtn->setGeometry(x + 660, y - 15, x + 680, y);
x = x0;
y -= 40;
m_configPanel->setGeometry(0, 0, size.lx - 1, y);
}
//------------------------------------------------------------------------------
void CasmSubmitPage::Data::browseCasmFiles() {
static FileBrowserPopup *popup = 0;
if (!popup) {
vector<string> fileTypes;
fileTypes.push_back("casm");
popup = new FileBrowserPopup(m_cspage, fileTypes);
popup->setOkAction(new TFileBrowserPopupAction<CasmSubmitPage::Data>(
this, &CasmSubmitPage::Data::loadCasm));
}
if (!popup) return;
TFilePath fp = Application::instance()->getCurrentFolder();
if (fp != TFilePath()) popup->setCurrentDir(fp);
TDimension d = TMainshell::getMainshell()->getSize();
#ifdef WIN32
HDC hdc = GetDC(0);
d.lx = GetDeviceCaps(hdc, HORZRES);
d.ly = GetDeviceCaps(hdc, VERTRES);
ReleaseDC(0, hdc);
#endif
d -= popup->getSize();
// TDimension d = TMainshell::getMainshell()->getSize() - popup->getSize();
popup->popup(TPoint(d.lx / 2, d.ly / 2));
popup->setCaption("Load Casm");
}
//------------------------------------------------------------------------------
void CasmSubmitPage::Data::submit() {
if (m_filepathTextField->getText() == toWideString("")) {
TMessage::error("You must load a file");
return;
}
CasmTask *casm = m_configPanel->getTask();
TFarmController *controller = Application::instance()->getController();
string nativeCmdLine("runcasm ");
nativeCmdLine += casm->m_casmFile;
nativeCmdLine += " ";
if (casm->m_setupFile != "") {
nativeCmdLine += "-setup ";
nativeCmdLine += casm->m_setupFile;
nativeCmdLine += " ";
}
nativeCmdLine += casm->getCommandLine();
string casmName = TFilePath(casm->m_casmFile).getName();
int stepCount = casm->m_end - casm->m_start + 1;
TFarmTaskGroup task(casmName, nativeCmdLine, TSystem::getUserName(),
TSystem::getHostName(), stepCount);
int ra = casm->m_start;
for (;;) {
CasmTask subcasm(*casm);
string cmdLine("runcasm ");
int rb = tmin(ra + casm->m_taskChunksize - 1, casm->m_end);
subcasm.m_start = ra;
subcasm.m_end = rb;
cmdLine += subcasm.m_casmFile;
cmdLine += " ";
if (subcasm.m_setupFile != "") {
cmdLine += "-setup ";
cmdLine += subcasm.m_setupFile;
cmdLine += " ";
}
cmdLine += subcasm.getCommandLine();
cmdLine += " -nowait ";
try {
string name = casmName + " " + toString(ra) + "-" + toString(rb);
stepCount = rb - ra + 1;
task.addTask(new TFarmTask(name, cmdLine, TSystem::getUserName(),
TSystem::getHostName(), stepCount));
} catch (TException &e) {
TMessage::error(toString(e.getMessage()));
}
if (rb == casm->m_end) break;
ra = rb + 1;
}
try {
controller->addTask(task, m_submitAsSuspended->isSelected());
} catch (TException &e) {
TMessage::error(toString(e.getMessage()));
}
}
//------------------------------------------------------------------------------
#ifdef WIN32
void DisplayStruct(LPNETRESOURCE lpnr) {
string info;
if (lpnr->lpLocalName) {
info += lpnr->lpLocalName;
info += " = ";
}
info += lpnr->lpRemoteName;
MessageBox(NULL, info.c_str(), "Connection info", 0);
}
BOOL WINAPI EnumerateFunc(LPNETRESOURCE lpnr) {
DWORD dwResult, dwResultEnum;
HANDLE hEnum;
DWORD cbBuffer = 16384; // 16K is a good size
DWORD cEntries = -1; // enumerate all possible entries
LPNETRESOURCE lpnrLocal; // pointer to enumerated structures
DWORD i;
//
// Call the WNetOpenEnum function to begin the enumeration.
//
dwResult = WNetOpenEnum(
RESOURCE_CONNECTED /*RESOURCE_GLOBALNET*/, // all network resources
RESOURCETYPE_ANY, // all resources
0, // enumerate all resources
lpnr, // NULL first time the function is called
&hEnum); // handle to the resource
if (dwResult != NO_ERROR) {
//
// Process errors with an application-defined error handler.
//
// NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetOpenEnum");
return FALSE;
}
//
// Call the GlobalAlloc function to allocate resources.
//
lpnrLocal = (LPNETRESOURCE)GlobalAlloc(GPTR, cbBuffer);
do {
//
// Initialize the buffer.
//
ZeroMemory(lpnrLocal, cbBuffer);
//
// Call the WNetEnumResource function to continue
// the enumeration.
//
dwResultEnum = WNetEnumResource(hEnum, // resource handle
&cEntries, // defined locally as -1
lpnrLocal, // LPNETRESOURCE
&cbBuffer); // buffer size
//
// If the call succeeds, loop through the structures.
//
if (dwResultEnum == NO_ERROR) {
for (i = 0; i < cEntries; i++) {
// Call an application-defined function to
// display the contents of the NETRESOURCE structures.
//
DisplayStruct(&lpnrLocal[i]);
// If the NETRESOURCE structure represents a container resource,
// call the EnumerateFunc function recursively.
if (RESOURCEUSAGE_CONTAINER ==
(lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER))
if (!EnumerateFunc(&lpnrLocal[i])) return FALSE;
// TextOut(hdc, 10, 10, "EnumerateFunc returned FALSE.", 29);
}
}
// Process errors.
//
else if (dwResultEnum != ERROR_NO_MORE_ITEMS) {
// NetErrorHandler(hwnd, dwResultEnum, (LPSTR)"WNetEnumResource");
break;
}
}
//
// End do.
//
while (dwResultEnum != ERROR_NO_MORE_ITEMS);
//
// Call the GlobalFree function to free the memory.
//
GlobalFree((HGLOBAL)lpnrLocal);
//
// Call WNetCloseEnum to end the enumeration.
//
dwResult = WNetCloseEnum(hEnum);
if (dwResult != NO_ERROR) {
//
// Process errors.
//
// NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetCloseEnum");
return FALSE;
}
return TRUE;
}
#endif
//------------------------------------------------------------------------------
void CasmSubmitPage::Data::loadCasm(const TFilePath &fp) {
if (!TFileStatus(fp).doesExist()) {
string msg = toString(fp.getWideString()) + "\n";
msg += "File not found\n";
msg += "Please verify that the path and file name are correct";
m_filepathTextField->setText("");
TMessage::error(msg);
return;
}
Application::instance()->setCurrentFolder(fp.getParentDir());
string uncString = convertToUncString(fp);
m_filepathTextField->setText(uncString);
m_taskNameTextField->setText(TFilePath(uncString).getName());
#ifdef WIN32
int x = uncString.find("\\", 2);
while (x != string::npos) {
uncString.replace(x, 1, "/", 0, 1);
x = uncString.find("\\", x + 1);
}
#endif
TFilePath uncFilePath = TFilePath(uncString);
CasmFileInfo casmFileInfo(uncFilePath);
int start, end;
bool interlaced;
casmFileInfo.getFrameRange(start, end, interlaced);
if (m_casmTask) delete m_casmTask;
m_casmTask = new CasmTask;
m_casmTask->m_casmFile = uncString;
m_casmTask->m_start = start;
m_casmTask->m_end = end;
m_casmTask->m_step = 1;
m_configPanel->setTask(m_casmTask);
}
//==============================================================================
CasmSubmitPage::CasmSubmitPage(TWidget *parent)
: TabPage(parent, "SubmitCasm") {
m_data = new CasmSubmitPage::Data(this);
}
//------------------------------------------------------------------------------
CasmSubmitPage::~CasmSubmitPage() {}
//------------------------------------------------------------------------------
void CasmSubmitPage::configureNotify(const TDimension &size) {
m_data->configureNotify(size);
}
//------------------------------------------------------------------------------
void CasmSubmitPage::onActivate() {}
//------------------------------------------------------------------------------
void CasmSubmitPage::onDeactivate() {}