Greatly increase database generation speed from compressed PPDs where possible

(cherry picked from commit 880fec0918)
v3.5.13-sru
Timothy Pearson 10 years ago committed by Slávek Banko
parent 94067b20f4
commit 3051002fc6

@ -72,12 +72,12 @@ tde_add_kpart( ${target} AUTOMOC
set( target make_driver_db_cups ) set( target make_driver_db_cups )
set( ${target}_SRCS set( ${target}_SRCS
make_driver_db_cups.c make_driver_db_cups.cpp
) )
tde_add_executable( ${target} tde_add_executable( ${target}
SOURCES ${${target}_SRCS} SOURCES ${${target}_SRCS}
LINK driverparse-static kdefakes-shared ${ZLIB_LIBRARIES} ${DL_LIBRARIES} LINK driverparse-static kdefakes-shared ${ZLIB_LIBRARIES} ${DL_LIBRARIES} ${TQT_LIBRARIES}
DESTINATION ${BIN_INSTALL_DIR} DESTINATION ${BIN_INSTALL_DIR}
) )

@ -26,8 +26,8 @@ noinst_HEADERS = cupsinfos.h ipprequest.h kmcupsjobmanager.h kmcupsmanager.h kmc
kmwother.h ippreportdlg.h kptagspage.h kmwother.h ippreportdlg.h kptagspage.h
bin_PROGRAMS = make_driver_db_cups cupsdoprint bin_PROGRAMS = make_driver_db_cups cupsdoprint
make_driver_db_cups_SOURCES = make_driver_db_cups.c make_driver_db_cups_SOURCES = make_driver_db_cups.cpp
make_driver_db_cups_LDADD = ../libdriverparse.a $(top_builddir)/kdecore/libkdefakes.la $(LIBDL) $(LIBZ) make_driver_db_cups_LDADD = ../libdriverparse.a $(top_builddir)/kdecore/libkdefakes.la $(LIBDL) $(LIBZ) $(LIB_QT)
make_driver_db_cups_LDFLAGS = $(all_libraries) make_driver_db_cups_LDFLAGS = $(all_libraries)
cupsdoprint_SOURCES = cupsdoprint.c cupsdoprint_SOURCES = cupsdoprint.c

@ -29,7 +29,12 @@
#include <ctype.h> #include <ctype.h>
#include <zlib.h> #include <zlib.h>
#include "driverparse.h" #include <tqstringlist.h>
#include <tqlocale.h>
extern "C" {
#include "driverparse.h"
}
#define PROCESS_PPD_FILE_CONTENTS \ #define PROCESS_PPD_FILE_CONTENTS \
memset(value,0,256); \ memset(value,0,256); \
@ -126,7 +131,7 @@ void initPpd(const char *dirname)
snprintf(drFile, 255, "ppd:%s", buffer); snprintf(drFile, 255, "ppd:%s", buffer);
if (c && strncmp(c,".ppd",4) == 0) if (c && strncmp(c,".ppd",4) == 0)
{ {
addFile(drFile, ""); addFile(drFile, "", "");
} }
else if (c && strncmp(c, ".gz", 3) == 0) else if (c && strncmp(c, ".gz", 3) == 0)
{ /* keep also compressed driver files */ { /* keep also compressed driver files */
@ -136,7 +141,7 @@ void initPpd(const char *dirname)
} }
if (*c == '.' && strncmp(c, ".ppd",4) == 0) if (*c == '.' && strncmp(c, ".ppd",4) == 0)
{ {
addFile(drFile, ""); addFile(drFile, "", "");
} }
} }
} }
@ -160,19 +165,19 @@ void initPpd(const char *dirname)
ssize_t read; ssize_t read;
while ((read = getline(&line, &len, file)) != -1) { while ((read = getline(&line, &len, file)) != -1) {
char * pos1 = strstr(line, "\""); char * pos1 = strstr(line, "\"");
if (pos1 >= 0) { if (pos1 != NULL) {
char * pos2 = strstr(pos1 + 1, "\""); char * pos2 = strstr(pos1 + 1, "\"");
if (pos2 >= 0) { if (pos2 != NULL) {
*pos2 = 0; *pos2 = 0;
char * pos3 = strstr(pos1 + 1, ":"); char * pos3 = strstr(pos1 + 1, ":");
if (pos3 >= 0) { if (pos3 != NULL) {
char *ppduri; char *ppduri;
int n2 = strlen("compressed-ppd:")+strlen(pos3+1); int n2 = strlen("compressed-ppd:")+strlen(pos3+1);
ppduri = (char*)malloc(n2*sizeof(char)+1); ppduri = (char*)malloc(n2*sizeof(char)+1);
memset(ppduri,0,n2); memset(ppduri,0,n2);
strcat(ppduri, "compressed-ppd:"); strcat(ppduri, "compressed-ppd:");
strcat(ppduri, pos3+1); strcat(ppduri, pos3+1);
addFile(ppduri, dirname); addFile(ppduri, dirname, pos2+1);
free(ppduri); free(ppduri);
ppduri = NULL; ppduri = NULL;
} }
@ -198,7 +203,7 @@ void initPpd(const char *dirname)
} }
} }
int parsePpdFile(const char *filename, const char *origin, FILE *output_file) int parsePpdFile(const char *filename, const char *origin, const char *metadata, FILE *output_file)
{ {
gzFile ppd_file; gzFile ppd_file;
char line[4096], value[256], langver[64] = {0}, desc[256] = {0}; char line[4096], value[256], langver[64] = {0}, desc[256] = {0};
@ -223,44 +228,116 @@ int parsePpdFile(const char *filename, const char *origin, FILE *output_file)
return 1; return 1;
} }
int parseCompressedPpdFile(const char *ppdfilename, const char *origin, FILE *output_file) int parseCompressedPpdFile(const char *ppdfilename, const char *origin, const char *metadata, FILE *output_file)
{ {
char value[256], langver[64] = {0}, desc[256] = {0}; char value[256], langver[64] = {0}, desc[256] = {0};
char *c1, *c2; char *c1, *c2;
int count = 0; int count = 0;
char *filename; bool useFallbackExtractionMethod = false;
int n = strlen(origin)+strlen(" cat ")+strlen(ppdfilename);
filename = (char*)malloc(n*sizeof(char)+1);
memset(filename,0,n);
strcat(filename, origin);
strcat(filename, " cat ");
strcat(filename, ppdfilename);
FILE* file = popen(filename, "r"); if (strlen(metadata) > 0) {
if (file) { TQString metadataProcessed(metadata);
char * line = NULL; metadataProcessed = metadataProcessed.stripWhiteSpace();
size_t len = 0; TQStringList metadataList = TQStringList::split(" ", metadataProcessed, TRUE);
ssize_t read; TQLocale ppdLanguage(metadataList[0]);
TQString languageVersion = TQLocale::languageToString(ppdLanguage.language());
metadataList = TQStringList::split("\" \"", metadataProcessed, TRUE);
TQString description = metadataList[1];
fprintf(output_file,"FILE=compressed-ppd:%s:%s\n", origin, ppdfilename); int pos = metadataProcessed.find("MFG:");
if (pos < 0) {
pos = metadataProcessed.find("MANUFACTURER:");
}
if (pos >= 0) {
TQString manufacturer;
TQString model;
TQString modelName;
TQString pnpManufacturer;
TQString pnpModel;
TQString driver;
TQStringList metadataList = TQStringList::split(";", metadataProcessed.mid(pos), TRUE);
for (TQStringList::Iterator it = metadataList.begin(); it != metadataList.end(); ++it) {
TQStringList kvPair = TQStringList::split(":", *it, TRUE);
if ((kvPair[0].upper() == "MFG") || (kvPair[0].upper() == "MANUFACTURER")) {
manufacturer = kvPair[1];
}
else if ((kvPair[0].upper() == "MDL") ||(kvPair[0].upper() == "MODEL")) {
modelName = kvPair[1];
}
// else if (kvPair[0].upper() == "PNPMANUFACTURER") {
// pnpManufacturer = kvPair[1];
// }
// else if (kvPair[0].upper() == "PNPMODEL") {
// pnpModel = kvPair[1];
// }
else if ((kvPair[0].upper() == "DRV") || (kvPair[0].upper() == "DRIVER")) {
driver = kvPair[1];
}
}
TQStringList driverList = TQStringList::split(",", driver, TRUE);
driver = driverList[0];
if (driver.startsWith("D")) {
driver = driver.mid(1);
}
model = manufacturer + " " + modelName + " " + driver;
description = description + " [" + languageVersion + "]";
while ((read = getline(&line, &len, file)) != -1) { fprintf(output_file,"FILE=compressed-ppd:%s:%s\n", origin, ppdfilename);
PROCESS_PPD_FILE_CONTENTS
fprintf(output_file,"MANUFACTURER=%s\n",manufacturer.ascii());
fprintf(output_file,"MODELNAME=%s\n",modelName.ascii());
fprintf(output_file,"MODEL=%s\n",model.ascii());
if (pnpManufacturer.length() > 0) {
fprintf(output_file,"PNPMANUFACTURER=%s\n",pnpManufacturer.ascii());
}
if (pnpModel.length() > 0) {
fprintf(output_file,"PNPMODEL=%s\n",pnpModel.ascii());
}
if (description.length() > 0) {
fprintf(output_file,"DESCRIPTION=%s\n",description.ascii());
}
} }
if (line) { else {
free(line); useFallbackExtractionMethod = true;
} }
pclose(file);
}
else {
fprintf(stderr, "Can't open driver file : %s\n", ppdfilename);
return 0;
} }
free(filename); if (useFallbackExtractionMethod) {
filename = NULL; char *filename;
int n = strlen(origin)+strlen(" cat ")+strlen(ppdfilename);
filename = (char*)malloc(n*sizeof(char)+1);
memset(filename,0,n);
strcat(filename, origin);
strcat(filename, " cat ");
strcat(filename, ppdfilename);
FILE* file = popen(filename, "r");
if (file) {
char * line = NULL;
size_t len = 0;
ssize_t read;
fprintf(output_file,"FILE=compressed-ppd:%s:%s\n", origin, ppdfilename);
while ((read = getline(&line, &len, file)) != -1) {
PROCESS_PPD_FILE_CONTENTS
}
if (line) {
free(line);
}
pclose(file);
}
else {
fprintf(stderr, "Can't open driver file : %s\n", ppdfilename);
return 0;
}
free(filename);
filename = NULL;
}
return 1; return 1;
} }

@ -30,13 +30,14 @@
char **files = NULL; char **files = NULL;
char **fileorigins = NULL; char **fileorigins = NULL;
char **filemetadata = NULL;
int nfiles = 0, maxfiles = 0; int nfiles = 0, maxfiles = 0;
int nhandlers = 0, maxhandlers = 0; int nhandlers = 0, maxhandlers = 0;
int nlibs = 0, maxlibs = 0; int nlibs = 0, maxlibs = 0;
typedef struct typedef struct
{ {
void (*init)(const char*); void (*init)(const char*);
int (*parse)(const char*, const char*, FILE*); int (*parse)(const char*, const char*, const char*, FILE*);
char *name; char *name;
int namelen; int namelen;
} handler; } handler;
@ -60,7 +61,7 @@ void freeHandlers(void)
free(handlers); free(handlers);
} }
void registerHandler(const char *name, void(*initf)(const char*), int(*parsef)(const char*, const char*, FILE*)) void registerHandler(const char *name, void(*initf)(const char*), int(*parsef)(const char*, const char*, const char*, FILE*))
{ {
handler *h = (handler*)malloc(sizeof(handler)); handler *h = (handler*)malloc(sizeof(handler));
h->init = initf; h->init = initf;
@ -110,6 +111,7 @@ void initFiles(void)
maxfiles = 100; maxfiles = 100;
files = (char**)malloc(sizeof(char*) * maxfiles); files = (char**)malloc(sizeof(char*) * maxfiles);
fileorigins = (char**)malloc(sizeof(char*) * maxfiles); fileorigins = (char**)malloc(sizeof(char*) * maxfiles);
filemetadata = (char**)malloc(sizeof(char*) * maxfiles);
} }
void freeFiles(void) void freeFiles(void)
@ -118,8 +120,10 @@ void freeFiles(void)
for (i=0; i<nfiles; i++) for (i=0; i<nfiles; i++)
free(files[i]); free(files[i]);
free(fileorigins[i]); free(fileorigins[i]);
free(filemetadata[i]);
free(files); free(files);
free(fileorigins); free(fileorigins);
free(filemetadata);
} }
void checkSize(void) void checkSize(void)
@ -129,16 +133,18 @@ void checkSize(void)
maxfiles += 100; maxfiles += 100;
files = (char**)realloc(files, sizeof(char*) * maxfiles); files = (char**)realloc(files, sizeof(char*) * maxfiles);
fileorigins = (char**)realloc(fileorigins, sizeof(char*) * maxfiles); fileorigins = (char**)realloc(fileorigins, sizeof(char*) * maxfiles);
filemetadata = (char**)realloc(filemetadata, sizeof(char*) * maxfiles);
} }
} }
void addFile(const char *filename, const char *origin) void addFile(const char *filename, const char *origin, const char *metadata)
{ {
if (maxfiles == 0) if (maxfiles == 0)
initFiles(); initFiles();
checkSize(); checkSize();
files[nfiles] = strdup(filename); files[nfiles] = strdup(filename);
fileorigins[nfiles] = strdup(origin); fileorigins[nfiles] = strdup(origin);
filemetadata[nfiles] = strdup(metadata);
nfiles++; nfiles++;
} }
@ -273,7 +279,7 @@ int getMaticPrinterInfos(const char *base, const char *id, char *make, char *mod
return 1; return 1;
} }
int parseMaticFile(const char *driver, const char *origin, FILE *output) int parseMaticFile(const char *driver, const char *origin, const char *metadata, FILE *output)
{ {
FILE *drFile; FILE *drFile;
char name[32] = {0}, char name[32] = {0},
@ -377,7 +383,7 @@ void initMatic(const char *base)
continue; continue;
else if (!S_ISREG(st.st_mode)) else if (!S_ISREG(st.st_mode))
continue; continue;
addFile(drFile, ""); addFile(drFile, "", "");
} }
closedir(foodir); closedir(foodir);
} }
@ -443,7 +449,7 @@ int execute(int argc, char *argv[])
for (hi=0; hi<nhandlers; hi++) for (hi=0; hi<nhandlers; hi++)
if (strncmp(files[i], handlers[hi]->name, handlers[hi]->namelen) == 0) if (strncmp(files[i], handlers[hi]->name, handlers[hi]->namelen) == 0)
{ {
handlers[hi]->parse(files[i]+handlers[hi]->namelen, fileorigins[i], dbFile); handlers[hi]->parse(files[i]+handlers[hi]->namelen, fileorigins[i], filemetadata[i], dbFile);
break; break;
} }
fprintf(stdout, "%d\n", i); fprintf(stdout, "%d\n", i);

@ -23,9 +23,9 @@
#include <stdio.h> #include <stdio.h>
void registerHandler(const char *name, void(*initf)(const char*), int(*parsef)(const char*, const char*, FILE*)); void registerHandler(const char *name, void(*initf)(const char*), int(*parsef)(const char*, const char*, const char*, FILE*));
void initFoomatic(void); void initFoomatic(void);
int execute(int argc, char *argv[]); int execute(int argc, char *argv[]);
void addFile(const char *filename, const char *origin); void addFile(const char *filename, const char *origin, const char *metadata);
#endif #endif

@ -114,7 +114,7 @@ void initAps(const char *base)
gsversion = 1; gsversion = 1;
} }
snprintf(drFile, 256, "apsfilter:%s/%s", base, d->d_name); snprintf(drFile, 256, "apsfilter:%s/%s", base, d->d_name);
addFile(drFile, ""); addFile(drFile, "", "");
} }
closedir(apsdir); closedir(apsdir);
} }
@ -199,7 +199,7 @@ void initIfhp(const char *base)
snprintf(path, 255, "lprngtool:%s/printerdb", base); snprintf(path, 255, "lprngtool:%s/printerdb", base);
if (access(path+10, R_OK) == 0) if (access(path+10, R_OK) == 0)
{ {
addFile(path, ""); addFile(path, "", "");
} }
} }

Loading…
Cancel
Save