ExternFilter::ExternFilter(const QString& nm, const QString& optional) : filt(0) , handle(0) { #ifdef USEQPE #ifdef OPIE QString filterpath(getenv("OPIEDIR")); #else QString filterpath(getenv("QTDIR")); #endif filterpath += "/plugins/reader/filters/lib"; #else QString filterpath(getenv("READERDIR")); filterpath += "/filters/lib"; #endif filterpath += nm; filterpath += ".so"; if (QFile::exists(filterpath)) { qDebug("Filter:%s", (const char*)filterpath); handle = dlopen(filterpath, RTLD_LAZY); if (handle == 0) { qDebug("Can't find filter:%s", dlerror()); // status = -10; filt = new ErrorFilter(QString("Can't find plugin:")+nm); return; } CFilter* (*newfilter)(const QString&); newfilter = (CFilter* (*)(const QString&))dlsym(handle, "newfilter"); if (newfilter == NULL) { qDebug("Can't find newfilter"); filt = new ErrorFilter(QString("Can't find entry point in plugin:")+nm); return; } filt = (*newfilter)(optional); } else { qDebug("No filter path:%s", (const char*)filterpath); filt = new ErrorFilter(QString("No filter plugins installed:")+nm); } if (filt == NULL) { qDebug("Can't do newfilter"); filt = new ErrorFilter(QString("Filter creation failed:")+nm); return; } }
/* * Sys_ListFilteredFiles */ void Sys_ListFilteredFiles(const char *basedir, char *subdirs, char *filter, char **list, int *numfiles) { char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; char filename[MAX_OSPATH]; DIR *fdir; struct dirent *d; struct stat st; if(*numfiles >= MAX_FOUND_FILES - 1) return; if(strlen(subdirs)) Q_sprintf(search, sizeof(search), "%s/%s", basedir, subdirs); else Q_sprintf(search, sizeof(search), "%s", basedir); if((fdir = opendir(search)) == NULL) return; while((d = readdir(fdir)) != NULL){ Q_sprintf(filename, sizeof(filename), "%s/%s", search, d->d_name); if(stat(filename, &st) == -1) continue; if(st.st_mode & S_IFDIR) if(Q_stricmp(d->d_name, ".") && Q_stricmp(d->d_name, "..")){ if(strlen(subdirs)) Q_sprintf(newsubdirs, sizeof(newsubdirs), "%s/%s", subdirs, d->d_name); else Q_sprintf(newsubdirs, sizeof(newsubdirs), "%s", d->d_name); Sys_ListFilteredFiles(basedir, newsubdirs, filter, list, numfiles); } if(*numfiles >= MAX_FOUND_FILES - 1) break; Q_sprintf(filename, sizeof(filename), "%s/%s", subdirs, d->d_name); if(!filterpath(filter, filename, qfalse)) continue; list[ *numfiles ] = copystr(filename); (*numfiles)++; } closedir(fdir); }