int main(int argc, char **argv){ GtkWidget *box; GtkWidget *scroll; sz=MAXCONTACT; int i; conlist=(Contact*)malloc(MAXCONTACT*sizeof(Contact)); //Load contact file if(argc==2) readListFile(argv[1],conlist,&sz); else readListFile("cons.cn",conlist,&sz); closeListFile(); //initializing components gtk_init(&argc,&argv); initializeClient(NULL); wind=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(wind),"Aeos Client"); phnum=gtk_entry_new(); phNumCombo=gtk_combo_box_text_new(); for(i=0;i<sz;i++){ gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(phNumCombo),i,strcat(&conlist[i].name,&conlist[i].num)); //gtk_combo_box_insert_text(GTK_COMBO_BOX(phNumCombo),1,"World"); } gtk_combo_box_set_active(GTK_COMBO_BOX(phNumCombo),0); text=gtk_text_view_new(); textBuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD); scroll=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll),text); //gtk_text_view_set_ //gtk_text_set_editable(GTK_TEXT(text),1); sendButton=gtk_button_new_with_mnemonic("_Send"); //adding event listeners g_signal_connect(wind,"destroy",G_CALLBACK(destroyWindow),NULL); g_signal_connect(sendButton,"clicked",G_CALLBACK(sendText),NULL); //adding to container and making visible box=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box),phNumCombo,TRUE,TRUE,0); gtk_widget_show(phnum); gtk_box_pack_start(GTK_BOX(box),scroll,TRUE,TRUE,0); gtk_widget_show(scroll); gtk_box_pack_start(GTK_BOX(box),sendButton,TRUE,TRUE,0); gtk_widget_show(sendButton); gtk_widget_show(box); gtk_container_add(GTK_CONTAINER(wind),box); gtk_widget_show_all(wind); //main gtk_main(); return 0; }
void TestRegressionWindow::removeFromIgnores() { assert(m_activeTreeItem != 0); QString treeItemText = pathFromItem(m_activeTreeItem); // Extract directory/file name... int position = treeItemText.lastIndexOf('/'); QString directory = treeItemText.mid(0, (position == -1 ? 0 : position)); QString fileName = treeItemText.mid(position + 1); // Read corresponding ignore file.. QString ignoreFile = m_testsUrl.path() + "/tests/" + directory + "/ignore"; QStringList ignoreFileList = readListFile(ignoreFile); if(ignoreFileList.contains(fileName)) ignoreFileList.removeAll(fileName); // Commit changes... writeListFile(ignoreFile, ignoreFileList); // Reset icon status... m_activeTreeItem->setIcon(0, QPixmap()); }
bool processCmdLineArgs(int argc, char **argv) { for (int i = 0; i < vmxpathListMax; i++) vmxpathList[i] = NULL; for (int i = 1; i < argc; i++) { if (strcmp(argv[i],"-v") == 0) { verbose = true; } else if ((strcmp(argv[i],"-h") == 0) || (strcmp(argv[i],"-?") == 0)) { printUsage(argv[0]); return false; } else if ((strcmp(argv[i],"-u") == 0) || (strcmp(argv[i],"--uninstall") == 0)) { shouldUninstall = true; } else if (strncmp(argv[i],"--tag=",6) == 0) { overrideTag = argv[i] + 6; if (verbose) fprintf(stderr,"Using \"%s\" to tag guests\n",overrideTag); } else { if (vmxpathCount < vmxpathListMax) { if (isNumber(argv[i])) { readListFile(atoi(argv[i])); } else { vmxpathList[vmxpathCount++] = argv[i]; } } } } return true; }
bool ModList::update() { if (!isValid()) return false; QList<Mod> newMods; m_dir.refresh(); auto folderContents = m_dir.entryInfoList(); bool orderWasInvalid = false; // first, process the ordered items (if any) int currentOrderIndex = 0; QStringList listOrder = readListFile(); for(auto item: listOrder) { QFileInfo info (m_dir.filePath(item)); int idx = folderContents.indexOf(info); // if the file from the index file exists if(idx != -1) { // remove from the actual folder contents list folderContents.takeAt(idx); // append the new mod newMods.append(Mod(info)); } else { orderWasInvalid = true; } } for(auto entry: folderContents) { newMods.append(Mod(entry)); } if(mods.size() != newMods.size()) { orderWasInvalid = true; } else for(int i = 0; i < mods.size(); i++) { if(!mods[i].strongCompare(newMods[i])) { orderWasInvalid = true; break; } } beginResetModel(); mods.swap(newMods); endResetModel(); if(orderWasInvalid) { saveListFile(); emit changed(); } return true; }
void TestRegressionWindow::directoryListingResult(KIO::Job *, const KIO::UDSEntryList &list) { KIO::UDSEntryList::ConstIterator it = list.constBegin(); const KIO::UDSEntryList::ConstIterator end = list.constEnd(); for(; it != end; ++it) { const KIO::UDSEntry &entry = *it; QString name = entry.stringValue(KIO::UDSEntry::UDS_NAME); if(entry.isDir()) // Create new map entry... { assert(m_directoryMap.constFind(name) == m_directoryMap.constEnd()); m_directoryMap.insert(name, QStringList()); QString ignoreFile = m_testsUrl.path() + "/tests/" + name + "/ignore"; QString failureFile = m_testsUrl.path() + "/tests/" + name + "/KNOWN_FAILURES"; QStringList ignoreFileList = readListFile(ignoreFile); QStringList failureFileList = readListFile(failureFile); if(!ignoreFileList.isEmpty()) m_ignoreMap.insert(name, ignoreFileList); if(!failureFileList.isEmpty()) m_failureMap.insert(name, failureFileList); } else if(name.endsWith(".html") || name.endsWith(".htm") || name.endsWith(".xhtml") || name.endsWith(".xml") || name.endsWith(".js")) { int lastSlashPos = name.lastIndexOf('/'); QString cachedDirectory = (lastSlashPos > 0 ? name.mid(0, lastSlashPos) : QString()); QString cachedFilename = name.mid(lastSlashPos + 1); assert(m_directoryMap.constFind(cachedDirectory) != m_directoryMap.constEnd()); m_directoryMap[cachedDirectory].append(cachedFilename); } } }
void TestRegressionWindow::directoryListingFinished(KJob *) { QTreeWidgetItem *topLevelItem = m_ui.treeWidget->topLevelItem(0); // Gather a lot of statistics... unsigned long availableDomFiles = 0; unsigned long availableDumpFiles = 0; unsigned long availableRenderFiles = 0; unsigned long ignoredJSTests = 0; unsigned long availableJSTests = 0; unsigned long ignoredXMLTests = 0; unsigned long availableXMLTests = 0; unsigned long ignoredHTMLTests = 0; unsigned long availableHTMLTests = 0; unsigned long ignoredDOMTSTests = 0; unsigned long availableDOMTSTests = 0; // Start the actual data processing... QMap<QString, QStringList>::const_iterator it = m_directoryMap.constBegin(); const QMap<QString, QStringList>::const_iterator end = m_directoryMap.constEnd(); for(; it != end; ++it) { QString directory = it.key(); QStringList filenames = it.value(); if(filenames.isEmpty()) // Do not add empty directories at all... continue; bool hasIgnores = (m_ignoreMap.constFind(directory) != m_directoryMap.constEnd()); bool hasFailures = (m_failureMap.constFind(directory) != m_failureMap.constEnd()); // Extract parent directory... int position = directory.lastIndexOf('/'); QString parentDirectory = directory.mid(0, (position == -1 ? 0 : position)); QString parentDirectoryItem = directory.mid(position + 1); bool hasParentIgnores = (m_ignoreMap.constFind(parentDirectory) != m_directoryMap.constEnd()); bool hasParentFailures = (m_failureMap.constFind(parentDirectory) != m_failureMap.constEnd()); // Sort in ascending order... filenames.sort(); QStringList::const_iterator it2 = filenames.constBegin(); const QStringList::const_iterator end2 = filenames.constEnd(); // Create new tree widget item for the active directory... QTreeWidgetItem *parent = topLevelItem; if(!directory.isEmpty()) { parent = new QTreeWidgetItem(topLevelItem, QStringList(directory)); // Directory is completely ignored, mark it 'yellow'... if(hasParentIgnores && m_ignoreMap[parentDirectory].contains(parentDirectoryItem)) parent->setIcon(0, m_ignorePixmap); // Directory is completely known to fail, mark it 'red'... if(hasParentFailures && m_failureMap[parentDirectory].contains(parentDirectoryItem)) parent->setIcon(0, m_failKnownPixmap); } // Add all contained files as new items below 'parent'... for(; it2 != end2; ++it2) { QString test = (*it2); QString cacheName = directory + "/" + test; //krazy:exclude=duoblequote_chars DOM demands chars QTreeWidgetItem *testItem = new QTreeWidgetItem(parent, QStringList(KUrl(test).path())); // Remember name <-> item pair... assert(m_itemMap.contains(cacheName)); m_itemMap.insert(cacheName, testItem); bool ignore = (hasIgnores && m_ignoreMap[directory].contains(test)); bool ignoreParent = (hasParentIgnores && m_ignoreMap[parentDirectory].contains(parentDirectoryItem)); bool failure = (hasFailures && m_failureMap[directory].contains(test)); // Check baseline directory for this test... QString baseLinePath = m_testsUrl.path() + "/baseline/" + cacheName; bool dom[9], render[9]; for(unsigned int i = 0; i < 9; ++i) { if(i == 0) { dom[i] = (QFileInfo(baseLinePath + "-dom").exists()); render[i] = (QFileInfo(baseLinePath + "-render").exists()); } else { dom[i] = (QFileInfo(baseLinePath + "-" + QString::number(i) + "-dom").exists()); //krazy:exclude=duoblequote_chars DOM demands chars render[i] = (QFileInfo(baseLinePath + "-" + QString::number(i) + "-render").exists()); //krazy:exclude=duoblequote_chars DOM demands chars } } bool dump = (QFileInfo(baseLinePath + "-dump.png").exists()); // Ignored tests are marked 'yellow'... if(ignore) testItem->setIcon(0, m_ignorePixmap); // Tests, known to fail, are marked 'red'... if(failure) testItem->setIcon(0, m_failKnownPixmap); // Detect whether the tests has no corresponding baseline items... if(!ignore && !failure) { if(!dom[0] && !dump && !render && !cacheName.endsWith(".js") && !cacheName.startsWith("domts")) { // See if parent directory is completely ignored... if(!ignoreParent) testItem->setIcon(0, m_noBaselinePixmap); } } // Update statistics... if(dump) availableDumpFiles++; for(unsigned i = 0; i < 9; ++i) { if(dom[i]) availableDomFiles++; if(render[i]) availableRenderFiles++; } // Count DOM Testsuite files separated... (these have no baseline items!) if(cacheName.startsWith("domts")) { // See if parent directory is completely ignored... if(ignore || ignoreParent) ignoredDOMTSTests++; else availableDOMTSTests++; } if(cacheName.endsWith(".html") || cacheName.endsWith(".htm") || cacheName.endsWith(".xhtml")) { if(ignore || ignoreParent) ignoredHTMLTests++; else availableHTMLTests++; } else if(cacheName.endsWith(".xml")) { if(ignore || ignoreParent) ignoredXMLTests++; else availableXMLTests++; } else if(cacheName.endsWith(".js")) { unsigned long containedTests = 0; // Try hard to _ESTIMATE_ the number of tests... // I really meant estimate, no way to calculate it perfectly. QString jsFilePath = m_testsUrl.path() + "/tests/" + cacheName; assert(QFileInfo(jsFilePath).exists() == true); QStringList fileList = readListFile(jsFilePath); QString fileContent = fileList.join(""); // #1 -> Check js file for the 'reportResult' calls... containedTests = fileContent.count("reportResult"); // #2 -> Check js file for 'openPage' calls... containedTests += fileContent.count("openPage"); // #3 -> Check js file for 'checkOutput' calls... containedTests += fileContent.count("checkOutput"); // #4 -> Fallback for ie. mozilla/ecma files... if(containedTests == 0) // Doesn't use 'reportResult' scheme... containedTests++; if(ignore || ignoreParent) ignoredJSTests += containedTests; else availableJSTests += containedTests; } } } // Now we can calculate all ignored/available tests... unsigned long ignoredTests = ignoredJSTests + ignoredXMLTests + ignoredHTMLTests; unsigned long availableTests = availableJSTests + availableXMLTests + availableHTMLTests; // This estimates the number of total tests, depending on the mode... m_totalTests = availableDomFiles + availableDumpFiles + availableRenderFiles + availableDOMTSTests + availableJSTests; m_totalTestsJS = availableJSTests; m_totalTestsDOMTS = availableDOMTSTests; // Update progress bar range... updateProgressBarRange(); QString statistics = QString("<body><table border='0' align='center' cellspacing='15'>") + QString("<tr valign='top'><td colspan='3'><center><b>Statistics</b></center></td></tr>") + QString("<tr valign='middle'><td>JS Tests</td><td>" + QString::number(availableJSTests) + "</td><td>(" + QString::number(ignoredJSTests) + " ignored)</td></tr>") + QString("<tr valign='middle'><td>XML Tests</td><td>" + QString::number(availableXMLTests) + "</td><td>(" + QString::number(ignoredXMLTests) + " ignored)</td></tr>") + QString("<tr valign='middle'><td>HTML Tests</td><td>" + QString::number(availableHTMLTests) + "</td><td>(" + QString::number(ignoredHTMLTests) + " ignored)</td></tr>") + QString("</table></body>"); // Go to end... QTextCursor cursor = m_ui.textEdit->textCursor(); cursor.movePosition(QTextCursor::End); m_ui.textEdit->setTextCursor(cursor); // Insert statistics... m_ui.textEdit->insertHtml(statistics); // Update treeview... m_ui.treeWidget->headerItem()->setText(0, i18n("Available Tests: %1 (ignored: %2)", availableTests, ignoredTests)); }
void TestRegressionWindow::initTestsDirectory() { bool okay = !m_testsUrl.isEmpty(); if(okay) { const char *subdirs[] = { "tests", "baseline", "output", "resources" }; for(int i = 0; i <= 3; i++) { QFileInfo sourceDir(m_testsUrl.path() + "/" + subdirs[i]); //krazy:exclude=duoblequote_chars DOM demands chars if(!sourceDir.exists() || !sourceDir.isDir()) { KMessageBox::error(0, i18n("Please choose a valid 'khtmltests/regression/' directory.")); okay = false; m_testsUrl = KUrl(); break; } } } if(okay) { // Clean up... m_itemMap.clear(); m_ignoreMap.clear(); m_failureMap.clear(); m_directoryMap.clear(); m_ui.treeWidget->clear(); if(!m_khtmlUrl.isEmpty()) m_ui.actionRun_tests->setEnabled(true); // Initialize map (to prevent assert below)... m_directoryMap.insert(QString(), QStringList()); // Setup root tree widget item... (void) new QTreeWidgetItem(m_ui.treeWidget, QStringList(m_testsUrl.path() + "/tests")); // Check for ignore & failure file in root directory... QString ignoreFile = m_testsUrl.path() + "/tests/ignore"; QString failureFile = m_testsUrl.path() + "/tests/KNOWN_FAILURES"; QStringList ignoreFileList = readListFile(ignoreFile); QStringList failureFileList = readListFile(failureFile); if(!ignoreFileList.isEmpty()) m_ignoreMap.insert(QString(), ignoreFileList); if(!failureFileList.isEmpty()) m_failureMap.insert(QString(), failureFileList); // Remember directory... KConfig config("testregressiongui", KConfig::SimpleConfig); KConfigGroup grp = config.group("<default>"); grp.writePathEntry("TestsDirectory", m_testsUrl.path()); // Start listing directory... KUrl listUrl = m_testsUrl; listUrl.addPath("tests"); KIO::ListJob *job = KIO::listRecursive(listUrl, KIO::HideProgressInfo, false /* no hidden files */); connect(job, SIGNAL(result(KJob *)), SLOT(directoryListingFinished(KJob *))); connect(job, SIGNAL(entries(KIO::Job *, const KIO::UDSEntryList &)), this, SLOT(directoryListingResult(KIO::Job *, const KIO::UDSEntryList &))); } }
bool ModList::update() { if (!isValid()) return false; QList<Mod> orderedMods; QList<Mod> newMods; m_dir.refresh(); auto folderContents = m_dir.entryInfoList(); bool orderOrStateChanged = false; // first, process the ordered items (if any) OrderList listOrder = readListFile(); for (auto item : listOrder) { QFileInfo infoEnabled(m_dir.filePath(item.id)); QFileInfo infoDisabled(m_dir.filePath(item.id + ".disabled")); int idxEnabled = folderContents.indexOf(infoEnabled); int idxDisabled = folderContents.indexOf(infoDisabled); bool isEnabled; // if both enabled and disabled versions are present, it's a special case... if (idxEnabled >= 0 && idxDisabled >= 0) { // we only process the one we actually have in the order file. // and exactly as we have it. // THIS IS A CORNER CASE isEnabled = item.enabled; } else { // only one is present. // we pick the one that we found. // we assume the mod was enabled/disabled by external means isEnabled = idxEnabled >= 0; } int idx = isEnabled ? idxEnabled : idxDisabled; QFileInfo & info = isEnabled ? infoEnabled : infoDisabled; // if the file from the index file exists if (idx != -1) { // remove from the actual folder contents list folderContents.takeAt(idx); // append the new mod orderedMods.append(Mod(info)); if (isEnabled != item.enabled) orderOrStateChanged = true; } else { orderOrStateChanged = true; } } // if there are any untracked files... if (folderContents.size()) { // the order surely changed! for (auto entry : folderContents) { newMods.append(Mod(entry)); } std::sort(newMods.begin(), newMods.end(), [](const Mod & left, const Mod & right) { return left.name().localeAwareCompare(right.name()) <= 0; }); orderedMods.append(newMods); orderOrStateChanged = true; } // otherwise, if we were already tracking some mods else if (mods.size()) { // if the number doesn't match, order changed. if (mods.size() != orderedMods.size()) orderOrStateChanged = true; // if it does match, compare the mods themselves else for (int i = 0; i < mods.size(); i++) { if (!mods[i].strongCompare(orderedMods[i])) { orderOrStateChanged = true; break; } } } beginResetModel(); mods.swap(orderedMods); endResetModel(); if (orderOrStateChanged && !m_list_file.isEmpty()) { QLOG_INFO() << "Mod list " << m_list_file << " changed!"; saveListFile(); emit changed(); } return true; }