23 #define NONAMELESSUNION 43 #include "wine/unicode.h" 46 #include "msiserver.h" 133 static const WCHAR szMsiDialogClass[] = {
'M',
's',
'i',
'D',
'i',
'a',
'l',
'o',
'g',
'C',
'l',
'o',
's',
'e',
'C',
'l',
'a',
's',
's',0 };
134 static const WCHAR szMsiHiddenWindow[] = {
'M',
's',
'i',
'H',
'i',
'd',
'd',
'e',
'n',
'W',
'i',
'n',
'd',
'o',
'w',0 };
140 static const WCHAR szPushButton[] = {
'P',
'u',
's',
'h',
'B',
'u',
't',
't',
'o',
'n',0 };
144 static const WCHAR szScrollableText[] = {
'S',
'c',
'r',
'o',
'l',
'l',
'a',
'b',
'l',
'e',
'T',
'e',
'x',
't',0 };
147 static const WCHAR szMaskedEdit[] = {
'M',
'a',
's',
'k',
'e',
'd',
'E',
'd',
'i',
't',0 };
149 static const WCHAR szProgressBar[] = {
'P',
'r',
'o',
'g',
'r',
'e',
's',
's',
'B',
'a',
'r',0 };
150 static const WCHAR szSetProgress[] = {
'S',
'e',
't',
'P',
'r',
'o',
'g',
'r',
'e',
's',
's',0 };
151 static const WCHAR szRadioButtonGroup[] = {
'R',
'a',
'd',
'i',
'o',
'B',
'u',
't',
't',
'o',
'n',
'G',
'r',
'o',
'u',
'p',0 };
153 static const WCHAR szSelectionTree[] = {
'S',
'e',
'l',
'e',
'c',
't',
'i',
'o',
'n',
'T',
'r',
'e',
'e',0 };
156 static const WCHAR szDirectoryCombo[] = {
'D',
'i',
'r',
'e',
'c',
't',
'o',
'r',
'y',
'C',
'o',
'm',
'b',
'o',0 };
157 static const WCHAR szDirectoryList[] = {
'D',
'i',
'r',
'e',
'c',
't',
'o',
'r',
'y',
'L',
'i',
's',
't',0 };
158 static const WCHAR szVolumeCostList[] = {
'V',
'o',
'l',
'u',
'm',
'e',
'C',
'o',
's',
't',
'L',
'i',
's',
't',0 };
159 static const WCHAR szVolumeSelectCombo[] = {
'V',
'o',
'l',
'u',
'm',
'e',
'S',
'e',
'l',
'e',
'c',
't',
'C',
'o',
'm',
'b',
'o',0 };
160 static const WCHAR szSelectionDescription[] = {
'S',
'e',
'l',
'e',
'c',
't',
'i',
'o',
'n',
'D',
'e',
's',
'c',
'r',
'i',
'p',
't',
'i',
'o',
'n',0};
161 static const WCHAR szSelectionPath[] = {
'S',
'e',
'l',
'e',
'c',
't',
'i',
'o',
'n',
'P',
'a',
't',
'h',0};
166 #define WM_MSI_DIALOG_CREATE (WM_USER+0x100) 167 #define WM_MSI_DIALOG_DESTROY (WM_USER+0x101) 169 #define USER_INSTALLSTATE_ALL 0x1000 284 if( *
p !=
'\\' && *
p !=
'&' )
288 for(
i=++
p;
i<
q;
i++ )
289 if( *
i ==
'}' || *
i ==
'\\' )
324 memset( &lf, 0,
sizeof lf );
379 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
380 '`',
'T',
'e',
'x',
't',
'S',
't',
'y',
'l',
'e',
'`',0};
461 TRACE(
"Dialog %s control %s hwnd %p\n",
479 's',
'e',
'l',
'e',
'c',
't',
' ',
'*',
' ',
480 'f',
'r',
'o',
'm',
' ',
'`',
'U',
'I',
'T',
'e',
'x',
't',
'`',
' ',
481 'w',
'h',
'e',
'r',
'e',
' ',
'`',
'K',
'e',
'y',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0
485 if (!rec)
return NULL;
494 's',
'e',
'l',
'e',
'c',
't',
' ',
'*',
' ',
495 'f',
'r',
'o',
'm',
' ',
'B',
'i',
'n',
'a',
'r',
'y',
' ',
496 'w',
'h',
'e',
'r',
'e',
' ',
497 '`',
'N',
'a',
'm',
'e',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0
588 memset( &tvi, 0,
sizeof tvi );
625 if (text_fmt)
text = text_fmt;
642 TRACE(
"progress: func %u val1 %u val2 %u\n",
func, val1, val2);
659 ctrl->progress_current = 0;
665 if (val2)
dialog->package->action_progress_increment = val1;
666 else dialog->package->action_progress_increment = 0;
669 if (
ctrl->progress_backwards)
672 else ctrl->progress_current = 0;
677 else ctrl->progress_current =
ctrl->progress_max;
685 FIXME(
"Unknown progress message %u\n",
func);
723 TRACE(
"already subscribed\n");
727 if (!(sub =
msi_alloc(
sizeof(*sub) )))
return;
753 static const WCHAR queryW[] =
754 {
'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
755 '`',
'E',
'v',
'e',
'n',
't',
'M',
'a',
'p',
'p',
'i',
'n',
'g',
'`',
' ',
756 'W',
'H',
'E',
'R',
'E',
' ',
'`',
'D',
'i',
'a',
'l',
'o',
'g',
'_',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',
' ',
757 'A',
'N',
'D',
' ',
'`',
'C',
'o',
'n',
't',
'r',
'o',
'l',
'_',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0};
906 while (*
p && *
p !=
'{')
p++;
907 if (!*
p++)
return text;
909 while (*
p && *
p !=
'}')
p++;
910 if (!*
p++)
return text;
919 static const WCHAR szNullArg[] = {
'{',
'}',0};
927 if (
p && (
p[1] == 0 ||
p[1] ==
' '))
936 else ERR(
"Badly formatted property string - what happens?\n");
981 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
982 'C',
'o',
'n',
't',
'r',
'o',
'l',
'E',
'v',
'e',
'n',
't',
' ',
'W',
'H',
'E',
'R',
'E',
' ',
983 '`',
'D',
'i',
'a',
'l',
'o',
'g',
'_',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',
' ',
'A',
'N',
'D',
' ',
984 '`',
'C',
'o',
'n',
't',
'r',
'o',
'l',
'_',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',
' ',
985 'O',
'R',
'D',
'E',
'R',
' ',
'B',
'Y',
' ',
'`',
'O',
'r',
'd',
'e',
'r',
'i',
'n',
'g',
'`',0};
995 ERR(
"query failed\n");
1002 if (
dialog->pending_event)
1051 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
1052 'F',
'R',
'O',
'M',
' ',
'`',
'C',
'h',
'e',
'c',
'k',
'B',
'o',
'x',
'`',
' ',
1053 'W',
'H',
'E',
'R',
'E',
' ',
1054 '`',
'P',
'r',
'o',
'p',
'e',
'r',
't',
'y',
'`',
' ',
'=',
' ',
1091 return state[0] ? 1 : 0;
1213 TRACE(
"Dialog %s control %s hwnd %p\n",
1299 static const WCHAR szRichEdit20W[] = {
'R',
'i',
'c',
'h',
'E',
'd',
'i',
't',
'2',
'0',
'W',0};
1343 HBITMAP hOleBitmap = 0,
hBitmap = 0, hOldSrcBitmap, hOldDestBitmap;
1361 IStream_Release( stm );
1364 ERR(
"failed to load picture\n");
1368 r = IPicture_get_Handle( pic, (
OLE_HANDLE*) &hOleBitmap );
1371 ERR(
"failed to get bitmap handle\n");
1377 if (
r !=
sizeof bm )
1379 ERR(
"failed to get bitmap size\n");
1395 srcdc, 0, 0, bm.bmWidth, bm.bmHeight,
SRCCOPY);
1403 IPicture_Release( pic );
1493 for (
j = 0;
j <
info->num_items;
j++)
1517 info->addpos_items++;
1525 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
1526 '`',
'C',
'o',
'm',
'b',
'o',
'B',
'o',
'x',
'`',
' ',
'W',
'H',
'E',
'R',
'E',
' ',
1527 '`',
'P',
'r',
'o',
'p',
'e',
'r',
't',
'y',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',
' ',
1528 'O',
'R',
'D',
'E',
'R',
' ',
'B',
'Y',
' ',
'`',
'O',
'r',
'd',
'e',
'r',
'`',0};
1555 static const WCHAR szHide[] = {
'H',
'i',
'd',
'e',0};
1556 static const WCHAR szShow[] = {
'S',
'h',
'o',
'w',0};
1557 static const WCHAR szDisable[] = {
'D',
'i',
's',
'a',
'b',
'l',
'e',0};
1558 static const WCHAR szEnable[] = {
'E',
'n',
'a',
'b',
'l',
'e',0};
1559 static const WCHAR szDefault[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',0};
1594 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
1595 'C',
'o',
'n',
't',
'r',
'o',
'l',
'C',
'o',
'n',
'd',
'i',
't',
'i',
'o',
'n',
' ',
1596 'W',
'H',
'E',
'R',
'E',
' ',
'`',
'D',
'i',
'a',
'l',
'o',
'g',
'_',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0};
1653 for (
j = 0;
j <
info->num_items;
j++)
1710 info->addpos_items = 0;
1740 #define MAX_NUM_DIGITS 11 1783 #define MASK_MAX_GROUPS 20 1825 for(
i=0,
n=0;
i<
info->num_groups;
i++ )
1827 if (
info->group[
i].len == ~0
u)
1835 if (
info->group[
i].len +
n >
info->num_chars)
1837 ERR(
"can't fit control %d text into template\n",
i);
1842 for(
r=0;
r<
info->group[
i].len;
r++)
1849 if(
r !=
info->group[
i].len )
1856 TRACE(
"%d/%d controls were good\n",
i,
info->num_groups);
1858 if(
i ==
info->num_groups )
1873 for(
i=0;
i<
info->num_groups;
i++ )
1878 if(
i >= (
info->num_groups-1) )
1928 for(
i = 0;
i <
info->num_groups;
i++ )
1970 if(
p[0] == 0 ||
p[0] ==
'>' )
1975 info->group[0].type =
'&';
1976 info->group[0].len = ~0
u;
1983 for(
n=0;
p[
n] ==
p[0];
n++ )
1986 info->group[
i].type =
p[0];
2002 info->num_groups =
i;
2022 for(
i = 0;
i <
info->num_groups;
i++ )
2026 if (
info->num_chars)
2040 ERR(
"failed to create mask edit sub window\n");
2071 WARN(
"mask template is empty\n");
2088 ERR(
"Failed to create maskedit container\n");
2299 group->parent->hwnd );
2342 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
2343 'R',
'a',
'd',
'i',
'o',
'B',
'u',
't',
't',
'o',
'n',
' ',
'W',
'H',
'E',
'R',
'E',
' ',
2344 '`',
'P',
'r',
'o',
'p',
'e',
'r',
't',
'y',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0};
2385 ERR(
"query failed for dialog %s radio group %s\n",
2391 group.parent = control;
2485 package = info->dialog->package;
2490 ERR(
"item %p feature was NULL\n",
hItem);
2582 memset( &tvis, 0,
sizeof tvis );
2601 if (
feature->Display % 2 != 0 )
2607 info->selected = hfirst;
2612 const int bm_width = 32, bm_height = 16, bm_count = 3;
2613 const int bm_resource = 0x1001;
2621 ERR(
"failed to create image list\n");
2625 for (
i=0;
i<bm_count;
i++)
2630 ERR(
"failed to load bitmap %d\n",
i);
2659 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
2660 '`',
'F',
'e',
'a',
't',
'u',
'r',
'e',
'`',
' ',
'W',
'H',
'E',
'R',
'E',
' ',
2661 '`',
'T',
'i',
't',
'l',
'e',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0
2798 for (
j = 0;
j <
info->num_items;
j++)
2822 info->addpos_items++;
2829 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
2830 '`',
'L',
'i',
's',
't',
'B',
'o',
'x',
'`',
' ',
'W',
'H',
'E',
'R',
'E',
' ',
2831 '`',
'P',
'r',
'o',
'p',
'e',
'r',
't',
'y',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',
' ',
2832 'O',
'R',
'D',
'E',
'R',
' ',
'B',
'Y',
' ',
'`',
'O',
'r',
'd',
'e',
'r',
'`',0};
2909 info->addpos_items = 0;
2977 static const WCHAR asterisk[] = {
'*',0};
3008 item.pszText = wfd.cFileName;
3063 ERR(
"No list-view item selected!\n");
3133 {
'V',
'o',
'l',
'u',
'm',
'e',
'C',
'o',
's',
't',
'V',
'o',
'l',
'u',
'm',
'e',0},
3134 {
'V',
'o',
'l',
'u',
'm',
'e',
'C',
'o',
's',
't',
'S',
'i',
'z',
'e',0},
3135 {
'V',
'o',
'l',
'u',
'm',
'e',
'C',
'o',
's',
't',
'A',
'v',
'a',
'i',
'l',
'a',
'b',
'l',
'e',0},
3136 {
'V',
'o',
'l',
'u',
'm',
'e',
'C',
'o',
's',
't',
'R',
'e',
'q',
'u',
'i',
'r',
'e',
'd',0},
3137 {
'V',
'o',
'l',
'u',
'm',
'e',
'C',
'o',
's',
't',
'D',
'i',
'f',
'f',
'e',
'r',
'e',
'n',
'c',
'e',0}
3148 static const WCHAR negative[] = {
'-',0};
3203 total_cost += ((
LONGLONG)each_cost) * 512;
3209 total_cost -= ((
LONGLONG)each_cost) * 512;
3230 if ( !
size )
return;
3233 if ( !drives )
return;
3248 difference =
free.QuadPart - cost;
3251 lvitem.iSubItem = 1;
3252 lvitem.pszText = size_text;
3253 lvitem.cchTextMax =
lstrlenW(size_text) + 1;
3257 lvitem.iSubItem = 2;
3258 lvitem.pszText = size_text;
3259 lvitem.cchTextMax =
lstrlenW(size_text) + 1;
3262 lvitem.iSubItem = 3;
3263 lvitem.pszText = cost_text;
3264 lvitem.cchTextMax =
lstrlenW(cost_text) + 1;
3268 lvitem.iSubItem = 4;
3269 lvitem.pszText = size_text;
3270 lvitem.cchTextMax =
lstrlenW(size_text) + 1;
3314 ERR(
"No ComboBox item selected!\n");
3335 if ( !
size )
return;
3338 if ( !drives )
return;
3378 static const WCHAR hrefW[] = {
'h',
'r',
'e',
'f'};
3379 static const WCHAR openW[] = {
'o',
'p',
'e',
'n',0};
3380 int len, len_href =
sizeof(hrefW) /
sizeof(hrefW[0]);
3392 while (*
p && *
p !=
'<')
p++;
3405 if (*
p ==
'\"' || *
p ==
'\'')
quote = *
p++;
3443 else item.szUrl[0] = 0;
3475 #define NUM_CONTROL_TYPES (sizeof msi_dialog_handler/sizeof msi_dialog_handler[0]) 3499 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
3500 'C',
'o',
'n',
't',
'r',
'o',
'l',
' ',
'W',
'H',
'E',
'R',
'E',
' ',
3501 '`',
'D',
'i',
'a',
'l',
'o',
'g',
'_',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0};
3530 static const WCHAR szSansSerif[] = {
3531 'M',
'S',
' ',
'S',
'a',
'n',
's',
' ',
'S',
'e',
'r',
'i',
'f',0 };
3542 memset( &lf, 0,
sizeof lf );
3564 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
3565 'F',
'R',
'O',
'M',
' ',
'D',
'i',
'a',
'l',
'o',
'g',
' ',
3566 'W',
'H',
'E',
'R',
'E',
' ',
3567 '`',
'D',
'i',
'a',
'l',
'o',
'g',
'`',
' ',
'=',
' ',
'\'',
'%',
's',
'\'',0};
3582 static const WCHAR szScreenX[] = {
'S',
'c',
'r',
'e',
'e',
'n',
'X',0};
3583 static const WCHAR szScreenY[] = {
'S',
'c',
'r',
'e',
'e',
'n',
'Y',0};
3602 center.
x =
MulDiv( center.
x, xres, 100 );
3603 center.
y =
MulDiv( center.
y, yres, 100 );
3606 if (
dialog->package->center_x &&
dialog->package->center_y)
3608 pos->left =
dialog->package->center_x - sz.
cx / 2.0;
3610 pos->top =
dialog->package->center_y - sz.
cy / 2.0;
3615 pos->left = center.
x - sz.
cx/2;
3617 pos->top = center.
y - sz.
cy/2;
3621 dialog->package->center_x = center.
x;
3622 dialog->package->center_y = center.
y;
3636 struct list tab_chain;