[W->A] Fix printdlg.c

Dimitrie O. Paun dpaun at rogers.com
Wed Sep 22 00:23:22 CDT 2004


Hmmm, there is one tricky transition that I have not
eliminated. It requires a unicode version of sscanf,
and the only one I know of is in msvcrt. Can we make use
of that one?

ChangeLog
    Avoid W->A transitions in printdlg.c


Index: dlls/commdlg/printdlg.c
===================================================================
RCS file: /var/cvs/wine/dlls/commdlg/printdlg.c,v
retrieving revision 1.79
diff -u -r1.79 printdlg.c
--- dlls/commdlg/printdlg.c	18 Aug 2004 21:00:05 -0000	1.79
+++ dlls/commdlg/printdlg.c	22 Sep 2004 05:20:34 -0000
@@ -156,17 +156,15 @@
     if(!name ||
        (i = SendDlgItemMessageW(hDlg, id, CB_FINDSTRINGEXACT, -1,
 				(LPARAM)name)) == CB_ERR) {
-
-	/* ansi is ok */
-        char buf[260];
-        DWORD dwBufLen = sizeof(buf);
-        FIXME("Can't find '%s' in printer list so trying to find default\n",
+        WCHAR buf[260];
+        DWORD dwBufLen = sizeof(buf)/sizeof(buf[0]);
+        TRACE("Can't find '%s' in printer list so trying to find default\n",
 	      debugstr_w(name));
-	if(!GetDefaultPrinterA(buf, &dwBufLen))
+	if(!GetDefaultPrinterW(buf, &dwBufLen))
 	    return num;
-	i = SendDlgItemMessageA(hDlg, id, CB_FINDSTRINGEXACT, -1, (LPARAM)buf);
+	i = SendDlgItemMessageW(hDlg, id, CB_FINDSTRINGEXACT, -1, (LPARAM)buf);
 	if(i == CB_ERR)
-	    FIXME("Can't find default printer in printer list\n");
+	    TRACE("Can't find default printer in printer list\n");
     }
     SendDlgItemMessageW(hDlg, id, CB_SETCURSEL, i, 0);
     return num;
@@ -378,14 +376,14 @@
 	    nToPage   = GetDlgItemInt(hDlg, edt2, NULL, FALSE);
 	    if (nFromPage < lppd->nMinPage || nFromPage > lppd->nMaxPage ||
 		nToPage < lppd->nMinPage || nToPage > lppd->nMaxPage) {
-	        char resourcestr[256];
-		char resultstr[256];
-		LoadStringA(COMDLG32_hInstance, PD32_INVALID_PAGE_RANGE,
+	        WCHAR resourcestr[256];
+		WCHAR resultstr[256];
+		LoadStringW(COMDLG32_hInstance, PD32_INVALID_PAGE_RANGE,
 			    resourcestr, 255);
-		sprintf(resultstr,resourcestr, lppd->nMinPage, lppd->nMaxPage);
-		LoadStringA(COMDLG32_hInstance, PD32_PRINT_TITLE,
+		wsprintfW(resultstr,resourcestr, lppd->nMinPage, lppd->nMaxPage);
+		LoadStringW(COMDLG32_hInstance, PD32_PRINT_TITLE,
 			    resourcestr, 255);
-		MessageBoxA(hDlg, resultstr, resourcestr,
+		MessageBoxW(hDlg, resultstr, resourcestr,
 			    MB_OK | MB_ICONWARNING);
 		return FALSE;
 	    }
@@ -681,13 +679,13 @@
     TRACE(" Printer: %s, Port: %s, ComboID: %d\n",debugstr_w(PrinterName),debugstr_w(PortName),nIDComboBox);
 
     /* query the dialog box for the current selected value */
-    Sel = SendDlgItemMessageA(hDlg, nIDComboBox, CB_GETCURSEL, 0, 0);
+    Sel = SendDlgItemMessageW(hDlg, nIDComboBox, CB_GETCURSEL, 0, 0);
     if(Sel != CB_ERR) {
         /* we enter here only if a different printer is selected after
          * the Print Setup dialog is opened. The current settings are
          * stored into the newly selected printer.
          */
-        oldWord = SendDlgItemMessageA(hDlg, nIDComboBox, CB_GETITEMDATA,
+        oldWord = SendDlgItemMessageW(hDlg, nIDComboBox, CB_GETITEMDATA,
                                       Sel, 0);
         if (dm) {
             if (nIDComboBox == cmb2)
@@ -745,7 +743,7 @@
 				      fwCapability_Words, (LPWSTR)Words, dm);
 
     /* reset any current content in the combobox */
-    SendDlgItemMessageA(hDlg, nIDComboBox, CB_RESETCONTENT, 0, 0);
+    SendDlgItemMessageW(hDlg, nIDComboBox, CB_RESETCONTENT, 0, 0);
 
     /* store new content */
     for (i = 0; i < NrOfEntries; i++) {
@@ -759,13 +757,13 @@
        item order will change as more items are added */
     Sel = 0;
     for (i = 0; i < NrOfEntries; i++) {
-        if(SendDlgItemMessageA(hDlg, nIDComboBox, CB_GETITEMDATA, i, 0) ==
+        if(SendDlgItemMessageW(hDlg, nIDComboBox, CB_GETITEMDATA, i, 0) ==
 	   oldWord) {
 	    Sel = i;
 	    break;
 	}
     }
-    SendDlgItemMessageA(hDlg, nIDComboBox, CB_SETCURSEL, Sel, 0);
+    SendDlgItemMessageW(hDlg, nIDComboBox, CB_SETCURSEL, Sel, 0);
 
     HeapFree(GetProcessHeap(),0,Words);
     HeapFree(GetProcessHeap(),0,Names);
@@ -1094,13 +1092,12 @@
 	}
 	/* "All xxx pages"... */
 	{
-	    /* ansi is ok */
-	    char        resourcestr[64];
-	    char        result[64];
-	    LoadStringA(COMDLG32_hInstance, PD32_PRINT_ALL_X_PAGES,
+	    WCHAR        resourcestr[64];
+	    WCHAR        result[64];
+	    LoadStringW(COMDLG32_hInstance, PD32_PRINT_ALL_X_PAGES,
 			resourcestr, 49);
-	    sprintf(result,resourcestr,lppd->nMaxPage - lppd->nMinPage + 1);
-	    SendDlgItemMessageA(hDlg, rad1, WM_SETTEXT, 0, (LPARAM) result);
+	    wsprintfW(result,resourcestr,lppd->nMaxPage - lppd->nMinPage + 1);
+	    SendDlgItemMessageW(hDlg, rad1, WM_SETTEXT, 0, (LPARAM) result);
 	}
 
 	/* Collate pages
@@ -1108,11 +1105,11 @@
 	 * FIXME: The ico3 is not displayed for some reason. I don't know why.
 	 */
 	if (lppd->Flags & PD_COLLATE) {
-	    SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+	    SendDlgItemMessageW(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
 				(LPARAM)PrintStructures->hCollateIcon);
 	    CheckDlgButton(hDlg, chx2, 1);
 	} else {
-	    SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+	    SendDlgItemMessageW(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
 				(LPARAM)PrintStructures->hNoCollateIcon);
 	    CheckDlgButton(hDlg, chx2, 0);
 	}
@@ -1164,7 +1161,7 @@
 				  PrintStructures->lpPrinterInfo->pPortName,
 				  lpdm);
       CheckRadioButton(hDlg, rad1, rad2, bPortrait ? rad1: rad2);
-      SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+      SendDlgItemMessageW(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
                           (LPARAM)(bPortrait ? PrintStructures->hPortraitIcon :
                                    PrintStructures->hLandscapeIcon));
 
@@ -1292,6 +1289,10 @@
 static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, WPARAM wParam,
 				     PRINT_PTRW* PrintStructures)
 {
+    const static WCHAR PD32_COLLATE[] = { 'P', 'D', '3', '2', '_', 'C', 'O', 'L', 'L', 'A', 'T', 'E', 0 };
+    const static WCHAR PD32_NOCOLLATE[] = { 'P', 'D', '3', '2', '_', 'N', 'O', 'C', 'O', 'L', 'L', 'A', 'T', 'E', 0 };
+    const static WCHAR PD32_PORTRAIT[] = { 'P', 'D', '3', '2', '_', 'P', 'O', 'R', 'T', 'R', 'A', 'I', 'T', 0 };
+    const static WCHAR PD32_LANDSCAPE[] = { 'P', 'D', '3', '2', '_', 'L', 'A', 'N', 'D', 'S', 'C', 'A', 'P', 'E', 0 };
     LPPRINTDLGW lppd = PrintStructures->lpPrintDlg;
     DEVNAMES *pdn;
     DEVMODEW *pdm;
@@ -1302,18 +1303,18 @@
     /* We load these with LoadImage because they are not a standard
        size and we don't want them rescaled */
     PrintStructures->hCollateIcon =
-      LoadImageA(COMDLG32_hInstance, "PD32_COLLATE", IMAGE_ICON, 0, 0, 0);
+      LoadImageW(COMDLG32_hInstance, PD32_COLLATE, IMAGE_ICON, 0, 0, 0);
     PrintStructures->hNoCollateIcon =
-      LoadImageA(COMDLG32_hInstance, "PD32_NOCOLLATE", IMAGE_ICON, 0, 0, 0);
+      LoadImageW(COMDLG32_hInstance, PD32_NOCOLLATE, IMAGE_ICON, 0, 0, 0);
 
     /* These can be done with LoadIcon */
     PrintStructures->hPortraitIcon =
-      LoadIconA(COMDLG32_hInstance, "PD32_PORTRAIT");
+      LoadIconW(COMDLG32_hInstance, PD32_PORTRAIT);
     PrintStructures->hLandscapeIcon =
-      LoadIconA(COMDLG32_hInstance, "PD32_LANDSCAPE");
+      LoadIconW(COMDLG32_hInstance, PD32_LANDSCAPE);
 
     /* display the collate/no_collate icon */
-    SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+    SendDlgItemMessageW(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
                         (LPARAM)PrintStructures->hNoCollateIcon);
 
     if(PrintStructures->hCollateIcon == 0 ||
@@ -1331,7 +1332,7 @@
      */
     if (lppd->Flags & PD_SHOWHELP) {
         if((PrintStructures->HelpMessageID =
-	    RegisterWindowMessageA(HELPMSGSTRINGA)) == 0) {
+	    RegisterWindowMessageW(HELPMSGSTRINGW)) == 0) {
 	    COMDLG32_SetCommDlgExtendedError(CDERR_REGISTERMSGFAIL);
 	    return FALSE;
 	}
@@ -1608,10 +1609,10 @@
 
      case chx2:                         /* collate pages checkbox */
         if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED)
-            SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+            SendDlgItemMessageW(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
                                     (LPARAM)PrintStructures->hCollateIcon);
         else
-            SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+            SendDlgItemMessageW(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
                                     (LPARAM)PrintStructures->hNoCollateIcon);
         break;
      case edt1:                         /* from page nr editbox */
@@ -1663,7 +1664,7 @@
         if (lppd->Flags & PD_PRINTSETUP)
         {
               lpdm->u1.s1.dmOrientation = DMORIENT_PORTRAIT;
-              SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+              SendDlgItemMessageW(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
                           (LPARAM)(PrintStructures->hPortraitIcon));
         }
         break;
@@ -1672,7 +1673,7 @@
         if (lppd->Flags & PD_PRINTSETUP)
         {
               lpdm->u1.s1.dmOrientation = DMORIENT_LANDSCAPE;
-              SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+              SendDlgItemMessageW(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
                           (LPARAM)(PrintStructures->hLandscapeIcon));
         }
         break;
@@ -1693,9 +1694,9 @@
 
     case cmb2: /* Papersize */
       {
-	  DWORD Sel = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0);
+	  DWORD Sel = SendDlgItemMessageW(hDlg, cmb2, CB_GETCURSEL, 0, 0);
 	  if(Sel != CB_ERR)
-	      lpdm->u1.s1.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2,
+	      lpdm->u1.s1.dmPaperSize = SendDlgItemMessageW(hDlg, cmb2,
 							    CB_GETITEMDATA,
 							    Sel, 0);
       }
@@ -1703,7 +1704,7 @@
 
     case cmb3: /* Bin */
       {
-	  DWORD Sel = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0);
+	  DWORD Sel = SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
 	  if(Sel != CB_ERR)
 	      lpdm->dmDefaultSource = SendDlgItemMessageW(hDlg, cmb3,
 							  CB_GETITEMDATA, Sel,
@@ -1718,20 +1719,20 @@
 	    if (IsDlgButtonChecked(hDlg, rad1) == BST_CHECKED) {
 	        if(lpdm->u1.s1.dmOrientation != DMORIENT_PORTRAIT) {
 		    lpdm->u1.s1.dmOrientation = DMORIENT_PORTRAIT;
-		    SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE,
+		    SendDlgItemMessageW(hDlg, stc10, STM_SETIMAGE,
 					(WPARAM)IMAGE_ICON,
 					(LPARAM)PrintStructures->hPortraitIcon);
-		    SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE,
+		    SendDlgItemMessageW(hDlg, ico1, STM_SETIMAGE,
 					(WPARAM)IMAGE_ICON,
 					(LPARAM)PrintStructures->hPortraitIcon);
 		}
 	    } else {
 	        if(lpdm->u1.s1.dmOrientation != DMORIENT_LANDSCAPE) {
 	            lpdm->u1.s1.dmOrientation = DMORIENT_LANDSCAPE;
-		    SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE,
+		    SendDlgItemMessageW(hDlg, stc10, STM_SETIMAGE,
 					(WPARAM)IMAGE_ICON,
 					(LPARAM)PrintStructures->hLandscapeIcon);
-		    SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE,
+		    SendDlgItemMessageW(hDlg, ico1, STM_SETIMAGE,
 					(WPARAM)IMAGE_ICON,
 					(LPARAM)PrintStructures->hLandscapeIcon);
 		}
@@ -2382,23 +2383,26 @@
     return;
 }
 static void
-_c_size2strW(PageSetupDataW *pda,DWORD size,LPSTR strout) {
-    strcpy(strout,"<undef>");
+_c_size2strW(PageSetupDataW *pda,DWORD size,LPWSTR strout) {
+    const static WCHAR UNDEF[] = { '<', 'u', 'n', 'd', 'e', 'f', 0 };
+    const static WCHAR mm_fmt[] = { '%', '.', '2', 'f', 'm', 'm', 0 };
+    const static WCHAR in_fmt[] = { '%', '.', '2', 'f', 'i', 'n', 0 };
+    lstrcpyW(strout, UNDEF);
     if (pda->dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS) {
-	sprintf(strout,"%.2fmm",(size*1.0)/100.0);
+	wsprintfW(strout,mm_fmt,(size*1.0)/100.0);
 	return;
     }
     if (pda->dlga->Flags & PSD_INTHOUSANDTHSOFINCHES) {
-	sprintf(strout,"%.2fin",(size*1.0)/1000.0);
+	wsprintfW(strout,in_fmt,(size*1.0)/1000.0);
 	return;
     }
     pda->dlga->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
-    sprintf(strout,"%.2fmm",(size*1.0)/100.0);
+    wsprintfW(strout,mm_fmt,(size*1.0)/100.0);
     return;
 }
 
 static DWORD
-_c_str2size(PAGESETUPDLGA *dlga,LPCSTR strin) {
+_c_str2sizeA(PAGESETUPDLGA *dlga,LPCSTR strin) {
     float	val;
     char	rest[200];
 
@@ -2437,6 +2441,17 @@
 }
 
 
+static DWORD
+_c_str2sizeW(PAGESETUPDLGW *dlga, LPCWSTR strin) {
+    char	buf[200];
+
+    /* this W -> A transition is OK */
+    /* we need a unicode version of sscanf to avoid it */
+    WideCharToMultiByte(CP_ACP, 0, strin, -1, buf, sizeof(buf), NULL, NULL);
+    return _c_str2sizeA((PAGESETUPDLGA *)dlga, buf);
+}
+
+
 /*
  * This is called on finish and will update the output fields of the
  * struct.
@@ -2462,7 +2477,7 @@
 	pda->dlga->ptPaperSize.y = _c_10mm2size(pda->dlga,pda->dlga->ptPaperSize.y);
     } else
 	FIXME("could not get dialog text for papersize cmbbox?\n");
-#define GETVAL(id,val) if (GetDlgItemTextA(hDlg,id,buf,sizeof(buf))>0) { val = _c_str2size(pda->dlga,buf); } else { FIXME("could not get dlgitemtexta for %x\n",id); }
+#define GETVAL(id,val) if (GetDlgItemTextA(hDlg,id,buf,sizeof(buf))>0) { val = _c_str2sizeA(pda->dlga,buf); } else { FIXME("could not get dlgitemtexta for %x\n",id); }
     GETVAL(edt4,pda->dlga->rtMargin.left);
     GETVAL(edt5,pda->dlga->rtMargin.top);
     GETVAL(edt6,pda->dlga->rtMargin.right);
@@ -2487,8 +2502,7 @@
     DEVMODEW	*dm;
     LPWSTR	devname,portname;
     WCHAR	papername[64];
-
-    char	buf[200];
+    WCHAR	buf[200];
 
     dn = GlobalLock(pda->pdlg.hDevNames);
     dm = GlobalLock(pda->pdlg.hDevMode);
@@ -2503,7 +2517,7 @@
 	pda->dlga->ptPaperSize.y = _c_10mm2size((LPPAGESETUPDLGA)pda->dlga,pda->dlga->ptPaperSize.y);
     } else
 	FIXME("could not get dialog text for papersize cmbbox?\n");
-#define GETVAL(id,val) if (GetDlgItemTextA(hDlg,id,buf,sizeof(buf))>0) { val = _c_str2size((LPPAGESETUPDLGA)pda->dlga,buf); } else { FIXME("could not get dlgitemtexta for %x\n",id); }
+#define GETVAL(id,val) if (GetDlgItemTextW(hDlg,id,buf,sizeof(buf)/sizeof(buf[0]))>0) { val = _c_str2sizeW(pda->dlga,buf); } else { FIXME("could not get dlgitemtextw for %x\n",id); }
     GETVAL(edt4,pda->dlga->rtMargin.left);
     GETVAL(edt5,pda->dlga->rtMargin.top);
     GETVAL(edt6,pda->dlga->rtMargin.right);
@@ -2703,13 +2717,16 @@
 static INT_PTR CALLBACK
 PageDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
+    const static WCHAR __WINE_PAGESETUPDLGDATA[] = 
+	{ '_', '_', 'W', 'I', 'N', 'E', '_', 'P', 'A', 'G', 'E', 
+	  'S', 'E', 'T', 'U', 'P', 'D', 'L', 'G', 'D', 'A', 'T', 'A', 0 };
     PageSetupDataW	*pda;
     BOOL		res = FALSE;
 
     if (uMsg==WM_INITDIALOG) {
 	res = TRUE;
         pda = (PageSetupDataW*)lParam;
-	SetPropA(hDlg,"__WINE_PAGESETUPDLGDATA",pda);
+	SetPropW(hDlg, __WINE_PAGESETUPDLGDATA, pda);
 	if (pda->dlga->Flags & PSD_ENABLEPAGESETUPHOOK) {
 	    res = pda->dlga->lpfnPageSetupHook(hDlg,uMsg,wParam,(LPARAM)pda->dlga);
 	    if (!res) {
@@ -2739,24 +2756,24 @@
 	}
 	/* We fill them out enabled or not */
 	if (pda->dlga->Flags & PSD_MARGINS) {
-	    char str[100];
+	    WCHAR str[100];
 	    _c_size2strW(pda,pda->dlga->rtMargin.left,str);
-	    SetDlgItemTextA(hDlg,edt4,str);
+	    SetDlgItemTextW(hDlg,edt4,str);
 	    _c_size2strW(pda,pda->dlga->rtMargin.top,str);
-	    SetDlgItemTextA(hDlg,edt5,str);
+	    SetDlgItemTextW(hDlg,edt5,str);
 	    _c_size2strW(pda,pda->dlga->rtMargin.right,str);
-	    SetDlgItemTextA(hDlg,edt6,str);
+	    SetDlgItemTextW(hDlg,edt6,str);
 	    _c_size2strW(pda,pda->dlga->rtMargin.bottom,str);
-	    SetDlgItemTextA(hDlg,edt7,str);
+	    SetDlgItemTextW(hDlg,edt7,str);
 	} else {
 	    /* default is 1 inch */
 	    DWORD size = _c_inch2size((LPPAGESETUPDLGA)pda->dlga,1000);
-	    char	str[20];
+	    WCHAR	str[20];
 	    _c_size2strW(pda,size,str);
-	    SetDlgItemTextA(hDlg,edt4,str);
-	    SetDlgItemTextA(hDlg,edt5,str);
-	    SetDlgItemTextA(hDlg,edt6,str);
-	    SetDlgItemTextA(hDlg,edt7,str);
+	    SetDlgItemTextW(hDlg,edt4,str);
+	    SetDlgItemTextW(hDlg,edt5,str);
+	    SetDlgItemTextW(hDlg,edt6,str);
+	    SetDlgItemTextW(hDlg,edt7,str);
 	}
 	PRINTDLG_PS_ChangePrinterW(hDlg,pda);
 	if (pda->dlga->Flags & PSD_DISABLEPAPER) {
@@ -2765,7 +2782,7 @@
 	}
 	return TRUE;
     } else {
-	pda = (PageSetupDataW*)GetPropA(hDlg,"__WINE_PAGESETUPDLGDATA");
+	pda = (PageSetupDataW*)GetPropW(hDlg, __WINE_PAGESETUPDLGDATA);
 	if (!pda) {
 	    WARN("__WINE_PAGESETUPDLGDATA prop not set?\n");
 	    return FALSE;



More information about the wine-patches mailing list