Skip to content

Commit

Permalink
libmapi: Improve unicode support
Browse files Browse the repository at this point in the history
Patch from Milan Crha

Resolves bug openchange#269.
  • Loading branch information
Brad Hards committed Jun 19, 2011
1 parent 9e93774 commit 1945f81
Show file tree
Hide file tree
Showing 23 changed files with 168 additions and 139 deletions.
2 changes: 1 addition & 1 deletion doc/examples/fetchappointment.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ int main(int argc, char *argv[])
mapi_object_init(&obj_message);
retval = OpenMessage(&obj_store, *fid, *mid, &obj_message, 0x0);
if (retval != MAPI_E_NOT_FOUND) {
retval = GetPropsAll(&obj_message, &props_all);
retval = GetPropsAll(&obj_message, MAPI_UNICODE, &props_all);
mapidump_appointment(&props_all, NULL);
mapi_object_release(&obj_message);
}
Expand Down
2 changes: 1 addition & 1 deletion doc/examples/fetchmail.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ int main(int argc, char *argv[])
mapi_object_init(&obj_message);
retval = OpenMessage(&obj_store, *fid, *mid, &obj_message, 0x0);
if (retval != MAPI_E_NOT_FOUND) {
retval = GetPropsAll(&obj_message, &props_all);
retval = GetPropsAll(&obj_message, MAPI_UNICODE, &props_all);
mapidump_message(&props_all, NULL, &obj_message);
mapi_object_release(&obj_message);
}
Expand Down
10 changes: 5 additions & 5 deletions libexchange2ical/exchange2ical.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ static uint8_t exchange2ical_exception_from_EmbeddedObj(struct exchange2ical *ex
);

lpProps = talloc_zero(exchange2ical->mem_ctx, struct SPropValue);
retval = GetProps(&obj_attach, SPropTagArray, &lpProps, &count);
retval = GetProps(&obj_attach, 0, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
if (retval != MAPI_E_SUCCESS) {
return 1;
Expand Down Expand Up @@ -506,7 +506,7 @@ static uint8_t exchange2ical_exception_from_EmbeddedObj(struct exchange2ical *ex



retval = GetProps(&exception.obj_message, SPropTagArray, &lpProps, &count);
retval = GetProps(&exception.obj_message, MAPI_UNICODE, SPropTagArray, &lpProps, &count);

if (retval == MAPI_E_SUCCESS) {
aRow2.ulAdrEntryPad = 0;
Expand Down Expand Up @@ -559,7 +559,7 @@ static uint8_t exchange2ical_exception_from_EmbeddedObj(struct exchange2ical *ex
/*has a modified summary*/
if(dBody && *dBody){
SPropTagArray = set_SPropTagArray(exchange2ical->mem_ctx, 0x1, PR_BODY_HTML_UNICODE);
retval = GetProps(&exception.obj_message, SPropTagArray, &lpProps, &count);
retval = GetProps(&exception.obj_message, MAPI_UNICODE, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
if (retval == MAPI_E_SUCCESS) {
aRowT.ulAdrEntryPad = 0;
Expand Down Expand Up @@ -696,7 +696,7 @@ icalcomponent * _Exchange2Ical(mapi_object_t *obj_folder, struct exchange2ical_c
);


retval = GetProps(&exchange2ical.obj_message, SPropTagArray, &lpProps, &count);
retval = GetProps(&exchange2ical.obj_message, MAPI_UNICODE, SPropTagArray, &lpProps, &count);

MAPIFreeBuffer(SPropTagArray);

Expand Down Expand Up @@ -728,7 +728,7 @@ icalcomponent * _Exchange2Ical(mapi_object_t *obj_folder, struct exchange2ical_c

/*Set PR_BODY_HTML for x_alt_desc property*/
SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_BODY_HTML_UNICODE);
retval = GetProps(&exchange2ical.obj_message, SPropTagArray, &lpProps, &count);
retval = GetProps(&exchange2ical.obj_message, MAPI_UNICODE, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
if (retval == MAPI_E_SUCCESS) {
aRowT.ulAdrEntryPad = 0;
Expand Down
2 changes: 1 addition & 1 deletion libexchange2ical/exchange2ical_property.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ void ical_property_ATTACH(struct exchange2ical *exchange2ical)
);

lpProps = talloc_zero(exchange2ical->mem_ctx, struct SPropValue);
retval = GetProps(&obj_attach, SPropTagArray, &lpProps, &count);
retval = GetProps(&obj_attach, MAPI_UNICODE, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
if (retval == MAPI_E_SUCCESS) {

Expand Down
2 changes: 1 addition & 1 deletion libexchange2ical/ical2exchange.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ void _IcalEvent2Exchange(mapi_object_t *obj_folder, icalcomponent *vevent)
if (retval != MAPI_E_SUCCESS){
mapi_errstr("CreateMessage", GetLastError());
} else {
retval = SetProps(&obj_message, ical2exchange.lpProps, ical2exchange.cValues);
retval = SetProps(&obj_message, 0, ical2exchange.lpProps, ical2exchange.cValues);
if (retval != MAPI_E_SUCCESS){
mapi_errstr("SetProps", GetLastError());
} else {
Expand Down
4 changes: 2 additions & 2 deletions libmapi++/property_container.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ class property_container {
*/
uint32_t fetch()
{
if (GetProps(&m_mapi_object, m_property_tag_array, &m_property_values, &m_cn_vals) != MAPI_E_SUCCESS)
if (GetProps(&m_mapi_object, MAPI_UNICODE, m_property_tag_array, &m_property_values, &m_cn_vals) != MAPI_E_SUCCESS)
throw mapi_exception(GetLastError(), "property_container::fetch : GetProps");

MAPIFreeBuffer(m_property_tag_array);
Expand All @@ -190,7 +190,7 @@ class property_container {
/// \brief Fetches \b ALL properties of the object associated with this container.
void fetch_all()
{
if (GetPropsAll(&m_mapi_object, &m_property_value_array) != MAPI_E_SUCCESS)
if (GetPropsAll(&m_mapi_object, MAPI_UNICODE, &m_property_value_array) != MAPI_E_SUCCESS)
throw mapi_exception(GetLastError(), "property_container::fetch_all : GetPropsAll");

// Free property_tag_array in case user used operator<< by mistake.
Expand Down
72 changes: 43 additions & 29 deletions libmapi/IMAPIProp.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
named properties.
\param obj the object to get properties on
\param flags Flags for behaviour; can be bit-OR of MAPI_UNICODE and
MAPI_PROPS_SKIP_NAMEDID_CHECK constants
\param SPropTagArray an array of MAPI property tags
\param lpProps the result of the query
\param PropCount the count of property tags
Expand All @@ -56,7 +58,8 @@
\sa SetProps, GetPropList, GetPropsAll, DeleteProps, GetLastError
*/
_PUBLIC_ enum MAPISTATUS GetProps(mapi_object_t *obj,
_PUBLIC_ enum MAPISTATUS GetProps(mapi_object_t *obj,
uint32_t flags,
struct SPropTagArray *SPropTagArray,
struct SPropValue **lpProps,
uint32_t *PropCount)
Expand Down Expand Up @@ -94,15 +97,16 @@ _PUBLIC_ enum MAPISTATUS GetProps(mapi_object_t *obj,

/* Named property mapping */
nameid = mapi_nameid_new(mem_ctx);
retval = mapi_nameid_lookup_SPropTagArray(nameid, SPropTagArray);
if (retval == MAPI_E_SUCCESS) {
named = true;
SPropTagArray2 = talloc_zero(mem_ctx, struct SPropTagArray);
retval = GetIDsFromNames(obj, nameid->count, nameid->nameid, 0, &SPropTagArray2);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);
mapi_nameid_map_SPropTagArray(nameid, SPropTagArray, SPropTagArray2);
MAPIFreeBuffer(SPropTagArray2);

if (!(flags & MAPI_PROPS_SKIP_NAMEDID_CHECK)) {
retval = mapi_nameid_lookup_SPropTagArray(nameid, SPropTagArray);
if (retval == MAPI_E_SUCCESS) {
named = true;
SPropTagArray2 = talloc_zero(mem_ctx, struct SPropTagArray);
retval = GetIDsFromNames(obj, nameid->count, nameid->nameid, 0, &SPropTagArray2);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);
mapi_nameid_map_SPropTagArray(nameid, SPropTagArray, SPropTagArray2);
MAPIFreeBuffer(SPropTagArray2);
}
}
errno = 0;

Expand All @@ -114,7 +118,7 @@ _PUBLIC_ enum MAPISTATUS GetProps(mapi_object_t *obj,
/* Fill the GetProps operation */
request.PropertySizeLimit = 0x0;
size += sizeof (uint16_t);
request.WantUnicode = 0x0;
request.WantUnicode = (flags & MAPI_UNICODE) != 0 ? true : 0x0;
size += sizeof (uint16_t);
request.prop_count = (uint16_t) SPropTagArray->cValues;
size += sizeof (uint16_t);
Expand Down Expand Up @@ -173,6 +177,7 @@ _PUBLIC_ enum MAPISTATUS GetProps(mapi_object_t *obj,
This function sets one or more properties on a specified object.
\param obj the object to set properties on
\param flags Flags for behaviour; can be MAPI_PROPS_SKIP_NAMEDID_CHECK
\param lpProps the list of properties to set
\param PropCount the number of properties
Expand All @@ -186,7 +191,8 @@ _PUBLIC_ enum MAPISTATUS GetProps(mapi_object_t *obj,
\sa GetProps, GetPropList, GetPropsAll, DeleteProps, GetLastError
*/
_PUBLIC_ enum MAPISTATUS SetProps(mapi_object_t *obj,
_PUBLIC_ enum MAPISTATUS SetProps(mapi_object_t *obj,
uint32_t flags,
struct SPropValue *lpProps,
unsigned long PropCount)
{
Expand Down Expand Up @@ -220,14 +226,16 @@ _PUBLIC_ enum MAPISTATUS SetProps(mapi_object_t *obj,

/* Named property mapping */
nameid = mapi_nameid_new(mem_ctx);
retval = mapi_nameid_lookup_SPropValue(nameid, lpProps, PropCount);
if (retval == MAPI_E_SUCCESS) {
named = true;
SPropTagArray = talloc_zero(mem_ctx, struct SPropTagArray);
retval = GetIDsFromNames(obj, nameid->count, nameid->nameid, 0, &SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);
mapi_nameid_map_SPropValue(nameid, lpProps, PropCount, SPropTagArray);
MAPIFreeBuffer(SPropTagArray);
if (!(flags & MAPI_PROPS_SKIP_NAMEDID_CHECK)) {
retval = mapi_nameid_lookup_SPropValue(nameid, lpProps, PropCount);
if (retval == MAPI_E_SUCCESS) {
named = true;
SPropTagArray = talloc_zero(mem_ctx, struct SPropTagArray);
retval = GetIDsFromNames(obj, nameid->count, nameid->nameid, 0, &SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);
mapi_nameid_map_SPropValue(nameid, lpProps, PropCount, SPropTagArray);
MAPIFreeBuffer(SPropTagArray);
}
}
errno = 0;

Expand Down Expand Up @@ -470,6 +478,7 @@ _PUBLIC_ enum MAPISTATUS GetPropList(mapi_object_t *obj,
for a given object.
\param obj the object to get the properties for
\param flags Flags for behaviour; can be a MAPI_UNICODE constant
\param properties the properties / values for the object
\return MAPI_E_SUCCESS on success, otherwise MAPI error.
Expand All @@ -483,6 +492,7 @@ _PUBLIC_ enum MAPISTATUS GetPropList(mapi_object_t *obj,
\sa GetProps, GetPropList, GetLastError
*/
_PUBLIC_ enum MAPISTATUS GetPropsAll(mapi_object_t *obj,
uint32_t flags,
struct mapi_SPropValue_array *properties)
{
TALLOC_CTX *mem_ctx;
Expand Down Expand Up @@ -512,7 +522,7 @@ _PUBLIC_ enum MAPISTATUS GetPropsAll(mapi_object_t *obj,
/* Fill the GetPropsAll operation */
request.PropertySizeLimit = 0;
size += sizeof (uint16_t);
request.WantUnicode = 0;
request.WantUnicode = (flags & MAPI_UNICODE) != 0 ? true : 0x0;
size += sizeof (uint16_t);

/* Fill the MAPI_REQ request */
Expand Down Expand Up @@ -637,6 +647,7 @@ _PUBLIC_ enum MAPISTATUS DeleteProps(mapi_object_t *obj,
this function does not result in folder properties being replicated.
\param obj the object to set properties on
\param flags Flags for behaviour; can be MAPI_PROPS_SKIP_NAMEDID_CHECK
\param lpProps the list of properties to set
\param PropCount the number of properties
Expand All @@ -652,6 +663,7 @@ _PUBLIC_ enum MAPISTATUS DeleteProps(mapi_object_t *obj,
\sa SetProps, DeletePropertiesNoReplicate
*/
_PUBLIC_ enum MAPISTATUS SetPropertiesNoReplicate(mapi_object_t *obj,
uint32_t flags,
struct SPropValue *lpProps,
unsigned long PropCount)
{
Expand Down Expand Up @@ -685,14 +697,16 @@ _PUBLIC_ enum MAPISTATUS SetPropertiesNoReplicate(mapi_object_t *obj,

/* Named property mapping */
nameid = mapi_nameid_new(mem_ctx);
retval = mapi_nameid_lookup_SPropValue(nameid, lpProps, PropCount);
if (retval == MAPI_E_SUCCESS) {
named = true;
SPropTagArray = talloc_zero(mem_ctx, struct SPropTagArray);
retval = GetIDsFromNames(obj, nameid->count, nameid->nameid, 0, &SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);
mapi_nameid_map_SPropValue(nameid, lpProps, PropCount, SPropTagArray);
MAPIFreeBuffer(SPropTagArray);
if (!(flags & MAPI_PROPS_SKIP_NAMEDID_CHECK)) {
retval = mapi_nameid_lookup_SPropValue(nameid, lpProps, PropCount);
if (retval == MAPI_E_SUCCESS) {
named = true;
SPropTagArray = talloc_zero(mem_ctx, struct SPropTagArray);
retval = GetIDsFromNames(obj, nameid->count, nameid->nameid, 0, &SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);
mapi_nameid_map_SPropValue(nameid, lpProps, PropCount, SPropTagArray);
MAPIFreeBuffer(SPropTagArray);
}
}
errno = 0;

Expand Down
2 changes: 1 addition & 1 deletion libmapi/IMessage.c
Original file line number Diff line number Diff line change
Expand Up @@ -1577,7 +1577,7 @@ _PUBLIC_ enum MAPISTATUS SetMessageReadFlag(mapi_object_t *obj_folder,
attach[0].value.l = ATTACH_EMBEDDED_MSG;
attach[1].ulPropTag = PR_RENDERING_POSITION;
attach[1].value.l = 0;
retval = SetProps(&obj_attach, attach, 2);
retval = SetProps(&obj_attach, 0, attach, 2);
... check the return value ...
// Initialise the embedded message object
Expand Down
2 changes: 1 addition & 1 deletion libmapi/freebusy.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ _PUBLIC_ enum MAPISTATUS GetUserFreeBusyData(mapi_object_t *obj_store,
PR_FREEBUSY_BUSY_EVENTS,
PR_FREEBUSY_OOF_MONTHS,
PR_FREEBUSY_OOF_EVENTS);
retval = GetProps(&obj_message, SPropTagArray, &lpProps, &count);
retval = GetProps(&obj_message, 0, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, NULL);

Expand Down
8 changes: 4 additions & 4 deletions libmapi/libmapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -324,13 +324,13 @@ enum MAPISTATUS SetReadFlags(mapi_object_t *, uint8_t, uint16_t, uint64_t *);
enum MAPISTATUS HardDeleteMessagesAndSubfolders(mapi_object_t *);

/* The following public definitions come from libmapi/IMAPIProp.c */
enum MAPISTATUS GetProps(mapi_object_t *, struct SPropTagArray *, struct SPropValue **, uint32_t *);
enum MAPISTATUS SetProps(mapi_object_t *, struct SPropValue *, unsigned long);
enum MAPISTATUS GetProps(mapi_object_t *, uint32_t, struct SPropTagArray *, struct SPropValue **, uint32_t *);
enum MAPISTATUS SetProps(mapi_object_t *, uint32_t, struct SPropValue *, unsigned long);
enum MAPISTATUS SaveChangesAttachment(mapi_object_t *, mapi_object_t *, enum SaveFlags);
enum MAPISTATUS GetPropList(mapi_object_t *, struct SPropTagArray *);
enum MAPISTATUS GetPropsAll(mapi_object_t *, struct mapi_SPropValue_array *);
enum MAPISTATUS GetPropsAll(mapi_object_t *, uint32_t, struct mapi_SPropValue_array *);
enum MAPISTATUS DeleteProps(mapi_object_t *, struct SPropTagArray *);
enum MAPISTATUS SetPropertiesNoReplicate(mapi_object_t *, struct SPropValue *, unsigned long);
enum MAPISTATUS SetPropertiesNoReplicate(mapi_object_t *, uint32_t, struct SPropValue *, unsigned long);
enum MAPISTATUS DeletePropertiesNoReplicate(mapi_object_t *, struct SPropTagArray *);
enum MAPISTATUS GetNamesFromIDs(mapi_object_t *, enum MAPITAGS, uint16_t *, struct MAPINAMEID **);
enum MAPISTATUS GetIDsFromNames(mapi_object_t *, uint16_t, struct MAPINAMEID *, uint32_t, struct SPropTagArray **);
Expand Down
3 changes: 3 additions & 0 deletions libmapi/mapidefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
/* UNICODE flags */
#define MAPI_UNICODE 0x80000000

/* Other GetProps/SetProps flags */
#define MAPI_PROPS_SKIP_NAMEDID_CHECK 0x00000001

/* Property types */
#define PT_UNSPECIFIED 0x0
#define PT_NULL 0x1
Expand Down
28 changes: 20 additions & 8 deletions libmapi/mapidump.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,19 +399,31 @@ _PUBLIC_ void mapidump_message(struct mapi_SPropValue_array *properties, const c
const uint32_t *cp;
ssize_t len;

msgid = (const char *)find_mapi_SPropValue_data(properties, PR_INTERNET_MESSAGE_ID);
subject = (const char *) find_mapi_SPropValue_data(properties, PR_CONVERSATION_TOPIC);
body = (const char *) find_mapi_SPropValue_data(properties, PR_BODY);
msgid = (const char *)find_mapi_SPropValue_data(properties, PR_INTERNET_MESSAGE_ID_UNICODE);
if (!msgid)
msgid = (const char *)find_mapi_SPropValue_data(properties, PR_INTERNET_MESSAGE_ID);
subject = (const char *) find_mapi_SPropValue_data(properties, PR_CONVERSATION_TOPIC_UNICODE);
if (!subject)
subject = (const char *) find_mapi_SPropValue_data(properties, PR_CONVERSATION_TOPIC);
body = (const char *) find_mapi_SPropValue_data(properties, PR_BODY_UNICODE);
if (!body) {
body = (const char *) find_mapi_SPropValue_data(properties, PR_BODY_UNICODE);
body = (const char *) find_mapi_SPropValue_data(properties, PR_BODY);
if (!body) {
html = (const struct SBinary_short *) find_mapi_SPropValue_data(properties, PR_HTML);
}
}
from = (const char *) find_mapi_SPropValue_data(properties, PR_SENT_REPRESENTING_NAME);
to = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_TO);
cc = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_CC);
bcc = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_BCC);
from = (const char *) find_mapi_SPropValue_data(properties, PR_SENT_REPRESENTING_NAME_UNICODE);
if (!from)
from = (const char *) find_mapi_SPropValue_data(properties, PR_SENT_REPRESENTING_NAME);
to = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_TO_UNICODE);
if (!to)
to = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_TO);
cc = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_CC_UNICODE);
if (!cc)
cc = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_CC);
bcc = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_BCC_UNICODE);
if (!bcc)
bcc = (const char *) find_mapi_SPropValue_data(properties, PR_DISPLAY_BCC);

has_attach = (const uint8_t *)find_mapi_SPropValue_data(properties, PR_HASATTACH);

Expand Down
2 changes: 1 addition & 1 deletion libmapi/nspi.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,7 +933,7 @@ _PUBLIC_ enum MAPISTATUS nspi_QueryColumns(struct nspi_context *nspi_ctx,

r.in.handle = &nspi_ctx->handle;
r.in.Reserved = 0x0;
r.in.dwFlags = (WantUnicode == true) ? NspiUnicodeProptypes : 0x0;
r.in.dwFlags = (WantUnicode != false) ? NspiUnicodeProptypes : 0x0;

r.out.ppColumns = ppColumns;

Expand Down
6 changes: 3 additions & 3 deletions libmapi/simple_mapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ static enum MAPISTATUS CacheDefaultFolders(mapi_object_t *obj_store)
PR_IPM_TASK_ENTRYID,
PR_IPM_DRAFTS_ENTRYID);

retval = GetProps(&obj_inbox, SPropTagArray, &lpProps, &count);
retval = GetProps(&obj_inbox, 0, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);

Expand Down Expand Up @@ -436,7 +436,7 @@ _PUBLIC_ enum MAPISTATUS GetFolderItemsCount(mapi_object_t *obj_folder,
PR_CONTENT_UNREAD,
PR_CONTENT_COUNT);

retval = GetProps(obj_folder, SPropTagArray, &lpProps, &count);
retval = GetProps(obj_folder, 0, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
OPENCHANGE_RETVAL_IF(retval, retval, mem_ctx);

Expand Down Expand Up @@ -812,7 +812,7 @@ _PUBLIC_ enum MAPISTATUS GetBestBody(mapi_object_t *obj_message,
PR_RTF_COMPRESSED,
PR_HTML,
PR_RTF_IN_SYNC);
retval = GetProps(obj_message, SPropTagArray, &lpProps, &count);
retval = GetProps(obj_message, 0, SPropTagArray, &lpProps, &count);
MAPIFreeBuffer(SPropTagArray);
if (retval != MAPI_E_SUCCESS) {
*format = 0;
Expand Down
Loading

0 comments on commit 1945f81

Please sign in to comment.