diff --git a/apps/aqhome-storage/u_rooms.c b/apps/aqhome-storage/u_rooms.c index b2d3ad4..8c125ae 100644 --- a/apps/aqhome-storage/u_rooms.c +++ b/apps/aqhome-storage/u_rooms.c @@ -47,8 +47,8 @@ static GWEN_MSG *_handlePostAdd(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq); static GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id); static int _writeAddPage(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, GWEN_DB_NODE *dbValues, GWEN_BUFFER *pageBuf); static int _writeEditPage(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, GWEN_DB_NODE *dbValues, GWEN_BUFFER *pageBuf); -static GWEN_MSG *_addRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq); -static GWEN_MSG *_editRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id); +static GWEN_MSG *_addOrEditAndCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id); +static int _addOrEditRoom(AQH_HTTP_URLHANDLER *uh, const AQH_ROOM *newRoom, int id); @@ -287,38 +287,26 @@ void _handleGetEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id, GWEN_ sv=AQH_HttpUrlHandler_GetHttpService(uh); sto=AqHomeHttpService_GetStorage(sv); - if (sto) { - if (id>0) { - const AQH_ROOM *r; + if (id>0) { + const AQH_ROOM *r; - r=AQH_Storage_GetRoomById(sto, id); - if (r) { - GWEN_DB_NODE *db; - int rv; + r=AQH_Storage_GetRoomById(sto, id); + if (r) { + GWEN_DB_NODE *db; - db=GWEN_DB_Group_new("room"); - rv=AQH_Room_toDb(r, db); - if (rv>=0) - _writeEditPage(uh, rq, db, pageBuf); - else { - DBG_ERROR(NULL, "Error writing room %d to db", id); - GWEN_Buffer_AppendArgs(pageBuf, "

%s

", I18N("Internal error.")); - } - GWEN_DB_Group_free(db); - } - else { - DBG_ERROR(NULL, "Room %d not found", id); - GWEN_Buffer_AppendArgs(pageBuf, "

%s

", I18N("Room not found.")); - } + db=GWEN_DB_Group_new("room"); + AQH_Room_toDb(r, db); + _writeEditPage(uh, rq, db, pageBuf); + GWEN_DB_Group_free(db); } else { - DBG_ERROR(NULL, "Missing room id"); - GWEN_Buffer_AppendArgs(pageBuf, "

%s

", I18N("Missing or invalid room id.")); + DBG_ERROR(NULL, "Room %d not found", id); + GWEN_Buffer_AppendArgs(pageBuf, "

%s

", I18N("Room not found.")); } } else { - DBG_ERROR(NULL, "No storage"); - GWEN_Buffer_AppendArgs(pageBuf, "

%s

", I18N("Internal error.")); + DBG_ERROR(NULL, "Missing room id"); + GWEN_Buffer_AppendArgs(pageBuf, "

%s

", I18N("Missing or invalid room id.")); } } else { @@ -411,18 +399,8 @@ GWEN_MSG *_handlePostAdd(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq) protocol=AQH_HttpRequest_GetProtocol(rq); sv=AQH_HttpUrlHandler_GetHttpService(uh); perms=AQH_HttpRequest_GetModulePerms(rq); - if (perms & AQHOME_HTTP_PERMS_ADD_ROOM) { - AQH_STORAGE *sto; - - sto=AqHomeHttpService_GetStorage(sv); - if (sto) { - return _addRoomCreateResponse(uh, rq); - } - else { - DBG_ERROR(NULL, "No storage"); - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); - } - } + if (perms & AQHOME_HTTP_PERMS_ADD_ROOM) + return _addOrEditAndCreateResponse(uh, rq, 0); else { return AQH_HttpService_CreateResponseMsg(sv, 403, "Forbidden", protocol, NULL); } @@ -439,17 +417,8 @@ GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id) protocol=AQH_HttpRequest_GetProtocol(rq); sv=AQH_HttpUrlHandler_GetHttpService(uh); perms=AQH_HttpRequest_GetModulePerms(rq); - if (perms & AQHOME_HTTP_PERMS_ADD_ROOM) { - AQH_STORAGE *sto; - - sto=AqHomeHttpService_GetStorage(sv); - if (sto) { - return _editRoomCreateResponse(uh, rq, id); - } - else { - DBG_ERROR(NULL, "No storage"); - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); - } + if (perms & AQHOME_HTTP_PERMS_EDIT_ROOM) { + return _addOrEditAndCreateResponse(uh, rq, id); } else { return AQH_HttpService_CreateResponseMsg(sv, 403, "Forbidden", protocol, NULL); @@ -458,119 +427,107 @@ GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id) -GWEN_MSG *_addRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq) +GWEN_MSG *_addOrEditAndCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id) { AQH_SERVICE *sv; const char *protocol; GWEN_DB_NODE *db; - const char *roomName; - const char *roomDescr; - AQH_STORAGE *sto; + AQH_ROOM *r; + int rv; sv=AQH_HttpUrlHandler_GetHttpService(uh); protocol=AQH_HttpRequest_GetProtocol(rq); db=AQH_HttpRequest_GetDbPostBody(rq); - roomName=GWEN_DB_GetCharValue(db, "name", 0, NULL); - roomDescr=GWEN_DB_GetCharValue(db, "description", 0, NULL); - - if (!(roomName && *roomName)) { - DBG_INFO(NULL, "Missing room name"); - return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Missing room name"), 1, db, _writeAddPage); - } - - sto=AqHomeHttpService_GetStorage(sv); - if (sto) { - AQH_ROOM *r; - int rv; - - r=AQH_Room_new(); - AQH_Room_SetName(r, roomName); - if (roomDescr && *roomDescr) - AQH_Room_SetDescription(r, roomDescr); - - rv=AqHomeHttpService_LockStorage(sv); - if (rv<0) { - DBG_ERROR(NULL, "Error locking storage"); + r=AQH_Room_fromDb(db); + rv=_addOrEditRoom(uh, r, id); + AQH_Room_free(r); + if (rv<0) { + switch(rv) { + case GWEN_ERROR_INVALID: + return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Missing fields"), 1, db, _writeAddPage); + case GWEN_ERROR_FOUND: + return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room already exists"), 1, db, _writeEditPage); + case GWEN_ERROR_NOT_FOUND: + return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room not found"), 1, db, _writeEditPage); + case GWEN_ERROR_IO: + case GWEN_ERROR_INTERNAL: + default: return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); } - if (AQH_Storage_GetRoomByName(sto, roomName)!=NULL) { - DBG_INFO(NULL, "Room \"%s\" already exists", roomName); - AqHomeHttpService_UnlockStorage(sv); - return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room already exists"), 1, db, _writeAddPage); - } - AQH_Storage_AddRoom(sto, r); - AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED); - - rv=AqHomeHttpService_UnlockStorage(sv); - if (rv<0) { - DBG_ERROR(NULL, "Error unlocking storage"); - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); - } - return AQH_HttpService_CreateRedirectingResponseMsg(sv, protocol, "/rooms/list"); } - else - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); + return AQH_HttpService_CreateRedirectingResponseMsg(sv, protocol, "/rooms/list"); } -GWEN_MSG *_editRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id) +int _addOrEditRoom(AQH_HTTP_URLHANDLER *uh, const AQH_ROOM *newRoom, int id) { AQH_SERVICE *sv; - const char *protocol; - GWEN_DB_NODE *db; - const char *roomName; - const char *roomDescr; AQH_STORAGE *sto; + const char *roomName; + int rv; sv=AQH_HttpUrlHandler_GetHttpService(uh); - protocol=AQH_HttpRequest_GetProtocol(rq); - db=AQH_HttpRequest_GetDbPostBody(rq); - - roomName=GWEN_DB_GetCharValue(db, "name", 0, NULL); - roomDescr=GWEN_DB_GetCharValue(db, "description", 0, NULL); + sto=AqHomeHttpService_GetStorage(sv); + roomName=AQH_Room_GetName(newRoom); if (!(roomName && *roomName)) { DBG_INFO(NULL, "Missing room name"); - return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Missing room name"), 1, db, _writeAddPage); + return GWEN_ERROR_INVALID; } - sto=AqHomeHttpService_GetStorage(sv); - if (sto) { - AQH_ROOM *r; - int rv; + rv=AqHomeHttpService_LockStorage(sv); + if (rv<0) { + DBG_ERROR(NULL, "Error locking storage"); + return GWEN_ERROR_IO; + } - rv=AqHomeHttpService_LockStorage(sv); - if (rv<0) { - DBG_ERROR(NULL, "Error locking storage"); - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); - } + if (id>0) { + AQH_ROOM *r; r=AQH_Storage_GetRoomById(sto, id); if (r==NULL) { AqHomeHttpService_UnlockStorage(sv); DBG_ERROR(NULL, "Room %d not found", id); - return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room not found"), 1, db, _writeEditPage); + return GWEN_ERROR_NOT_FOUND; } - - /* edit room */ + AQH_Room_SetId(r, id); AQH_Room_SetName(r, roomName); - if (roomDescr && *roomDescr) - AQH_Room_SetDescription(r, roomDescr); + AQH_Room_SetDescription(r, AQH_Room_GetDescription(newRoom)); AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED); - - rv=AqHomeHttpService_UnlockStorage(sv); - if (rv<0) { - DBG_ERROR(NULL, "Error unlocking storage"); - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); - } - return AQH_HttpService_CreateRedirectingResponseMsg(sv, protocol, "/rooms/list"); } - else - return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); + else { + AQH_ROOM *r; + + r=AQH_Storage_GetRoomByName(sto, roomName); + if (r) { + DBG_ERROR(NULL, "Room %s exists", roomName); + return GWEN_ERROR_FOUND; + } + AQH_Storage_AddRoom(sto, r); + AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED); + } + + rv=AqHomeHttpService_UnlockStorage(sv); + if (rv<0) { + DBG_ERROR(NULL, "Error unlocking storage"); + return GWEN_ERROR_IO; + } + return 0; } +/* TODO: applyRoom(uh, rq, r, id) + * share code! + * + * check values + * + * if id==0: + * - lookup room + * - add room if not already found + * else + * set room data +*/