]> rtime.felk.cvut.cz Git - frescor/frsh-forb.git/blob - resources/item/frs_item.c
Fixed uninitialized variable warnings
[frescor/frsh-forb.git] / resources / item / frs_item.c
1 #include <item.h>
2 #include <ul_log.h>
3 #include <frs_generic.h>
4 #include <stdio.h>
5 #include <frsh_distributed.h>
6
7 UL_LOG_CUST(ulogd_frs_item);
8 ul_log_domain_t ulogd_frs_item = {UL_LOGL_MSG, "frs_item"};
9
10 struct item {
11         fres_item_scheduler scheduler;
12 };
13
14 static int create_vres(fres_vres_t *vres, void *priv)
15 {
16         struct item *item = priv;
17         fres_block_item_nodes *nodes;
18         CORBA_Environment env;
19         int ret;
20         
21         nodes = fres_contract_get_block(vres->new, FRES_BLOCK_ITEM_NODES);
22         if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
23         
24         ret = fres_item_scheduler_add_nodes(item->scheduler, nodes->mask, &env);
25         if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
26         if (ret) return ret;
27         return 0;
28 }
29
30 static int cancel_vres(fres_vres_t *vres, void *priv)
31 {
32         struct item *item = priv;
33         fres_block_item_nodes *nodes;
34         CORBA_Environment env;
35         int ret;
36         
37         nodes = fres_contract_get_block(vres->allocated, FRES_BLOCK_ITEM_NODES);
38         if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
39         
40         ret = fres_item_scheduler_del_nodes(item->scheduler, nodes->mask, &env);
41         if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
42         if (ret) return ret;
43         return 0;
44 }
45
46 static int change_vres(fres_vres_t *vres, void *priv)
47 {
48         return FRSH_ERR_NOT_IMPLEMENTED;
49 }
50
51
52
53 static struct item item;
54
55 static struct fres_scheduler item_scheduler = {
56         .res_type = FRSH_RT_NETWORK,
57         .res_id = FRSH_NETPF_ITEM,
58         /* Here we are using the "simple interface" */
59         .create_vres = create_vres,
60         .cancel_vres = cancel_vres,
61         .change_vres = change_vres,
62         .priv = &item
63 };
64
65 int frs_item_init(forb_orb orb, fres_contract_broker fcb, forb_executor_t *executor)
66 {
67         fres_block_register_item();
68         
69         item.scheduler = forb_resolve_reference(orb, "item_scheduler");
70         if (!item.scheduler) {
71                 ul_logerr("forb_resolve_reference(item_scheduler) failed\n");
72                 return errno;
73         }
74         return frs_register(orb, fcb, executor, &item_scheduler);
75 }
76
77 /** 
78  * Receives data from sensor network.
79  * 
80  * @param[in] vres
81  * 
82  * @param[out] data Where to store pointer to the array with received
83  * data. The programmer should free the returned array via
84  * forb_free(), when the data are not needed anymore.
85  * 
86  * @return Number of elements returned in @a data array, -1 on error.
87  */
88 int frs_item_receive(frsh_vres_id_t vres, unsigned *data[])
89 {
90         fres_item_data_seq *seq;
91         fres_block_item_nodes *nodes;
92         int ret;
93         CORBA_Environment env;
94         
95         nodes = fres_contract_get_block(vres->allocated, FRES_BLOCK_ITEM_NODES);
96         if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
97         
98         fres_item_scheduler_get_data(item.scheduler, nodes->mask, &seq, &env);
99         CORBA_sequence_set_release(seq, CORBA_FALSE);
100         ret = seq->_length;
101         *data = seq->_buffer;
102         forb_free(seq);
103         return ret;
104 }