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