4 * Copyright 2004 CodeWeavers, Mike Hearn
5 * Copyright 2005,2006 CodeWeavers, Aric Stewart
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include <wine/debug.h>
26 #include "explorer_private.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(explorer
);
30 typedef struct parametersTAG
{
33 WCHAR selection
[MAX_PATH
];
37 static int CopyPathString(LPWSTR target
, LPSTR source
)
39 CHAR temp_buf
[MAX_PATH
];
42 while (isspace(*source
)) source
++;
47 while (*source
!= '\"')
49 temp_buf
[i
] = *source
;
59 while (*source
&& !isspace(*source
))
61 temp_buf
[i
] = *source
;
67 MultiByteToWideChar(CP_ACP
,0,temp_buf
,-1,target
,MAX_PATH
);
72 static void CopyPathRoot(LPWSTR root
, LPWSTR path
)
81 while (*p
!='\\' && p
> path
)
98 * Command Line parameters are:
99 * [/n] Opens in single-paned view for each selected items. This is default
100 * [/e,] Uses Windows Explorer View
101 * [/root,object] Specifies the root level of the view
102 * [/select,object] parent folder is opened and specified object is selected
104 static void ParseCommandLine(LPSTR commandline
,parameters_struct
*parameters
)
110 p
= strchr(commandline
,'/');
114 if (strncmp(p
,"n",1)==0)
116 parameters
->explorer_mode
= FALSE
;
119 else if (strncmp(p
,"e,",2)==0)
121 parameters
->explorer_mode
= TRUE
;
124 else if (strncmp(p
,"root,",5)==0)
127 p
+=CopyPathString(parameters
->root
,p
);
129 else if (strncmp(p
,"select,",7)==0)
132 p
+=CopyPathString(parameters
->selection
,p
);
133 if (!parameters
->root
[0])
134 CopyPathRoot(parameters
->root
,
135 parameters
->selection
);
137 else if (strncmp(p
,"desktop",7)==0)
139 manage_desktop( p
+ 7 ); /* the rest of the command line is handled by desktop mode */
146 /* left over command line is generally the path to be opened */
147 CopyPathString(parameters
->root
,p2
);
151 int WINAPI
WinMain(HINSTANCE hinstance
,
152 HINSTANCE previnstance
,
157 PROCESS_INFORMATION info
;
158 parameters_struct parameters
;
160 static const WCHAR winefile
[] = {'w','i','n','e','f','i','l','e','.','e','x','e',0};
161 static const WCHAR space
[] = {' ',0};
162 LPWSTR winefile_commandline
= NULL
;
165 memset(¶meters
,0,sizeof(parameters
));
166 memset(&si
,0,sizeof(STARTUPINFOW
));
168 ParseCommandLine(cmdline
,¶meters
);
169 len
= lstrlenW(winefile
) +1;
171 if (parameters
.selection
[0])
173 len
+= lstrlenW(parameters
.selection
) + 2;
174 winefile_commandline
= HeapAlloc(GetProcessHeap(),0,len
*sizeof(WCHAR
));
176 lstrcpyW(winefile_commandline
,winefile
);
177 lstrcatW(winefile_commandline
,space
);
178 lstrcatW(winefile_commandline
,parameters
.selection
);
180 else if (parameters
.root
[0])
182 len
+= lstrlenW(parameters
.root
) + 3;
183 winefile_commandline
= HeapAlloc(GetProcessHeap(),0,len
*sizeof(WCHAR
));
185 lstrcpyW(winefile_commandline
,winefile
);
186 lstrcatW(winefile_commandline
,space
);
187 lstrcatW(winefile_commandline
,parameters
.root
);
188 if (winefile_commandline
[lstrlenW(winefile_commandline
)-1]!='\\')
190 static const WCHAR slash
[] = {'\\',0};
191 lstrcatW(winefile_commandline
,slash
);
196 winefile_commandline
= HeapAlloc(GetProcessHeap(),0,len
*sizeof(WCHAR
));
197 lstrcpyW(winefile_commandline
,winefile
);
200 rc
= CreateProcessW(NULL
, winefile_commandline
, NULL
, NULL
, FALSE
, 0, NULL
,
201 parameters
.root
, &si
, &info
);
203 HeapFree(GetProcessHeap(),0,winefile_commandline
);
208 WaitForSingleObject(info
.hProcess
,INFINITE
);