1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker *
5*abb65b4bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker *
8*abb65b4bSAndroid Build Coastguard Worker * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker *
11*abb65b4bSAndroid Build Coastguard Worker * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker *
15*abb65b4bSAndroid Build Coastguard Worker * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker * without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker *
19*abb65b4bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker */
31*abb65b4bSAndroid Build Coastguard Worker
32*abb65b4bSAndroid Build Coastguard Worker #include "oapv_def.h"
33*abb65b4bSAndroid Build Coastguard Worker #include "oapv_metadata.h"
34*abb65b4bSAndroid Build Coastguard Worker
meta_id_to_ctx(oapvm_t id)35*abb65b4bSAndroid Build Coastguard Worker static oapvm_ctx_t *meta_id_to_ctx(oapvm_t id)
36*abb65b4bSAndroid Build Coastguard Worker {
37*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *ctx;
38*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(id, NULL);
39*abb65b4bSAndroid Build Coastguard Worker ctx = (oapvm_ctx_t *)id;
40*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(ctx->magic == OAPVM_MAGIC_CODE, NULL);
41*abb65b4bSAndroid Build Coastguard Worker return ctx;
42*abb65b4bSAndroid Build Coastguard Worker }
43*abb65b4bSAndroid Build Coastguard Worker
meta_mdp_find_last_with_check(oapv_md_t * md,int type,unsigned char * uuid)44*abb65b4bSAndroid Build Coastguard Worker static oapv_mdp_t **meta_mdp_find_last_with_check(oapv_md_t *md, int type, unsigned char *uuid)
45*abb65b4bSAndroid Build Coastguard Worker {
46*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t **last_mdp = &md->md_payload;
47*abb65b4bSAndroid Build Coastguard Worker
48*abb65b4bSAndroid Build Coastguard Worker while((*last_mdp) != NULL) {
49*abb65b4bSAndroid Build Coastguard Worker if((*last_mdp) == NULL)
50*abb65b4bSAndroid Build Coastguard Worker break;
51*abb65b4bSAndroid Build Coastguard Worker if((*last_mdp)->pld_type == type) {
52*abb65b4bSAndroid Build Coastguard Worker if(type == OAPV_METADATA_USER_DEFINED) {
53*abb65b4bSAndroid Build Coastguard Worker if(oapv_mcmp(uuid, (*last_mdp)->pld_data, 16) == 0) {
54*abb65b4bSAndroid Build Coastguard Worker return NULL;
55*abb65b4bSAndroid Build Coastguard Worker }
56*abb65b4bSAndroid Build Coastguard Worker }
57*abb65b4bSAndroid Build Coastguard Worker else {
58*abb65b4bSAndroid Build Coastguard Worker return NULL;
59*abb65b4bSAndroid Build Coastguard Worker }
60*abb65b4bSAndroid Build Coastguard Worker }
61*abb65b4bSAndroid Build Coastguard Worker last_mdp = &((*last_mdp)->next);
62*abb65b4bSAndroid Build Coastguard Worker }
63*abb65b4bSAndroid Build Coastguard Worker return last_mdp;
64*abb65b4bSAndroid Build Coastguard Worker }
65*abb65b4bSAndroid Build Coastguard Worker
meta_md_find_mdp(oapv_md_t * md,int mdt)66*abb65b4bSAndroid Build Coastguard Worker static oapv_mdp_t *meta_md_find_mdp(oapv_md_t *md, int mdt)
67*abb65b4bSAndroid Build Coastguard Worker {
68*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = md->md_payload;
69*abb65b4bSAndroid Build Coastguard Worker
70*abb65b4bSAndroid Build Coastguard Worker while(mdp != NULL) {
71*abb65b4bSAndroid Build Coastguard Worker if(mdp->pld_type == mdt) {
72*abb65b4bSAndroid Build Coastguard Worker break;
73*abb65b4bSAndroid Build Coastguard Worker }
74*abb65b4bSAndroid Build Coastguard Worker mdp = mdp->next;
75*abb65b4bSAndroid Build Coastguard Worker }
76*abb65b4bSAndroid Build Coastguard Worker
77*abb65b4bSAndroid Build Coastguard Worker return mdp;
78*abb65b4bSAndroid Build Coastguard Worker }
79*abb65b4bSAndroid Build Coastguard Worker
meta_md_free_mdp(oapv_mdp_t * mdp)80*abb65b4bSAndroid Build Coastguard Worker static int meta_md_free_mdp(oapv_mdp_t *mdp)
81*abb65b4bSAndroid Build Coastguard Worker {
82*abb65b4bSAndroid Build Coastguard Worker oapv_mfree(mdp->pld_data);
83*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
84*abb65b4bSAndroid Build Coastguard Worker }
85*abb65b4bSAndroid Build Coastguard Worker
meta_md_rm_mdp(oapv_md_t * md,int mdt)86*abb65b4bSAndroid Build Coastguard Worker static int meta_md_rm_mdp(oapv_md_t *md, int mdt)
87*abb65b4bSAndroid Build Coastguard Worker {
88*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = md->md_payload;
89*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp_prev = NULL;
90*abb65b4bSAndroid Build Coastguard Worker
91*abb65b4bSAndroid Build Coastguard Worker while(mdp->pld_type != mdt && mdp->next != NULL) {
92*abb65b4bSAndroid Build Coastguard Worker mdp_prev = mdp;
93*abb65b4bSAndroid Build Coastguard Worker mdp = mdp->next;
94*abb65b4bSAndroid Build Coastguard Worker }
95*abb65b4bSAndroid Build Coastguard Worker
96*abb65b4bSAndroid Build Coastguard Worker if(mdp->pld_type == mdt) {
97*abb65b4bSAndroid Build Coastguard Worker if(mdp_prev == NULL) {
98*abb65b4bSAndroid Build Coastguard Worker md->md_payload = NULL;
99*abb65b4bSAndroid Build Coastguard Worker }
100*abb65b4bSAndroid Build Coastguard Worker else {
101*abb65b4bSAndroid Build Coastguard Worker mdp_prev->next = mdp->next;
102*abb65b4bSAndroid Build Coastguard Worker }
103*abb65b4bSAndroid Build Coastguard Worker meta_md_free_mdp(mdp);
104*abb65b4bSAndroid Build Coastguard Worker md->md_num--;
105*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
106*abb65b4bSAndroid Build Coastguard Worker }
107*abb65b4bSAndroid Build Coastguard Worker
108*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_NOT_FOUND;
109*abb65b4bSAndroid Build Coastguard Worker }
110*abb65b4bSAndroid Build Coastguard Worker
meta_md_rm_usd(oapv_md_t * md,unsigned char * uuid)111*abb65b4bSAndroid Build Coastguard Worker static int meta_md_rm_usd(oapv_md_t *md, unsigned char *uuid)
112*abb65b4bSAndroid Build Coastguard Worker {
113*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = md->md_payload;
114*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp_prev = NULL;
115*abb65b4bSAndroid Build Coastguard Worker while(mdp != NULL) {
116*abb65b4bSAndroid Build Coastguard Worker if(mdp->pld_type == OAPV_METADATA_USER_DEFINED) {
117*abb65b4bSAndroid Build Coastguard Worker if(oapv_mcmp(uuid, mdp->pld_data, 16) == 0) {
118*abb65b4bSAndroid Build Coastguard Worker if(mdp_prev == NULL) {
119*abb65b4bSAndroid Build Coastguard Worker md->md_payload = NULL;
120*abb65b4bSAndroid Build Coastguard Worker }
121*abb65b4bSAndroid Build Coastguard Worker else {
122*abb65b4bSAndroid Build Coastguard Worker mdp_prev->next = mdp->next;
123*abb65b4bSAndroid Build Coastguard Worker }
124*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(md->md_size >= mdp->pld_size, OAPV_ERR_UNEXPECTED);
125*abb65b4bSAndroid Build Coastguard Worker md->md_size -= mdp->pld_size;
126*abb65b4bSAndroid Build Coastguard Worker meta_md_free_mdp(mdp);
127*abb65b4bSAndroid Build Coastguard Worker md->md_num--;
128*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
129*abb65b4bSAndroid Build Coastguard Worker }
130*abb65b4bSAndroid Build Coastguard Worker }
131*abb65b4bSAndroid Build Coastguard Worker mdp_prev = mdp;
132*abb65b4bSAndroid Build Coastguard Worker mdp = mdp->next;
133*abb65b4bSAndroid Build Coastguard Worker }
134*abb65b4bSAndroid Build Coastguard Worker
135*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_NOT_FOUND;
136*abb65b4bSAndroid Build Coastguard Worker }
137*abb65b4bSAndroid Build Coastguard Worker
meta_md_find_usd(oapv_md_t * md,unsigned char * uuid)138*abb65b4bSAndroid Build Coastguard Worker static oapv_mdp_t *meta_md_find_usd(oapv_md_t *md, unsigned char *uuid)
139*abb65b4bSAndroid Build Coastguard Worker {
140*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = md->md_payload;
141*abb65b4bSAndroid Build Coastguard Worker while(mdp != NULL) {
142*abb65b4bSAndroid Build Coastguard Worker if(mdp->pld_type == OAPV_METADATA_USER_DEFINED) {
143*abb65b4bSAndroid Build Coastguard Worker oapv_md_usd_t *usd = (oapv_md_usd_t *)mdp->pld_data;
144*abb65b4bSAndroid Build Coastguard Worker if(oapv_mcmp(uuid, usd->uuid, 16) == 0) {
145*abb65b4bSAndroid Build Coastguard Worker return mdp;
146*abb65b4bSAndroid Build Coastguard Worker }
147*abb65b4bSAndroid Build Coastguard Worker }
148*abb65b4bSAndroid Build Coastguard Worker mdp = mdp->next;
149*abb65b4bSAndroid Build Coastguard Worker }
150*abb65b4bSAndroid Build Coastguard Worker
151*abb65b4bSAndroid Build Coastguard Worker return NULL;
152*abb65b4bSAndroid Build Coastguard Worker }
153*abb65b4bSAndroid Build Coastguard Worker
meta_verify_mdp_data(int type,int size,u8 * data)154*abb65b4bSAndroid Build Coastguard Worker static int meta_verify_mdp_data(int type, int size, u8 *data)
155*abb65b4bSAndroid Build Coastguard Worker {
156*abb65b4bSAndroid Build Coastguard Worker if(type == OAPV_METADATA_ITU_T_T35) {
157*abb65b4bSAndroid Build Coastguard Worker if(size == 0) {
158*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_INVALID_ARGUMENT;
159*abb65b4bSAndroid Build Coastguard Worker }
160*abb65b4bSAndroid Build Coastguard Worker if(*data == 0xFF) {
161*abb65b4bSAndroid Build Coastguard Worker if(size == 1) {
162*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_INVALID_ARGUMENT;
163*abb65b4bSAndroid Build Coastguard Worker }
164*abb65b4bSAndroid Build Coastguard Worker }
165*abb65b4bSAndroid Build Coastguard Worker }
166*abb65b4bSAndroid Build Coastguard Worker else if(type == OAPV_METADATA_MDCV) {
167*abb65b4bSAndroid Build Coastguard Worker if(size != 24) {
168*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_INVALID_ARGUMENT;
169*abb65b4bSAndroid Build Coastguard Worker }
170*abb65b4bSAndroid Build Coastguard Worker }
171*abb65b4bSAndroid Build Coastguard Worker else if(type == OAPV_METADATA_CLL) {
172*abb65b4bSAndroid Build Coastguard Worker if(size != 4) {
173*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_INVALID_ARGUMENT;
174*abb65b4bSAndroid Build Coastguard Worker }
175*abb65b4bSAndroid Build Coastguard Worker }
176*abb65b4bSAndroid Build Coastguard Worker else if(type == OAPV_METADATA_USER_DEFINED) {
177*abb65b4bSAndroid Build Coastguard Worker if(size < 16) {
178*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_INVALID_ARGUMENT;
179*abb65b4bSAndroid Build Coastguard Worker }
180*abb65b4bSAndroid Build Coastguard Worker }
181*abb65b4bSAndroid Build Coastguard Worker else {
182*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
183*abb65b4bSAndroid Build Coastguard Worker }
184*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
185*abb65b4bSAndroid Build Coastguard Worker }
186*abb65b4bSAndroid Build Coastguard Worker
meta_free_md(oapv_md_t * md)187*abb65b4bSAndroid Build Coastguard Worker static void meta_free_md(oapv_md_t *md)
188*abb65b4bSAndroid Build Coastguard Worker {
189*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = md->md_payload;
190*abb65b4bSAndroid Build Coastguard Worker while(mdp != NULL) {
191*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *tmp_mdp = mdp;
192*abb65b4bSAndroid Build Coastguard Worker mdp = mdp->next;
193*abb65b4bSAndroid Build Coastguard Worker if(tmp_mdp->pld_data != NULL) {
194*abb65b4bSAndroid Build Coastguard Worker oapv_mfree(tmp_mdp->pld_data);
195*abb65b4bSAndroid Build Coastguard Worker }
196*abb65b4bSAndroid Build Coastguard Worker oapv_mfree(tmp_mdp);
197*abb65b4bSAndroid Build Coastguard Worker }
198*abb65b4bSAndroid Build Coastguard Worker }
199*abb65b4bSAndroid Build Coastguard Worker
oapvm_set(oapvm_t mid,int group_id,int type,void * data,int size,unsigned char * uuid)200*abb65b4bSAndroid Build Coastguard Worker int oapvm_set(oapvm_t mid, int group_id, int type, void *data, int size, unsigned char *uuid)
201*abb65b4bSAndroid Build Coastguard Worker {
202*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
203*abb65b4bSAndroid Build Coastguard Worker
204*abb65b4bSAndroid Build Coastguard Worker int ret = meta_verify_mdp_data(type, size, (u8 *)data);
205*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(OAPV_SUCCEEDED(ret), ret);
206*abb65b4bSAndroid Build Coastguard Worker
207*abb65b4bSAndroid Build Coastguard Worker int md_list_idx = 0;
208*abb65b4bSAndroid Build Coastguard Worker while(md_list_idx < md_list->num) {
209*abb65b4bSAndroid Build Coastguard Worker if(md_list->group_ids[md_list_idx] == group_id) {
210*abb65b4bSAndroid Build Coastguard Worker break;
211*abb65b4bSAndroid Build Coastguard Worker }
212*abb65b4bSAndroid Build Coastguard Worker md_list_idx++;
213*abb65b4bSAndroid Build Coastguard Worker }
214*abb65b4bSAndroid Build Coastguard Worker if(md_list_idx == md_list->num) {
215*abb65b4bSAndroid Build Coastguard Worker md_list->num++;
216*abb65b4bSAndroid Build Coastguard Worker }
217*abb65b4bSAndroid Build Coastguard Worker md_list->group_ids[md_list_idx] = group_id;
218*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t **last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], type,
219*abb65b4bSAndroid Build Coastguard Worker (type == OAPV_METADATA_USER_DEFINED) ? uuid : NULL);
220*abb65b4bSAndroid Build Coastguard Worker while(last_ptr == NULL) {
221*abb65b4bSAndroid Build Coastguard Worker oapvm_rem(mid, group_id, type, uuid);
222*abb65b4bSAndroid Build Coastguard Worker last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], type,
223*abb65b4bSAndroid Build Coastguard Worker (type == OAPV_METADATA_USER_DEFINED) ? uuid : NULL);
224*abb65b4bSAndroid Build Coastguard Worker }
225*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *tmp_mdp = oapv_malloc(sizeof(oapv_mdp_t));
226*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(tmp_mdp != NULL, OAPV_ERR_OUT_OF_MEMORY);
227*abb65b4bSAndroid Build Coastguard Worker
228*abb65b4bSAndroid Build Coastguard Worker oapv_mset(tmp_mdp, 0, sizeof(oapv_mdp_t));
229*abb65b4bSAndroid Build Coastguard Worker tmp_mdp->pld_size = size;
230*abb65b4bSAndroid Build Coastguard Worker tmp_mdp->pld_type = type;
231*abb65b4bSAndroid Build Coastguard Worker tmp_mdp->pld_data = data;
232*abb65b4bSAndroid Build Coastguard Worker *last_ptr = tmp_mdp;
233*abb65b4bSAndroid Build Coastguard Worker
234*abb65b4bSAndroid Build Coastguard Worker /* calculate length of payload type */
235*abb65b4bSAndroid Build Coastguard Worker int tmp_mpt = type;
236*abb65b4bSAndroid Build Coastguard Worker while(tmp_mpt >= 255) {
237*abb65b4bSAndroid Build Coastguard Worker tmp_mpt -= 255;
238*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_size += 1;
239*abb65b4bSAndroid Build Coastguard Worker }
240*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_size += 1;
241*abb65b4bSAndroid Build Coastguard Worker
242*abb65b4bSAndroid Build Coastguard Worker /* calculate length of payload data size */
243*abb65b4bSAndroid Build Coastguard Worker int tmp_mps = size;
244*abb65b4bSAndroid Build Coastguard Worker while(tmp_mps >= 255) {
245*abb65b4bSAndroid Build Coastguard Worker tmp_mps -= 255;
246*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_size += 1;
247*abb65b4bSAndroid Build Coastguard Worker }
248*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_size += 1;
249*abb65b4bSAndroid Build Coastguard Worker
250*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_size += tmp_mdp->pld_size;
251*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_num++;
252*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
253*abb65b4bSAndroid Build Coastguard Worker }
254*abb65b4bSAndroid Build Coastguard Worker
oapvm_get(oapvm_t mid,int group_id,int type,void ** data,int * size,unsigned char * uuid)255*abb65b4bSAndroid Build Coastguard Worker int oapvm_get(oapvm_t mid, int group_id, int type, void **data, int *size, unsigned char *uuid)
256*abb65b4bSAndroid Build Coastguard Worker {
257*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
258*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < md_list->num; i++) {
259*abb65b4bSAndroid Build Coastguard Worker if(group_id != md_list->group_ids[i]) {
260*abb65b4bSAndroid Build Coastguard Worker continue;
261*abb65b4bSAndroid Build Coastguard Worker }
262*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = (type == OAPV_METADATA_USER_DEFINED) ? meta_md_find_usd(&md_list->md_arr[i], uuid) : meta_md_find_mdp(&md_list->md_arr[i], type);
263*abb65b4bSAndroid Build Coastguard Worker if(mdp != NULL) {
264*abb65b4bSAndroid Build Coastguard Worker *data = mdp->pld_data;
265*abb65b4bSAndroid Build Coastguard Worker *size = mdp->pld_size;
266*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
267*abb65b4bSAndroid Build Coastguard Worker }
268*abb65b4bSAndroid Build Coastguard Worker }
269*abb65b4bSAndroid Build Coastguard Worker
270*abb65b4bSAndroid Build Coastguard Worker return OAPV_ERR_NOT_FOUND;
271*abb65b4bSAndroid Build Coastguard Worker }
oapvm_rem(oapvm_t mid,int group_id,int type,unsigned char * uuid)272*abb65b4bSAndroid Build Coastguard Worker int oapvm_rem(oapvm_t mid, int group_id, int type, unsigned char *uuid)
273*abb65b4bSAndroid Build Coastguard Worker {
274*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
275*abb65b4bSAndroid Build Coastguard Worker int md_list_idx = 0;
276*abb65b4bSAndroid Build Coastguard Worker while(md_list_idx < md_list->num) {
277*abb65b4bSAndroid Build Coastguard Worker if(md_list->group_ids[md_list_idx] == group_id) {
278*abb65b4bSAndroid Build Coastguard Worker break;
279*abb65b4bSAndroid Build Coastguard Worker }
280*abb65b4bSAndroid Build Coastguard Worker md_list_idx++;
281*abb65b4bSAndroid Build Coastguard Worker }
282*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(md_list_idx < md_list->num, OAPV_ERR_NOT_FOUND);
283*abb65b4bSAndroid Build Coastguard Worker if(type == OAPV_METADATA_USER_DEFINED) {
284*abb65b4bSAndroid Build Coastguard Worker return meta_md_rm_usd(&md_list->md_arr[md_list_idx], uuid);
285*abb65b4bSAndroid Build Coastguard Worker }
286*abb65b4bSAndroid Build Coastguard Worker return meta_md_rm_mdp(&md_list->md_arr[md_list_idx], type);
287*abb65b4bSAndroid Build Coastguard Worker }
288*abb65b4bSAndroid Build Coastguard Worker
oapvm_set_all(oapvm_t mid,oapvm_payload_t * pld,int num_plds)289*abb65b4bSAndroid Build Coastguard Worker int oapvm_set_all(oapvm_t mid, oapvm_payload_t *pld, int num_plds)
290*abb65b4bSAndroid Build Coastguard Worker {
291*abb65b4bSAndroid Build Coastguard Worker int ret;
292*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
293*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < num_plds; i++) {
294*abb65b4bSAndroid Build Coastguard Worker ret = meta_verify_mdp_data(pld[i].type, pld[i].data_size, (u8 *)pld[i].data);
295*abb65b4bSAndroid Build Coastguard Worker oapv_assert_g(OAPV_SUCCEEDED(ret), ERR);
296*abb65b4bSAndroid Build Coastguard Worker
297*abb65b4bSAndroid Build Coastguard Worker int md_list_idx = 0;
298*abb65b4bSAndroid Build Coastguard Worker while(md_list_idx < md_list->num) {
299*abb65b4bSAndroid Build Coastguard Worker if(md_list->group_ids[md_list_idx] == pld[i].group_id) {
300*abb65b4bSAndroid Build Coastguard Worker break;
301*abb65b4bSAndroid Build Coastguard Worker }
302*abb65b4bSAndroid Build Coastguard Worker md_list_idx++;
303*abb65b4bSAndroid Build Coastguard Worker }
304*abb65b4bSAndroid Build Coastguard Worker if(md_list_idx == md_list->num) {
305*abb65b4bSAndroid Build Coastguard Worker md_list->num++;
306*abb65b4bSAndroid Build Coastguard Worker }
307*abb65b4bSAndroid Build Coastguard Worker
308*abb65b4bSAndroid Build Coastguard Worker md_list->group_ids[md_list_idx] = pld[i].group_id;
309*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_num++;
310*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t **last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], pld[i].type,
311*abb65b4bSAndroid Build Coastguard Worker (pld[i].type == OAPV_METADATA_USER_DEFINED) ? pld[i].uuid : NULL);
312*abb65b4bSAndroid Build Coastguard Worker while(last_ptr == NULL) {
313*abb65b4bSAndroid Build Coastguard Worker oapvm_rem(mid, pld[i].group_id, pld[i].type, pld[i].uuid);
314*abb65b4bSAndroid Build Coastguard Worker last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], pld[i].type,
315*abb65b4bSAndroid Build Coastguard Worker (pld[i].type == OAPV_METADATA_USER_DEFINED) ? pld[i].uuid : NULL);
316*abb65b4bSAndroid Build Coastguard Worker }
317*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *tmp_mdp = oapv_malloc(sizeof(oapv_mdp_t));
318*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(tmp_mdp != NULL, OAPV_ERR_OUT_OF_MEMORY);
319*abb65b4bSAndroid Build Coastguard Worker oapv_mset(tmp_mdp, 0, sizeof(oapv_mdp_t));
320*abb65b4bSAndroid Build Coastguard Worker tmp_mdp->pld_size = pld[i].data_size;
321*abb65b4bSAndroid Build Coastguard Worker tmp_mdp->pld_type = pld[i].type;
322*abb65b4bSAndroid Build Coastguard Worker tmp_mdp->pld_data = pld[i].data;
323*abb65b4bSAndroid Build Coastguard Worker md_list->md_arr[md_list_idx].md_size += tmp_mdp->pld_size;
324*abb65b4bSAndroid Build Coastguard Worker
325*abb65b4bSAndroid Build Coastguard Worker *last_ptr = tmp_mdp;
326*abb65b4bSAndroid Build Coastguard Worker }
327*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
328*abb65b4bSAndroid Build Coastguard Worker
329*abb65b4bSAndroid Build Coastguard Worker ERR:
330*abb65b4bSAndroid Build Coastguard Worker return ret;
331*abb65b4bSAndroid Build Coastguard Worker }
332*abb65b4bSAndroid Build Coastguard Worker
oapvm_get_all(oapvm_t mid,oapvm_payload_t * pld,int * num_plds)333*abb65b4bSAndroid Build Coastguard Worker int oapvm_get_all(oapvm_t mid, oapvm_payload_t *pld, int *num_plds)
334*abb65b4bSAndroid Build Coastguard Worker {
335*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
336*abb65b4bSAndroid Build Coastguard Worker if(pld == NULL) {
337*abb65b4bSAndroid Build Coastguard Worker int num_payload = 0;
338*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < md_list->num; i++) {
339*abb65b4bSAndroid Build Coastguard Worker num_payload += md_list->md_arr[i].md_num;
340*abb65b4bSAndroid Build Coastguard Worker }
341*abb65b4bSAndroid Build Coastguard Worker *num_plds = num_payload;
342*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
343*abb65b4bSAndroid Build Coastguard Worker }
344*abb65b4bSAndroid Build Coastguard Worker int p_cnt = 0;
345*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < md_list->num; i++) {
346*abb65b4bSAndroid Build Coastguard Worker int group_id = md_list->group_ids[i];
347*abb65b4bSAndroid Build Coastguard Worker oapv_mdp_t *mdp = md_list->md_arr[i].md_payload;
348*abb65b4bSAndroid Build Coastguard Worker while(mdp != NULL) {
349*abb65b4bSAndroid Build Coastguard Worker oapv_assert_rv(p_cnt < *num_plds, OAPV_ERR_REACHED_MAX);
350*abb65b4bSAndroid Build Coastguard Worker pld[p_cnt].group_id = group_id;
351*abb65b4bSAndroid Build Coastguard Worker pld[p_cnt].data_size = mdp->pld_size;
352*abb65b4bSAndroid Build Coastguard Worker pld[p_cnt].data = mdp->pld_data;
353*abb65b4bSAndroid Build Coastguard Worker pld[p_cnt].type = mdp->pld_type;
354*abb65b4bSAndroid Build Coastguard Worker if(pld[p_cnt].type == OAPV_METADATA_USER_DEFINED) {
355*abb65b4bSAndroid Build Coastguard Worker oapv_mcpy(pld[p_cnt].uuid, mdp->pld_data, 16);
356*abb65b4bSAndroid Build Coastguard Worker }
357*abb65b4bSAndroid Build Coastguard Worker else {
358*abb65b4bSAndroid Build Coastguard Worker oapv_mset(pld[p_cnt].uuid, 0, 16);
359*abb65b4bSAndroid Build Coastguard Worker }
360*abb65b4bSAndroid Build Coastguard Worker p_cnt++;
361*abb65b4bSAndroid Build Coastguard Worker mdp = mdp->next;
362*abb65b4bSAndroid Build Coastguard Worker }
363*abb65b4bSAndroid Build Coastguard Worker }
364*abb65b4bSAndroid Build Coastguard Worker *num_plds = p_cnt;
365*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
366*abb65b4bSAndroid Build Coastguard Worker }
367*abb65b4bSAndroid Build Coastguard Worker
oapvm_rem_all(oapvm_t mid)368*abb65b4bSAndroid Build Coastguard Worker void oapvm_rem_all(oapvm_t mid)
369*abb65b4bSAndroid Build Coastguard Worker {
370*abb65b4bSAndroid Build Coastguard Worker
371*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
372*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < md_list->num; i++) {
373*abb65b4bSAndroid Build Coastguard Worker meta_free_md(&md_list->md_arr[i]);
374*abb65b4bSAndroid Build Coastguard Worker oapv_mset(&md_list->md_arr[i], 0, sizeof(oapv_md_t));
375*abb65b4bSAndroid Build Coastguard Worker }
376*abb65b4bSAndroid Build Coastguard Worker md_list->num = 0;
377*abb65b4bSAndroid Build Coastguard Worker }
378*abb65b4bSAndroid Build Coastguard Worker
oapvm_create(int * err)379*abb65b4bSAndroid Build Coastguard Worker oapvm_t oapvm_create(int *err)
380*abb65b4bSAndroid Build Coastguard Worker {
381*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list;
382*abb65b4bSAndroid Build Coastguard Worker md_list = oapv_malloc(sizeof(oapvm_ctx_t));
383*abb65b4bSAndroid Build Coastguard Worker if(md_list == NULL) {
384*abb65b4bSAndroid Build Coastguard Worker *err = OAPV_ERR_OUT_OF_MEMORY;
385*abb65b4bSAndroid Build Coastguard Worker return NULL;
386*abb65b4bSAndroid Build Coastguard Worker }
387*abb65b4bSAndroid Build Coastguard Worker oapv_mset(md_list, 0, sizeof(oapvm_ctx_t));
388*abb65b4bSAndroid Build Coastguard Worker
389*abb65b4bSAndroid Build Coastguard Worker md_list->magic = OAPVM_MAGIC_CODE;
390*abb65b4bSAndroid Build Coastguard Worker return md_list;
391*abb65b4bSAndroid Build Coastguard Worker }
392*abb65b4bSAndroid Build Coastguard Worker
oapvm_delete(oapvm_t mid)393*abb65b4bSAndroid Build Coastguard Worker void oapvm_delete(oapvm_t mid)
394*abb65b4bSAndroid Build Coastguard Worker {
395*abb65b4bSAndroid Build Coastguard Worker oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
396*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < md_list->num; i++) {
397*abb65b4bSAndroid Build Coastguard Worker meta_free_md(&md_list->md_arr[i]);
398*abb65b4bSAndroid Build Coastguard Worker }
399*abb65b4bSAndroid Build Coastguard Worker oapv_mfree(md_list);
400*abb65b4bSAndroid Build Coastguard Worker }
401