// // findFilter // // Find a filter in the list // FilterItem * Filter::findFilter(const QString& filterPattern) { FilterItem* re; FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) if (re->name() == filterPattern) return re; return NULL; }
void Filter::listFilters(void) { FilterItem *re; #ifdef DEBUG_FILTER // printf("Filter::listFilters\n"); #endif FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) printf("'%s'\n", (const char*)re->name()); }
bool Filter::isFiltered(const QString& filterString, uint8_t level) { FilterItem *re; #ifdef DEBUG_FILTER //seqDebug("isFiltered(%s)", string); #endif /* DEBUG_FILTER */ // iterate over the filters checking for a match FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) { if (re->isFiltered(filterString, level)) return true; } return false; }
// // save // // parses the filter file and builds filter list // bool Filter::save(QString& indent, QTextStream& out) { FilterItem *re; // increase indent indent += " "; // construct an iterator over the filter items FilterListIterator it(m_filterItems); // iterate over the filter items, saving them as we go along. for (re = it.toFirst(); re != NULL; re = ++it) re->save(indent, out); // decrease indent indent.remove(0, 4); return true; }
// // addFilter // // Add a filter to the list // bool Filter::addFilter(const QString& filterPattern) { FilterItem* re; // no duplicates allowed if (findFilter(filterPattern)) return false; re = new FilterItem(filterPattern, m_caseSensitive); // append it to the end of the list m_filterItems.append(re); #ifdef DEBUG_FILTER seqDebug("Added Filter '%s'", (const char*)filterPattern); #endif return re->valid(); } // end addFilter
// // addFilter // // Add a filter to the list // bool Filter::addFilter(const QString& filterPattern) { FilterItem* re; // no duplicates allowed if (findFilter(filterPattern)) return false; re = new FilterItem(filterPattern, m_cFlags); // append it to the end of the list m_filterItems.append(re); #ifdef DEBUG_FILTER printf("Added Filter '%s'\n", filterPattern); #endif return re->valid(); } // end addFilter
// // remFilter // // Remove a filter from the list void Filter::remFilter(const QString& filterPattern) { FilterItem *re; // Find a match in the list and the one previous to it //while(re) FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) { if (re->name() == filterPattern) // if match { // remove the filter m_filterItems.remove(re); #ifdef DEBUG_FILTER seqDebug("Removed '%s' from List", (const char*)filterPattern); #endif break; } } //end For }
void Filter::listFilters(void) { FilterItem *re; #ifdef DEBUG_FILTER // seqDebug("Filter::listFilters"); #endif FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) { if (re->minLevel() || re->maxLevel()) seqInfo("\t'%s' (%d, %d)", (const char*)re->name().utf8(), re->minLevel(), re->maxLevel()); else seqInfo("\t'%s'", (const char*)re->name().utf8()); } }
bool Filter::saveFilters(void) { FILE *in; FILE *out; FilterItem* re; char msg[MAXLEN + 1]; char *p; int count = 0; bool done = false; bool start = false; #ifdef DEBUG_FILTER printf("Filter::saveFilters(void)\n"); #endif // if no filename can't save if (m_file.isEmpty()) return false; // Save filter file // Open source and destination files QString outfilename = NULL; QString infilename = m_file; outfilename = infilename + ".new"; in = fopen ((const char*)infilename, "r"); out = fopen ((const char*)outfilename, "w+"); if (in == 0) { fprintf (stderr, "Couldn't open filter file. '%s' - %s\n", (const char*)infilename, strerror(errno)); } if (out == 0) { fprintf (stderr, "Couldn't open filter file. '%s' - %s\n", (const char*)outfilename, strerror(errno)); return false; } else { char *sType = NULL; if (in) { // Parse source file while (fgets (msg, MAXLEN, in) != NULL) { // terminate the line p = index (msg, '\n'); if (p) *p = 0; p = index (msg, '\r'); if (p) *p = 0; // terminate on CF or LF // if this filter uses section names if (!m_type.isEmpty()) { // end of section - dump all items left in list that belong here if (sType && !msg[0]) { // if this is our section if (m_type == sType) { // done copying filters that existed in file already // dump whatever is left in list FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) { #ifdef DEBUG_FILTER printf("OUT: '%s'\n", (const char*)re->name()); #endif fprintf(out, "%s\n", (const char*)re->name()); } done = true; start = false; } // end if our section free(sType); sType = 0; } // end if end of section } // treat lines beginning with # or ; as comments if ( (msg[0] == '#') || (msg[0] == ';')) { #ifdef DEBUG_FILTER printf("OUT: '%s'\n", msg); #endif fprintf(out, "%s", msg); msg[0] = 0; } // preserve blank lines if (!msg[0]) fprintf(out, "\n"); if (!m_type.isEmpty()) { // check for section name if (msg[0] == '[') { p = index(msg, ']'); if (p) *p = 0; p = index(msg, '\r'); if (p) *p = 0; if (sType) free(sType); sType = strdup(msg + 1); #ifdef DEBUG_FILTER printf("OUT: '[%s]'\n", sType); #endif fprintf(out, "[%s]\n", sType); start = true; msg[0] = 0; } } // end if filter uses section names if (msg[0]) { // if this is our section if (sType && (m_type == sType)) { // look for a match, if found put it in the file and // remove it from the list FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) { // if we found a match, output it if (re->name() == msg) { #ifdef DEBUG_FILTER printf("OUT: '%s'\n", msg); #endif fprintf(out, "%s\n", msg); count++; remFilter(msg); break; } } // for all items in list } // end if our section // someone elses section, just output it without alteration else { #ifdef DEBUG_FILTER printf("OUT: '%s'\n", msg); #endif fprintf(out, "%s\n", msg); } } // end if msg } // end while lines in source file } // end if source file // if we still have filters in our list, we never found our section // add it if (!done) { if (!m_type.isEmpty() && !start) { #ifdef DEBUG_FILTER printf("done parsing file... creating section '%s'\n", (const char*)m_type); #endif fprintf(out, "\n[%s]\n", (const char*)m_type); } // done copying filters that existed in file already // dump whatever is left in list FilterListIterator it(m_filterItems); for (re = it.toFirst(); re != NULL; re = ++it) { #ifdef DEBUG_FILTER printf("OUT: '%s'\n", (const char*)re->name()); #endif fprintf(out, "%s\n", (const char*)re->name()); } } if (fflush (out)) fprintf (stderr, "Couldn't flush filter file. '%s' - %s\n", (const char*)outfilename, strerror(errno)); if (fclose (out)) fprintf (stderr, "Couldn't flush filter file. '%s' - %s\n", (const char*)outfilename, strerror(errno)); if (in) fclose (in); // printf ("Filter file saved '%s'\n", outfilename); // rename files int result; QString bakFileName = infilename + ".bak"; // rename input file to filename.bak result = rename((const char*)infilename, (const char*)bakFileName); if (result != 0) fprintf(stderr, "rename '%s' to '%s' failed: (%d): %s\n", (const char*)infilename, (const char*)bakFileName, errno, strerror(errno)); // rename the output file to the input filename result = rename((const char*)outfilename, (const char*)infilename); if (result != 0) fprintf(stderr, "rename '%s' to '%s' failed: (%d): %s\n", (const char*)outfilename, (const char*)infilename, errno, strerror(errno)); if (sType) free(sType); } // re-read the filters from file loadFilters(); return true; } // end saveFilters