/** \details Calculate the size of a TypedString structure \param typedstring TypedString structure \return Size of typedstring structure */ _PUBLIC_ uint16_t libmapiserver_TypedString_size(struct TypedString typedstring) { uint16_t size = 0; size += sizeof (uint8_t); switch (typedstring.StringType) { case StringType_NONE: case StringType_EMPTY: break; case StringType_STRING8: if (typedstring.String.lpszA) { size += strlen(typedstring.String.lpszA) + 1; } break; case StringType_UNICODE_REDUCED: if (typedstring.String.lpszW_reduced) { size += strlen(typedstring.String.lpszW_reduced) + 1; } break; case StringType_UNICODE: if (typedstring.String.lpszW) { size += strlen_m_ext(typedstring.String.lpszW, CH_UTF8, CH_UTF16LE) * 2 + 2; } break; } return size; }
_PUBLIC_ size_t strlen_m_ext_term(const char *s, const charset_t src_charset, const charset_t dst_charset) { if (!s) { return 0; } return strlen_m_ext(s, src_charset, dst_charset) + 1; }
_PUBLIC_ size_t strlen_m_ext_term_null(const char *s, const charset_t src_charset, const charset_t dst_charset) { size_t len; if (!s) { return 0; } len = strlen_m_ext(s, src_charset, dst_charset); if (len == 0) { return 0; } return len+1; }
/** * Calculate the number of 16-bit units that would be needed to convert * the input string which is expected to be in CH_UNIX encoding to UTF16. * * This will be the same as the number of bytes in a string for single * byte strings, but will be different for multibyte. */ _PUBLIC_ size_t strlen_m(const char *s) { return strlen_m_ext(s, CH_UNIX, CH_UTF16LE); }
/** \details Calculate the size of a RecipientRow structure \param recipientrow RecipientRow structure \return Size of RecipientRow structure */ _PUBLIC_ uint16_t libmapiserver_RecipientRow_size(struct RecipientRow recipientrow) { uint16_t size = 0; /* RecipientFlags */ size += sizeof (uint16_t); /* recipient_type */ if ((recipientrow.RecipientFlags & 0x7) == 0x1) { size += sizeof (uint8_t) * 2; /* AddressPrefixUsed + DisplayType */ size += strlen(recipientrow.X500DN.recipient_x500name) + 1; } /* recipient_EmailAddress */ switch (recipientrow.RecipientFlags & 0x208) { case 0x8: size += strlen(recipientrow.EmailAddress.lpszA); break; case 0x208: size += strlen(recipientrow.EmailAddress.lpszW) * 2 + 2; break; default: break; } /* recipient_DisplayName */ switch (recipientrow.RecipientFlags & 0x210) { case 0x10: size += strlen(recipientrow.DisplayName.lpszA); break; case 0x210: size += strlen_m_ext(recipientrow.DisplayName.lpszW, CH_UTF8, CH_UTF16LE) * 2 + 2; break; default: break; } /* recipient_SimpleDisplayName */ switch (recipientrow.RecipientFlags & 0x600) { case 0x400: size += strlen(recipientrow.SimpleDisplayName.lpszA); break; case 0x600: size += strlen_m_ext(recipientrow.SimpleDisplayName.lpszW, CH_UTF8, CH_UTF16LE) * 2 + 2; break; default: break; } /* recipient_TransmittableDisplayName */ switch (recipientrow.RecipientFlags & 0x260) { case 0x20: size += strlen(recipientrow.TransmittableDisplayName.lpszA); break; case 0x220: size += strlen_m_ext(recipientrow.TransmittableDisplayName.lpszW, CH_UTF8, CH_UTF16LE) * 2 + 2; break; default: break; } /* prop_count */ size += sizeof (uint16_t); /* layout */ size += sizeof (uint8_t); /* prop_values */ size += sizeof (uint16_t); size += recipientrow.prop_values.length; return size; }