@@ -150,8 +150,6 @@ void* uri_bbf_detect_objects_parse(const void* context, void* parsed, const char
150150 default :
151151 break ;
152152 case s_bbf_name_interval :
153- numeric_parser_execute (& parser -> numeric_parser , buf , len );
154- break ;
155153 case s_bbf_name_min_neighbors :
156154 numeric_parser_execute (& parser -> numeric_parser , buf , len );
157155 break ;
@@ -191,32 +189,89 @@ void* uri_bbf_detect_objects_init(void)
191189 return context ;
192190}
193191
194- ebb_buf uri_bbf_detect_objects_intro (const void * context , const void * parsed )
192+ int uri_bbf_detect_objects_intro (const void * context , const void * parsed , ebb_buf * buf )
195193{
196- ebb_buf buf ;
197- const static char bbf_intro [] =
194+ const static char bbf_desc [] =
198195 "HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nAccept: \r\nContent-Type: text/html\r\nContent-Length: 189\r\n\r\n"
199196 "<html><body><form enctype='multipart/form-data' method='post'><input name='size' value='24x24'><input name='model' value='face'><input type='file' name='source'><input type='submit'></form>\n" ;
200- buf .data = (void * )bbf_intro ;
201- buf .len = sizeof (bbf_intro );
202- return buf ;
197+ /*
198+ const static char bbf_desc[] =
199+ "HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nAccept: \r\nContent-Type: application/json\r\nContent-Length: 1\r\n\r\n"
200+ "{\"model\":\"\",\"size\":\"\",\"interval\":\"\",\"min_neighbors\":\"\",\"accurate\":\"\",\"source\":\"\"}\n";
201+ */
202+ buf -> data = (void * )bbf_desc ;
203+ buf -> len = sizeof (bbf_desc );
204+ return 0 ;
203205}
204206
205- ebb_buf uri_bbf_detect_objects (const void * context , const void * parsed )
207+ int uri_bbf_detect_objects (const void * context , const void * parsed , ebb_buf * buf )
206208{
207209 bbf_param_parser_t * parser = (bbf_param_parser_t * )parsed ;
208210 if (parser -> state != s_bbf_start )
209211 uri_bbf_param_parser_terminate (parser );
210212 ccv_dense_matrix_t * image = 0 ;
213+ if (parser -> source .data == 0 )
214+ {
215+ free (parser );
216+ return -1 ;
217+ }
211218 ccv_read (parser -> source .data , & image , CCV_IO_ANY_STREAM | CCV_IO_GRAY , parser -> source .written );
219+ free (parser -> source .data );
220+ if (image == 0 )
221+ {
222+ free (parser );
223+ return -1 ;
224+ }
212225 ccv_array_t * seq = ccv_bbf_detect_objects (image , & parser -> cascade , 1 , parser -> params );
213- ccv_array_free (seq );
214226 ccv_matrix_free (image );
215- ebb_buf buf ;
216- const static char bbf_intro [] =
217- "HTTP/1.1 201 Created\r\nCache-Control: no-cache\r\nContent-Type: text/plain\r\nContent-Length: 3\r\n\r\n"
218- "OK\n" ;
219- buf .data = (void * )bbf_intro ;
220- buf .len = sizeof (bbf_intro );
221- return buf ;
227+ if (seq == 0 )
228+ {
229+ free (parser );
230+ return -1 ;
231+ }
232+ int i = 0 ;
233+ if (seq -> rnum > 0 )
234+ {
235+ buf -> len = seq -> rnum * 21 + 2 ;
236+ char * data = (char * )malloc (buf -> len );
237+ data [0 ] = '[' ;
238+ buf -> written = 1 ;
239+ for (i = 0 ; i < seq -> rnum ; i ++ )
240+ {
241+ char cell [64 ];
242+ ccv_comp_t * comp = (ccv_comp_t * )ccv_array_get (seq , i );
243+ snprintf (cell , 64 , "[%d,%d,%d,%d,%f]" , comp -> rect .x , comp -> rect .y , comp -> rect .width , comp -> rect .height , comp -> confidence );
244+ size_t len = strnlen (cell , 64 );
245+ while (buf -> written + len + 1 >= buf -> len )
246+ {
247+ buf -> len = (buf -> len * 3 + 1 ) / 2 ;
248+ data = (char * )realloc (data , buf -> len );
249+ }
250+ memcpy (data + buf -> written , cell , len );
251+ buf -> written += len + 1 ;
252+ data [buf -> written - 1 ] = (i == seq -> rnum - 1 ) ? ']' : ',' ;
253+ }
254+ char http_header [192 ];
255+ snprintf (http_header , 192 , "HTTP/1.1 201 Created\r\nCache-Control: no-cache\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: %zd\r\n\r\n" , buf -> written );
256+ size_t len = strnlen (http_header , 192 );
257+ if (buf -> written + len + 1 >= buf -> len )
258+ {
259+ buf -> len = buf -> written + len + 1 ;
260+ data = (char * )realloc (data , buf -> len );
261+ }
262+ memmove (data + len , data , buf -> written );
263+ memcpy (data , http_header , len );
264+ buf -> written += len + 1 ;
265+ data [buf -> written - 1 ] = '\n' ;
266+ buf -> data = data ;
267+ buf -> len = buf -> written ;
268+ buf -> on_release = uri_ebb_buf_free ;
269+ } else {
270+ buf -> data = (void * )ebb_http_empty_array ;
271+ buf -> len = sizeof (ebb_http_empty_array );
272+ buf -> on_release = 0 ;
273+ }
274+ ccv_array_free (seq );
275+ free (parser );
276+ return 0 ;
222277}
0 commit comments