Fixed a JSON generation bug.

This commit is contained in:
Stuart Longland 2008-01-11 16:17:28 +10:00
parent 361b0b606d
commit a04734e5d0
4 changed files with 51 additions and 23 deletions

View File

@ -1,12 +1,12 @@
.PHONY: clean install
CS_PATH=/usr
CFLAGS+=-I$(CS_PATH)/include/ClearSilver
CFLAGS+=$(shell Wand-config --cflags --cppflags)
LDFLAGS+=$(shell Wand-config --ldflags --libs)
MY_CFLAGS+=-I$(CS_PATH)/include/ClearSilver $(CFLAGS)
MY_CFLAGS+=$(shell Wand-config --cflags --cppflags)
MY_LDFLAGS+=$(shell Wand-config --ldflags --libs) $(LDFLAGS)
CFLAGS+=$(shell pkg-config --cflags json)
LDFLAGS+=$(shell pkg-config --libs json)
MY_CFLAGS+=$(shell pkg-config --cflags json)
MY_LDFLAGS+=$(shell pkg-config --libs json)
OBJS=obj/main.o obj/util.o obj/galleries.o obj/gallery.o obj/varray.o \
obj/photo.o obj/hdf-json.o obj/jpeg.o \
$(CS_PATH)/lib/libneo_cgi.a $(CS_PATH)/lib/libneo_cs.a \
@ -16,14 +16,14 @@ VERSIONSTAMP=$(shell if [ -d .git ]; then git-describe; else cat version; fi)
COMPILESTAMP=$(shell date "+%Y-%m-%d %H:%M:%S %z" )
gallery.cgi: $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS)
$(CC) -o $@ $(OBJS) $(MY_LDFLAGS)
obj:
mkdir obj
obj/%.o: src/%.c include/%.h obj
$(CC) -DCOMPILESTAMP='"$(COMPILESTAMP)"' \
-DVERSIONSTAMP='"$(VERSIONSTAMP)"' \
$(CFLAGS) -I include -o $@ -c $<
$(MY_CFLAGS) -I include -o $@ -c $<
clean:
rm -fr obj gallery.cgi

View File

@ -20,13 +20,6 @@ CGI* cgi;
CSPARSE* cstemp;
char* cstemp_dir;
/* Output mode. This is set by main() and defines the mode of output for all
* functions defined.
*/
#define OUTPUT_HTML 0
#define OUTPUT_JSON 1
char output_mode = OUTPUT_HTML;
/* Default Photo settings */
#define DEFAULT_WIDTH 720
#define DEFAULT_HEIGHT 0

View File

@ -19,8 +19,11 @@ struct json_object* hdf_obj_to_json( struct json_object* parent,
struct json_object* json_obj;
if ( hdf_obj->value != NULL )
/* We have a string node */
json_obj = json_object_new_string( hdf_obj->value );
if ( hdf_obj->child == NULL )
/* We have a string node */
json_obj = json_object_new_string( hdf_obj->value );
else /* Special case */
json_obj = json_object_new_object();
else
/* We have a container node */
json_obj = json_object_new_object();
@ -37,6 +40,15 @@ struct json_object* hdf_obj_to_json( struct json_object* parent,
else /* Add it to the parent */
json_object_object_add( parent, hdf_obj->name, json_obj );
/* SPECIAL CASE: Container nodes with children */
if ( ( hdf_obj->value != NULL ) && ( hdf_obj->child != NULL ) ) {
/* Add the value in as a string child node. */
struct json_object* json_val =
json_object_new_string( hdf_obj->value );
json_object_object_add( json_obj, "_value", json_val );
}
/* Parse each of the attributes */
HDF_ATTR* attr = hdf_obj->attr;
while( attr != NULL ) {

View File

@ -13,8 +13,28 @@
#include <json/json.h>
#include <hdf-json.h>
#ifdef EBUG
/* HACK: Enable coredumps! */
#include <sys/time.h>
#include <sys/resource.h>
#endif
/* Entry point into entire webapp */
int main( int argc, char** argv ) {
#ifdef EBUG
struct rlimit core_limit;
if (getrlimit( RLIMIT_CORE, &core_limit ) ) {
perror("get coredump limit");
} else {
dprintf("old coredump size: %d\n", core_limit.rlim_cur);
}
core_limit.rlim_max = 1048576; /* 1MB */
if (setrlimit( RLIMIT_CORE, &core_limit ) ) {
perror("enable coredump");
} else {
dprintf("new coredump size: %d\n", core_limit.rlim_max);
}
#endif
char* dir = get_cgidir();
#ifdef COMPILESTAMP
dprintf("DEBUG: Compile timestamp is %s\n", COMPILESTAMP);
@ -47,11 +67,6 @@ int main( int argc, char** argv ) {
hdf_set_value( cgi->hdf, "system.version", VERSIONSTAMP );
#endif
/* Detect JSON mode */
if ( argc > 1 )
if ( strcmp( argv[1], "json" ) == 0 )
output_mode = OUTPUT_JSON;
/* Parse the PATH_INFO variable */
struct vararray* path_info = create_vararray( NULL, 0, NULL, NULL );
char* raw_path_info = getenv("PATH_INFO");
@ -346,11 +361,19 @@ void photo_handler( struct gallery_info* gallery,
}
void write_template( const char* template_name ) {
if ( output_mode == OUTPUT_JSON ) {
int output_mode = hdf_get_int_value( cgi->hdf, "Query.json", 0 );
if ( output_mode ) {
/* Ignore the template name, we were asked for JSON data */
puts("Content-Type: text/plain\n\n");
#ifdef EBUG
fflush(stdout);
hdf_dump( cgi->hdf, "// DEBUG:" );
fflush(stdout);
#endif
struct json_object* cgi_json =
hdf_obj_to_json( NULL, cgi->hdf );
puts("Content-Type: text/plain\n\n");
puts( json_object_to_json_string( cgi_json ) );
} else {
char* template = construct_path( "s/s", cstemp_dir, template_name );