annotate dwt/program/Program.d @ 192:135517d29564

moved pragme link for shlwapi into DWT
author Frank Benoit <benoit@tionex.de>
date Mon, 17 Mar 2008 01:04:59 +0100
parents 528e7db39d9e
children 184ab53b7785
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2007 IBM Corporation and others.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D Programming language:
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.program.Program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwt.DWT;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.graphics.Image;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.graphics.ImageData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.internal.win32.OS;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.dwthelper.utils;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.dwthelper.Integer;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 static import tango.text.convert.Utf;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 * Instances of this class represent programs and
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 * their associated file extensions in the operating
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 * system.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 public final class Program {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 char[] name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 char[] command;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 char[] iconName;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 char[] extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 static const char[][] ARGUMENTS = ["%1"[], "%l", "%L"]; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 * Prevents uninitialized instances from being created outside the package.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 this () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 static char[] assocQueryString (int assocStr, TCHAR[] key, bool expand) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 TCHAR[] pszOut = NewTCHARs(0, 1024);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 uint[1] pcchOut;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 pcchOut[0] = pszOut.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 int result = OS.AssocQueryString(OS.ASSOCF_NOTRUNCATE, assocStr, key.ptr, null, pszOut.ptr, pcchOut.ptr);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 if (result is OS.E_POINTER) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 pszOut = NewTCHARs(0, pcchOut [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 result = OS.AssocQueryString(OS.ASSOCF_NOTRUNCATE, assocStr, key.ptr, null, pszOut.ptr, pcchOut.ptr);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 if (result is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 if (!OS.IsWinCE && expand) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 int length_ = OS.ExpandEnvironmentStrings (pszOut.ptr, null, 0);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 if (length_ !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 TCHAR[] lpDst = NewTCHARs (0, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 OS.ExpandEnvironmentStrings (pszOut.ptr, lpDst.ptr, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 return tango.text.convert.Utf.toString( lpDst[ 0 .. Math.max (0, length_ - 1) ] );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 return "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 return tango.text.convert.Utf.toString( pszOut[ 0 .. Math.max (0, pcchOut [0] - 1)]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * Finds the program that is associated with an extension.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * The extension may or may not begin with a '.'. Note that
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * a <code>Display</code> must already exist to guarantee that
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * this method returns an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * @param extension the program extension
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * @return the program or <code>null</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * @exception IllegalArgumentException <ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * <li>ERROR_NULL_ARGUMENT when extension is null</li>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 * </ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 public static Program findProgram (char[] extension) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 if (extension is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 if (extension.length is 0) return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 if (extension.charAt (0) !is '.') extension = "." ~ extension; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 TCHAR[] key = StrToTCHARs (0, extension, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 Program program = null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 if (OS.IsWinCE) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 void*[1] phkResult;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 if (OS.RegOpenKeyEx ( cast(void*)OS.HKEY_CLASSES_ROOT, key.ptr, 0, OS.KEY_READ, phkResult.ptr) !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 uint [1] lpcbData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 int result = OS.RegQueryValueEx (phkResult [0], null, null, null, null, lpcbData.ptr);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 if (result is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 TCHAR[] lpData = NewTCHARs (0, lpcbData [0] / TCHAR.sizeof);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 result = OS.RegQueryValueEx (phkResult [0], null, null, null, cast(ubyte*)lpData.ptr, lpcbData.ptr);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 if (result is 0) program = getProgram ( TCHARzToStr( lpData.ptr ), extension);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 OS.RegCloseKey (phkResult [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 char[] command = assocQueryString (OS.ASSOCSTR_COMMAND, key, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 if (command !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 char[] name = null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 if (name is null) name = assocQueryString (OS.ASSOCSTR_FRIENDLYDOCNAME, key, false);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 if (name is null) name = assocQueryString (OS.ASSOCSTR_FRIENDLYAPPNAME, key, false);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 if (name is null) name = "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 char[] iconName = assocQueryString (OS.ASSOCSTR_DEFAULTICON, key, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 if (iconName is null) iconName = "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 program = new Program ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 program.name = name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 program.command = command;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 program.iconName = iconName;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 program.extension = extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 return program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 * Answer all program extensions in the operating system. Note
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 * that a <code>Display</code> must already exist to guarantee
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 * that this method returns an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 * @return an array of extensions
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 public static char[] [] getExtensions () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 char[] [] extensions = new char[] [1024];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 TCHAR[] lpName = NewTCHARs (0, 1024);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 uint [1] lpcName; lpcName[0] = lpName.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 FILETIME ft;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 int dwIndex = 0, count = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 while (OS.RegEnumKeyEx ( cast(void*)OS.HKEY_CLASSES_ROOT, dwIndex, lpName.ptr, lpcName.ptr, null, null, null, &ft) !is OS.ERROR_NO_MORE_ITEMS) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 char[] extension = TCHARsToStr( lpName[0 .. lpcName[0] ]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 lpcName [0] = lpName.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 if (extension.length > 0 && extension.charAt (0) is '.') {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 if (count is extensions.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 char[][] newExtensions = new char[][]( extensions.length + 1024 );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 System.arraycopy (extensions, 0, newExtensions, 0, extensions.length);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 extensions = newExtensions;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 extensions [count++] = extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 dwIndex++;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 if (count !is extensions.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 char[][] newExtension = new char[][]( count );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 System.arraycopy (extensions, 0, newExtension, 0, count);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 extensions = newExtension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 return extensions;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 static char[] getKeyValue (char[] string, bool expand) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 TCHAR[] key = StrToTCHARs (0, string, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 void* [1] phkResult;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 if (OS.RegOpenKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, key.ptr, 0, OS.KEY_READ, phkResult.ptr) !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 char[] result = null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 uint [1] lpcbData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 if (OS.RegQueryValueEx (phkResult [0], null, null, null, null, lpcbData.ptr) is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 result = "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 int length_ = lpcbData [0] / TCHAR.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 if (length_ !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 TCHAR[] lpData = NewTCHARs (0, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 if (OS.RegQueryValueEx (phkResult [0], null, null, null, cast(ubyte*)lpData.ptr, lpcbData.ptr) is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 if (!OS.IsWinCE && expand) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 length_ = OS.ExpandEnvironmentStrings (lpData.ptr, null, 0);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 if (length_ !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 TCHAR[] lpDst = NewTCHARs (0, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 OS.ExpandEnvironmentStrings (lpData.ptr, lpDst.ptr, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 result = tango.text.convert.Utf.toString ( lpDst[0 .. Math.max (0, length_ - 1) ] );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 length_ = Math.max (0, lpData.length - 1);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 result = tango.text.convert.Utf.toString ( lpData[0 .. length_]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 if (phkResult [0] !is null) OS.RegCloseKey (phkResult [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 return result;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 static Program getProgram (char[] key, char[] extension) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 /* Name */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 char[] name = getKeyValue (key, false);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 if (name is null || name.length is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 name = key;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 /* Command */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 char[] DEFAULT_COMMAND = "\\shell"; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 char[] defaultCommand = getKeyValue (key ~ DEFAULT_COMMAND, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 if (defaultCommand is null || defaultCommand.length is 0) defaultCommand = "open"; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 char[] COMMAND = "\\shell\\" ~ defaultCommand ~ "\\command"; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 char[] command = getKeyValue (key ~ COMMAND, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 if (command is null || command.length is 0) return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 /* Icon */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 char[] DEFAULT_ICON = "\\DefaultIcon"; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 char[] iconName = getKeyValue (key ~ DEFAULT_ICON, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 if (iconName is null) iconName = ""; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 /* Program */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 Program program = new Program ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 program.name = name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 program.command = command;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 program.iconName = iconName;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 program.extension = extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 return program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 * Answers all available programs in the operating system. Note
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 * that a <code>Display</code> must already exist to guarantee
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 * that this method returns an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 * @return an array of programs
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 public static Program [] getPrograms () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 Program [] programs = new Program [1024];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 TCHAR[] lpName = NewTCHARs (0, 1024);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 uint [1] lpcName; lpcName[0] = lpName.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 FILETIME ft;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 int dwIndex = 0, count = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 while (OS.RegEnumKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, dwIndex, lpName.ptr, lpcName.ptr, null, null, null, &ft) !is OS.ERROR_NO_MORE_ITEMS) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 char[] path = tango.text.convert.Utf.toString ( lpName[0 .. lpcName [0]]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 lpcName [0] = lpName.length ;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 Program program = getProgram (path, null);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 if (program !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 if (count is programs.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 Program [] newPrograms = new Program [programs.length + 1024];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 System.arraycopy (programs, 0, newPrograms, 0, programs.length);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 programs = newPrograms;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 programs [count++] = program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 dwIndex++;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 if (count !is programs.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 Program [] newPrograms = new Program [count];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 System.arraycopy (programs, 0, newPrograms, 0, count);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 programs = newPrograms;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 return programs;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 * Launches the executable associated with the file in
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 * the operating system. If the file is an executable,
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 * then the executable is launched. Note that a <code>Display</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 * must already exist to guarantee that this method returns
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 * an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 * @param fileName the file or program name
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 * @return <code>true</code> if the file is launched, otherwise <code>false</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 * @exception IllegalArgumentException <ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 * <li>ERROR_NULL_ARGUMENT when fileName is null</li>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 * </ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 public static bool launch (char[] fileName) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 auto hHeap = OS.GetProcessHeap ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 TCHAR[] buffer = StrToTCHARs (0, fileName, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 int byteCount = buffer.length * TCHAR.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 auto lpFile = cast(wchar*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 OS.MoveMemory (lpFile, buffer.ptr, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 SHELLEXECUTEINFO info;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 info.cbSize = SHELLEXECUTEINFO.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 info.lpFile = lpFile;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 info.nShow = OS.SW_SHOW;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 bool result = cast(bool) OS.ShellExecuteEx (&info);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 if (lpFile !is null) OS.HeapFree (hHeap, 0, lpFile);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 return result;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 * Executes the program with the file as the single argument
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 * in the operating system. It is the responsibility of the
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 * programmer to ensure that the file contains valid data for
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 * this program.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 * @param fileName the file or program name
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 * @return <code>true</code> if the file is launched, otherwise <code>false</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 * @exception IllegalArgumentException <ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 * <li>ERROR_NULL_ARGUMENT when fileName is null</li>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 * </ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 public bool execute (char[] fileName) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 int index = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 bool append = true;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 char[] prefix = command, suffix = ""; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 while (index < ARGUMENTS.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 int i = command.indexOf (ARGUMENTS [index]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 if (i !is -1) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 append = false;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 prefix = command.substring (0, i);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 suffix = command.substring (i + ARGUMENTS [index].length , command.length );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 break;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 index++;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 if (append) fileName = " \"" ~ fileName ~ "\"";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 char[] commandLine = prefix ~ fileName ~ suffix;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 auto hHeap = OS.GetProcessHeap ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 TCHAR[] buffer = StrToTCHARs (0, commandLine, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 int byteCount = buffer.length * TCHAR.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 auto lpCommandLine = cast(TCHAR*)OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 OS.MoveMemory (lpCommandLine, buffer.ptr, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 STARTUPINFO lpStartupInfo;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 lpStartupInfo.cb = STARTUPINFO.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 PROCESS_INFORMATION lpProcessInformation;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 bool success = cast(bool) OS.CreateProcess (null, lpCommandLine, null, null, false, 0, null, null, &lpStartupInfo, &lpProcessInformation);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 if (lpCommandLine !is null) OS.HeapFree (hHeap, 0, lpCommandLine);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 if (lpProcessInformation.hProcess !is null) OS.CloseHandle (lpProcessInformation.hProcess);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 if (lpProcessInformation.hThread !is null) OS.CloseHandle (lpProcessInformation.hThread);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 return success;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 * Returns the receiver's image data. This is the icon
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 * that is associated with the receiver in the operating
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 * system.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 * @return the image data for the program, may be null
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 public ImageData getImageData () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 if (extension !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 SHFILEINFOW shfi;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 int flags = OS.SHGFI_ICON | OS.SHGFI_SMALLICON | OS.SHGFI_USEFILEATTRIBUTES;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 TCHAR[] pszPath = StrToTCHARs (0, extension, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 OS.SHGetFileInfo (pszPath.ptr, OS.FILE_ATTRIBUTE_NORMAL, &shfi, SHFILEINFO.sizeof, flags);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 if (shfi.hIcon !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 Image image = Image.win32_new (null, DWT.ICON, shfi.hIcon);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 ImageData imageData = image.getImageData ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 image.dispose ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 return imageData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 int nIconIndex = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 char[] fileName = iconName;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 int index = iconName.indexOf (',');
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 if (index !is -1) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 fileName = iconName.substring (0, index);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 char[] iconIndex = iconName.substring (index + 1, iconName.length ).trim ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 try {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 nIconIndex = Integer.parseInt (iconIndex);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 } catch (NumberFormatException e) {}
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 TCHAR[] lpszFile = StrToTCHARs (0, fileName, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 HICON [1] phiconSmall, phiconLarge;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 OS.ExtractIconEx (lpszFile.ptr, nIconIndex, phiconLarge.ptr, phiconSmall.ptr, 1);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 if (phiconSmall [0] is null) return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 Image image = Image.win32_new (null, DWT.ICON, phiconSmall [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 ImageData imageData = image.getImageData ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 image.dispose ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 return imageData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 * Returns the receiver's name. This is as short and
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 * descriptive a name as possible for the program. If
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 * the program has no descriptive name, this string may
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 * be the executable name, path or empty.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 * @return the name of the program
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 public char[] getName () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 return name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 * Compares the argument to the receiver, and returns true
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 * if they represent the <em>same</em> object using a class
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 * specific comparison.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 * @param other the object to compare with this object
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 * @see #hashCode()
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 public override int opEquals(Object other) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 if (this is other) return true;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 if ( auto program = cast(Program)other ) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 return name.equals(program.name) && command.equals(program.command)
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 && iconName.equals(program.iconName);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 return false;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 * Returns an integer hash code for the receiver. Any two
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 * objects that return <code>true</code> when passed to
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 * <code>equals</code> must return the same value for this
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 * method.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 * @return the receiver's hash
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 * @see #equals(Object)
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 public override hash_t toHash() {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 return .toHash(name) ^ .toHash(command) ^ .toHash(iconName);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 * Returns a string containing a concise, human-readable
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 * description of the receiver.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 * @return a string representation of the program
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 public char[] toString () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 return "Program {" ~ name ~ "}"; //$NON-NLS-1$ //$NON-NLS-2$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 }