/** * Internal function get the total length of primary block to write on the buffer * * @param bundle Bundle to generate * @param dict Dictionary to get the offsets of the endpoint eids * @param primary PrimaryBlock data strucre object * @return Total numbers of Bytes required to write primary block */ protected static int get_primary_len(final Bundle bundle, Dictionary dict, PrimaryBlock primary) { int primary_len = 0; int block_len = 0; primary.set_dictionary_length(0); primary.set_block_length(0); /* * We need to figure out the total length of the primary block, * except for the SDNVs used to encode flags and the length itself and * the one byte version field. * * First, we determine the size of the dictionary by first * figuring out all the unique strings, and in the process, * remembering their offsets and summing up their lengths * (including the null terminator for each). */ dict.get_offsets(bundle.dest(), primary.dest_scheme_offset(), primary.dest_ssp_offset()); block_len += SDNV.encoding_len(primary.dest_scheme_offset()); block_len += SDNV.encoding_len(primary.dest_ssp_offset()); dict.get_offsets(bundle.source(), primary.source_scheme_offset(), primary.source_ssp_offset()); block_len += SDNV.encoding_len(primary.source_scheme_offset()); block_len += SDNV.encoding_len(primary.source_ssp_offset()); dict.get_offsets( bundle.replyto(), primary.replyto_scheme_offset(), primary.replyto_ssp_offset()); block_len += SDNV.encoding_len(primary.replyto_scheme_offset()); block_len += SDNV.encoding_len(primary.replyto_ssp_offset()); dict.get_offsets( bundle.custodian(), primary.custodian_scheme_offset(), primary.custodian_ssp_offset()); block_len += SDNV.encoding_len(primary.custodian_scheme_offset()); block_len += SDNV.encoding_len(primary.custodian_ssp_offset()); primary.set_dictionary_length(dict.dict_length()); block_len += SDNV.encoding_len(bundle.creation_ts().seconds()); block_len += SDNV.encoding_len(bundle.creation_ts().seqno()); block_len += SDNV.encoding_len(bundle.expiration()); block_len += SDNV.encoding_len(primary.dictionary_length_value()); block_len += primary.dictionary_length_value(); /* * If the bundle is a fragment, we need to include space for the * fragment offset and the original payload length. * * Note: Any changes to this protocol must be reflected into the * FragmentManager since it depends on this length when * calculating fragment sizes. */ if (bundle.is_fragment()) { block_len += SDNV.encoding_len(bundle.frag_offset()); block_len += SDNV.encoding_len(bundle.orig_length()); } // Format the processing flags. primary.set_processing_flags(format_bundle_flags(bundle)); primary.set_processing_flags(format_bundle_flags(bundle)); primary.set_processing_flags(primary.processing_flags_value() | format_cos_flags(bundle)); primary.set_processing_flags(primary.processing_flags_value() | format_srr_flags(bundle)); /* * Finally, add up the initial preamble and the variable * length part. */ primary.set_block_length(block_len); primary_len = (int) (1 + SDNV.encoding_len(primary.processing_flags) + SDNV.encoding_len(primary.block_length()) + primary.block_length_value()); Log.d(TAG, "get_primary_len: for bundleid = " + bundle.bundleid() + ": " + primary_len); // Fill in the remaining values of 'primary' just for the sake of returning // a complete data structure. primary.set_version(BundleProtocol.CURRENT_VERSION); primary.set_creation_time(bundle.creation_ts().seconds()); primary.set_creation_sequence(bundle.creation_ts().seqno()); primary.set_lifetime(bundle.expiration()); return primary_len; }
/** * Return the length of SDNV encoding of the input DTNTime * * @param dt DTNTime object to get the length of SDNV encoding of the input DTNTime * @return Total length of SDVN encoding of DTNTime */ public static int SDNV_encoding_len(DTNTime dt) { return SDNV.encoding_len(dt.seconds_) + SDNV.encoding_len(dt.nanoseconds_); }