Как мне прочитать данные из элемента TYPE_MIME_PART? - PullRequest
0 голосов
/ 02 октября 2018

Это вроде работает, но проблема в том, что кажется, что структура MIME_PART не инициализирована?все его свойства имеют одинаковые значения, даже если я пытаюсь открыть другой элемент MIME.

MIME_PART *pMime;
DHANDLE hPart; 
char *pText;
WORD textLen;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
 goto exit;
}

pMime = OSLock(MIME_PART, hPart);
textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;
pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;
char *itemText = (char *)malloc(textLen);       
memcpy(itemText, pText, textLen); 
itemText[textLen] = '\0';
OSUnlock(hPart);

Строка itemText содержит большую часть содержимого, но поскольку структура MIME_PART установлена ​​неправильно, указатель натекст выключен ...

Так как мне правильно установить MIME_PART?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Ваш код должен сделать что-то вроде этого:

DHANDLE hPart; 
char *pchPart;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
  goto exit;
}

pchPart = OSLock(char, hPart);

Другими словами, заблокируйте дескриптор как тип char вместо типа MIME_PART.На этом этапе pchPart указывает на начало необработанных данных детали - начиная с границы (если имеется) и заголовков.Вы можете использовать NSFMimePartGetInfoByBLOCKID, чтобы получить длину границы и заголовков.

Я понимаю, что это противоречит документации , но я подтвердил эксперту в предметной области: документация неверна.

0 голосов
/ 03 октября 2018

Неправильный ответ, но комментарии могут быть полезны.Мой другой ответ более правильный.

Этот вопрос можно улучшить.Например, вы можете показать некоторые примеры данных и описать результаты, когда попытаетесь прочитать эти данные с помощью своего кода.

Но я постараюсь ответить на основе имеющейся у меня информации.Вы вычислили длину текста следующим образом:

textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;

Мне это кажется правильным, но затем вы делаете это:

pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;

wHeadersLen гарантированно равно pMime->wHeadersLen?Кроме того, вы не учли длину границы.Разве вы не должны вместо этого вычислять адрес?

pText = (char *)pMime + sizeof(MIME_PART) + pMime->wHeadersLen + pMime->wBoundaryLen;
...