osaf/libs/core/common/saf_edu.c        |   33 +--------
 osaf/libs/core/include/ncsencdec_pub.h |    2 +
 osaf/libs/core/leap/hj_enc.c           |  100 ++++++++++++++++++++++++++++++--
 3 files changed, 100 insertions(+), 35 deletions(-)


Currently, ncs_edp_sanamet encodes a SaNameT by storing the length in 2 bytes,
followed by a fixed char array of length SA_MAX_NAME_LENGTH.

This patch adds long DN support by:

1) if length < SA_MAX_NAME_LENGTH, encode as present
2) if length >= SA_MAX_NAME_LENGTH, encode as a variable string like 
ncs_edp_string

diff --git a/osaf/libs/core/common/saf_edu.c b/osaf/libs/core/common/saf_edu.c
--- a/osaf/libs/core/common/saf_edu.c
+++ b/osaf/libs/core/common/saf_edu.c
@@ -57,36 +57,15 @@
 uint32_t ncs_edp_sanamet(EDU_HDL *hdl, EDU_TKN *edu_tkn,
                      NCSCONTEXT ptr, uint32_t *ptr_data_len, EDU_BUF_ENV 
*buf_env, EDP_OP_TYPE op, EDU_ERR *o_err)
 {
-       uint32_t rc = NCSCC_RC_SUCCESS;
-       SaNameT *struct_ptr = NULL, **d_ptr = NULL;
-
-       EDU_INST_SET saname_rules[] = {
-               {EDU_START, ncs_edp_sanamet, 0, 0, 0, sizeof(SaNameT), 0, NULL},
-               {EDU_EXEC, m_NCS_EDP_SAUINT16T, 0, 0, 0,
-                (long)&((SaNameT *)0)->length, 0, NULL},
-               {EDU_EXEC, ncs_edp_uns8, EDQ_ARRAY, 0, 0,
-                (long)&((SaNameT *)0)->value, SA_MAX_NAME_LENGTH, NULL},
-               {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
-       };
-
        if (op == EDP_OP_TYPE_ENC) {
-               struct_ptr = (SaNameT *)ptr;
+               const SaNameT *name = ptr;
+               osaf_encode_sanamet(buf_env->info.uba, name);
        } else if (op == EDP_OP_TYPE_DEC) {
-               d_ptr = (SaNameT **)ptr;
-               if (*d_ptr == NULL) {
-                       *d_ptr = m_MMGR_ALLOC_EDP_SANAMET;
-                       if (*d_ptr == NULL) {
-                               *o_err = EDU_ERR_MEM_FAIL;
-                               return NCSCC_RC_FAILURE;
-                       }
-               }
-               memset(*d_ptr, '\0', sizeof(SaNameT));
-               struct_ptr = *d_ptr;
-       } else {
-               struct_ptr = ptr;
+               SaNameT *name = *(SaNameT**)ptr;
+               osaf_decode_sanamet(buf_env->info.uba, name);
        }
-       rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, saname_rules, struct_ptr, 
ptr_data_len, buf_env, op, o_err);
-       return rc;
+       
+       return NCSCC_RC_SUCCESS;
 }
 
 /*****************************************************************************
diff --git a/osaf/libs/core/include/ncsencdec_pub.h 
b/osaf/libs/core/include/ncsencdec_pub.h
--- a/osaf/libs/core/include/ncsencdec_pub.h
+++ b/osaf/libs/core/include/ncsencdec_pub.h
@@ -153,6 +153,8 @@ void osaf_encode_uint64(NCS_UBAID *ub, u
 void osaf_decode_uint64(NCS_UBAID *ub, uint64_t *to);
 void osaf_encode_sanamet(NCS_UBAID *ub, const SaNameT *name);
 void osaf_decode_sanamet(NCS_UBAID *ub, SaNameT *name);
+void osaf_encode_sanamet_o2(NCS_UBAID *ub, SaConstStringT name);
+void osaf_encode_saconststring(NCS_UBAID *ub, SaConstStringT str);
 void osaf_encode_satimet(NCS_UBAID *ub, SaTimeT time);
 void osaf_decode_satimet(NCS_UBAID *ub, SaTimeT *time);
 void osaf_encode_bool(NCS_UBAID *ub, bool value);
diff --git a/osaf/libs/core/leap/hj_enc.c b/osaf/libs/core/leap/hj_enc.c
--- a/osaf/libs/core/leap/hj_enc.c
+++ b/osaf/libs/core/leap/hj_enc.c
@@ -42,6 +42,9 @@
 
 *******************************************************************************
 */
+#ifndef SA_EXTENDED_NAME_SOURCE
+#define SA_EXTENDED_NAME_SOURCE
+#endif
 
 #include <ncsgl_defs.h>
 #include "ncs_osprm.h"
@@ -49,6 +52,7 @@
 #include "ncssysf_def.h"
 #include "ncssysf_mem.h"
 #include "ncs_svd.h"
+#include "osaf_extended_name.h"
 
 /** A NULL os implies "count" number of zeros...
  **/
@@ -374,18 +378,49 @@ void osaf_decode_uint64(NCS_UBAID *ub, u
 
 void osaf_encode_sanamet(NCS_UBAID *ub, const SaNameT *name)
 {
-       int i;
-       osaf_encode_uint16(ub, name->length);
-       for (i = 0; i < SA_MAX_NAME_LENGTH; i++)
-               osaf_encode_uint8(ub, name->value[i]);
+       TRACE_ENTER();
+
+       SaConstStringT str = osaf_extended_name_borrow(name);
+       TRACE("str %s (%zu)", str, osaf_extended_name_length(name));
+       osaf_encode_sanamet_o2(ub, str);
+
+       TRACE_LEAVE();
 }
 
 void osaf_decode_sanamet(NCS_UBAID *ub, SaNameT *name)
 {
-       int i;
-       osaf_decode_uint16(ub, &name->length);
-       for (i = 0; i < SA_MAX_NAME_LENGTH; i++)
-               osaf_decode_uint8(ub, &name->value[i]);
+       TRACE_ENTER();
+
+       SaStringT str;
+       uint16_t len;
+
+       // get the length of the SaNameT
+       osaf_decode_uint16(ub, &len);
+       osafassert(len < 65535);
+       
+       if (len < SA_MAX_UNEXTENDED_NAME_LENGTH) {
+               // string is encoded as a fixed 256 char array
+               str = (SaStringT)malloc(SA_MAX_UNEXTENDED_NAME_LENGTH * 
sizeof(char));
+               osafassert(str != NULL);
+
+               uint8_t *p8 = decode_flatten_space(ub, (uint8_t*)str, 
SA_MAX_UNEXTENDED_NAME_LENGTH);
+               memcpy(str, p8, SA_MAX_UNEXTENDED_NAME_LENGTH * sizeof(char));
+               ncs_dec_skip_space(ub, SA_MAX_UNEXTENDED_NAME_LENGTH);  
+       } else {
+               str = (SaStringT)malloc((len + 1) * sizeof(char));
+               osafassert(str != NULL);
+
+               uint8_t *p8 = decode_flatten_space(ub, (uint8_t*)str, len);
+               memcpy(str, p8, len * sizeof(char));
+               ncs_dec_skip_space(ub, len);
+
+               str[len] = '\0';
+       }
+       TRACE("str: %s (%u)", str, len);
+       osaf_extended_name_alloc(str, name);
+       free(str);
+
+       TRACE_LEAVE();
 }
 
 void osaf_encode_saclmnodeaddresst(NCS_UBAID *ub, const SaClmNodeAddressT 
*addr)
@@ -408,6 +443,55 @@ void osaf_decode_saclmnodeaddresst(NCS_U
        }
 }
 
+void osaf_encode_sanamet_o2(NCS_UBAID *ub, SaConstStringT name)
+{
+       TRACE_ENTER();
+
+       int i;
+       const size_t len = strlen(name);
+
+       if (len < SA_MAX_UNEXTENDED_NAME_LENGTH) {
+               // encode a fixed 256 char string, to ensure
+               // we are backwards compatible
+               osaf_encode_uint16(ub, len);
+
+               for (i = 0; i < len; i++) {
+                       osaf_encode_uint8(ub, name[i]);
+               }
+
+               // need to encode SA_MAX_UNEXTENDED_NAME_LENGTH characters to 
remain
+               // compatible with legacy osaf_decode_sanamet() [without long 
DN support]
+               for (i = len; i < SA_MAX_UNEXTENDED_NAME_LENGTH; i++) {
+                       osaf_encode_uint8(ub, 0);
+               }
+       } else {
+               // encode as a variable string
+               osaf_encode_saconststring(ub, name);
+       }
+
+       TRACE_LEAVE();
+}
+
+void osaf_encode_saconststring(NCS_UBAID *ub, SaConstStringT str)
+{
+       size_t len = strlen(str);
+
+       TRACE_ENTER2("%s (%zu)", str, len);
+       
+       // len is encoded in 16 bits, max length is 2^16
+       // this is done to remain compatible with ncs_edp_string
+       osafassert(len < 65535);
+       osaf_encode_uint16(ub, len);
+
+       // encode 'str'
+       uint8_t *p8 = encode_reserve_space(ub, len);
+       osafassert(p8);
+       memcpy(p8, str, len * sizeof(char));
+       ncs_enc_claim_space(ub, len);
+       
+       TRACE_LEAVE();
+}
+
 void osaf_encode_satimet(NCS_UBAID *ub, SaTimeT time)
 {
        osaf_encode_uint64(ub, time);

------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to