From 660b569b0980fc8f71b03ed666dd02eec8388b4c Mon Sep 17 00:00:00 2001 From: Xavier Roche Date: Mon, 19 Mar 2012 12:59:03 +0000 Subject: httrack 3.41.2 --- libtest/Makefile.am | 17 ++- libtest/Makefile.in | 51 +++++++-- libtest/callbacks-example-baselinks.c | 141 +++++++++++++---------- libtest/callbacks-example-changecontent.c | 65 +++++++++++ libtest/callbacks-example-contentfilter.c | 152 +++++++++++++++---------- libtest/callbacks-example-displayheader.c | 79 +++++++------ libtest/callbacks-example-filename.c | 70 ++++++++---- libtest/callbacks-example-filename2.c | 150 +++++++++++++++---------- libtest/callbacks-example-filenameiisbug.c | 59 ++++++---- libtest/callbacks-example-listlinks.c | 142 +++++++++++++++-------- libtest/callbacks-example-log.c | 114 +++++++++++++++++++ libtest/callbacks-example-simple.c | 89 +++++++++++++++ libtest/example.c | 175 ++++++++++++++++++----------- libtest/example.dsp | 95 ---------------- libtest/example.dsw | 29 ----- libtest/example.h | 39 ++++--- libtest/htssystem.h | 2 - libtest/readme.txt | 22 ++++ 18 files changed, 966 insertions(+), 525 deletions(-) create mode 100755 libtest/callbacks-example-changecontent.c create mode 100755 libtest/callbacks-example-log.c create mode 100755 libtest/callbacks-example-simple.c delete mode 100644 libtest/example.dsp delete mode 100644 libtest/example.dsw delete mode 100644 libtest/htssystem.h (limited to 'libtest') diff --git a/libtest/Makefile.am b/libtest/Makefile.am index 878c05b..eb500c0 100644 --- a/libtest/Makefile.am +++ b/libtest/Makefile.am @@ -20,22 +20,31 @@ AM_LDFLAGS = -L../src libbaselinks_la_SOURCES = callbacks-example-baselinks.c libbaselinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libbaselinks_la_LDFLAGS = -version-info 1:0:0 +libchangecontent_la_SOURCES = callbacks-example-changecontent.c +libchangecontent_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +libchangecontent_la_LDFLAGS = -version-info 1:0:0 libcontentfilter_la_SOURCES = callbacks-example-contentfilter.c libcontentfilter_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libcontentfilter_la_LDFLAGS = -version-info 1:0:0 libdisplayheader_la_SOURCES = callbacks-example-displayheader.c libdisplayheader_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libdisplayheader_la_LDFLAGS = -version-info 1:0:0 -libfilename_la_SOURCES = callbacks-example-filename.c -libfilename_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack -libfilename_la_LDFLAGS = -version-info 1:0:0 libfilename2_la_SOURCES = callbacks-example-filename2.c libfilename2_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libfilename2_la_LDFLAGS = -version-info 1:0:0 +libfilename_la_SOURCES = callbacks-example-filename.c +libfilename_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +libfilename_la_LDFLAGS = -version-info 1:0:0 libfilenameiisbug_la_SOURCES = callbacks-example-filenameiisbug.c libfilenameiisbug_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libfilenameiisbug_la_LDFLAGS = -version-info 1:0:0 liblistlinks_la_SOURCES = callbacks-example-listlinks.c liblistlinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack liblistlinks_la_LDFLAGS = -version-info 1:0:0 -pkglib_LTLIBRARIES = libbaselinks.la libcontentfilter.la libdisplayheader.la libfilename.la libfilename2.la libfilenameiisbug.la liblistlinks.la +liblog_la_SOURCES = callbacks-example-log.c +liblog_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +liblog_la_LDFLAGS = -version-info 1:0:0 +libsimple_la_SOURCES = callbacks-example-simple.c +libsimple_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +libsimple_la_LDFLAGS = -version-info 1:0:0 +pkglib_LTLIBRARIES = libbaselinks.la libchangecontent.la libcontentfilter.la libdisplayheader.la libfilename2.la libfilename.la libfilenameiisbug.la liblistlinks.la liblog.la libsimple.la diff --git a/libtest/Makefile.in b/libtest/Makefile.in index 5dabcbe..0c6d904 100644 --- a/libtest/Makefile.in +++ b/libtest/Makefile.in @@ -163,25 +163,34 @@ AM_LDFLAGS = -L../src libbaselinks_la_SOURCES = callbacks-example-baselinks.c libbaselinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libbaselinks_la_LDFLAGS = -version-info 1:0:0 +libchangecontent_la_SOURCES = callbacks-example-changecontent.c +libchangecontent_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +libchangecontent_la_LDFLAGS = -version-info 1:0:0 libcontentfilter_la_SOURCES = callbacks-example-contentfilter.c libcontentfilter_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libcontentfilter_la_LDFLAGS = -version-info 1:0:0 libdisplayheader_la_SOURCES = callbacks-example-displayheader.c libdisplayheader_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libdisplayheader_la_LDFLAGS = -version-info 1:0:0 -libfilename_la_SOURCES = callbacks-example-filename.c -libfilename_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack -libfilename_la_LDFLAGS = -version-info 1:0:0 libfilename2_la_SOURCES = callbacks-example-filename2.c libfilename2_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libfilename2_la_LDFLAGS = -version-info 1:0:0 +libfilename_la_SOURCES = callbacks-example-filename.c +libfilename_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +libfilename_la_LDFLAGS = -version-info 1:0:0 libfilenameiisbug_la_SOURCES = callbacks-example-filenameiisbug.c libfilenameiisbug_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack libfilenameiisbug_la_LDFLAGS = -version-info 1:0:0 liblistlinks_la_SOURCES = callbacks-example-listlinks.c liblistlinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack liblistlinks_la_LDFLAGS = -version-info 1:0:0 -pkglib_LTLIBRARIES = libbaselinks.la libcontentfilter.la libdisplayheader.la libfilename.la libfilename2.la libfilenameiisbug.la liblistlinks.la +liblog_la_SOURCES = callbacks-example-log.c +liblog_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +liblog_la_LDFLAGS = -version-info 1:0:0 +libsimple_la_SOURCES = callbacks-example-simple.c +libsimple_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) -lhttrack +libsimple_la_LDFLAGS = -version-info 1:0:0 +pkglib_LTLIBRARIES = libbaselinks.la libchangecontent.la libcontentfilter.la libdisplayheader.la libfilename2.la libfilename.la libfilenameiisbug.la liblistlinks.la liblog.la libsimple.la subdir = libtest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs @@ -192,6 +201,9 @@ LTLIBRARIES = $(pkglib_LTLIBRARIES) libbaselinks_la_DEPENDENCIES = am_libbaselinks_la_OBJECTS = callbacks-example-baselinks.lo libbaselinks_la_OBJECTS = $(am_libbaselinks_la_OBJECTS) +libchangecontent_la_DEPENDENCIES = +am_libchangecontent_la_OBJECTS = callbacks-example-changecontent.lo +libchangecontent_la_OBJECTS = $(am_libchangecontent_la_OBJECTS) libcontentfilter_la_DEPENDENCIES = am_libcontentfilter_la_OBJECTS = callbacks-example-contentfilter.lo libcontentfilter_la_OBJECTS = $(am_libcontentfilter_la_OBJECTS) @@ -210,17 +222,26 @@ libfilenameiisbug_la_OBJECTS = $(am_libfilenameiisbug_la_OBJECTS) liblistlinks_la_DEPENDENCIES = am_liblistlinks_la_OBJECTS = callbacks-example-listlinks.lo liblistlinks_la_OBJECTS = $(am_liblistlinks_la_OBJECTS) +liblog_la_DEPENDENCIES = +am_liblog_la_OBJECTS = callbacks-example-log.lo +liblog_la_OBJECTS = $(am_liblog_la_OBJECTS) +libsimple_la_DEPENDENCIES = +am_libsimple_la_OBJECTS = callbacks-example-simple.lo +libsimple_la_OBJECTS = $(am_libsimple_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/callbacks-example-baselinks.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-changecontent.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-contentfilter.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-displayheader.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-filename.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-filename2.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-filenameiisbug.Plo \ -@AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-listlinks.Plo +@AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-listlinks.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-log.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/callbacks-example-simple.Plo COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ @@ -228,14 +249,15 @@ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -DIST_SOURCES = $(libbaselinks_la_SOURCES) $(libcontentfilter_la_SOURCES) \ - $(libdisplayheader_la_SOURCES) $(libfilename_la_SOURCES) \ - $(libfilename2_la_SOURCES) $(libfilenameiisbug_la_SOURCES) \ - $(liblistlinks_la_SOURCES) +DIST_SOURCES = $(libbaselinks_la_SOURCES) $(libchangecontent_la_SOURCES) \ + $(libcontentfilter_la_SOURCES) $(libdisplayheader_la_SOURCES) \ + $(libfilename_la_SOURCES) $(libfilename2_la_SOURCES) \ + $(libfilenameiisbug_la_SOURCES) $(liblistlinks_la_SOURCES) \ + $(liblog_la_SOURCES) $(libsimple_la_SOURCES) DATA = $(exemples_DATA) DIST_COMMON = $(srcdir)/Makefile.in Makefile.am -SOURCES = $(libbaselinks_la_SOURCES) $(libcontentfilter_la_SOURCES) $(libdisplayheader_la_SOURCES) $(libfilename_la_SOURCES) $(libfilename2_la_SOURCES) $(libfilenameiisbug_la_SOURCES) $(liblistlinks_la_SOURCES) +SOURCES = $(libbaselinks_la_SOURCES) $(libchangecontent_la_SOURCES) $(libcontentfilter_la_SOURCES) $(libdisplayheader_la_SOURCES) $(libfilename_la_SOURCES) $(libfilename2_la_SOURCES) $(libfilenameiisbug_la_SOURCES) $(liblistlinks_la_SOURCES) $(liblog_la_SOURCES) $(libsimple_la_SOURCES) all: all-am @@ -276,6 +298,8 @@ clean-pkglibLTLIBRARIES: done libbaselinks.la: $(libbaselinks_la_OBJECTS) $(libbaselinks_la_DEPENDENCIES) $(LINK) -rpath $(pkglibdir) $(libbaselinks_la_LDFLAGS) $(libbaselinks_la_OBJECTS) $(libbaselinks_la_LIBADD) $(LIBS) +libchangecontent.la: $(libchangecontent_la_OBJECTS) $(libchangecontent_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(libchangecontent_la_LDFLAGS) $(libchangecontent_la_OBJECTS) $(libchangecontent_la_LIBADD) $(LIBS) libcontentfilter.la: $(libcontentfilter_la_OBJECTS) $(libcontentfilter_la_DEPENDENCIES) $(LINK) -rpath $(pkglibdir) $(libcontentfilter_la_LDFLAGS) $(libcontentfilter_la_OBJECTS) $(libcontentfilter_la_LIBADD) $(LIBS) libdisplayheader.la: $(libdisplayheader_la_OBJECTS) $(libdisplayheader_la_DEPENDENCIES) @@ -288,6 +312,10 @@ libfilenameiisbug.la: $(libfilenameiisbug_la_OBJECTS) $(libfilenameiisbug_la_DEP $(LINK) -rpath $(pkglibdir) $(libfilenameiisbug_la_LDFLAGS) $(libfilenameiisbug_la_OBJECTS) $(libfilenameiisbug_la_LIBADD) $(LIBS) liblistlinks.la: $(liblistlinks_la_OBJECTS) $(liblistlinks_la_DEPENDENCIES) $(LINK) -rpath $(pkglibdir) $(liblistlinks_la_LDFLAGS) $(liblistlinks_la_OBJECTS) $(liblistlinks_la_LIBADD) $(LIBS) +liblog.la: $(liblog_la_OBJECTS) $(liblog_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(liblog_la_LDFLAGS) $(liblog_la_OBJECTS) $(liblog_la_LIBADD) $(LIBS) +libsimple.la: $(libsimple_la_OBJECTS) $(libsimple_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(libsimple_la_LDFLAGS) $(libsimple_la_OBJECTS) $(libsimple_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core @@ -296,12 +324,15 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-baselinks.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-changecontent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-contentfilter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-displayheader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-filename.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-filename2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-filenameiisbug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-listlinks.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-simple.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ diff --git a/libtest/callbacks-example-baselinks.c b/libtest/callbacks-example-baselinks.c index 9f6eb11..63b5175 100755 --- a/libtest/callbacks-example-baselinks.c +++ b/libtest/callbacks-example-baselinks.c @@ -3,89 +3,116 @@ Can be useful to make copies of site's archives using site's URL base href as root reference .c file + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example.c - - use the --wrapper option in httrack: - httrack --wrapper check-html=callback:process_file - --wrapper link-detected=callback:check_detectedlink + httrack --wrapper mycallback .. */ #include #include #include +/* Standard httrack module includes */ #include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif - -/* Function definitions */ -EXTERNAL_FUNCTION int process_file(char* html, int len, char* url_adresse, char* url_fichier); -EXTERNAL_FUNCTION int check_detectedlink(char* link); -EXTERNAL_FUNCTION int check_detectedlink_init(char* initString); -EXTERNAL_FUNCTION int check_detectedlink_exit(void); +/* Local function definitions */ +static int process_file(t_hts_callbackarg *carg, httrackp* opt, char* html, int len, const char* url_address, const char* url_file); +static int check_detectedlink(t_hts_callbackarg *carg, httrackp* opt, char* link); +static int check_detectedlink_end(t_hts_callbackarg *carg, httrackp *opt); -static char base[HTS_URLMAXSIZE + 2] = ""; +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); -/* -"check-html" callback -typedef int (* t_hts_htmlcheck)(char* html,int len,char* url_adresse,char* url_fichier); +/* +module entry point */ -EXTERNAL_FUNCTION int process_file(char* html, int len, char* url_adresse, char* url_fichier) { +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Check args */ + fprintf(stderr, "Plugged..\n"); + if (arg == NULL || *arg == '\0' || strlen(arg) >= HTS_URLMAXSIZE / 2) { + fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); + fprintf(stderr, "usage: httrack --wrapper modulename,base\n"); + fprintf(stderr, "example: httrack --wrapper callback,http://www.example.com/\n"); + return 0; /* failed */ + } else { + char *callbacks_userdef = strdup(arg); /* userdef */ + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, check_html, process_file, callbacks_userdef); + CHAIN_FUNCTION(opt, linkdetected, check_detectedlink, callbacks_userdef); + CHAIN_FUNCTION(opt, end, check_detectedlink_end, callbacks_userdef); + + fprintf(stderr, "Using root '%s'\n", callbacks_userdef); + } + + return 1; /* success */ +} + +static int process_file(t_hts_callbackarg *carg, httrackp* opt, char* html, int len, const char* url_address, const char* url_file) { + char* prevBase; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { + return 0; /* Abort */ + } + } + /* Disable base href, if any */ - char* prevBase = strstr(html, "_init() will be called, if exists, upon startup */ -EXTERNAL_FUNCTION int check_detectedlink_init(char* initString) { - fprintf(stderr, "Plugged..\n"); - if (initString != NULL && *initString != '\0' && strlen(initString) < HTS_URLMAXSIZE / 2) { - strcpy(base, initString); - fprintf(stderr, "Using root '%s'\n", base); - return 1; /* success */ - } else { - fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); - fprintf(stderr, "usage: httrack --wrapper save-name=callback:mysavename,base\n"); - fprintf(stderr, "example: httrack --wrapper save-name=callback:mysavename,http://www.example.com/\n"); - return 0; /* failed */ - } -} +static int check_detectedlink_end(t_hts_callbackarg *carg, httrackp *opt) { + char *base = (char*) CALLBACKARG_USERDEF(carg); -/* _exit() will be called, if exists, upon exit */ -EXTERNAL_FUNCTION int check_detectedlink_exit(void) { fprintf(stderr, "Unplugged ..\n"); - return 1; /* success (result ignored anyway in xx_exit) */ + if (base != NULL) { + free(base); + base = NULL; + } + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt); + } + + return 1; /* success */ } diff --git a/libtest/callbacks-example-changecontent.c b/libtest/callbacks-example-changecontent.c new file mode 100755 index 0000000..7e0e0a9 --- /dev/null +++ b/libtest/callbacks-example-changecontent.c @@ -0,0 +1,65 @@ +/* + HTTrack external callbacks example : display all incoming request headers + Example of _init and _exit call (httrack >> 3.31) + .c file + + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + + How to use: + httrack --wrapper mycallback .. +*/ + +#include +#include +#include + +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" + +/* Local function definitions */ +static int postprocess(t_hts_callbackarg *carg, httrackp *opt, + char** html, int* len, + const char* url_address, const char* url_file); + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); + +/* +module entry point +*/ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, postprocess, postprocess, NULL); + + return 1; /* success */ +} + +static int postprocess(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file) { + char *old = *html; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, postprocess) != NULL) { + if (CALLBACKARG_PREV_FUN(carg, postprocess)(CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { + /* Modified *html */ + old = *html; + } + } + + /* Process */ + *html = strdup(*html); + hts_free(old); + + return 1; +} diff --git a/libtest/callbacks-example-contentfilter.c b/libtest/callbacks-example-contentfilter.c index 54ee9c0..069a99f 100755 --- a/libtest/callbacks-example-contentfilter.c +++ b/libtest/callbacks-example-contentfilter.c @@ -3,32 +3,33 @@ Example of _init and _exit call (httrack >> 3.31) .c file + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example-contentfilter.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example-contentfilter.c - - use the --wrapper option in httrack: - httrack --wrapper save-name=callback:process,string[,string..] + httrack --wrapper mycallback,stringtofind,stringtofind.. .. */ #include #include #include -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" -/* Function definitions */ -EXTERNAL_FUNCTION int process(char* html, int len, char* address, char* filename); -EXTERNAL_FUNCTION int wrapper_init(char* module, char* initString); -EXTERNAL_FUNCTION int wrapper_exit(void); +/* Local function definitions */ +static int process(t_hts_callbackarg *carg, httrackp *opt, char* html, int len, const char* address, const char* filename); +static int end(t_hts_callbackarg *carg, httrackp *opt); + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); /* TOLOWER */ #define TOLOWER_(a) (a >= 'A' && a <= 'Z') ? (a + ('a' - 'A')) : a @@ -38,24 +39,74 @@ EXTERNAL_FUNCTION int wrapper_exit(void); This sample just crawls pages that contains certain keywords, and skips the other ones */ -static char stringfilter[8192]; -static char* stringfilters[128]; -static int initialized = 0; +typedef struct t_my_userdef { + char stringfilter[8192]; + char* stringfilters[128]; +} t_my_userdef; -/* -"check-html" callback -from htsdefines.h: -typedef int (* t_hts_htmlcheck)(char* html,int len,char* address,char* filename); +/* +module entry point */ -EXTERNAL_FUNCTION int process(char* html, int len, char* address, char* filename) { +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Check args */ + if (arg == NULL || *arg == '\0') { + fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); + fprintf(stderr, "usage: httrack --wrapper callback,stringtofind,stringtofind..\n"); + fprintf(stderr, "example: httrack --wrapper callback,apple,orange,lemon\n"); + return 0; + } else { + t_my_userdef *userdef = (t_my_userdef*) malloc(sizeof(t_my_userdef)); /* userdef */ + char * const stringfilter = userdef->stringfilter; + char** const stringfilters = userdef->stringfilters; + /* */ + char* a = stringfilter; + int i = 0; + fprintf(stderr, "** info: wrapper_init(%s) called!\n", arg); + fprintf(stderr, "** callback example: crawling pages only if specific keywords are found\n"); + + /* stringfilters = split(arg, ','); */ + strcpy(stringfilter, arg); + while(a != NULL) { + stringfilters[i] = a; + a = strchr(a, ','); + if (a != NULL) { + *a = '\0'; + a ++; + } + fprintf(stderr, "** callback info: will crawl pages with '%s' in them\n", stringfilters[i]); + i++; + } + stringfilters[i++] = NULL; + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, check_html, process, userdef); + CHAIN_FUNCTION(opt, end, end, userdef); + } + + return 1; /* success */ +} + +static int process(t_hts_callbackarg *carg, httrackp *opt, char* html, int len, const char* address, const char* filename) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + char * const stringfilter = userdef->stringfilter; + char** const stringfilters = userdef->stringfilters; + /* */ int i = 0; int getIt = 0; char* pos; - if (!initialized) { - fprintf(stderr, "** ERROR! process_init() was not called by httrack - you are probably using an old version (<3.31)\n"); - fprintf(stderr, "** bailing out..\n"); - exit(1); + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt, html, len, address, filename)) { + return 0; /* Abort */ + } } + + /* Process */ if (strcmp(address, "primary") == 0 && strcmp(filename, "/primary") == 0) /* primary page (list of links) */ return 1; while(stringfilters[i] != NULL && ! getIt) { @@ -82,39 +133,18 @@ EXTERNAL_FUNCTION int process(char* html, int len, char* address, char* filename } } -/* _init() will be called, if exists, upon startup */ -EXTERNAL_FUNCTION int wrapper_init(char* module, char* initString) { - char* a = stringfilter; - int i = 0; - fprintf(stderr, "** info: wrapper_init(%s, %s) called!\n", module, initString); - fprintf(stderr, "** callback example: crawling pages only if specific keywords are found\n"); - if (initString == NULL || *initString == '\0') { - fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); - fprintf(stderr, "usage: httrack --wrapper save-name=callback:process,stringtofind,stringtofind..\n"); - fprintf(stderr, "example: httrack --wrapper save-name=callback:process,apple,orange,lemon\n"); - return 0; +static int end(t_hts_callbackarg *carg, httrackp *opt) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + fprintf(stderr, "** info: wrapper_exit() called!\n"); + if (userdef != NULL) { + free(userdef); + userdef = NULL; } - /* stringfilters = split(initString, ','); */ - strcpy(stringfilter, initString); - while(a != NULL) { - stringfilters[i] = a; - a = strchr(a, ','); - if (a != NULL) { - *a = '\0'; - a ++; - } - fprintf(stderr, "** callback info: will crawl pages with '%s' in them\n", stringfilters[i]); - i++; + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt); } - stringfilters[i++] = NULL; - initialized = 1; /* we're ok */ - return 1; /* success */ -} -/* _exit() will be called, if exists, upon exit */ -EXTERNAL_FUNCTION int wrapper_exit(void) { - fprintf(stderr, "** info: wrapper_exit() called!\n"); - initialized = 0; - return 1; /* success (result ignored anyway in xx_exit) */ + return 1; /* success */ } diff --git a/libtest/callbacks-example-displayheader.c b/libtest/callbacks-example-displayheader.c index 1f9c471..a8333b3 100755 --- a/libtest/callbacks-example-displayheader.c +++ b/libtest/callbacks-example-displayheader.c @@ -3,55 +3,64 @@ Example of _init and _exit call (httrack >> 3.31) .c file + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example-contentfilter.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example-displayheader.c - - use the --wrapper option in httrack: - httrack --wrapper save-name=callback:process,string[,string..] + httrack --wrapper mycallback .. */ #include #include #include +/* Standard httrack module includes */ #include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif +/* Local function definitions */ +static int process(t_hts_callbackarg *carg, httrackp *opt, + char* buff, const char* adr, const char* fil, + const char* referer_adr, const char* referer_fil, + htsblk* incoming); -/* Function definitions */ -EXTERNAL_FUNCTION int process(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, void* incoming); -EXTERNAL_FUNCTION int wrapper_init(char* module, char* initString); -EXTERNAL_FUNCTION int wrapper_exit(void); +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); -/* -"receive-header" callback -from htsdefines.h: -typedef int (* t_hts_htmlcheck_receivehead)(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* incoming); +/* +module entry point */ -EXTERNAL_FUNCTION int process(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, void* incoming) { - printf("[ %s%s ]\n%s\n", adr, fil, buff); - return 1; /* success */ -} +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, receivehead, process, NULL); -/* _init() will be called, if exists, upon startup */ -static char* thisModule = NULL; -EXTERNAL_FUNCTION int wrapper_init(char* module, char* initString) { - fprintf(stderr, "Plugged %s\n", module); - thisModule = module; return 1; /* success */ } -/* _exit() will be called, if exists, upon exit */ -EXTERNAL_FUNCTION int wrapper_exit(void) { - fprintf(stderr, "Unplugged %s\n", thisModule); - return 1; /* success (result ignored anyway in xx_exit) */ +static int process(t_hts_callbackarg *carg, httrackp *opt, + char* buff, const char* adr, const char* fil, + const char* referer_adr, const char* referer_fil, + htsblk* incoming) { + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, receivehead) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, receivehead)(CALLBACKARG_PREV_CARG(carg), opt, buff, adr, fil, referer_adr, referer_fil, incoming)) { + return 0; /* Abort */ + } + } + + /* Process */ + printf("[ %s%s ]\n%s\n", adr, fil, buff); + + return 1; /* success */ } diff --git a/libtest/callbacks-example-filename.c b/libtest/callbacks-example-filename.c index 0755b4d..a6c7fa1 100755 --- a/libtest/callbacks-example-filename.c +++ b/libtest/callbacks-example-filename.c @@ -2,30 +2,35 @@ HTTrack external callbacks example : changing the destination filename .c file + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example-filename.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example-filename.c - - use the --wrapper option in httrack: - httrack --wrapper save-name=callback:mysavename + httrack --wrapper mycallback .. */ #include #include #include -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" + +/* Local function definitions */ +static int mysavename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save); + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); -/* Function definitions */ -EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* referer_adr, char* referer_fil, char* save); +/* Options settings */ +#include "htsopt.h" /* TOLOWER */ #define TOLOWER_(a) (a >= 'A' && a <= 'Z') ? (a + ('a' - 'A')) : a @@ -46,18 +51,35 @@ EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* r This sample can be improved, for example, to make a map of a website. */ -/* -"check-html" callback -from htsdefines.h: -typedef int (* t_hts_htmlcheck_savename)(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save); +/* +module entry point */ -EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* referer_adr, char* referer_fil, char* save) { - char* a = save; - while(*a) { +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, savename, mysavename, NULL); + + return 1; /* success */ +} + +static int mysavename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save) { + char* a; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, savename) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, savename)(CALLBACKARG_PREV_CARG(carg), opt, adr_complete, fil_complete, referer_adr, referer_fil, save)) { + return 0; /* Abort */ + } + } + + /* Process */ + for(a = save ; *a != 0 ; a++) { char c = TOLOWER(*a); if (c >= 'a' && c <= 'z') *a = ( ( ( c - 'a' ) + 13 ) % 26 ) + 'a'; // ROT-13 - a++; } return 1; /* success */ diff --git a/libtest/callbacks-example-filename2.c b/libtest/callbacks-example-filename2.c index ded2e8f..a66420e 100755 --- a/libtest/callbacks-example-filename2.c +++ b/libtest/callbacks-example-filename2.c @@ -1,34 +1,31 @@ /* - HTTrack external callbacks example : changing the destination filename - Example of _init and _exit call (httrack >> 3.31) - .c file + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example-filename.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example-filename.c - - use the --wrapper option in httrack: - httrack --wrapper save-name=callback:mysavename,string1,string2 + httrack --wrapper mycallback,string1,string2 .. */ #include #include #include -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" /* Function definitions */ -EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* referer_adr, char* referer_fil, char* save); -EXTERNAL_FUNCTION int wrapper_init(char* module, char* initString); -EXTERNAL_FUNCTION int wrapper_exit(void); +static int mysavename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save); +static int myend(t_hts_callbackarg *carg, httrackp *opt); + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); /* TOLOWER */ #define TOLOWER_(a) (a >= 'A' && a <= 'Z') ? (a + ('a' - 'A')) : a @@ -40,24 +37,82 @@ EXTERNAL_FUNCTION int wrapper_exit(void); httrack --wrapper save-name=callback:mysavename,string1,string2 .. */ -static char string1[256]; -static char string2[256]; -static int initialized = 0; +typedef struct t_my_userdef { + char string1[256]; + char string2[256]; +} t_my_userdef; -/* -"check-html" callback -from htsdefines.h: -typedef int (* t_hts_htmlcheck_savename)(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save); +/* +module entry point */ -EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* referer_adr, char* referer_fil, char* save) { - char* buff = strdup(save); - char* a = buff; - char* b = save; - if (!initialized) { - fprintf(stderr, "** ERROR! mysavename_init() was not called by httrack - you are probably using an old version (<3.31)\n"); - fprintf(stderr, "** bailing out..\n"); - exit(1); +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Check args */ + if (arg == NULL || *arg == '\0' || strchr(arg, ',') == NULL) { + fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); + fprintf(stderr, "usage: httrack --wrapper save-name=callback:mysavename,string1,string2\n"); + fprintf(stderr, "example: httrack --wrapper save-name=callback:mysavename,foo,bar\n"); + return 0; /* failed */ + } else { + char *pos = strchr(arg, ','); + t_my_userdef *userdef = (t_my_userdef*) malloc(sizeof(t_my_userdef)); + char * const string1 = userdef->string1; + char * const string2 = userdef->string2; + + /* Split args */ + fprintf(stderr, "** info: wrapper_init(%s) called!\n", arg); + fprintf(stderr, "** callback example: changing destination filename word by another one\n"); + string1[0] = string1[1] = '\0'; + strncat(string1, arg, pos - arg); + strcpy(string2, pos + 1); + fprintf(stderr, "** callback info: will replace %s by %s in filenames!\n", string1, string2); + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, savename, mysavename, userdef); + CHAIN_FUNCTION(opt, end, myend, userdef); + } + + return 1; /* success */ +} + +static int myend(t_hts_callbackarg *carg, httrackp *opt) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + + fprintf(stderr, "** info: wrapper_exit() called!\n"); + if (userdef != NULL) { + free(userdef); + userdef = NULL; + } + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt); } + + return 1; /* success */ +} + +static int mysavename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + char * const string1 = userdef->string1; + char * const string2 = userdef->string2; + /* */ + char *buff, *a, *b; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, savename) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, savename)(CALLBACKARG_PREV_CARG(carg), opt, adr_complete, fil_complete, referer_adr, referer_fil, save)) { + return 0; /* Abort */ + } + } + + /* Process */ + buff = strdup(save); + a = buff; + b = save; *b = '\0'; /* the "save" variable points to a buffer with "sufficient" space */ while(*a) { if (strncmp(a, string1, (int)strlen(string1)) == 0) { @@ -70,31 +125,6 @@ EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* r } } free(buff); - return 1; /* success */ -} -/* _init() will be called, if exists, upon startup */ -EXTERNAL_FUNCTION int wrapper_init(char* module, char* initString) { - char* pos; - fprintf(stderr, "** info: wrapper_init(%s, %s) called!\n", module, initString); - fprintf(stderr, "** callback example: changing destination filename word by another one\n"); - if (initString == NULL || *initString == '\0' || (pos = strchr(initString, ',') ) == NULL) { - fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); - fprintf(stderr, "usage: httrack --wrapper save-name=callback:mysavename,string1,string2\n"); - fprintf(stderr, "example: httrack --wrapper save-name=callback:mysavename,foo,bar\n"); - return 0; - } - string1[0] = string1[1] = '\0'; - strncat(string1, initString, pos - initString); - strcpy(string2, pos + 1); - fprintf(stderr, "** callback info: will replace %s by %s in filenames!\n", string1, string2); - initialized = 1; /* we're ok */ return 1; /* success */ } - -/* _exit() will be called, if exists, upon exit */ -EXTERNAL_FUNCTION int wrapper_exit(void) { - fprintf(stderr, "** info: wrapper_exit() called!\n"); - initialized = 0; - return 1; /* success (result ignored anyway in xx_exit) */ -} diff --git a/libtest/callbacks-example-filenameiisbug.c b/libtest/callbacks-example-filenameiisbug.c index eb162d9..59c42f5 100755 --- a/libtest/callbacks-example-filenameiisbug.c +++ b/libtest/callbacks-example-filenameiisbug.c @@ -2,43 +2,57 @@ HTTrack external callbacks example : changing folder names ending with ".com" with ".c0m" as a workaround of IIS bug (see KB 275601) - How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example-filename.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example-filename.c - - use the --wrapper option in httrack: - httrack --wrapper save-name=callback:mysavename + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback */ #include #include #include -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" /* Function definitions */ -EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* referer_adr, char* referer_fil, char* save); +static int mysavename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save); -/* - Replaces all "offending" IIS extensions (exe, dll..) with "nice" ones +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); + +/* +module entry point */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + CHAIN_FUNCTION(opt, savename, mysavename, NULL); + return 1; /* success */ +} + /* -"check-html" callback -from htsdefines.h: -typedef int (* t_hts_htmlcheck_savename)(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save); + Replaces all "offending" IIS extensions (exe, dll..) with "nice" ones */ -EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* referer_adr, char* referer_fil, char* save) { +static int mysavename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save) { static const char* iisBogus[] = { ".com", ".exe", ".dll", ".sh", NULL }; static const char* iisBogusReplace[] = { ".c0m", ".ex3", ".dl1", ".5h", NULL }; /* MUST be the same sizes */ char* a; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, savename) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, savename)(CALLBACKARG_PREV_CARG(carg), opt, adr_complete, fil_complete, referer_adr, referer_fil, save)) { + return 0; /* Abort */ + } + } + + /* Process */ for(a = save ; *a != '\0' ; a++) { int i; for(i = 0 ; iisBogus[i] != NULL ; i++) { @@ -50,5 +64,6 @@ EXTERNAL_FUNCTION int mysavename(char* adr_complete, char* fil_complete, char* r } } } + return 1; /* success */ } diff --git a/libtest/callbacks-example-listlinks.c b/libtest/callbacks-example-listlinks.c index 26c2055..9aef247 100755 --- a/libtest/callbacks-example-listlinks.c +++ b/libtest/callbacks-example-listlinks.c @@ -2,35 +2,35 @@ HTTrack external callbacks example .c file + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + How to use: - - compile this file as a module (callback.so or callback.dll) - example: - (with gcc) - gcc -O -g3 -Wall -D_REENTRANT -DINET6 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -shared -o callback.so callbacks-example.c - or (with visual c++) - cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"callback.dll" callbacks-example.c - - use the --wrapper option in httrack: - httrack --wrapper check-html=callback:process_file - --wrapper link-detected=callback:check_detectedlink - --wrapper loop=callback:check_loop + httrack --wrapper mycallback .. */ #include #include #include -/* "External" */ -#ifdef _WIN32 -#define EXTERNAL_FUNCTION __declspec(dllexport) -#else -#define EXTERNAL_FUNCTION -#endif +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" /* Function definitions */ -EXTERNAL_FUNCTION int process_file(char* html, int len, char* url_adresse, char* url_fichier); -EXTERNAL_FUNCTION int check_detectedlink(char* link); -EXTERNAL_FUNCTION int check_loop(void* back,int back_max,int back_index,int lien_tot,int lien_ntot,int stat_time,void* stats); -EXTERNAL_FUNCTION int check_void(void); +static int process_file(t_hts_callbackarg *carg, httrackp *opt, char* html, int len, const char* url_address, const char* url_file); +static int check_detectedlink(t_hts_callbackarg *carg, httrackp *opt, char* link); +static int check_loop(t_hts_callbackarg *carg, httrackp *opt, void* back,int back_max,int back_index,int lien_tot,int lien_ntot,int stat_time,void* stats); +static int end(t_hts_callbackarg *carg, httrackp *opt); + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); /* This sample just lists all links in documents with the parent link: @@ -38,42 +38,96 @@ EXTERNAL_FUNCTION int check_void(void); This sample can be improved, for example, to make a map of a website. */ -static char currentURLBeingParsed[2048]; +typedef struct t_my_userdef { + char currentURLBeingParsed[2048]; +} t_my_userdef; -/* -"check-html" callback -typedef int (* t_hts_htmlcheck)(char* html,int len,char* url_adresse,char* url_fichier); +/* +module entry point */ -EXTERNAL_FUNCTION int process_file(char* html, int len, char* url_adresse, char* url_fichier) { - printf("now parsing %s%s..\n", url_adresse, url_fichier); - strcpy(currentURLBeingParsed, url_adresse); - strcat(currentURLBeingParsed, url_fichier); +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + t_my_userdef *userdef; + /* */ + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* Create user-defined structure */ + userdef = (t_my_userdef*) malloc(sizeof(t_my_userdef)); /* userdef */ + userdef->currentURLBeingParsed[0] = '\0'; + + /* Plug callback functions */ + CHAIN_FUNCTION(opt, check_html, process_file, userdef); + CHAIN_FUNCTION(opt, end, end, userdef); + CHAIN_FUNCTION(opt, linkdetected, check_detectedlink, userdef); + CHAIN_FUNCTION(opt, loop, check_loop, userdef); + return 1; /* success */ } -/* -"link-detected" callback -typedef int (* t_hts_htmlcheck_linkdetected)(char* link); -*/ -EXTERNAL_FUNCTION int check_detectedlink(char* link) { +static int process_file(t_hts_callbackarg *carg, httrackp *opt, char* html, int len, const char* url_address, const char* url_file) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + char * const currentURLBeingParsed = userdef->currentURLBeingParsed; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { + return 0; /* Abort */ + } + } + + /* Process */ + printf("now parsing %s%s..\n", url_address, url_file); + strcpy(currentURLBeingParsed, url_address); + strcat(currentURLBeingParsed, url_file); + + return 1; /* success */ +} + +static int check_detectedlink(t_hts_callbackarg *carg, httrackp *opt, char* link) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + char * const currentURLBeingParsed = userdef->currentURLBeingParsed; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, linkdetected) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, linkdetected)(CALLBACKARG_PREV_CARG(carg), opt, link)) { + return 0; /* Abort */ + } + } + + /* Process */ printf("[%s] -> [%s]\n", currentURLBeingParsed, link); + return 1; /* success */ } -/* -"loop" callback -typedef int (* t_hts_htmlcheck_loop)(void* back,int back_max,int back_index,int lien_tot,int lien_ntot,int stat_time,void* stats); -*/ -EXTERNAL_FUNCTION int check_loop(void* back,int back_max,int back_index,int lien_tot,int lien_ntot,int stat_time,void* stats) { +static int check_loop(t_hts_callbackarg *carg, httrackp *opt, void* back,int back_max,int back_index,int lien_tot,int lien_ntot,int stat_time,void* stats) { static int fun_animation=0; + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, loop) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, loop)(CALLBACKARG_PREV_CARG(carg), opt, back, back_max, back_index, lien_tot, lien_ntot, stat_time, stats)) { + return 0; /* Abort */ + } + } + + /* Process */ printf("%c\r", "/-\\|"[(fun_animation++)%4]); return 1; } -/* -a default callback for testing purpose -*/ -EXTERNAL_FUNCTION int check_void(void) { - printf("\n* * * default callback function called! * * *\n\n"); - return 1; +static int end(t_hts_callbackarg *carg, httrackp *opt) { + t_my_userdef *userdef = (t_my_userdef*) CALLBACKARG_USERDEF(carg); + fprintf(stderr, "** info: wrapper_exit() called!\n"); + if (userdef != NULL) { + free(userdef); + userdef = NULL; + } + + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt); + } + + return 1; /* success */ } diff --git a/libtest/callbacks-example-log.c b/libtest/callbacks-example-log.c new file mode 100755 index 0000000..2834d05 --- /dev/null +++ b/libtest/callbacks-example-log.c @@ -0,0 +1,114 @@ +/* + HTTrack external callbacks example : dumy plugin, aimed to log for debugging purpose + + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + + How to use: + httrack --wrapper mycallback .. +*/ + +/* system includes */ +#include +#include +#include + +/* standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); +EXTERNAL_FUNCTION int hts_unplug(httrackp *opt); + +/* local function called as "check_html" callback */ +static int process_file(t_hts_callbackarg *carg, httrackp *opt, + char* html, int len, const char* url_address, const char* url_file) { + void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/ + char *fmt; + + /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ + if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt, + html, len, url_address, url_file)) { + return 0; /* abort */ + } + } + + /* log */ + fprintf(stderr, "* parsing file %s%s\n", url_address, url_file); + fmt = malloc(strlen(url_address) + strlen(url_file) + 128); + sprintf(fmt, " parsing file %s%s", url_address, url_file); + hts_log(opt, "log-wrapper-info", fmt); + free(fmt); + + return 1; /* success */ +} + +static int start_of_mirror(t_hts_callbackarg *carg, httrackp *opt) { + const char *arginfo = (char*) CALLBACKARG_USERDEF(carg); + + fprintf(stderr, "* mirror start\n"); + hts_log(opt, arginfo, "mirror started"); + + /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + /* status is ok on our side, return other callabck's status */ + return CALLBACKARG_PREV_FUN(carg, start)(CALLBACKARG_PREV_CARG(carg), opt); + } + + return 1; /* success */ +} + +/* local function called as "end" callback */ +static int end_of_mirror(t_hts_callbackarg *carg, httrackp *opt) { + const char *arginfo = (char*) CALLBACKARG_USERDEF(carg); + + fprintf(stderr, "* mirror end\n"); + hts_log(opt, arginfo, "mirror ended"); + + /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + /* status is ok on our side, return other callabck's status */ + return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt); + } + + return 1; /* success */ +} + +/* +module entry point +the function name and prototype MUST match this prototype +*/ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + /* optional argument passed in the commandline we won't be using here */ + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* plug callback functions */ + if (arg == NULL) + arg = "log-wrapper-info"; + hts_log(opt, arg, "* plugging functions"); + CHAIN_FUNCTION(opt, check_html, process_file, (char*) arg); + CHAIN_FUNCTION(opt, start, start_of_mirror, (char*) arg); + CHAIN_FUNCTION(opt, end, end_of_mirror, (char*) arg); + + hts_log(opt, arg, "* module successfully plugged"); + return 1; /* success */ +} + +/* +module exit point +the function name and prototype MUST match this prototype +*/ +EXTERNAL_FUNCTION int hts_unplug(httrackp *opt) { + hts_log(opt, "log-wrapper-info", "* module successfully unplugged"); + return 1; +} diff --git a/libtest/callbacks-example-simple.c b/libtest/callbacks-example-simple.c new file mode 100755 index 0000000..e1f835a --- /dev/null +++ b/libtest/callbacks-example-simple.c @@ -0,0 +1,89 @@ +/* + HTTrack external callbacks example : print all downloaded html documents + + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack1 + With MS-Visual C++: + cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack1.lib + + Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback + + How to use: + httrack --wrapper mycallback .. +*/ + +/* system includes */ +#include +#include +#include + +/* standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" + +/* external functions */ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); +EXTERNAL_FUNCTION int hts_unplug(httrackp *opt); + +/* local function called as "check_html" callback */ +static int process_file(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt, + /*other parameters are callback-specific*/ + char* html, int len, const char* url_address, const char* url_file) { + void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/ + + /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ + if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { + if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt, + html, len, url_address, url_file)) { + return 0; /* abort */ + } + } + + printf("file %s%s content: %s\n", url_address, url_file, html); + return 1; /* success */ +} + +/* local function called as "end" callback */ +static int end_of_mirror(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt) { + void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/ + + /* processing */ + fprintf(stderr, "That's all, folks!\n"); + + /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ + if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { + /* status is ok on our side, return other callabck's status */ + return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt); + } + + return 1; /* success */ +} + +/* +module entry point +the function name and prototype MUST match this prototype +*/ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + /* optional argument passed in the commandline we won't be using here */ + const char *arg = strchr(argv, ','); + if (arg != NULL) + arg++; + + /* plug callback functions */ + CHAIN_FUNCTION(opt, check_html, process_file, /*optional user-defined arg*/NULL); + CHAIN_FUNCTION(opt, end, end_of_mirror, /*optional user-defined arg*/NULL); + + return 1; /* success */ +} + +/* +module exit point +the function name and prototype MUST match this prototype +*/ +EXTERNAL_FUNCTION int hts_unplug(httrackp *opt) { + fprintf(stderr, "Module unplugged"); + + return 1; /* success */ +} diff --git a/libtest/example.c b/libtest/example.c index 3361872..df6e503 100644 --- a/libtest/example.c +++ b/libtest/example.c @@ -2,29 +2,32 @@ HTTrack library example .c file - To Build on Windows: - - install winhttrack - - set the proper path in the project settings (especially for the httrack lib and dll) - - compile in multithreaded DLL - - avoid precompiled headers with VC - - To Build on Linux: - - install httrack - - link with libhttrack.so and compile using something like: - gcc example.c -I/usr/include/httrack -lhttrack + Prerequisites: + - install winhttrack + - set the proper path in the project settings (especially for the httrack lib and dll) + + How to build: (callback.so or callback.dll) + With GNU-GCC: + gcc -I/usr/include/httrack -O -g3 -Wall -D_REENTRANT -o example example.c -lhttrack1 + With MS-Visual C++: + cl -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.exe" callbacks-example.c wsock32.lib libhttrack.lib */ - #include #include #include +#ifdef _WIN32 +#include +#endif +/* Standard httrack module includes */ #include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" +/* Local definitions */ #include "example.h" - - /* * Name: main * Description: main() function @@ -39,6 +42,8 @@ int main(void) { char _argv[][256] = {"httrack_test" , "" , "-r3" , "--testscan" , "" }; char* argv[] = {NULL , NULL , NULL , NULL , NULL}; int argc = 0; + httrackp *opt; + int ret; while(strlen(_argv[argc])) { argv[argc]=_argv[argc]; argc++; @@ -49,40 +54,7 @@ int main(void) { scanf("%s",argv[1]); printf("Test: 1 depth\n"); - hts_init(); - htswrap_add("init",httrack_wrapper_init); - htswrap_add("free",httrack_wrapper_uninit); - htswrap_add("start",httrack_wrapper_start); - htswrap_add("change-options",httrack_wrapper_chopt); - htswrap_add("end",httrack_wrapper_end); - htswrap_add("check-html",httrack_wrapper_checkhtml); - htswrap_add("loop",httrack_wrapper_loop); - htswrap_add("query",httrack_wrapper_query); - htswrap_add("query2",httrack_wrapper_query2); - htswrap_add("query3",httrack_wrapper_query3); - htswrap_add("check-link",httrack_wrapper_check); - htswrap_add("pause",httrack_wrapper_pause); - htswrap_add("save-file",httrack_wrapper_filesave); - htswrap_add("link-detected",httrack_wrapper_linkdetected); - htswrap_add("transfer-status",httrack_wrapper_xfrstatus); - - /* Then, launch the mirror */ - hts_main(argc,argv); - - /* Wait for a key */ - printf("\nPress ENTER key to exit\n"); - scanf("%s",argv[1]); - - /* That's all! */ - return 0; -} - - -/* CALLBACK FUNCTIONS */ - -/* Initialize the Winsock */ -void CDECL httrack_wrapper_init(void) { - printf("Engine started\n"); + /* Initialize the library */ #ifdef _WIN32 { WORD wVersionRequested; // requested version WinSock API @@ -100,59 +72,130 @@ void CDECL httrack_wrapper_init(void) { } } #endif + hts_init(); -} -void CDECL httrack_wrapper_uninit(void) { - printf("Engine exited\n"); + /* Create option settings and set callbacks (wrappers) */ + opt = hts_create_opt(); + + CHAIN_FUNCTION(opt, init, httrack_wrapper_init, NULL); + CHAIN_FUNCTION(opt, uninit, httrack_wrapper_uninit, NULL); + CHAIN_FUNCTION(opt, start, httrack_wrapper_start, NULL); + CHAIN_FUNCTION(opt, end, httrack_wrapper_end, NULL); + CHAIN_FUNCTION(opt, chopt, httrack_wrapper_chopt, NULL); + CHAIN_FUNCTION(opt, preprocess, httrack_wrapper_preprocesshtml, NULL); + CHAIN_FUNCTION(opt, postprocess, httrack_wrapper_postprocesshtml, NULL); + CHAIN_FUNCTION(opt, check_html, httrack_wrapper_checkhtml, NULL); + CHAIN_FUNCTION(opt, query, httrack_wrapper_query, NULL); + CHAIN_FUNCTION(opt, query2, httrack_wrapper_query2, NULL); + CHAIN_FUNCTION(opt, query3, httrack_wrapper_query3, NULL); + CHAIN_FUNCTION(opt, loop, httrack_wrapper_loop, NULL); + CHAIN_FUNCTION(opt, check_link, httrack_wrapper_check, NULL); + CHAIN_FUNCTION(opt, check_mime, httrack_wrapper_check_mime, NULL); + CHAIN_FUNCTION(opt, pause, httrack_wrapper_pause, NULL); + CHAIN_FUNCTION(opt, filesave, httrack_wrapper_filesave, NULL); + CHAIN_FUNCTION(opt, filesave2, httrack_wrapper_filesave2, NULL); + CHAIN_FUNCTION(opt, linkdetected, httrack_wrapper_linkdetected, NULL); + CHAIN_FUNCTION(opt, linkdetected2, httrack_wrapper_linkdetected2, NULL); + CHAIN_FUNCTION(opt, xfrstatus, httrack_wrapper_xfrstatus, NULL); + CHAIN_FUNCTION(opt, savename, httrack_wrapper_savename, NULL); + CHAIN_FUNCTION(opt, sendhead, httrack_wrapper_sendheader, NULL); + CHAIN_FUNCTION(opt, receivehead, httrack_wrapper_receiveheader, NULL); + + /* Then, launch the mirror */ + ret = hts_main2(argc, argv, opt); + + /* Wait for a key */ + printf("\nPress ENTER key to exit\n"); + scanf("%s",argv[1]); + + /* Clear option state */ + hts_free_opt(opt); + hts_uninit(); #ifdef _WIN32 WSACleanup(); #endif + + /* That's all! */ + return 0; } -int CDECL httrack_wrapper_start(httrackp* opt) { + + +/* CALLBACK FUNCTIONS */ + +/* Initialize the Winsock */ +static void CDECL httrack_wrapper_init(t_hts_callbackarg *carg) { + printf("Engine started\n"); +} +static void CDECL httrack_wrapper_uninit(t_hts_callbackarg *carg) { + printf("Engine exited\n"); +} +static int CDECL httrack_wrapper_start(t_hts_callbackarg *carg, httrackp* opt) { printf("Start of mirror\n"); return 1; } -int CDECL httrack_wrapper_chopt(httrackp* opt) { - return CDECL httrack_wrapper_start(opt); +static int CDECL httrack_wrapper_chopt(t_hts_callbackarg *carg, httrackp* opt) { + return 1; } -int CDECL httrack_wrapper_end(void) { +static int CDECL httrack_wrapper_end(t_hts_callbackarg *carg, httrackp* opt) { printf("End of mirror\n"); return 1; } -int CDECL httrack_wrapper_checkhtml(char* html,int len,char* url_adresse,char* url_fichier) { - printf("Parsing html file: http://%s%s\n",url_adresse,url_fichier); +static int CDECL httrack_wrapper_checkhtml(t_hts_callbackarg *carg, httrackp *opt, char* html,int len,const char* url_address,const char* url_file) { + printf("Parsing html file: http://%s%s\n",url_address,url_file); return 1; } -int CDECL httrack_wrapper_loop(void* _back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats) { +static int CDECL httrack_wrapper_loop(t_hts_callbackarg *carg, httrackp *opt, void* _back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats) { /* printf("..httrack_wrapper_loop called\n"); */ return 1; } -char* CDECL httrack_wrapper_query(char* question) { +static const char* CDECL httrack_wrapper_query(t_hts_callbackarg *carg, httrackp *opt, const char* question) { /* Answer is No */ return "N"; } -char* CDECL httrack_wrapper_query2(char* question) { +static const char* CDECL httrack_wrapper_query2(t_hts_callbackarg *carg, httrackp *opt, const char* question) { /* Answer is No */ return "N"; } -char* CDECL httrack_wrapper_query3(char* question) { +static const char* CDECL httrack_wrapper_query3(t_hts_callbackarg *carg, httrackp *opt, const char* question) { /* Answer is "" */ return ""; } -int CDECL httrack_wrapper_check(char* adr,char* fil,int status) { +static int CDECL httrack_wrapper_check(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,int status) { printf("Link status tested: http://%s%s\n",adr,fil); return -1; } -void CDECL httrack_wrapper_pause(char* lockfile) { +static void CDECL httrack_wrapper_pause(t_hts_callbackarg *carg, httrackp *opt, const char* lockfile) { /* Wait until lockfile is removed.. */ } -void CDECL httrack_wrapper_filesave(char* file) { +static void CDECL httrack_wrapper_filesave(t_hts_callbackarg *carg, httrackp *opt, const char* file) { } -int CDECL httrack_wrapper_linkdetected(char* link) { +static int CDECL httrack_wrapper_linkdetected(t_hts_callbackarg *carg, httrackp *opt, char* link) { printf("Link detected: %s\n",link); return 1; } -int CDECL httrack_wrapper_xfrstatus(void* back) { +static int CDECL httrack_wrapper_xfrstatus(t_hts_callbackarg *carg, httrackp *opt, void* back) { + return 1; +} +static int CDECL httrack_wrapper_preprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file) { + return 1; +} +static int CDECL httrack_wrapper_postprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file) { + return 1; +} +static int CDECL httrack_wrapper_check_mime(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,const char* mime,int status) { + return -1; +} +static void CDECL httrack_wrapper_filesave2(t_hts_callbackarg *carg, httrackp *opt, const char* adr, const char* fil, const char* save, int is_new, int is_modified,int not_updated) { +} +static int CDECL httrack_wrapper_linkdetected2(t_hts_callbackarg *carg, httrackp *opt, char* link, const char* start_tag) { + return 1; +} +static int CDECL httrack_wrapper_savename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete,const char* fil_complete,const char* referer_adr,const char* referer_fil,char* save) { + return 1; +} +static int CDECL httrack_wrapper_sendheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing) { + return 1; +} +static int CDECL httrack_wrapper_receiveheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming) { return 1; } - diff --git a/libtest/example.dsp b/libtest/example.dsp deleted file mode 100644 index 0f87ae0..0000000 --- a/libtest/example.dsp +++ /dev/null @@ -1,95 +0,0 @@ -# Microsoft Developer Studio Project File - Name="example" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=example - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "example.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "example.mak" CFG="example - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "example - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "example - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "example - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "C:\Dev" /I "C:\Dev\IPv6Kit\inc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 wsock32.lib libhttrack.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "example - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "C:\Dev\IPv6Kit\inc" /I "C:\Dev" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 wsock32.lib libhttrack.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "example - Win32 Release" -# Name "example - Win32 Debug" -# Begin Source File - -SOURCE=.\example.c -# End Source File -# Begin Source File - -SOURCE=.\example.h -# End Source File -# End Target -# End Project diff --git a/libtest/example.dsw b/libtest/example.dsw deleted file mode 100644 index adba05b..0000000 --- a/libtest/example.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "example"=".\example.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/libtest/example.h b/libtest/example.h index 161dce5..57bf15d 100644 --- a/libtest/example.h +++ b/libtest/example.h @@ -9,19 +9,26 @@ #define CDECL #endif -void CDECL httrack_wrapper_init(void); -void CDECL httrack_wrapper_uninit(void); -int CDECL httrack_wrapper_start(httrackp* opt); -int CDECL httrack_wrapper_chopt(httrackp* opt); -int CDECL httrack_wrapper_end(void); -int CDECL httrack_wrapper_checkhtml(char* html,int len,char* url_adresse,char* url_fichier); -int CDECL httrack_wrapper_loop(void* _back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats); -char* CDECL httrack_wrapper_query(char* question); -char* CDECL httrack_wrapper_query2(char* question); -char* CDECL httrack_wrapper_query3(char* question); -int CDECL httrack_wrapper_check(char* adr,char* fil,int status); -void CDECL httrack_wrapper_pause(char* lockfile); -void CDECL httrack_wrapper_filesave(char* file); -int CDECL httrack_wrapper_linkdetected(char* link); -int CDECL httrack_wrapper_xfrstatus(void* back); - +static void CDECL httrack_wrapper_init(t_hts_callbackarg *carg); +static void CDECL httrack_wrapper_uninit(t_hts_callbackarg *carg); +static int CDECL httrack_wrapper_start(t_hts_callbackarg *carg, httrackp* opt); +static int CDECL httrack_wrapper_chopt(t_hts_callbackarg *carg, httrackp* opt); +static int CDECL httrack_wrapper_end(t_hts_callbackarg *carg, httrackp* opt); +static int CDECL httrack_wrapper_checkhtml(t_hts_callbackarg *carg, httrackp *opt, char* html,int len,const char* url_address,const char* url_file); +static int CDECL httrack_wrapper_loop(t_hts_callbackarg *carg, httrackp *opt, void* _back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats); +static const char* CDECL httrack_wrapper_query(t_hts_callbackarg *carg, httrackp *opt, const char* question); +static const char* CDECL httrack_wrapper_query2(t_hts_callbackarg *carg, httrackp *opt, const char* question); +static const char* CDECL httrack_wrapper_query3(t_hts_callbackarg *carg, httrackp *opt, const char* question); +static int CDECL httrack_wrapper_check(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,int status); +static void CDECL httrack_wrapper_pause(t_hts_callbackarg *carg, httrackp *opt, const char* lockfile); +static void CDECL httrack_wrapper_filesave(t_hts_callbackarg *carg, httrackp *opt, const char* file); +static int CDECL httrack_wrapper_linkdetected(t_hts_callbackarg *carg, httrackp *opt, char* link); +static int CDECL httrack_wrapper_xfrstatus(t_hts_callbackarg *carg, httrackp *opt, void* back); +static int CDECL httrack_wrapper_preprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file); +static int CDECL httrack_wrapper_postprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file); +static int CDECL httrack_wrapper_check_mime(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,const char* mime,int status); +static void CDECL httrack_wrapper_filesave2(t_hts_callbackarg *carg, httrackp *opt, const char* adr, const char* fil, const char* save, int is_new, int is_modified,int not_updated); +static int CDECL httrack_wrapper_linkdetected2(t_hts_callbackarg *carg, httrackp *opt, char* link, const char* start_tag); +static int CDECL httrack_wrapper_savename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete,const char* fil_complete,const char* referer_adr,const char* referer_fil,char* save); +static int CDECL httrack_wrapper_sendheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing); +static int CDECL httrack_wrapper_receiveheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming); diff --git a/libtest/htssystem.h b/libtest/htssystem.h deleted file mode 100644 index 58941ed..0000000 --- a/libtest/htssystem.h +++ /dev/null @@ -1,2 +0,0 @@ -#define HTS_ANALYSTE 1 - diff --git a/libtest/readme.txt b/libtest/readme.txt index 3c23e4c..c204e29 100644 --- a/libtest/readme.txt +++ b/libtest/readme.txt @@ -32,3 +32,25 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +======================================================================== + MAKEFILE PROJECT : libtest Project Overview +======================================================================== + +AppWizard has created this libtest project for you. + +This file contains a summary of what you will find in each of the files that +make up your libtest project. + + +libtest.vcproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +This project allows you to build/clean/rebuild from within Visual Studio by calling the commands you have input +in the wizard. The build command can be nmake or any other tool you use. + +This project does not contain any files, so there are none displayed in Solution Explorer. + +///////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3