00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00028 #include "main.h"
00029
00050 int sc_getFile (mmachine m)
00051 {
00052 int murl, mlocalfile, len;
00053 char * url, * localfile, * err = NULL;
00054
00055 CURL * hCurl;
00056 CURLcode rCurl;
00057 FILE * fp = NULL;
00058
00059 MMechostr (MSKDEBUG, "sc_getFile : entering ...\n");
00060
00061 mlocalfile = MTOP (MMpull (m));
00062 murl = MTOP (MMpull (m));
00063
00064 if ((mlocalfile == NIL) || (murl == NIL))
00065 {
00066 MMechostr (MSKDEBUG, "sc_getFile error : url or localfile is nil\n");
00067 MMpush (m, ITOM (1));
00068 return 0;
00069 }
00070
00071 hCurl = curl_easy_init();
00072 if (hCurl)
00073 {
00074 len = sizeof (char) * (MMsizestr (m, mlocalfile));
00075 localfile = (char *) malloc (len+1);
00076 strncpy (localfile, MMstartstr (m, mlocalfile), len);
00077 localfile[len] = '\0';
00078
00079 fp = fopen (localfile, "w");
00080 if (fp == NULL)
00081 {
00082 curl_easy_cleanup (hCurl);
00083 free (localfile); localfile = NULL;
00084 MMpush (m, ITOM (3));
00085 return 0;
00086 }
00087
00088 err = (char *) malloc (sizeof (char) * (CURL_ERROR_SIZE +1));
00089 len = sizeof (char) * (MMsizestr (m, murl));
00090 url = (char *) malloc (len+1);
00091 strncpy (url, MMstartstr (m, murl), len);
00092 url[len] = '\0';
00093
00094 curl_easy_setopt (hCurl, CURLOPT_URL, url);
00095 curl_easy_setopt (hCurl, CURLOPT_WRITEFUNCTION, fwrite);
00096 curl_easy_setopt (hCurl, CURLOPT_WRITEDATA, (FILE *) fp);
00097 curl_easy_setopt (hCurl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
00098 curl_easy_setopt (hCurl, CURLOPT_ERRORBUFFER, err);
00099 rCurl = curl_easy_perform (hCurl);
00100
00101 MMechostr (MSKDEBUG, "sc_getFile : err = %s ...\n", err);
00102 curl_easy_cleanup (hCurl);
00103 fclose (fp);
00104
00105 free (localfile); localfile = NULL;
00106 free (url); url = NULL;
00107 free (err); err = NULL;
00108
00109 MMpush (m, ITOM (0));
00110 return 0;
00111 }
00112
00113 MMpush (m, ITOM (2));
00114 return 0;
00115 }
00116
00117
00118
00133 void sc_newUrlCBend (struct StrExample * strEx)
00134 {
00135 mmachine m;
00136 CURL * hCurl;
00137 int cb;
00138
00139 MMechostr (MSKDEBUG, "sc_newUrlCBend : entering ...\n");
00140
00141 m = (mmachine) strEx->m2m;
00142 hCurl = (CURL *) strEx->hcurl;
00143
00144 cb = OBJbeginreflex (m, ObjCurl, (int) hCurl, CURL_CB_GET);
00145 if (cb)
00146 {
00147 MMechostr (0, "sc_newUrlCBend error : no callback defined ! errcode = %d\n", cb);
00148 return;
00149 }
00150
00151 MMpush (m, NIL);
00152 MMpush (m, NIL);
00153 Mpushstrbloc (m, strEx->url);
00154 Mpushstrbloc (m, strEx->cerr);
00155 OBJcallreflex (m, 4);
00156 return;
00157 }
00158
00203 size_t sc_newUrlCB (void * ptr, size_t size, size_t nmemb, void * p_strEx)
00204 {
00205 mmachine m;
00206 char * data = NULL;
00207 int cb;
00208 size_t n;
00209 struct StrExample * strEx;
00210 CURL * hCurl;
00211
00212 MMechostr (MSKDEBUG, "sc_newUrlCB : entering ...\n");
00213 strEx = (struct StrExample *) p_strEx;
00214
00215 m = (mmachine) strEx->m2m;
00216 hCurl = (CURL *) strEx->hcurl;
00217
00218 cb = OBJbeginreflex (m, ObjCurl, (int) hCurl, CURL_CB_GET);
00219 if (cb)
00220 {
00221 MMechostr (0, "sc_newUrlCB error : no callback defined ! errcode = %d\n", cb);
00222 return -1;
00223 }
00224
00225 n = (sizeof (char) * size * nmemb);
00226 data = (char *) malloc (n+1);
00227 if (data == NULL)
00228 return -1;
00229 strncpy (data, ptr, n);
00230 data[n] = '\0';
00231
00232
00233
00234 Mpushstrbloc (m, data);
00235 MMpush (m, ITOM (size*nmemb));
00236 Mpushstrbloc (m, strEx->url);
00237 Mpushstrbloc (m, strEx->cerr);
00238
00239 OBJcallreflex (m, 4);
00240 if (data)
00241 free (data);
00242
00243 return size*nmemb;
00244 }
00245
00246
00247
00325 int sc_newGetUrl (mmachine m)
00326 {
00327 int mchannel, murl;
00328 int curltab, sizetab, tmp_res, n;
00329 CURLcode rCurl;
00330 struct StrExample strEx;
00331
00332 MMechostr (MSKDEBUG, "sc_newGetUrl : entering ...\n");
00333
00334 memset (strEx.cerr, '\0', CURL_ERROR_SIZE);
00335
00336
00337 mchannel = MMget (m, 4);
00338 if (mchannel == NIL)
00339 {
00340 MMechostr (0, "sc_newGetUrl error : channel is nil\n");
00341 MMpull (m);
00342 MMpush (m, NIL);
00343 return 0;
00344 }
00345
00346
00347 murl = MTOP (MMget (m, 3));
00348 if (murl == NIL)
00349 {
00350 MMechostr (0, "sc_newGetUrl error : url is nil\n");
00351 MMpull (m);
00352 MMpush (m, NIL);
00353 return 0;
00354 }
00355
00356
00357
00358 INVERT (m, 0, 4);
00359
00360
00361 if (curl_global_init (CURL_GLOBAL_ALL) != CURLE_OK)
00362 {
00363 MMechostr (0, "sc_newGetUrl error : global init failed\n");
00364 MMpull (m);
00365 MMpush (m, NIL);
00366 return 0;
00367 }
00368
00369
00370 strEx.hcurl = curl_easy_init();
00371
00372 if (strEx.hcurl)
00373 {
00374
00375 sizetab = sizeof (strEx.hcurl) + 1;
00376
00377 curltab = MMmalloc (m, sizetab, TYPETAB);
00378
00379 if ((curltab == NIL))
00380 {
00381 MMechostr (0, "sc_newGetUrl error : insufficient memory\n");
00382 curl_easy_cleanup (strEx.hcurl);
00383 MMpull (m);
00384 MMpush (m, NIL);
00385 return 0;
00386 }
00387
00388 MMstore (m, curltab, OBJCURL_HANDLE, (int) strEx.hcurl);
00389
00390 MMpush (m, PTOM (curltab));
00391
00392
00393
00394
00395 OBJcreate (m, ObjCurl, (int) strEx.hcurl, -1, -1);
00396
00397 n = sizeof (char) * (MMsizestr (m, murl));
00398 strEx.url = (char *) malloc (n+1);
00399 strncpy (strEx.url, MMstartstr (m, murl), n);
00400 strEx.url[n] = '\0';
00401
00402 strEx.m2m = m;
00403
00404
00405
00406
00407 INVERT (m, 0, 2);
00408 INVERT (m, 0, 4);
00409
00410 OBJaddreflex (m, ObjCurl, CURL_CB_GET);
00411
00412 curl_easy_setopt (strEx.hcurl, CURLOPT_URL, strEx.url);
00413 curl_easy_setopt (strEx.hcurl, CURLOPT_ERRORBUFFER, strEx.cerr);
00414 curl_easy_setopt (strEx.hcurl, CURLOPT_WRITEDATA, &strEx);
00415 curl_easy_setopt (strEx.hcurl, CURLOPT_WRITEFUNCTION, sc_newUrlCB);
00416 curl_easy_setopt (strEx.hcurl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
00417
00418 rCurl = curl_easy_perform (strEx.hcurl);
00419 sc_newUrlCBend (&strEx);
00420
00421 curl_easy_cleanup (strEx.hcurl);
00422 curl_global_cleanup();
00423
00424 free (strEx.url);
00425
00426
00427 return 0;
00428 }
00429
00430
00431 MMechostr (0, "sc_newGetUrl error : easy init failed\n");
00432 curl_global_cleanup();
00433
00434 MMpull (m);
00435 MMpush (m, NIL);
00436 return 0;
00437 }
00438
00450 int sc_delGetUrl (mmachine m)
00451 {
00452 int obj;
00453
00454 MMechostr (MSKDEBUG, "sc_delGetUrl entering ...\n");
00455
00456
00457 obj = MTOP (MMget (m, 0));
00458 if (obj == NIL)
00459 {
00460 MMechostr (MSKDEBUG, "sc_delGetUrl : object aleady destroyed\n");
00461 MMset (m, 0, NIL);
00462 return 0;
00463 }
00464
00465
00466 OBJdelTM (m, OBJCURL_HANDLE, PTOM (obj));
00467
00468 MMset (m, 0, 0);
00469
00470 return 0;
00471 }