annotate dwt/program/Program.d @ 212:ab60f3309436

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