1 /*
2     HTTrack library example
3     .c file
4 
5     Prerequisites:
6       - install winhttrack
7       - set the proper path in the project settings (especially for the httrack lib and dll)
8 
9     How to build: (callback.so or callback.dll)
10       With GNU-GCC:
11         gcc -I/usr/include/httrack -O -g3 -Wall -D_REENTRANT -o example example.c -lhttrack2
12       With MS-Visual C++:
13         cl -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.exe" callbacks-example.c wsock32.lib libhttrack.lib
14 */
15 
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #ifdef _WIN32
20 #include <windows.h>
21 #endif
22 
23 /* Standard httrack module includes */
24 #include "httrack-library.h"
25 #include "htsopt.h"
26 #include "htsdefines.h"
27 
28 /* Local definitions */
29 #include "example-main.h"
30 
31 /*
32  * Name:           main
33  * Description:    main() function
34  * Parameters:     None
35  * Should return:  error status
36 */
main(void)37 int main(void) {
38   /*
39      First, ask for an URL
40      Note: For the test, option r2 (mirror max depth=1) and --testscan (no index, no cache, do not store, no log files)
41    */
42   char _argv[][256] = { "httrack_test", "<URL>", "-r3", "--testscan", "" };
43   char *argv[] = { NULL, NULL, NULL, NULL, NULL };
44   int argc = 0;
45   httrackp *opt;
46   int ret;
47 
48   while(strlen(_argv[argc])) {
49     argv[argc] = _argv[argc];
50     argc++;
51   }
52   argv[argc] = NULL;
53   printf("HTTrackLib test program\n");
54   printf("Enter URL (example: www.foobar.com/index.html) :");
55   scanf("%s", argv[1]);
56   printf("Test: 1 depth\n");
57 
58   /* Initialize the library */
59 #ifdef _WIN32
60   {
61     WORD wVersionRequested;     // requested version WinSock API
62     WSADATA wsadata;            // Windows Sockets API data
63     int stat;
64 
65     wVersionRequested = 0x0101;
66     stat = WSAStartup(wVersionRequested, &wsadata);
67     if (stat != 0) {
68       printf("Winsock not found!\n");
69       return;
70     } else if (LOBYTE(wsadata.wVersion) != 1 && HIBYTE(wsadata.wVersion) != 1) {
71       printf("WINSOCK.DLL does not support version 1.1\n");
72       WSACleanup();
73       return;
74     }
75   }
76 #endif
77   hts_init();
78 
79   /* Create option settings and set callbacks (wrappers) */
80   opt = hts_create_opt();
81 
82   CHAIN_FUNCTION(opt, init, httrack_wrapper_init, NULL);
83   CHAIN_FUNCTION(opt, uninit, httrack_wrapper_uninit, NULL);
84   CHAIN_FUNCTION(opt, start, httrack_wrapper_start, NULL);
85   CHAIN_FUNCTION(opt, end, httrack_wrapper_end, NULL);
86   CHAIN_FUNCTION(opt, chopt, httrack_wrapper_chopt, NULL);
87   CHAIN_FUNCTION(opt, preprocess, httrack_wrapper_preprocesshtml, NULL);
88   CHAIN_FUNCTION(opt, postprocess, httrack_wrapper_postprocesshtml, NULL);
89   CHAIN_FUNCTION(opt, check_html, httrack_wrapper_checkhtml, NULL);
90   CHAIN_FUNCTION(opt, query, httrack_wrapper_query, NULL);
91   CHAIN_FUNCTION(opt, query2, httrack_wrapper_query2, NULL);
92   CHAIN_FUNCTION(opt, query3, httrack_wrapper_query3, NULL);
93   CHAIN_FUNCTION(opt, loop, httrack_wrapper_loop, NULL);
94   CHAIN_FUNCTION(opt, check_link, httrack_wrapper_check, NULL);
95   CHAIN_FUNCTION(opt, check_mime, httrack_wrapper_check_mime, NULL);
96   CHAIN_FUNCTION(opt, pause, httrack_wrapper_pause, NULL);
97   CHAIN_FUNCTION(opt, filesave, httrack_wrapper_filesave, NULL);
98   CHAIN_FUNCTION(opt, filesave2, httrack_wrapper_filesave2, NULL);
99   CHAIN_FUNCTION(opt, linkdetected, httrack_wrapper_linkdetected, NULL);
100   CHAIN_FUNCTION(opt, linkdetected2, httrack_wrapper_linkdetected2, NULL);
101   CHAIN_FUNCTION(opt, xfrstatus, httrack_wrapper_xfrstatus, NULL);
102   CHAIN_FUNCTION(opt, savename, httrack_wrapper_savename, NULL);
103   CHAIN_FUNCTION(opt, sendhead, httrack_wrapper_sendheader, NULL);
104   CHAIN_FUNCTION(opt, receivehead, httrack_wrapper_receiveheader, NULL);
105 
106   /* Then, launch the mirror */
107   ret = hts_main2(argc, argv, opt);
108 
109   /* Wait for a key */
110   printf("\nPress ENTER key to exit\n");
111   scanf("%s", argv[1]);
112 
113   /* Clear option state */
114   hts_free_opt(opt);
115   hts_uninit();
116 #ifdef _WIN32
117   WSACleanup();
118 #endif
119 
120   /* That's all! */
121   return 0;
122 }
123 
124 /* CALLBACK FUNCTIONS */
125 
126 /* Initialize the Winsock */
httrack_wrapper_init(t_hts_callbackarg * carg)127 static void CDECL httrack_wrapper_init(t_hts_callbackarg * carg) {
128   printf("Engine started\n");
129 }
httrack_wrapper_uninit(t_hts_callbackarg * carg)130 static void CDECL httrack_wrapper_uninit(t_hts_callbackarg * carg) {
131   printf("Engine exited\n");
132 }
httrack_wrapper_start(t_hts_callbackarg * carg,httrackp * opt)133 static int CDECL httrack_wrapper_start(t_hts_callbackarg * carg, httrackp * opt) {
134   printf("Start of mirror\n");
135   return 1;
136 }
httrack_wrapper_chopt(t_hts_callbackarg * carg,httrackp * opt)137 static int CDECL httrack_wrapper_chopt(t_hts_callbackarg * carg, httrackp * opt) {
138   return 1;
139 }
httrack_wrapper_end(t_hts_callbackarg * carg,httrackp * opt)140 static int CDECL httrack_wrapper_end(t_hts_callbackarg * carg, httrackp * opt) {
141   printf("End of mirror\n");
142   return 1;
143 }
httrack_wrapper_checkhtml(t_hts_callbackarg * carg,httrackp * opt,char * html,int len,const char * url_address,const char * url_file)144 static int CDECL httrack_wrapper_checkhtml(t_hts_callbackarg * carg,
145                                            httrackp * opt, char *html, int len,
146                                            const char *url_address,
147                                            const char *url_file) {
148   printf("Parsing html file: http://%s%s\n", url_address, url_file);
149   return 1;
150 }
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)151 static int CDECL httrack_wrapper_loop(t_hts_callbackarg * carg, httrackp * opt,
152                                       void *_back, int back_max, int back_index,
153                                       int lien_n, int lien_tot, int stat_time,
154                                       hts_stat_struct * stats) {
155   /* printf("..httrack_wrapper_loop called\n"); */
156   return 1;
157 }
httrack_wrapper_query(t_hts_callbackarg * carg,httrackp * opt,const char * question)158 static const char *CDECL httrack_wrapper_query(t_hts_callbackarg * carg,
159                                                httrackp * opt,
160                                                const char *question) {
161   /* Answer is No */
162   return "N";
163 }
httrack_wrapper_query2(t_hts_callbackarg * carg,httrackp * opt,const char * question)164 static const char *CDECL httrack_wrapper_query2(t_hts_callbackarg * carg,
165                                                 httrackp * opt,
166                                                 const char *question) {
167   /* Answer is No */
168   return "N";
169 }
httrack_wrapper_query3(t_hts_callbackarg * carg,httrackp * opt,const char * question)170 static const char *CDECL httrack_wrapper_query3(t_hts_callbackarg * carg,
171                                                 httrackp * opt,
172                                                 const char *question) {
173   /* Answer is "" */
174   return "";
175 }
httrack_wrapper_check(t_hts_callbackarg * carg,httrackp * opt,const char * adr,const char * fil,int status)176 static int CDECL httrack_wrapper_check(t_hts_callbackarg * carg, httrackp * opt,
177                                        const char *adr, const char *fil,
178                                        int status) {
179   printf("Link status tested: http://%s%s\n", adr, fil);
180   return -1;
181 }
httrack_wrapper_pause(t_hts_callbackarg * carg,httrackp * opt,const char * lockfile)182 static void CDECL httrack_wrapper_pause(t_hts_callbackarg * carg,
183                                         httrackp * opt, const char *lockfile) {
184   /* Wait until lockfile is removed.. */
185 }
httrack_wrapper_filesave(t_hts_callbackarg * carg,httrackp * opt,const char * file)186 static void CDECL httrack_wrapper_filesave(t_hts_callbackarg * carg,
187                                            httrackp * opt, const char *file) {
188 }
httrack_wrapper_linkdetected(t_hts_callbackarg * carg,httrackp * opt,char * link)189 static int CDECL httrack_wrapper_linkdetected(t_hts_callbackarg * carg,
190                                               httrackp * opt, char *link) {
191   printf("Link detected: %s\n", link);
192   return 1;
193 }
httrack_wrapper_xfrstatus(t_hts_callbackarg * carg,httrackp * opt,void * back)194 static int CDECL httrack_wrapper_xfrstatus(t_hts_callbackarg * carg,
195                                            httrackp * opt, void *back) {
196   return 1;
197 }
httrack_wrapper_preprocesshtml(t_hts_callbackarg * carg,httrackp * opt,char ** html,int * len,const char * url_address,const char * url_file)198 static int CDECL httrack_wrapper_preprocesshtml(t_hts_callbackarg * carg,
199                                                 httrackp * opt, char **html,
200                                                 int *len,
201                                                 const char *url_address,
202                                                 const char *url_file) {
203   return 1;
204 }
httrack_wrapper_postprocesshtml(t_hts_callbackarg * carg,httrackp * opt,char ** html,int * len,const char * url_address,const char * url_file)205 static int CDECL httrack_wrapper_postprocesshtml(t_hts_callbackarg * carg,
206                                                  httrackp * opt, char **html,
207                                                  int *len,
208                                                  const char *url_address,
209                                                  const char *url_file) {
210   return 1;
211 }
httrack_wrapper_check_mime(t_hts_callbackarg * carg,httrackp * opt,const char * adr,const char * fil,const char * mime,int status)212 static int CDECL httrack_wrapper_check_mime(t_hts_callbackarg * carg,
213                                             httrackp * opt, const char *adr,
214                                             const char *fil, const char *mime,
215                                             int status) {
216   return -1;
217 }
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)218 static void CDECL httrack_wrapper_filesave2(t_hts_callbackarg * carg,
219                                             httrackp * opt, const char *adr,
220                                             const char *fil, const char *save,
221                                             int is_new, int is_modified,
222                                             int not_updated) {
223 }
httrack_wrapper_linkdetected2(t_hts_callbackarg * carg,httrackp * opt,char * link,const char * start_tag)224 static int CDECL httrack_wrapper_linkdetected2(t_hts_callbackarg * carg,
225                                                httrackp * opt, char *link,
226                                                const char *start_tag) {
227   return 1;
228 }
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)229 static int CDECL httrack_wrapper_savename(t_hts_callbackarg * carg,
230                                           httrackp * opt,
231                                           const char *adr_complete,
232                                           const char *fil_complete,
233                                           const char *referer_adr,
234                                           const char *referer_fil, char *save) {
235   return 1;
236 }
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)237 static int CDECL httrack_wrapper_sendheader(t_hts_callbackarg * carg,
238                                             httrackp * opt, char *buff,
239                                             const char *adr, const char *fil,
240                                             const char *referer_adr,
241                                             const char *referer_fil,
242                                             htsblk * outgoing) {
243   return 1;
244 }
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)245 static int CDECL httrack_wrapper_receiveheader(t_hts_callbackarg * carg,
246                                                httrackp * opt, char *buff,
247                                                const char *adr, const char *fil,
248                                                const char *referer_adr,
249                                                const char *referer_fil,
250                                                htsblk * incoming) {
251   return 1;
252 }
253