+void PopulateItemList(int Socket)
+{
+ char buffer[BUFSIZ];
+ int len;
+ int responseCode;
+
+ char *itemType, *itemStart;
+ int count, i;
+ regmatch_t matches[4];
+
+ // Ask server for stock list
+ send(Socket, "ENUM_ITEMS\n", 11, 0);
+ len = recv(Socket, buffer, BUFSIZ-1, 0);
+ buffer[len] = '\0';
+
+ trim(buffer);
+
+ //printf("Output: %s\n", buffer);
+
+ responseCode = atoi(buffer);
+ if( responseCode != 201 ) {
+ fprintf(stderr, "Unknown response from dispense server (Response Code %i)\n", responseCode);
+ exit(-1);
+ }
+
+ // - Get item list -
+
+ // Expected format: 201 Items <count> <item1> <item2> ...
+ RunRegex(&gArrayRegex, buffer, 4, matches, "Malformed server response");
+
+ itemType = &buffer[ matches[2].rm_so ]; buffer[ matches[2].rm_eo ] = '\0';
+ count = atoi( &buffer[ matches[3].rm_so ] );
+
+ // Check array type
+ if( strcmp(itemType, "Items") != 0 ) {
+ // What the?!
+ fprintf(stderr, "Unexpected array type, expected 'Items', got '%s'\n",
+ itemType);
+ exit(-1);
+ }
+
+ itemStart = &buffer[ matches[3].rm_eo ];
+
+ gaItems = malloc( count * sizeof(tItem) );
+
+ for( giNumItems = 0; giNumItems < count && itemStart; giNumItems ++ )
+ {
+ char *next = strchr( ++itemStart, ' ' );
+ if( next ) *next = '\0';
+ gaItems[giNumItems].Ident = strdup(itemStart);
+ itemStart = next;
+ }
+
+ // Fetch item information
+ for( i = 0; i < giNumItems; i ++ )
+ {
+ regmatch_t matches[6];
+
+ // Get item info
+ sendf(Socket, "ITEM_INFO %s\n", gaItems[i].Ident);
+ len = recv(Socket, buffer, BUFSIZ-1, 0);
+ buffer[len] = '\0';
+ trim(buffer);
+
+ responseCode = atoi(buffer);
+ if( responseCode != 202 ) {
+ fprintf(stderr, "Unknown response from dispense server (Response Code %i)\n", responseCode);
+ exit(-1);
+ }
+
+ RunRegex(&gItemRegex, buffer, 6, matches, "Malformed server response");
+
+ buffer[ matches[3].rm_eo ] = '\0';
+
+ gaItems[i].Price = atoi( buffer + matches[4].rm_so );
+ gaItems[i].Desc = strdup( buffer + matches[5].rm_so );
+ }
+}
+
+int DispenseItem(int Socket, int ItemID)
+{
+ int len, responseCode;
+ char buffer[BUFSIZ];
+
+ if( ItemID < 0 || ItemID > giNumItems ) return -1;
+
+ // Dispense!
+ sendf(Socket, "DISPENSE %s\n", gaItems[ItemID].Ident);
+ len = recv(Socket, buffer, BUFSIZ-1, 0);
+ buffer[len] = '\0';
+ trim(buffer);
+
+ responseCode = atoi(buffer);
+ switch( responseCode )
+ {
+ case 200:
+ printf("Dispense OK\n");
+ return 0;
+ case 401:
+ printf("Not authenticated\n");
+ return 1;
+ case 402:
+ printf("Insufficient balance\n");
+ return 1;
+ case 406:
+ printf("Bad item name, bug report\n");
+ return 1;
+ case 500:
+ printf("Item failed to dispense, is the slot empty?\n");
+ return 1;
+ case 501:
+ printf("Dispense not possible (slot empty/permissions)\n");
+ return 1;
+ default:
+ printf("Unknown response code %i ('%s')\n", responseCode, buffer);
+ return -2;
+ }
+}
+