From: Sanjeev Ba <as2902.b@samsung.com>

Subject: Using Eina_BinBuf in Ecore_Con_Url

From Sanjeev - an improvement and addition to the Ecore_Con
documentation giving a handy tip on using Eina_Bin/StrBuf.



SVN revision: 62195
This commit is contained in:
Sanjeev Ba 2011-08-08 09:40:36 +00:00 committed by Carsten Haitzler
parent eedfe2e790
commit 6cde0c4431
1 changed files with 107 additions and 0 deletions

View File

@ -105,6 +105,113 @@
*
*/
/**
* @defgroup Ecore_Con_Buffer Buffering
*
* As Ecore_Con works on an event driven design, as data arrives, events will
* be produced containing the data that arrived. It is up to the user of
* Ecore_Con to either parse as they go, append to a file to later parse the
* whole file in one go, or append to memory to parse or handle leter.
*
* To help with this Eina has some handy API's. The Eina_Binbuf and
* Eina_Strbuf APIs, abstract dynamic buffer management and make it trivial
* to handle buffers at runtime, without having to manage them. Eina_Binbuf
* makes it possible to create, expand, reset and slice a blob of memory -
* all via API. No system calls, no pointer manipulations and no size
* calculation.
*
* Additional functions include adding content at specified byte positions in
* the buffer, escaping the inputs, find and replace strings. This provides
* extreme flexibility to play around, with a dynamic blob of memory.
*
* It is good to free it (using eina_binbuf_free()) after using it.
*
* Eina_Binbuf compliments Ecore_Con use cases, where dynamic sizes of data
* arrive from the network (think http download in chunks). Using
* Eina_Binbuf provides enough flexibility to handle data as it arrives and
* to defer its processing until desired, without having to think about
* where to store the temporary data and how to manage its size.
*
* An example of how to use these with Ecore_Con follows.
*
* @code
* #include <Eina.h>
* #include <Ecore.h>
* #include <Ecore_Con.h>
*
* static Eina_Bool
* data_callback(void *data, int type, void *event)
* {
* Ecore_Con_Event_Url_Data *url_data = event;
* if ( url_data->size > 0)
* {
* // append data as it arrives - don't worry where or how it gets stored.
* // Also don't worry about size, expanding, reallocing etc.
* // just keep appending - size is automatically handled.
*
* eina_binbuf_append_length(data, url_data->data, url_data->size);
*
* fprintf(stderr, "Appended %d \n", url_data->size);
* }
* return EINA_TRUE;
* }
*
*
*
* static Eina_Bool
* completion_callback(void *data, int type, void *event)
* {
* Ecore_Con_Event_Url_Complete *url_complete = event;
* printf("download completed with status code: %d\n", url_complete->status);
*
* // get the data back from Eina_Binbuf
* char *ptr = eina_binbuf_string_get(data);
* size_t size = eina_binbuf_length_get(data);
*
* // process data as required (write to file)
* fprintf(stderr, "Size of data = %d bytes\n", size);
* int fd = open("./elm.png", O_CREAT);
* write(fd, ptr, size);
* close(fd);
*
* // free it when done.
* eina_binbuf_free(data);
*
* ecore_main_loop_quit();
*
* return EINA_TRUE;
* }
*
*
* int
* main(int argc, char **argv)
* {
*
* const char *url = "http://www.enlightenment.org/p/index/d/logo.png";
*
* ecore_init();
* ecore_con_init();
* ecore_con_url_init();
*
*
* // This is single additional line to manage dynamic network data.
* Eina_Binbuf *data = eina_binbuf_new();
* Ecore_Con_Url *url_con = ecore_con_url_new(url);
*
* ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE,
* completion_callback,
* data);
* ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA,
* data_callback,
* data);
* ecore_con_url_get(url_con);
*
* ecore_main_loop_begin();
* return 0;
* }
* @endcode
*/
#ifdef __cplusplus
extern "C" {
#endif