servlib/bundling/Dictionary.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/bundling/Dictionary.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,106 @@
+/*
+ *    Copyright 2006 Intel Corporation
+ * 
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ * 
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifndef _DICTIONARY_H_
+#define _DICTIONARY_H_
+
+#include <oasys/serialize/SerializableVector.h>
+#include <servlib/naming/EndpointID.h>
+
+namespace dtn {
+
+/**
+ * Simple data structure to handle a dictionary data structure, as
+ * specified by the bundle protocol, i.e. a sequence of null
+ * terminated strings.
+ */
+class Dictionary : public oasys::SerializableObject {
+public:
+    Dictionary();
+    Dictionary(const oasys::Builder&);
+    virtual ~Dictionary();
+    virtual void serialize( oasys::SerializeAction *a );
+    
+    /// @{ Accessors
+    u_int32_t     length() const { return length_; }
+    const u_char* dict()   const { return dict_; }
+    void set_dict(const u_char* dict, u_int32_t length);
+    /// @}
+
+    /**
+     * Add the given string to the dictionary if it doesn't already
+     * exist.
+     */
+    void add_str(const std::string& str);
+
+    /**
+     * Add the scheme and ssp of the given endpoint id to the dictionary.
+     */
+    void add_eid(const EndpointID& eid)
+    {
+        add_str(eid.scheme_str());
+        add_str(eid.ssp());
+    }
+
+    /**
+     * Look up the given string in the dictionary, returning true and
+     * assigning the offset if found.
+     */
+    bool get_offset(const std::string& str, u_int32_t* offset);
+
+    bool get_offset(const std::string& str, u_int64_t* offset);
+
+    /**
+     * Look up the given eid in the dictionary, returning true and
+     * assigning the offsets if found.
+     */
+    bool get_offsets(const EndpointID& eid,
+                     u_int32_t* scheme_offset,
+                     u_int32_t* ssp_offset)
+    {
+        return (get_offset(eid.scheme_str(), scheme_offset) &&
+                get_offset(eid.ssp(), ssp_offset));
+    }
+
+    bool get_offsets(const EndpointID& eid,
+                     u_int64_t* scheme_offset,
+                     u_int64_t* ssp_offset)
+    {
+        return (get_offset(eid.scheme_str(), scheme_offset) &&
+                get_offset(eid.ssp(), ssp_offset));
+    }
+
+    /**
+     * Create an eid from the dictionary, given the offsets.
+     * Return true upon success.
+     */
+    bool extract_eid(EndpointID* eid,
+                     u_int32_t scheme_offset,
+                     u_int32_t ssp_offset);
+    
+    bool extract_eid(EndpointID* eid,
+                     u_int64_t scheme_offset,
+                     u_int64_t ssp_offset);
+    
+protected:
+    u_char*   dict_;		///< Dictionary buffer
+    u_int32_t dict_length_;	///< Length of the dictionary buffer
+    u_int32_t length_;		///< Length of the filled-in portion
+};
+
+} // namespace dtn
+
+#endif /* _DICTIONARY_H_ */