Enlightenment CVS committal
Author : englebass
Project : e17
Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_con
Modified Files:
ecore_con_url.c
Log Message:
Add ftp upload function (from Massimiliano Calamelli).
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_con/ecore_con_url.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- ecore_con_url.c 28 May 2008 09:02:39 -0000 1.22
+++ ecore_con_url.c 20 Jun 2008 07:48:33 -0000 1.23
@@ -23,15 +23,23 @@
*
* Example Usage 1 (HTTP GET):
* ecore_con_url_url_set(url_con, "http://www.google.com");
- * ecore_con_url_send(url, NULL, 0, NULL);
+ * ecore_con_url_send(url_con, NULL, 0, NULL);
*
* Example usage 2 (HTTP POST):
* ecore_con_url_url_set(url_con, "http://www.example.com/post_handler.cgi");
- * ecore_con_url_send(url, data, data_length, "multipart/form-data");
+ * ecore_con_url_send(url_con, data, data_length, "multipart/form-data");
*
* Example Usage 3 (FTP download):
* ecore_con_url_url_set(url_con, "ftp://ftp.example.com/pub/myfile");
- * ecore_con_url_send(url, NULL, 0, NULL);
+ * ecore_con_url_send(url_con, NULL, 0, NULL);
+ *
+ * Example Usage 4 (FTP upload as ftp://ftp.example.com/file):
+ * ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
+ * ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass", NULL);
+ *
+ * Example Usage 5 (FTP upload as ftp://ftp.example.com/dir/file):
+ * ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
+ * ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass","dir");
*
* FIXME: Support more CURL features: Authentication, Progress callbacks and
more...
*/
@@ -42,6 +50,7 @@
#include <errno.h>
#include <sys/stat.h>
+#include <sys/types.h>
/**
* @defgroup Ecore_Con_Url_Group Ecore URL Connection Functions
@@ -58,8 +67,9 @@
#ifdef HAVE_CURL
static int _ecore_con_url_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
static int _ecore_con_url_perform(Ecore_Con_Url *url_con);
-static size_t _ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb,
void *userp);
+static size_t _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems,
void *userp);
static int _ecore_con_url_progress_cb(void *clientp, double dltotal, double
dlnow, double ultotal, double ulnow);
+static size_t _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems,
void *stream);
static void _ecore_con_event_url_free(void *data __UNUSED__, void *ev);
static int _ecore_con_url_process_completed_jobs(Ecore_Con_Url
*url_con_to_match);
@@ -495,17 +505,17 @@
/**
* Makes a FTP upload
- * @return FIXME: To be documented.
+ * @return FIXME: To be more documented.
* @ingroup Ecore_Con_Url_Group
*/
EAPI int
-ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, char *filename, char *user,
char *pass, char *uploadas)
+ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, char *filename, char *user,
char *pass, char *upload_dir)
{
#ifdef HAVE_CURL
char url[4096];
char userpwd[4096];
FILE *fd;
- struct stat file_info;
+ struct stat file_info;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
@@ -515,21 +525,23 @@
if (url_con->active) return 0;
if (!url_con->url) return 0;
-
if (filename)
{
if (stat(filename, &file_info)) return 0;
fd = fopen(filename, "rb");
- snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
basename(filename));
+ if (upload_dir)
+ snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
upload_dir, basename(filename));
+ else
+ snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
basename(filename));
snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
- curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 1);
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
(curl_off_t)file_info.st_size);
curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
_ecore_con_url_read_cb);
curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
ecore_con_url_url_set(url_con, url);
return _ecore_con_url_perform(url_con);
- fclose(fd);
}
#else
return 0;
@@ -537,10 +549,57 @@
filename = NULL;
user = NULL;
pass = NULL;
- uploadas = NULL;
+ upload_dir = NULL;
#endif
}
+/**
+ * Enable or disable libcurl verbose output, useful for debug
+ * @return FIXME: To be more documented.
+ * @ingroup Ecore_Con_Url_Group
+ */
+EAPI void
+ecore_con_url_verbose_set(Ecore_Con_Url *url_con, int verbose)
+{
+#ifdef HAVE_CURL
+ if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+ {
+ ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
"ecore_con_url_verbose_set");
+ return;
+ }
+
+ if (url_con->active) return;
+ if (!url_con->url) return;
+ if (verbose == TRUE)
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 1);
+ else
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 0);
+#endif
+}
+
+/**
+ * Enable or disable EPSV extension
+ * @return FIXME: To be more documented.
+ * @ingroup Ecore_Con_Url_Group
+ */
+EAPI void
+ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, int use_epsv)
+{
+#ifdef HAVE_CURL
+ if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+ {
+ ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
"ecore_con_url_ftp_use_epsv_set");
+ return;
+ }
+
+ if (url_con->active) return;
+ if (!url_con->url) return;
+ if (use_epsv == TRUE)
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, 1);
+ else
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, 0);
+#endif
+}
#ifdef HAVE_CURL
static int
@@ -595,11 +654,11 @@
}
static size_t
-_ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp)
+_ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
{
Ecore_Con_Url *url_con;
Ecore_Con_Event_Url_Data *e;
- size_t real_size = size * nmemb;
+ size_t real_size = size * nitems;
url_con = (Ecore_Con_Url *)userp;
@@ -685,6 +744,21 @@
}
return 0;
+}
+
+static size_t
+_ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream)
+{
+ size_t retcode = fread(ptr, size, nitems, stream);
+ if (ferror(stream)) {
+ fclose(stream);
+ return CURL_READFUNC_ABORT;
+ } else if ((retcode == 0) || (retcode < nitems)) {
+ fclose(stream);
+ return 0;
+ }
+ fprintf(stderr, "*** We read %d bytes from file\n", retcode);
+ return retcode;
}
static int
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs