project_files/frontlib/model/roomlist.c
changeset 7269 5b0aeef8ba2a
child 7275 15f722e0b96f
equal deleted inserted replaced
7267:710f3ced8934 7269:5b0aeef8ba2a
       
     1 #include "roomlist.h"
       
     2 
       
     3 #include "../util/util.h"
       
     4 #include "../util/list.h"
       
     5 #include "../util/logging.h"
       
     6 
       
     7 #include <stdlib.h>
       
     8 #include <string.h>
       
     9 
       
    10 flib_roomlist *flib_roomlist_create() {
       
    11 	return flib_calloc(1, sizeof(flib_roomlist));
       
    12 }
       
    13 
       
    14 static void flib_roomlist_room_destroy(flib_roomlist_room *room) {
       
    15 	if(room) {
       
    16 		free(room->map);
       
    17 		free(room->name);
       
    18 		free(room->owner);
       
    19 		free(room->scheme);
       
    20 		free(room->weapons);
       
    21 		free(room);
       
    22 	}
       
    23 }
       
    24 
       
    25 void flib_roomlist_destroy(flib_roomlist *list) {
       
    26 	if(list) {
       
    27 		for(int i=0; i<list->roomCount; i++) {
       
    28 			flib_roomlist_room_destroy(list->rooms[i]);
       
    29 		}
       
    30 		free(list);
       
    31 	}
       
    32 }
       
    33 
       
    34 static flib_roomlist_room *fillRoomFromParams(char **params) {
       
    35 	flib_roomlist_room *result = NULL;
       
    36 	flib_roomlist_room *tmpRoom = flib_calloc(1, sizeof(flib_roomlist_room));
       
    37 	if(tmpRoom) {
       
    38 		tmpRoom->inProgress = !strcmp(params[0], "True");
       
    39 		tmpRoom->name = flib_strdupnull(params[1]);
       
    40 		tmpRoom->playerCount = atoi(params[2]);
       
    41 		tmpRoom->teamCount = atoi(params[3]);
       
    42 		tmpRoom->owner = flib_strdupnull(params[4]);
       
    43 		tmpRoom->map = flib_strdupnull(params[5]);
       
    44 		tmpRoom->scheme = flib_strdupnull(params[6]);
       
    45 		tmpRoom->weapons = flib_strdupnull(params[7]);
       
    46 		if(tmpRoom->name && tmpRoom->owner && tmpRoom->map && tmpRoom->scheme && tmpRoom->weapons) {
       
    47 			result = tmpRoom;
       
    48 			tmpRoom = NULL;
       
    49 		}
       
    50 	}
       
    51 	flib_roomlist_room_destroy(tmpRoom);
       
    52 	return result;
       
    53 }
       
    54 
       
    55 int flib_roomlist_add(flib_roomlist *list, char **params) {
       
    56 	int result = -1;
       
    57 	if(!list || !params) {
       
    58 		flib_log_e("null parameter in flib_roomlist_add");
       
    59 	} else {
       
    60 		flib_roomlist_room *tmpRoom = fillRoomFromParams(params);
       
    61 		if(tmpRoom) {
       
    62 			flib_roomlist_room **rooms = flib_list_insert(list->rooms, &list->roomCount, sizeof(*list->rooms), &tmpRoom, 0);
       
    63 			if(rooms) {
       
    64 				list->rooms = rooms;
       
    65 				tmpRoom = NULL;
       
    66 				result = 0;
       
    67 			}
       
    68 		}
       
    69 		flib_roomlist_room_destroy(tmpRoom);
       
    70 	}
       
    71 	return result;
       
    72 }
       
    73 
       
    74 static int findRoom(flib_roomlist *list, const char *name) {
       
    75 	for(int i=0; i<list->roomCount; i++) {
       
    76 		if(!strcmp(name, list->rooms[i]->name)) {
       
    77 			return i;
       
    78 		}
       
    79 	}
       
    80 	return -1;
       
    81 }
       
    82 
       
    83 int flib_roomlist_update(flib_roomlist *list, const char *name, char **params) {
       
    84 	int result = -1;
       
    85 	if(!list || !name || !params) {
       
    86 		flib_log_e("null parameter in flib_roomlist_update");
       
    87 	} else {
       
    88 		flib_roomlist_room *tmpRoom = fillRoomFromParams(params);
       
    89 		int roomid = findRoom(list, name);
       
    90 		if(tmpRoom && roomid>=0) {
       
    91 			flib_roomlist_room_destroy(list->rooms[roomid]);
       
    92 			list->rooms[roomid] = tmpRoom;
       
    93 			tmpRoom = NULL;
       
    94 			result = 0;
       
    95 		}
       
    96 		flib_roomlist_room_destroy(tmpRoom);
       
    97 	}
       
    98 	return result;
       
    99 }
       
   100 
       
   101 flib_roomlist_room *flib_roomlist_find(flib_roomlist *list, const char *name) {
       
   102 	flib_roomlist_room *result = NULL;
       
   103 	if(!list || !name) {
       
   104 		flib_log_e("null parameter in flib_roomlist_find");
       
   105 	} else {
       
   106 		int roomid = findRoom(list, name);
       
   107 		if(roomid>=0) {
       
   108 			result = list->rooms[roomid];
       
   109 		}
       
   110 	}
       
   111 	return result;
       
   112 }
       
   113 
       
   114 void flib_roomlist_clear(flib_roomlist *list) {
       
   115 	if(!list) {
       
   116 		flib_log_e("null parameter in flib_roomlist_clear");
       
   117 	} else {
       
   118 		for(int i=0; i<list->roomCount; i++) {
       
   119 			flib_roomlist_room_destroy(list->rooms[i]);
       
   120 		}
       
   121 		free(list->rooms);
       
   122 		list->rooms = NULL;
       
   123 		list->roomCount = 0;
       
   124 	}
       
   125 }
       
   126 
       
   127 int flib_roomlist_delete(flib_roomlist *list, const char *name) {
       
   128 	int result = -1;
       
   129 	if(!list || !name) {
       
   130 		flib_log_e("null parameter in flib_roomlist_delete");
       
   131 	} else {
       
   132 		int roomid = findRoom(list, name);
       
   133 		if(roomid<0) {
       
   134 			flib_log_w("Attempt to delete unknown room %s", name);
       
   135 		} else {
       
   136 			flib_roomlist_room *room = list->rooms[roomid];
       
   137 			flib_roomlist_room **rooms = flib_list_delete(list->rooms, &list->roomCount, sizeof(*list->rooms), roomid);
       
   138 			if(rooms || list->roomCount==0) {
       
   139 				list->rooms = rooms;
       
   140 				flib_roomlist_room_destroy(room);
       
   141 				result = 0;
       
   142 			}
       
   143 		}
       
   144 	}
       
   145 	return result;
       
   146 }