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 "explorer_private.h"
27 typedef struct parametersTAG
{
30 WCHAR selection
[MAX_PATH
];
34 static int CopyPathString(LPWSTR target
, LPSTR source
)
36 CHAR temp_buf
[MAX_PATH
];
39 while (isspace(*source
)) source
++;
44 while (*source
!= '\"')
46 temp_buf
[i
] = *source
;
56 while (*source
&& !isspace(*source
))
58 temp_buf
[i
] = *source
;
64 MultiByteToWideChar(CP_ACP
,0,temp_buf
,-1,target
,MAX_PATH
);
69 static void CopyPathRoot(LPWSTR root
, LPWSTR path
)
78 while (*p
!='\\' && p
> path
)
95 * Command Line parameters are:
96 * [/n] Opens in single-paned view for each selected items. This is default
97 * [/e,] Uses Windows Explorer View
98 * [/root,object] Specifies the root level of the view
99 * [/select,object] parent folder is opened and specified object is selected
101 static void ParseCommandLine(LPSTR commandline
,parameters_struct
*parameters
)
107 p
= strchr(commandline
,'/');
111 if (strncmp(p
,"n",1)==0)
113 parameters
->explorer_mode
= FALSE
;
116 else if (strncmp(p
,"e,",2)==0)
118 parameters
->explorer_mode
= TRUE
;
121 else if (strncmp(p
,"root,",5)==0)
124 p
+=CopyPathString(parameters
->root
,p
);
126 else if (strncmp(p
,"select,",7)==0)
129 p
+=CopyPathString(parameters
->selection
,p
);
130 if (!parameters
->root
[0])
131 CopyPathRoot(parameters
->root
,
132 parameters
->selection
);
134 else if (strncmp(p
,"desktop",7)==0)
136 manage_desktop( p
+ 7 ); /* the rest of the command line is handled by desktop mode */
143 /* left over command line is generally the path to be opened */
144 CopyPathString(parameters
->root
,p2
);
148 int WINAPI
WinMain(HINSTANCE hinstance
,
149 HINSTANCE previnstance
,
154 PROCESS_INFORMATION info
;
155 parameters_struct parameters
;
157 static const WCHAR winefile
[] = {'\\','w','i','n','e','f','i','l','e','.','e','x','e',0};
158 static const WCHAR space
[] = {' ',0};
159 LPWSTR winefile_commandline
= NULL
;
162 memset(¶meters
,0,sizeof(parameters
));
163 memset(&si
,0,sizeof(STARTUPINFOW
));
165 ParseCommandLine(cmdline
,¶meters
);
166 len
= GetSystemDirectoryW( NULL
, 0 ) + sizeof(winefile
)/sizeof(WCHAR
);
168 if (parameters
.selection
[0]) len
+= lstrlenW(parameters
.selection
) + 2;
169 else if (parameters
.root
[0]) len
+= lstrlenW(parameters
.root
) + 3;
171 winefile_commandline
= HeapAlloc(GetProcessHeap(),0,len
*sizeof(WCHAR
));
172 GetSystemDirectoryW( winefile_commandline
, len
);
173 lstrcatW(winefile_commandline
,winefile
);
175 if (parameters
.selection
[0])
177 lstrcatW(winefile_commandline
,space
);
178 lstrcatW(winefile_commandline
,parameters
.selection
);
180 else if (parameters
.root
[0])
182 lstrcatW(winefile_commandline
,space
);
183 lstrcatW(winefile_commandline
,parameters
.root
);
184 if (winefile_commandline
[lstrlenW(winefile_commandline
)-1]!='\\')
186 static const WCHAR slash
[] = {'\\',0};
187 lstrcatW(winefile_commandline
,slash
);
191 rc
= CreateProcessW(NULL
, winefile_commandline
, NULL
, NULL
, FALSE
, 0, NULL
,
192 parameters
.root
, &si
, &info
);
194 HeapFree(GetProcessHeap(),0,winefile_commandline
);
199 WaitForSingleObject(info
.hProcess
,INFINITE
);