summaryrefslogtreecommitdiff
path: root/TAO/tao/Object_KeyC.cpp
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-09-01 05:06:42 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-09-01 05:06:42 +0000
commit2d3b3960491716876f75470fd65caa5e10ef3d0e (patch)
treecc9c7723971543db846eaa8ee006f362f02274d4 /TAO/tao/Object_KeyC.cpp
parent66c0612e5cbaaade9db3d1663e3beae93df209dc (diff)
downloadATCD-2d3b3960491716876f75470fd65caa5e10ef3d0e.tar.gz
ChangeLogTag:Thu Aug 31 16:31:04 2000 Carlos O'Ryan <coryan@uci.edu>
Diffstat (limited to 'TAO/tao/Object_KeyC.cpp')
-rw-r--r--TAO/tao/Object_KeyC.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/TAO/tao/Object_KeyC.cpp b/TAO/tao/Object_KeyC.cpp
index 7b6d0db4b97..22ec4287bc6 100644
--- a/TAO/tao/Object_KeyC.cpp
+++ b/TAO/tao/Object_KeyC.cpp
@@ -48,4 +48,83 @@ CORBA::TypeCode _tc_TAO_tc_TAO_ObjectKey (CORBA::tk_alias, sizeof
CORBA::TypeCode_ptr TAO_tc_ObjectKey = &_tc_TAO_tc_TAO_ObjectKey;
+void
+TAO_ObjectKey::encode_sequence_to_string (char * &str,
+ const TAO_Unbounded_Sequence<CORBA::Octet> &seq)
+{
+ // We must allocate a buffer which is (gag) 3 times the length
+ // of the sequence, which is the length required in the worst-case
+ // scenario of all non-printable characters.
+ //
+ // There are two strategies here...we could allocate all that space here,
+ // fill it up, then copy-allocate new space of just the right length.
+ // OR, we could just return this space. The classic time-space tradeoff,
+ // and for now we'll let time win out, which means that we only do the
+ // allocation once.
+ u_int len = 3 * seq.length (); /* space for zero termination not needed */;
+ str = CORBA::string_alloc (len);
+
+ char *cp = str;
+
+ for (u_int i = 0;
+ cp < (cp + len) && i < seq.length();
+ ++i)
+ {
+ u_char byte = seq[i];
+ if (isprint (byte) && byte != '\\')
+ {
+ *cp++ = (char) byte;
+ continue;
+ }
+
+ *cp++ = '\\';
+ *cp++ = ACE::nibble2hex ((byte >> 4) & 0x0f);
+ *cp++ = ACE::nibble2hex (byte & 0x0f);
+ }
+ // Zero terminate
+ *cp = '\0';
+}
+
+void
+TAO_ObjectKey::decode_string_to_sequence (TAO_Unbounded_Sequence<CORBA::Octet> &seq,
+ const char *str)
+{
+ if (str == 0)
+ {
+ seq.length (0);
+ return;
+ }
+
+ u_int length = ACE_OS::strlen (str);
+ const char *eos = str + length;
+ const char *cp = str;
+
+ // Set the length of the sequence to be as long as
+ // we'll possibly need...we'll reset it to the actual
+ // length later.
+ seq.length (length);
+
+ u_int i = 0;
+ for (;
+ cp < eos && i < seq.length ();
+ i++)
+ {
+ if (*cp == '\\')
+ {
+ // This is an escaped non-printable,
+ // so we decode the hex values into
+ // the sequence's octet
+ seq[i] = (u_char) (ACE::hex2byte (cp[1]) << 4);
+ seq[i] |= (u_char) ACE::hex2byte (cp[2]);
+ cp += 3;
+ }
+ else
+ // Copy it in
+ seq[i] = *cp++;
+ }
+
+ // Set the length appropriately
+ seq.length (i);
+}
+
// ****************************************************************