void MainWindow::slotFileOpt() { int ret,cnt,i; if(opt.arg_debug) printf("slotFileOpt\n"); DlgOpt *dlg = new DlgOpt(this); dlg->setWindowTitle("pvbrowser options"); dlg->setFilename(inifile()); if(opt.arg_debug) printf("slotFileOpt before dlg->exec()\n"); ret = dlg->exec(); if(opt.arg_debug) printf("slotFileOpt after dlg->exec() ret=%d\n", ret); if(ret == QDialog::Accepted) { cnt = urlComboBox->count(); for(i=0; i<cnt; i++) { urlComboBox->removeItem(0); } readIniFile(); for(i=0; i<MAX_TABS; i++) { pvbtab[i].interpreter.temp = opt.temp; } readHosts(); } delete dlg; }
MainWindow::MainWindow() { const char *cptr; int i; #ifdef BROWSERPLUGIN pvbinit(); #endif isReconnect = 0; #ifndef NO_WEBKIT textbrowser = NULL; #endif tabToolBar = NULL; maxfd = currentTab = numTabs = 0; for(i=0; i<MAX_TABS; i++) { pvbtab[i].s = -1; // socket pvbtab[i].in_use = 0; // tab is currently not used pvbtab[i].w = 1280; // default width pvbtab[i].h = 1024; // default height pvbtab[i].pvsVersion = 0x0040600; // last version of pvserver that does not send version pvbtab[i].rootWidget = NULL; pvbtab[i].hasLayout = 0; for(int ii=0; ii<MAX_DOCK_WIDGETS; ii++) { pvbtab[i].dock[ii] = NULL; } } cptr = readIniFile(); if(cptr != NULL) { QMessageBox::warning(NULL,"MainWindow","readIniFile ERROR: terminating ..."); printf("readIniFile ERROR=%s\n",cptr); exit(-1); } if(opt.appfontsize > 0) // intoduced june 2012 for android application font setting { //QFont f = qApp->font(); //f.setPointSize(opt.appfontsize); //qApp->setFont(f); QFont f = QApplication::font(); f.setPointSize(opt.appfontsize); QApplication::setFont(f); } createActions(); createToolBars(); createMenus(); createStatusBar(); if(opt.menubar == 0) menuBar()->hide(); if(opt.toolbar == 0) fileToolBar->hide(); if(opt.statusbar == 0) statusBar()->hide(); tcp_init(); setCurrentFile(""); readHosts(); semaphore.release(); mythread.pv = this; // slow_start_on_windows mythread.start(); // there is a problem within the firefox plugin on windows // we do not get enough CPU time there // no problem on linux // we get more CPU time if we continiously move the mouse over the widget // problem not solved jet #ifdef BROWSERPLUGIN mythread.start(QThread::HighestPriority); // this does not help also #endif // setup watchdog timer = new QTimer(); QObject::connect(timer, SIGNAL(timeout()), this, SLOT(slotTimeOut())); // moved timer start to end of this method because show may need longer on mobile devices timer->start(1000*10); if(opt.arg_host[0] != '\0') url = opt.arg_host; else url = opt.initialhost; add_host(url.toUtf8()); if(opt.arg_x != -1 && opt.arg_y != -1 && opt.arg_w != -1 && opt.arg_h != -1) { setGeometry(opt.arg_x,opt.arg_y, opt.arg_w,opt.arg_h); } else if(opt.fullscreen) { showFullScreen(); } else if(opt.maximized) { showMaximized(); } else { resize(800,600); } if(opt.cursor_shape >= 0) { QApplication::restoreOverrideCursor(); QApplication::setOverrideCursor(QCursor((Qt::CursorShape) opt.cursor_shape)); } // delay textbrowser for speedup starting on windows // loading the help file is damn slow on windows // thus we delay this operation until help is really needed //QMessageBox::information(this,"pvbrowser","step begin",1); // textbrowser = new dlgTextBrowser; //QMessageBox::information(this,"pvbrowser","step end",1); setFocus(Qt::MouseFocusReason); #ifdef BROWSERPLUGIN QApplication::setActiveWindow(this); // now we will get keyboard events #endif busyWidget = new QPushButton(this); busyWidget->setIcon(QIcon(":images/app.png")); busyWidgetTimer = new QTimer(this); busyWidgetTimer->setSingleShot(true); connect(busyWidgetTimer,SIGNAL(timeout()),this,SLOT(slotBusyWidgetTimeout())); timer->start(1000*10); }
void ccCp(char *source, char *dest, char *hostList) /* Copy source to dest on all files in hostList. */ { time_t startTime = time(NULL); time_t curTime, lastTime = 0; struct machine *machineList = NULL; struct netSwitch *nsList; struct machine *m, *m2; struct dlList *toDoList = newDlList(); /* We haven't done these. */ struct dlList *finishedList = newDlList(); /* All done here. */ struct dlList *sourceList = newDlList(); /* These are sources for copies. */ struct dlList *workingList = newDlList(); /* These are copying data to themselves. */ struct dlList *errList = newDlList(); /* These are messed up 3x or more. */ bool firstOk = FALSE; struct dlNode *finNode, *node, *sourceNode, *destNode; struct dyString *cmd = newDyString(256); int machineCount; int machinesFinished = 0; char *thisHost = getenv("HOST"); off_t size; int goodMachines; double grandTotal; /* Get host and switch info. */ readHosts(hostList, &machineList, &nsList); machineCount = slCount(machineList); /* Make sure file exists.... */ if (!fileExists(source)) errAbort("%s doesn't exist\n", source); size = fileSize(source); printf("Copying %s (%lld bytes) to %d machines\n", source, (unsigned long long)size, machineCount); /* Add everything to the to-do list. */ for (m = machineList; m != NULL; m = m->next) { dlAddValTail(toDoList, m); } /* Loop through to-do list trying to do first copy. */ for (node = toDoList->head; node->next != NULL; node = node->next) { m = node->val; dyStringClear(cmd); m = node->val; if (sameString(thisHost, m->name)) { if (sameString(source, dest)) { /* Hey, this is too easy. */ firstOk = TRUE; ++machinesFinished; break; } else { dyStringPrintf(cmd, "cp %s %s", source, dest); } } else { dyStringPrintf(cmd, "rcp %s %s:%s", source, m->name, dest); } if (system(cmd->string) == 0) { dlRemove(node); dlAddTail(finishedList, node); firstOk = TRUE; ++machinesFinished; break; } else /* some error in rcp */ { warn("Problem with %s\n", cmd->string); m->errCount += 1; } } /* Loop around launching child processes to copy and * wait for them to finish. */ while (machinesFinished < machineCount) { int pid; int status; /* Start all possible copies. */ while (matchMaker(finishedList, toDoList, &sourceNode, &destNode)) { dlAddTail(sourceList, sourceNode); dlAddTail(workingList, destNode); m = destNode->val; m->sourceNode = sourceNode; startCopy(sourceNode->val, destNode->val, dest, thisHost, cmd); } curTime = time(NULL); if (curTime - lastTime >= 3) { printf("%d finished in %d seconds, %d in progress, %d to start, %d errors, %d total\n", dlCount(finishedList) + dlCount(sourceList), (int)(curTime - startTime), dlCount(workingList), dlCount(toDoList), dlCount(errList), machineCount); lastTime = curTime; } /* Wait for a child to finish. Figure out which machine it is. */ pid = wait(&status); finNode = NULL; for (node = workingList->head; node->next != NULL; node = node->next) { m = node->val; if (m->pid == pid) { finNode = node; break; } } if (finNode == NULL) { errAbort("Returned from wait on unknown child %d\n", pid); continue; } m = finNode->val; m->pid = 0; dlRemove(finNode); dlRemove(m->sourceNode); m2 = m->sourceNode->val; if (m->netSwitch != m2->netSwitch) --crossSwitchCount; dlAddTail(finishedList, m->sourceNode); if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { /* Good return - move self and source node to finished list. */ ++machinesFinished; dlAddTail(finishedList, finNode); } else { /* Bad return. Increment error count, and maybe move it to * error list. */ if (++m->errCount >= maxErrCount) { ++machinesFinished; dlAddTail(errList, finNode); fprintf(stderr, "Gave up on %s\n", m->name); } else { dlAddMiddle(toDoList, finNode); fprintf(stderr, "Retry %d on %s\n", m->errCount, m->name); } } } if (!dlEmpty(errList)) { fprintf(stderr, "errors in:"); for (node = errList->head; node->next != NULL; node = node->next) { m = node->val; fprintf(stderr, " %s", m->name); } fprintf(stderr, "\n"); } goodMachines = dlCount(finishedList); grandTotal = (double)goodMachines * (double)size; printf("Copied to %d of %d machines (grand total %e bytes) in %d seconds\n", goodMachines, machineCount, grandTotal, (int)(time(NULL) - startTime)); }