Cleanups of bugs and segfaults
[tpg/opendispense2.git] / src / server / dispense.c
1 /**
2  */
3 #include "common.h"
4 #include <stdlib.h>
5
6 // === CODE ===
7 /**
8  * \brief Dispense an item for a user
9  * 
10  * The core of the dispense system, I kinda like it :)
11  */
12 int DispenseItem(int User, tItem *Item)
13 {
14          int    ret;
15         tHandler        *handler;
16         char    *username;
17         
18         handler = Item->Handler;
19         
20         // Check if the dispense is possible
21         if( handler->CanDispense ) {
22                 ret = handler->CanDispense( User, Item->ID );
23                 if(!ret)        return 1;       // 1: Unknown Error
24         }
25         
26         // Subtract the balance
27         ret = Transfer( User, GetUserID(">sales"), Item->Price, "" );
28         // What value should I use for this error?
29         // AlterBalance should return the final user balance
30         if(ret != 0)    return 2;       // 2: No balance
31         
32         // Get username for debugging
33         username = GetUserName(User);
34         
35         // Actually do the dispense
36         if( handler->DoDispense ) {
37                 ret = handler->DoDispense( User, Item->ID );
38                 if(ret) {
39                         Log_Error("Dispense failed after deducting cost (%s dispensing %s - %ic)",
40                                 username, Item->Name, Item->Price);
41                         Transfer( GetUserID(">sales"), User, Item->Price, "rollback" );
42                         free( username );
43                         return -1;      // 1: Unkown Error again
44                 }
45         }
46         
47         // And log that it happened
48         Log_Info("Dispensed %s (%i:%i) for %s [cost %i, balance %i cents]",
49                 Item->Name, handler->Name, Item->ID,
50                 username, Item->Price, GetBalance(User)
51                 );
52         
53         free( username );
54         return 0;       // 0: EOK
55 }

UCC git Repository :: git.ucc.asn.au