}
/*
- With testing on Windows 2000 it looks like the notify format
- has nothing to do with this message. It ALWAYS seems to be
- in ansi format.
-
+ Send notification. depends on dispinfoW having same
+ structure as dispinfoA.
infoPtr : listview struct
notificationCode : *Unicode* notification code
pdi : dispinfo structure (can be unicode or ansi)
static BOOL notify_dispinfoT(LISTVIEW_INFO *infoPtr, INT notificationCode, LPNMLVDISPINFOW pdi, BOOL isW)
{
BOOL bResult = FALSE;
- BOOL convertToAnsi = FALSE;
- INT cchTempBufMax = 0, savCchTextMax = 0;
+ BOOL convertToAnsi = FALSE, convertToUnicode = FALSE;
+ INT cchTempBufMax = 0, savCchTextMax = 0, realNotifCode;
LPWSTR pszTempBuf = NULL, savPszText = NULL;
if ((pdi->item.mask & LVIF_TEXT) && is_textT(pdi->item.pszText, isW))
- convertToAnsi = isW;
+ {
+ convertToAnsi = (isW && infoPtr->notifyFormat == NFR_ANSI);
+ convertToUnicode = (!isW && infoPtr->notifyFormat == NFR_UNICODE);
+ }
- if (convertToAnsi)
+ if (convertToAnsi || convertToUnicode)
{
if (notificationCode != LVN_GETDISPINFOW)
- {
- cchTempBufMax = WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText,
- -1, NULL, 0, NULL, NULL);
- }
- else
- {
- cchTempBufMax = pdi->item.cchTextMax;
- *pdi->item.pszText = 0; /* make sure we don't process garbage */
+ {
+ cchTempBufMax = convertToUnicode ?
+ MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pdi->item.pszText, -1, NULL, 0):
+ WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, NULL, 0, NULL, NULL);
}
-
- pszTempBuf = HeapAlloc(GetProcessHeap(), 0, sizeof(CHAR) *
- cchTempBufMax);
+ else
+ {
+ cchTempBufMax = pdi->item.cchTextMax;
+ *pdi->item.pszText = 0; /* make sure we don't process garbage */
+ }
+
+ pszTempBuf = HeapAlloc(GetProcessHeap(), 0,
+ (convertToUnicode ? sizeof(WCHAR) : sizeof(CHAR)) * cchTempBufMax);
if (!pszTempBuf) return FALSE;
- WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR)
- pszTempBuf, cchTempBufMax, NULL, NULL);
+ if (convertToUnicode)
+ MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pdi->item.pszText, -1,
+ pszTempBuf, cchTempBufMax);
+ else
+ WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) pszTempBuf,
+ cchTempBufMax, NULL, NULL);
savCchTextMax = pdi->item.cchTextMax;
savPszText = pdi->item.pszText;
pdi->item.cchTextMax = cchTempBufMax;
}
- TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat !=
- NFR_ANSI));
-
- bResult = notify_hdr(infoPtr, get_ansi_notification(notificationCode),
- (LPNMHDR)pdi);
+ if (infoPtr->notifyFormat == NFR_ANSI)
+ realNotifCode = get_ansi_notification(notificationCode);
+ else
+ realNotifCode = notificationCode;
+ TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat != NFR_ANSI));
+ bResult = notify_hdr(infoPtr, realNotifCode, &pdi->hdr);
- if (convertToAnsi)
+ if (convertToUnicode || convertToAnsi)
{
- MultiByteToWideChar(CP_ACP, 0, (LPSTR) pdi->item.pszText, -1,
- savPszText, savCchTextMax);
+ if (convertToUnicode) /* note : pointer can be changed by app ! */
+ WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) savPszText,
+ savCchTextMax, NULL, NULL);
+ else
+ MultiByteToWideChar(CP_ACP, 0, (LPSTR) pdi->item.pszText, -1,
+ savPszText, savCchTextMax);
pdi->item.pszText = savPszText; /* restores our buffer */
pdi->item.cchTextMax = savCchTextMax;
HeapFree(GetProcessHeap(), 0, pszTempBuf);