diff options
author | Mavridis Philippe <mavridisf@gmail.com> | 2021-01-13 19:26:24 +0200 |
---|---|---|
committer | Mavridis Philippe <mavridisf@gmail.com> | 2021-01-13 19:26:24 +0200 |
commit | 8c20dc919f7d54eb48fb60f39ba5e1d466a70763 (patch) | |
tree | 44d89f278d5dd066603e5ab9c0b270bc8eb4ad51 /src/dbviewer.cpp | |
download | klamav-8c20dc919f7d54eb48fb60f39ba5e1d466a70763.tar.gz klamav-8c20dc919f7d54eb48fb60f39ba5e1d466a70763.zip |
Initial commit
Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
Diffstat (limited to 'src/dbviewer.cpp')
-rw-r--r-- | src/dbviewer.cpp | 973 |
1 files changed, 973 insertions, 0 deletions
diff --git a/src/dbviewer.cpp b/src/dbviewer.cpp new file mode 100644 index 0000000..ed45a23 --- /dev/null +++ b/src/dbviewer.cpp @@ -0,0 +1,973 @@ +/* + * Copyright (C) 2004 Robert Hogan <robert at roberthogan dot net> + * + * ClamAV DB code: + * Copyright (C) 2002 - 2005 Tomasz Kojm <tkojm@clamav.net> + + */ + +#include "dbviewer.h" +#include "klamav.h" +#include <clamav.h> +#include "pageviewer.h" +#include "tabwidget.h" +#include "freshklam.h" +#include "../config.h" + +#include <qheader.h> +#include <qlayout.h> +#include <qpopupmenu.h> + +#include <ktoolbarbutton.h> //ctor +#include <ktempfile.h> +#include <ktempdir.h> +#include <klistviewsearchline.h> +#include <klistview.h> +#include <kprogress.h> + +#include <dirent.h> +#include <zlib.h> + +#include <klocale.h> +#include <kstandarddirs.h> +#include <kiconloader.h> + +#define TAR_BLOCKSIZE 512 +#define FILEBUFF 8192 + +int cli_untgz(int fd, const char *destdir); +int cli_rmdirs(const char *dirname); +int cli_strbcasestr(const char *haystack, const char *needle); +int cli_chomp(char *string); +char *cli_strtok(const char *line, int field, const char *delim); + +using namespace KlamAV; +/* + * Constructs a KlamDB as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +KlamDB::KlamDB( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) +{ + if ( !name ) + setName( "KlamDB" ); + + loadinprogress = false; + QVBoxLayout *vbox = new QVBoxLayout(this, KDialog::marginHint(), + KDialog::spacingHint(), "vbox"); + + QWidget* privateLayoutWidget = new QWidget( this, "dblayout" ); + vbox->addWidget(privateLayoutWidget); + + dblayout = new QGridLayout( privateLayoutWidget, 1, 1, 2, 2, "dblayout"); + dblayout->setColStretch(1, 1); + + tabBrowser = new TabWidget(privateLayoutWidget); + + + dblayout->addMultiCellWidget( tabBrowser, 0, 1, 1, 1 ); + + KToolBarButton *button; + KToolBar* searchToolBar = new KToolBar( privateLayoutWidget ); + searchToolBar->setMovingEnabled(false); + searchToolBar->setFlat(true); + searchToolBar->setIconSize( 16 ); + searchToolBar->setEnableContextMenu( false ); + + button = new KToolBarButton( "locationbar_erase", 0, searchToolBar ); + + VirusList = new KListView( privateLayoutWidget, "VirusList" ); + VirusList->addColumn( i18n( "All Known Viruses" ),150 ); + connect(VirusList, SIGNAL( doubleClicked( QListViewItem * , const QPoint &, int ) ), + this, SLOT(slotOpenTab(QListViewItem * , const QPoint &, int )) ); + + menu = new QPopupMenu( VirusList ); + + QPixmap gicon; + QPixmap vicon; + QPixmap ticon; + + QString iconPath = locate("cache", KMimeType::favIconForURL("http://www.viruspool.net")+".png"); + if ( iconPath.isEmpty() ) + vicon = SmallIcon("find"); + else + vicon = QPixmap( iconPath ); + + iconPath = locate("cache", KMimeType::favIconForURL("http://www.google.com")+".png"); + if ( iconPath.isEmpty() ) + gicon = SmallIcon("find"); + else + gicon = QPixmap( iconPath ); + + iconPath = locate("cache", KMimeType::favIconForURL("http://www.trendmicro.com")+".png"); + if ( iconPath.isEmpty() ) + ticon = SmallIcon("find"); + else + ticon = QPixmap( iconPath ); + + menu->insertItem(vicon, i18n("Search in VirusList"), this,SLOT(slotVirusList()) ); + menu->insertItem(vicon, i18n("Search in VirusPool"), this,SLOT(slotVirusPool()) ); + menu->insertItem(ticon, i18n("Search with Trend Micro"), this,SLOT(slotTrendMicro()) ); + menu->insertItem(gicon, i18n("Search with Google"), this,SLOT(slotGoogle()) ); + + connect(VirusList, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint& , int ) ), + this, SLOT( slotRMB( QListViewItem *, const QPoint &, int ) ) ); + + kLineEdit1 = new KListViewSearchLine( (QWidget *)searchToolBar, VirusList,"klinedit1"); + QValueList<int> columns; + columns.append(0); + kLineEdit1->setSearchColumns(columns); + kLineEdit1->setMaxLength(2); + connect(button, SIGNAL( clicked() ), + kLineEdit1, SLOT(clear()) ); + + dblayout->addWidget( searchToolBar, 0, 0 ); + + dblayout->addWidget( VirusList, 1, 0 ); + + + languageChange(); + clearWState( WState_Polished ); + + slotOpenHome(); +} + +/* + * Destroys the object and frees any allocated resources + */ +KlamDB::~KlamDB() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void KlamDB::languageChange() +{ + setCaption( i18n( "Form1" ) ); + tabBrowser->changeTab( tab, i18n( "Info" ) ); + VirusList->header()->setLabel( 0, i18n( "All Known Viruses" ) ); + VirusList->clear(); + /*KListViewItem * item =*/ new KListViewItem( VirusList, 0 ); + //item->setText( 0, tr( "New Item" ) ); + +} + +int KlamDB::listdb(const char *filename) +{ + FILE *fd, *tmpd; +// char *buffer, *pt, *start, *dir, *tmp; + char *buffer, *pt, *start; + int line = 0, bytes; + const char *tmpdir; + + if(cli_strbcasestr(filename, ".inc")) { /* incremental directory */ + if(listdir(filename) == -1) { + printf("!listdb: Can't list incremental directory %s\n", filename); + return -1; + } + return 0; + } + + if((fd = fopen(filename, "rb")) == NULL) { + printf("!listdb(): Can't open file %s\n", filename); + return -1; + } + + if(!(buffer = (char *) malloc(FILEBUFF))) { + printf("!listdb(): Can't allocate memory.\n"); + fclose(fd); + return -1; + } + + memset(buffer, 0, FILEBUFF); + /* check for CVD file */ + fgets(buffer, 12, fd); + rewind(fd); + + if(!strncmp(buffer, "ClamAV-VDB:", 11)) { + + fseek(fd, 512, SEEK_SET); + + tmpdir = getenv("TMPDIR"); + if(tmpdir == NULL) +#ifdef P_tmpdir + tmpdir = P_tmpdir; +#else + tmpdir = "/tmp"; +#endif + + KTempDir* tf = new KTempDir(); + if ( tf->status() != 0 ) { + delete tf; + return -1; + } + + /* FIXME: it seems there is some problem with current position indicator + * after gzdopen() call in cli_untgz(). Temporarily we need this wrapper: + */ + + /* start */ + + KTempFile* tn = new KTempFile(tf->name()); + + if((tmpd = fopen(tn->name(), "wb+")) == NULL) { + printf("!listdb(): Can't create temporary file \n"); + delete tf; + delete tn; + free(buffer); + fclose(fd); + return -1; + } + + while((bytes = fread(buffer, 1, FILEBUFF, fd)) > 0) + fwrite(buffer, 1, bytes, tmpd); + + free(buffer); + fclose(fd); + + fflush(tmpd); + fseek(tmpd, 0L, SEEK_SET); + + if(cli_untgz(fileno(tmpd), tf->name())) { + printf("!listdb(): Can't unpack CVD file.\n"); + cli_rmdirs(tf->name()); + delete tf; + delete tn; + fclose(tmpd); + free(buffer); + return -1; + } + + fclose(tmpd); + delete tn; + /* wrapper end */ + + /* list extracted directory */ + listdir(tf->name()); + + cli_rmdirs(tf->name()); + delete tf; + + return 0; + } + + if(cli_strbcasestr(filename, ".db") || cli_strbcasestr(filename, ".db2")) { + /* old style database */ + + while(fgets(buffer, FILEBUFF, fd)) { + line++; + pt = strchr(buffer, '='); + if(!pt) { + printf("!listdb(): Malformed pattern line %d (file %s).\n", line, filename); + fclose(fd); + free(buffer); + return -1; + } + + start = buffer; + *pt = 0; + + if((pt = strstr(start, " (Clam)"))) + *pt = 0; + + //printf("%s\n", start); + addVirusName(start); + + } + + } else if(cli_strbcasestr(filename, ".hdb")) { + + while(fgets(buffer, FILEBUFF, fd)) { + line++; + cli_chomp(buffer); + start = cli_strtok(buffer, 2, ":"); + + if(!start) { + printf("!listdb(): Malformed pattern line %d (file %s).\n", line, filename); + fclose(fd); + free(buffer); + return -1; + } + + if((pt = strstr(start, " (Clam)"))) + *pt = 0; + + //printf("%s\n", start); + addVirusName(start); + free(start); + } + + } else if(cli_strbcasestr(filename, ".ndb")) { + + while(fgets(buffer, FILEBUFF, fd)) { + line++; + cli_chomp(buffer); + start = cli_strtok(buffer, 0, ":"); + + if(!start) { + printf("!listdb(): Malformed pattern line %d (file %s).\n", line, filename); + fclose(fd); + free(buffer); + return -1; + } + + if((pt = strstr(start, " (Clam)"))) + *pt = 0; + + //printf("%s\n", start); + addVirusName(start); + + free(start); + } + } + + fclose(fd); + free(buffer); + return 0; +} + +int KlamDB::listdir(const char *dirname) +{ + DIR *dd; + struct dirent *dent; + char *dbfile; + + + if((dd = opendir(dirname)) == NULL) { + printf("!Can't open directory %s\n", dirname); + return -1; + } + + while((dent = readdir(dd))) { +#ifndef C_INTERIX + if(dent->d_ino) +#endif + { + if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") && + (cli_strbcasestr(dent->d_name, ".db") || + cli_strbcasestr(dent->d_name, ".hdb") || + cli_strbcasestr(dent->d_name, ".mdb") || + cli_strbcasestr(dent->d_name, ".ndb") || + cli_strbcasestr(dent->d_name, ".sdb") || + cli_strbcasestr(dent->d_name, ".zmd") || + cli_strbcasestr(dent->d_name, ".rmd") || + cli_strbcasestr(dent->d_name, ".inc") || + cli_strbcasestr(dent->d_name, ".cvd"))) { + + dbfile = (char *) calloc(strlen(dent->d_name) + strlen(dirname) + 2, sizeof(char)); + + if(!dbfile) { + printf("!listdir(): Can't allocate memory.\n"); + closedir(dd); + return -1; + } + sprintf(dbfile, "%s/%s", dirname, dent->d_name); + + if(listdb(dbfile)) { + printf("!listdb(): error listing database %s\n", dbfile); + free(dbfile); + closedir(dd); + return -1; + } + free(dbfile); + } + } + } + + closedir(dd); + return 0; +} + +int KlamDB::checkdir(const char *dirname) +{ + DIR *dd; + struct dirent *dent; + + + if((dd = opendir(dirname)) == NULL) { + printf("!Can't open directory %s\n", dirname); + return -1; + } + + int found = 0; + while((dent = readdir(dd))) { +#ifndef C_INTERIX + if(dent->d_ino) +#endif + { + if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") && + (cli_strbcasestr(dent->d_name, ".db") || + cli_strbcasestr(dent->d_name, ".hdb") || + cli_strbcasestr(dent->d_name, ".mdb") || + cli_strbcasestr(dent->d_name, ".ndb") || + cli_strbcasestr(dent->d_name, ".sdb") || + cli_strbcasestr(dent->d_name, ".zmd") || + cli_strbcasestr(dent->d_name, ".rmd") || + cli_strbcasestr(dent->d_name, ".inc") || + cli_strbcasestr(dent->d_name, ".cvd"))) { + found = 1; + } + } + } + + closedir(dd); + + if (!(found)) + return -1; + return 0; +} + +int cli_untgz(int fd, const char *destdir) +{ + char *fullname, osize[13], name[101], type; + char block[TAR_BLOCKSIZE]; + int nbytes, nread, nwritten, in_block = 0; + unsigned int size; + FILE *outfile = NULL; + gzFile *infile; + + printf("in cli_untgz()\n"); + + if((infile = (gzFile*) gzdopen(fd, "rb")) == NULL) { + printf("Can't gzdopen() descriptor %d\n", fd); + return -1; + } + + + fullname = (char *) calloc(sizeof(char), strlen(destdir) + 100 + 5); + + while(1) { + + nread = gzread(infile, block, TAR_BLOCKSIZE); + + if(!in_block && nread == 0) + break; + + if(nread != TAR_BLOCKSIZE) { + printf("Incomplete block read.\n"); + free(fullname); + gzclose(infile); + return -1; + } + + if(!in_block) { + if (block[0] == '\0') /* We're done */ + break; + + strncpy(name, block, 100); + name[100] = '\0'; + strcpy(fullname, destdir); + strcat(fullname, "/"); + strcat(fullname, name); + printf("Unpacking %s\n",fullname); + type = block[156]; + + switch(type) { + case '0': + case '\0': + break; + case '5': + printf("Directories in CVD are not supported.\n"); + free(fullname); + gzclose(infile); + return -1; + default: + printf("Unknown type flag %c.\n",type); + free(fullname); + gzclose(infile); + return -1; + } + + in_block = 1; + + if(outfile) { + if(fclose(outfile)) { + printf("Cannot close file %s.\n", fullname); + free(fullname); + gzclose(infile); + return -1; + } + outfile = NULL; + } + + if(!(outfile = fopen(fullname, "wb"))) { + printf("Cannot create file %s.\n", fullname); + free(fullname); + gzclose(infile); + return -1; + } + + strncpy(osize, block + 124, 12); + osize[12] = '\0'; + + if((sscanf(osize, "%o", &size)) == 0) { + printf("Invalid size in header.\n"); + free(fullname); + gzclose(infile); + fclose(outfile); + return -1; + } + + } else { /* write or continue writing file contents */ + nbytes = size > TAR_BLOCKSIZE ? TAR_BLOCKSIZE : size; + nwritten = fwrite(block, 1, nbytes, outfile); + + if(nwritten != nbytes) { + printf("Wrote %d instead of %d (%s).\n", nwritten, nbytes, fullname); + free(fullname); + gzclose(infile); + return -1; + } + + size -= nbytes; + if(size == 0) + in_block = 0; + } + } + + if(outfile) + fclose(outfile); + + gzclose(infile); + free(fullname); + return 0; +} + +int cli_rmdirs(const char *dirname) +{ + DIR *dd; + struct dirent *dent; +#if defined(HAVE_READDIR_R_3) || defined(HAVE_READDIR_R_2) + union { + struct dirent d; + char b[offsetof(struct dirent, d_name) + NAME_MAX + 1]; + } result; +#endif + struct stat maind, statbuf; + char *fname; + + + chmod(dirname, 0700); + if((dd = opendir(dirname)) != NULL) { + while(stat(dirname, &maind) != -1) { + if(!rmdir(dirname)) break; + +#ifdef HAVE_READDIR_R_3 + while(!readdir_r(dd, &result.d, &dent) && dent) { +#elif defined(HAVE_READDIR_R_2) + while((dent = (struct dirent *) readdir_r(dd, &result.d))) { +#else + while((dent = readdir(dd))) { +#endif +#ifndef C_INTERIX + if(dent->d_ino) +#endif + { + if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..")) { + fname = (char *)calloc(strlen(dirname) + strlen(dent->d_name) + 2, sizeof(char)); + sprintf(fname, "%s/%s", dirname, dent->d_name); + + /* stat the file */ + if(lstat(fname, &statbuf) != -1) { + if(S_ISDIR(statbuf.st_mode) && !S_ISLNK(statbuf.st_mode)) { + if(rmdir(fname) == -1) { /* can't be deleted */ + if(errno == EACCES) { + printf("Can't remove some temporary directories due to access problem.\n"); + closedir(dd); + free(fname); + return 0; + } + cli_rmdirs(fname); + } + } else + unlink(fname); + } + + free(fname); + } + } + } + + rewinddir(dd); + + } + + } else { + return 53; + } + + closedir(dd); + return 0; +} + +int cli_strbcasestr(const char *haystack, const char *needle) +{ + char *pt = (char *) haystack; + int i, j; + + i = strlen(haystack); + j = strlen(needle); + + if(i < j) + return 0; + + pt += i - j; + + return !strcasecmp(pt, needle); +} + +/* + * Remove trailing NL and CR characters from the end of the given string. + * Return the new length of the string (ala strlen) + */ +int +cli_chomp(char *string) +{ + int l; + + if(string == NULL) + return -1; + + l = strlen(string); + + if(l == 0) + return 0; + + --l; + + while((l >= 0) && ((string[l] == '\n') || (string[l] == '\r'))) + string[l--] = '\0'; + + return l + 1; +} + +/* + * char *cli_strok(const char *line, int fieldno, char *delim) + * Return a copy of field <fieldno> from the string <line>, where + * fields are delimited by any char from <delim>, or NULL if <line> + * doesn't have <fieldno> fields or not enough memory is available. + * The caller has to free() the result afterwards. + */ +char *cli_strtok(const char *line, int fieldno, const char *delim) +{ + int counter = 0, i, j; + char *buffer = NULL; + + + /* step to arg # <fieldno> */ + for (i=0; line[i] && counter != fieldno; i++) { + if (strchr(delim, line[i])) { + counter++; + while(line[i+1] && strchr(delim, line[i+1])) { + i++; + } + } + } + if (!line[i]) { + /* end of buffer before field reached */ + return NULL; + } + + for (j=i; line[j]; j++) { + if (strchr(delim, line[j])) { + break; + } + } + if (i == j) { + return NULL; + } + buffer = (char *)malloc(j-i+1); + if(!buffer) + return NULL; + strncpy(buffer, line+i, j-i); + buffer[j-i] = '\0'; + + return buffer; +} + +void KlamDB::shouldIShow(QWidget * current) +{ + + static struct cl_stat *dbstat=NULL; + QString location; + + if ((current == this) && (!(loadinprogress))){ + QString db = kmain->freshklam->getCurrentDBDir(); + + if (checkdir((const char *)db) == -1){ + kdDebug() << "returned -1" << endl; + location = locate("data", "klamav/about/nodb.html"); + homepage->openURL(location); + + return; + } + + + if ( ((cl_statchkdir(dbstat) == 1) || (dbstat == NULL))) { + location = locate("data", "klamav/about/wait.html"); + homepage->openURL(location); + + loadinprogress = true; + sigs = ( int )getSigNos(); + progress = new KProgressDialog (this, "progress", i18n( "Loading .." ), i18n( "Loading..." ), true); + progress->setAllowCancel(false); + prog = progress->progressBar(); + progress->setLabel(i18n( "Loading lots and lots and lots of virus information" )); + + + prog->setTotalSteps(sigs); + + //kdDebug() << prog->totalSteps() << endl; + + VirusList->hide(); + if (VirusList->childCount() > 0) + VirusList->clear(); + count = 0; + prog->setProgress (count); + kapp->processEvents(); + +// QString db = kmain->freshklam->getCurrentDBDir(); + + listdir((const char *)db); + + + prog->setProgress (sigs); + + VirusList->show(); + + if(dbstat == NULL) { + dbstat = (struct cl_stat *) malloc(sizeof(struct cl_stat)); + } else { + cl_statfree(dbstat); + } + + memset(dbstat, 0, sizeof(struct cl_stat)); + + cl_statinidir((const char *)db, dbstat); + + + loadinprogress = false; + // Default english + QString location = locate( "data", "klamav/about/main-" + KGlobal::locale()->language() + ".html" ); + if( location != QString::null ) + homepage->openURL( location ); + else + homepage->openURL( locate("data", "klamav/about/main.html") ); + + } + } +} + +void KlamDB::addVirusName(char *start) +{ + + count++; + + kapp->processEvents(); + if ((count % 500) == 0){ + //progress->setLabel("Loading " + QString(start)); + progress->setLabel( i18n( "Loading ClamAV's Database of Virus Signatures") ); + prog->setProgress (count); + kapp->processEvents(); + } + new KListViewItem( VirusList, QString(start)); + kapp->processEvents(); + +} + + +unsigned int KlamDB::getSigNos() +{ + + unsigned int ret= 0; + unsigned int no = 0; + struct cl_engine *engine = NULL; + QStringList lastDownloadPaths; + QString dbdir; + QString db; + + KConfig* config = KGlobal::config(); + config->setGroup("Freshklam"); + lastDownloadPaths = config->readListEntry("lastDownloadPaths"); + dbdir = lastDownloadPaths.first(); + +#ifdef SUPPORT_CLAMAV_V095 + if((engine = cl_engine_new()) == NULL) { + printf("Database initialization error: %s\n", cl_strerror(ret));; + cl_engine_free(engine); + return 0; + } +#endif + +#ifdef SUPPORT_CLAMAV_V095 + ret = cl_load((const char *)dbdir, engine, &no, CL_DB_STDOPT); + cl_engine_free(engine); +#else + ret = cl_load((const char *)dbdir, &engine, &no, CL_DB_STDOPT); + cl_free(engine); +#endif + kdDebug() << "no of sigs" << no << endl; + return no; + +} + +void KlamDB::slotOpenTab(QListViewItem * item, const QPoint& , int ) +{ + PageViewer* page = new PageViewer(this, "page"); + //connect( m_part, SIGNAL(signalSettingsChanged()), page, SLOT(slotPaletteOrFontChanged())); + + //connect( page, SIGNAL(setTabIcon(const QPixmap&)), + // this, SLOT(setTabIcon(const QPixmap&))); + //connect( page, SIGNAL(setWindowCaption (const QString &)), + // this, SLOT(slotTabCaption (const QString &)) ); + connect( page, SIGNAL(urlClicked(const KURL &,bool)), + this, SLOT(slotOpenTabPlain(const KURL &,bool)) ); + + QString url = item->text(0); + + Frame *frame=new Frame(this, page, page->widget(), "VirusList : "+item->text(0)); + //connectFrame(frame); + tabBrowser->addFrame(frame); + +// if(!background) + tabBrowser->showPage(page->widget()); +// else + setFocus(); + + //if (m_tabs->count() > 1 && m_tabs->currentPageIndex() != 0) +// m_tabsClose->setEnabled(true); + page->openURL("http://www.viruslist.com/en/find?search_mode=virus&words="+url); +} + +void KlamDB::slotOpenTabPlain(const KURL& url, bool background) +{ + PageViewer* page = new PageViewer(this, "page"); + //connect( m_part, SIGNAL(signalSettingsChanged()), page, SLOT(slotPaletteOrFontChanged())); + +/* connect( page, SIGNAL(setTabIcon(const QPixmap&)), + this, SLOT(setTabIcon(const QPixmap&)));*/ + connect( page, SIGNAL(setWindowCaption (const QString &)), + this, SLOT(slotTabCaption (const QString &)) ); + connect( page, SIGNAL(urlClicked(const KURL &,bool)), + this, SLOT(slotOpenTabPlain(const KURL &,bool)) ); + + Frame *frame=new Frame(this, page, page->widget(), i18n("Untitled")); + //connectFrame(frame); + tabBrowser->addFrame(frame); + + if(!background) + tabBrowser->showPage(page->widget()); + else + setFocus(); + + //if (m_tabs->count() > 1 && m_tabs->currentPageIndex() != 0) +// m_tabsClose->setEnabled(true); + + //kdDebug() << url << endl; + page->openURL(url); +} + +void KlamDB::slotTabCaption(const QString &caption) +{ + if (!caption.isEmpty()) + { + PageViewer *pv=(PageViewer *)sender(); + tabBrowser->setTitle(caption, pv->widget()); + pv->slotSetCaption(caption); + } +} + +void KlamDB::slotOpenHome() +{ + homepage = new PageViewer(this, "page"); + + Frame *frame=new Frame(this, homepage, homepage->widget(), "Home"); + //connectFrame(frame); + tabBrowser->addFrame(frame); + +// if(!background) + tabBrowser->showPage(homepage->widget()); +// else + setFocus(); + + QString location = locate( "data", "klamav/about/wait-" + KGlobal::locale()->language() + ".html" ); + if( location != QString::null ) + homepage->openURL( location ); + else + homepage->openURL( locate("data", "klamav/about/wait.html") ); +} + +void KlamDB::slotRMB( QListViewItem* Item, const QPoint & point, int ) +{ + if( Item ) + menu->popup( point ); +} + +void KlamDB::slotOpenPrefix(QString prefix, QString title,QString url) +{ + + PageViewer* page = new PageViewer(this, "page"); + + + Frame *frame=new Frame(this, page, page->widget(), title+" : "+url); + tabBrowser->addFrame(frame); + + tabBrowser->showPage(page->widget()); + setFocus(); + + page->openURL(prefix+url); +} + +void KlamDB::slotVirusPool() +{ + QString url = VirusList->selectedItem()->text(0); + QString prefix = QString("http://www.viruspool.net/virus.cms?&name="); + slotOpenPrefix(prefix,"VirusPool",url); +} + +void KlamDB::slotVirusList() +{ + QString url = VirusList->selectedItem()->text(0); + QString prefix = QString("http://www.viruslist.com/en/find?search_mode=virus&words="); + slotOpenPrefix(prefix,"VirusList",url); +} + +void KlamDB::slotGoogle() +{ + + QString url = VirusList->selectedItem()->text(0); + QString prefix = QString("http://www.google.com/search?ie=ISO-8859-1&q="); + slotOpenPrefix(prefix,"Google",url); +} + +void KlamDB::slotTrendMicro() +{ + + QString url = VirusList->selectedItem()->text(0); + QString prefix = QString("http://www.trendmicro.com/vinfo/virusencyclo/default2.asp?m=q&virus="); + slotOpenPrefix(prefix,"TrendMicro",url); +} + +void KlamDB::slotExternal(QString name,QString service) +{ + kmain->showVirusBrowser(); + shouldIShow(this); + QString prefix; + if (service == "VirusPool") + prefix = QString("http://www.viruspool.net/virus.cms?&name="); + else if (service == "Google") + prefix = QString("http://www.google.com/search?ie=ISO-8859-1&q="); + else if (service == "VirusList") + prefix = QString("http://www.viruslist.com/en/find?search_mode=virus&words="); + else + prefix = QString("http://www.trendmicro.com/vinfo/virusencyclo/default2.asp?m=q&virus="); + slotOpenPrefix(prefix,service,name); +} + +#include "dbviewer.moc" |