0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #include <string.h>
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 #include <memory.h>
0038 #include <errno.h>
0039 #include <dirent.h>
0040 #include <limits.h>
0041
0042 #include <ndrstandard.h>
0043 #include <ubfview.h>
0044 #include <ndebug.h>
0045
0046 #include <userlog.h>
0047 #include <view_cmn.h>
0048 #include <ferror.h>
0049 #include <ubfutil.h>
0050
0051 #include "Exfields.h"
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 expublic int ndrx_Bvftos_int(UBFH *p_ub, ndrx_typedview_t *v, char *cstruct)
0068 {
0069 int ret = EXSUCCEED;
0070 int occ;
0071 int dim_size;
0072 char *fld_offs;
0073 BFLDLEN len;
0074 short *C_count;
0075 short C_count_stor;
0076 unsigned short *L_length;
0077 unsigned short L_length_stor;
0078 long l;
0079 ndrx_typedview_field_t *f;
0080
0081 UBF_LOG(log_info, "Into %s", __func__);
0082
0083
0084 DL_FOREACH(v->fields, f)
0085 {
0086 if (f->flags & NDRX_VIEW_FLAG_1WAYMAP_UBF2C_S)
0087 {
0088 dim_size = f->fldsize/f->count;
0089
0090 if (f->flags & NDRX_VIEW_FLAG_ELEMCNT_IND_C)
0091 {
0092 C_count = (short *)(cstruct+f->count_fld_offset);
0093 }
0094 else
0095 {
0096 C_count = &C_count_stor;
0097 }
0098
0099 *C_count = 0;
0100 for (occ=0; occ<f->count; occ++)
0101 {
0102 fld_offs = cstruct+f->offset+occ*dim_size;
0103
0104 if (f->flags & NDRX_VIEW_FLAG_LEN_INDICATOR_L)
0105 {
0106 L_length = (unsigned short *)(cstruct+f->length_fld_offset+
0107 occ*sizeof(unsigned short));
0108 }
0109 else
0110 {
0111 L_length = &L_length_stor;
0112 }
0113
0114 *L_length = 0;
0115 len = dim_size;
0116
0117 if (
0118 (
0119 BFLD_INT==f->typecode_full &&
0120 EXSUCCEED!=CBget(p_ub, f->ubfid, occ, (char *)&l, 0L, BFLD_LONG)
0121 )
0122 ||
0123
0124 (
0125 BFLD_INT!=f->typecode_full &&
0126 EXSUCCEED!=CBget(p_ub, f->ubfid, occ, fld_offs, &len, f->typecode_full)
0127 )
0128 )
0129 {
0130 UBF_LOG(log_info, "Failed to get %d field: %s",
0131 f->ubfid, Bstrerror(Berror));
0132
0133 if (BNOTPRES!=Berror)
0134 {
0135 UBF_LOG(log_error, "Error getting field: %s",
0136 Bstrerror(Berror));
0137
0138 EXFAIL_OUT(ret);
0139
0140 }
0141 else
0142 {
0143
0144 ndrx_Bunset_error();
0145
0146
0147 if (EXSUCCEED!=ndrx_Bvselinit_int(v, f, occ, cstruct))
0148 {
0149 ndrx_Bset_error_fmt(BBADVIEW, "Failed to set NULL to %s.%s",
0150 v->vname, f->cname);
0151 EXFAIL_OUT(ret);
0152 }
0153
0154 }
0155 }
0156 else
0157 {
0158 if (BFLD_INT==f->typecode_full)
0159 {
0160 int *vi = (int *)fld_offs;
0161 *vi = (int)l;
0162 }
0163
0164 *C_count = (*C_count) + 1;
0165
0166 if (BFLD_STRING==f->typecode_full ||
0167 BFLD_CARRAY==f->typecode_full)
0168 {
0169 *L_length = (unsigned short)len;
0170 }
0171 else
0172 {
0173
0174 *L_length = 0;
0175 }
0176 }
0177 }
0178 }
0179 else
0180 {
0181 UBF_LOG(log_debug, "Defaulting to NULL %s.%s",
0182 v->vname, f->cname);
0183 if (EXSUCCEED!=ndrx_Bvselinit_int(v, f, EXFAIL, cstruct))
0184 {
0185 ndrx_Bset_error_fmt(BBADVIEW, "Failed to set NULL to %s.%s",
0186 v->vname, f->cname);
0187 EXFAIL_OUT(ret);
0188 }
0189 }
0190 }
0191
0192 out:
0193 return ret;
0194 }
0195
0196
0197
0198
0199
0200
0201
0202
0203 expublic int ndrx_Bvftos(UBFH *p_ub, char *cstruct, char *view)
0204 {
0205 int ret = EXSUCCEED;
0206 ndrx_typedview_t *v = NULL;
0207
0208
0209 if (NULL==(v = ndrx_view_get_view(view)))
0210 {
0211 ndrx_Bset_error_fmt(BBADVIEW, "View [%s] not found!", view);
0212 EXFAIL_OUT(ret);
0213 }
0214
0215 if (EXSUCCEED!=ndrx_Bvftos_int(p_ub, v, cstruct))
0216 {
0217 UBF_LOG(log_error, "ndrx_Bvftos_int failed");
0218 EXFAIL_OUT(ret);
0219 }
0220
0221 out:
0222 return ret;
0223 }
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233 expublic int ndrx_Bvstof_int(UBFH *p_ub, ndrx_typedview_t *v, char *cstruct, int mode)
0234 {
0235 int ret=EXSUCCEED;
0236 ndrx_typedview_field_t *f;
0237 UBFH *temp_ub = NULL;
0238 long bsize = v->ssize*3+1024;
0239 short *C_count;
0240 short C_count_stor;
0241 char *fld_offs;
0242 unsigned short *L_length;
0243 unsigned short L_length_stor;
0244
0245 int dim_size;
0246
0247 int *int_fix_ptr;
0248 long int_fix_l;
0249 int occ;
0250 BFLDLEN len;
0251
0252 temp_ub = (UBFH *)NDRX_MALLOC(bsize);
0253
0254 if (NULL==temp_ub)
0255 {
0256 int err = errno;
0257 UBF_LOG(log_error, "Failed to allocate %ld bytes in temporary UBF buffer: %s",
0258 bsize, strerror(errno));
0259 ndrx_Bset_error_fmt(BMALLOC, "Failed to allocate %ld bytes in temporary UBF buffer: %s",
0260 bsize, strerror(errno));
0261 EXFAIL_OUT(ret);
0262 }
0263
0264 if (EXSUCCEED!=Binit(temp_ub, bsize))
0265 {
0266 UBF_LOG(log_error, "Failed to init UBF buffer: %s", Bstrerror(Berror));
0267 EXFAIL_OUT(ret);
0268 }
0269
0270
0271
0272
0273
0274 DL_FOREACH(v->fields, f)
0275 {
0276 dim_size = f->fldsize/f->count;
0277
0278 if (f->flags & NDRX_VIEW_FLAG_1WAYMAP_C2UBF_F)
0279 {
0280 UBF_LOG(log_debug, "Processing field: [%s] ubf [%s]",
0281 f->cname, f->fbname);
0282
0283
0284 if (f->flags & NDRX_VIEW_FLAG_ELEMCNT_IND_C)
0285 {
0286 C_count = (short *)(cstruct+f->count_fld_offset);
0287
0288 UBF_LOG(log_dump, "%s.C_%s=%hd",
0289 v->vname, f->cname, *C_count);
0290 }
0291 else
0292 {
0293 C_count_stor=f->count;
0294 C_count = &C_count_stor;
0295 }
0296
0297 if (*C_count > f->count)
0298 {
0299 UBF_LOG(log_error, "Invalid count for field %s.%s in "
0300 "view %hd, specified: %hd", v->vname, f->cname,
0301 f->count, *C_count);
0302 ndrx_Bset_error_fmt(BEINVAL, "Invalid count for field %s.%s in "
0303 "view %hd, specified: %hd", v->vname, f->cname,
0304 f->count, *C_count);
0305 EXFAIL_OUT(ret);
0306 }
0307
0308 for (occ=0; occ<*C_count; occ++)
0309 {
0310
0311 fld_offs = cstruct+f->offset+occ*dim_size;
0312
0313 if (f->flags & NDRX_VIEW_FLAG_LEN_INDICATOR_L)
0314 {
0315 L_length = (unsigned short *)(cstruct+f->length_fld_offset+
0316 occ*sizeof(unsigned short));
0317 }
0318 else
0319 {
0320 L_length_stor = dim_size;
0321 L_length = &L_length_stor;
0322 }
0323
0324 if (BFLD_CARRAY==f->typecode_full && *L_length > dim_size)
0325 {
0326 UBF_LOG(log_error, "Invalid length for field %s.%s in "
0327 "view dim size %d, occ %d specified: %hu", v->vname,
0328 f->cname, dim_size, occ, *L_length);
0329 ndrx_Bset_error_fmt(BEINVAL, "Invalid length for field %s.%s in "
0330 "view dim size %d, occ %d specified: %hu", v->vname,
0331 f->cname, dim_size, occ, *L_length);
0332 EXFAIL_OUT(ret);
0333 }
0334
0335 len = *L_length;
0336
0337
0338
0339
0340 if (BUPDATE != mode || !ndrx_Bvnull_int(v, f, occ, cstruct))
0341 {
0342 if (BFLD_INT==f->typecode_full)
0343 {
0344 int_fix_ptr = (int *)fld_offs;
0345 int_fix_l = (long)*int_fix_ptr;
0346
0347 if (EXSUCCEED!=CBchg(temp_ub, f->ubfid, occ,
0348 (char *)&int_fix_l, 0L, BFLD_LONG))
0349 {
0350 UBF_LOG(log_error, "Failed to add field [%s]/%d as long!",
0351 f->fbname, f->ubfid);
0352
0353 EXFAIL_OUT(ret);
0354 }
0355 }
0356 else
0357 {
0358 if (EXSUCCEED!=CBchg(temp_ub, f->ubfid, occ,
0359 fld_offs, len, f->typecode_full))
0360 {
0361 UBF_LOG(log_error, "Failed to add field [%s]/%d as long!",
0362 f->fbname, f->ubfid);
0363
0364
0365 EXFAIL_OUT(ret);
0366 }
0367
0368 if (BFLD_STRING == f->typecode_full)
0369 {
0370
0371 *L_length = strlen(fld_offs)+1;
0372 }
0373 }
0374 }
0375 else
0376 {
0377
0378
0379
0380 break;
0381 }
0382 }
0383 }
0384 }
0385
0386
0387
0388 ndrx_debug_dump_UBF_ubflogger(log_info, "Temporary buffer built",
0389 temp_ub);
0390
0391 ndrx_debug_dump_UBF_ubflogger(log_info, "Output buffer before merge",
0392 p_ub);
0393
0394 switch (mode)
0395 {
0396 case BUPDATE:
0397 UBF_LOG(log_info, "About to run Bupdate");
0398 if (EXSUCCEED!=Bupdate(p_ub, temp_ub))
0399 {
0400 UBF_LOG(log_error, "Failed to Bupdate(): %s", Bstrerror(Berror));
0401 EXFAIL_OUT(ret);
0402 }
0403 break;
0404 case BJOIN:
0405 UBF_LOG(log_info, "About to run Bjoin");
0406 if (EXSUCCEED!=Bjoin(p_ub, temp_ub))
0407 {
0408 UBF_LOG(log_error, "Failed to Bjoin(): %s", Bstrerror(Berror));
0409 EXFAIL_OUT(ret);
0410 }
0411 break;
0412 case BOJOIN:
0413 UBF_LOG(log_info, "About to run Bojoin");
0414 if (EXSUCCEED!=Bojoin(p_ub, temp_ub))
0415 {
0416 UBF_LOG(log_error, "Failed to Bojoin(): %s", Bstrerror(Berror));
0417 EXFAIL_OUT(ret);
0418 }
0419 break;
0420 case BCONCAT:
0421 UBF_LOG(log_info, "About to run Bconcat");
0422 if (EXSUCCEED!=Bconcat(p_ub, temp_ub))
0423 {
0424 UBF_LOG(log_error, "Failed to Bconcat(): %s", Bstrerror(Berror));
0425 EXFAIL_OUT(ret);
0426 }
0427 break;
0428 default:
0429 ndrx_Bset_error_fmt(BEINVAL, "Invalid %s option: %d", __func__, mode);
0430 EXFAIL_OUT(ret);
0431 break;
0432 }
0433
0434 ndrx_debug_dump_UBF_ubflogger(log_info, "Output buffer after merge",
0435 p_ub);
0436
0437 out:
0438 if (NULL!=temp_ub)
0439 {
0440 NDRX_FREE(temp_ub);
0441 }
0442
0443 return ret;
0444 }
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454 expublic int ndrx_Bvstof(UBFH *p_ub, char *cstruct, int mode, char *view)
0455 {
0456 int ret = EXSUCCEED;
0457 ndrx_typedview_t *v = NULL;
0458
0459
0460
0461 if (NULL==(v = ndrx_view_get_view(view)))
0462 {
0463 ndrx_Bset_error_fmt(BBADVIEW, "View [%s] not found!", view);
0464 EXFAIL_OUT(ret);
0465 }
0466
0467 if (EXSUCCEED!=ndrx_Bvstof_int(p_ub, v, cstruct, mode))
0468 {
0469 UBF_LOG(log_error, "ndrx_Bvstof_int failed");
0470 EXFAIL_OUT(ret);
0471 }
0472
0473 out:
0474 return ret;
0475 }
0476
0477