25 private static final String TAG =
"RDPFileHelper";
31 public static void importFrom(InputStream in, BookmarkBase bookmark)
throws IOException
34 throw new IOException(
"null stream");
39 ByteArrayOutputStream buf =
new ByteArrayOutputStream(4096);
40 byte[] chunk =
new byte[4096];
42 while ((n = in.read(chunk)) != -1)
43 buf.write(chunk, 0, n);
44 content = buf.toByteArray();
52 int b0 = content.length > 0 ? (content[0] & 0xFF) : -1;
53 int b1 = content.length > 1 ? (content[1] & 0xFF) : -1;
54 if (b0 == 0xFF && b1 == 0xFE)
55 text =
new String(content, 2, content.length - 2, StandardCharsets.UTF_16LE);
56 else if (b0 == 0xFE && b1 == 0xFF)
57 text =
new String(content, 2, content.length - 2, StandardCharsets.UTF_16BE);
60 text =
new String(content, StandardCharsets.UTF_8);
61 if (text.startsWith(
"\uFEFF"))
62 text = text.substring(1);
66 p.parse(
new StringReader(text));
68 String s = p.getString(
"full address");
71 int colonIdx = s.lastIndexOf(
":");
72 if (colonIdx > s.lastIndexOf(
"]"))
76 bookmark.setPort(Integer.parseInt(s.substring(colonIdx + 1)));
78 catch (NumberFormatException e)
80 Log.e(TAG,
"Malformed address");
82 s = s.substring(0, colonIdx);
84 if (s.startsWith(
"[") && s.endsWith(
"]"))
85 s = s.substring(1, s.length() - 1);
86 bookmark.setHostname(s);
89 Integer i = p.getInteger(
"server port");
93 s = p.getString(
"username");
95 bookmark.setUsername(s);
97 s = p.getString(
"domain");
99 bookmark.setDomain(s);
101 BookmarkBase.ScreenSettings screen = bookmark.getActiveScreenSettings();
102 Integer w = p.getInteger(
"desktopwidth");
103 Integer h = p.getInteger(
"desktopheight");
104 if (w !=
null && h !=
null && w > 0 && h > 0)
108 screen.setResolution(BookmarkBase.ScreenSettings.CUSTOM);
110 i = p.getInteger(
"session bpp");
114 BookmarkBase.PerformanceFlags perf = bookmark.getPerformanceFlags();
115 i = p.getInteger(
"disable wallpaper");
117 perf.setWallpaper(i == 0);
118 i = p.getInteger(
"allow font smoothing");
120 perf.setFontSmoothing(i == 1);
121 i = p.getInteger(
"allow desktop composition");
123 perf.setDesktopComposition(i == 1);
124 i = p.getInteger(
"disable menu anims");
126 perf.setMenuAnimations(i == 0);
127 i = p.getInteger(
"disable themes");
129 perf.setTheming(i == 0);
130 i = p.getInteger(
"disable full window drag");
132 perf.setFullWindowDrag(i == 0);
134 BookmarkBase.AdvancedSettings advanced = bookmark.getAdvancedSettings();
135 i = p.getInteger(
"connect to console");
137 advanced.setConsoleMode(i == 1);
139 i = p.getInteger(
"audiomode");
140 if (i !=
null && i >= 0 && i <= 2)
141 advanced.setRedirectSound(i);
142 i = p.getInteger(
"audiocapturemode");
144 advanced.setRedirectMicrophone(i == 1);
146 s = p.getString(
"loadbalanceinfo");
147 if (s !=
null && !s.isEmpty())
148 advanced.setLoadBalanceInfo(s);
150 s = p.getString(
"remoteapplicationprogram");
151 if (s ==
null || s.isEmpty())
152 s = p.getString(
"alternate shell");
153 if (s !=
null && !s.isEmpty())
154 advanced.setRemoteProgram(s);
156 s = p.getString(
"shell working directory");
157 if (s !=
null && !s.isEmpty())
158 advanced.setWorkDir(s);
160 s = p.getString(
"gatewayhostname");
161 if (s !=
null && !s.isEmpty())
165 int colonIdx = s.lastIndexOf(
":");
170 gwPort = Integer.parseInt(s.substring(colonIdx + 1));
171 gwHost = s.substring(0, colonIdx);
173 catch (NumberFormatException e)
175 Log.e(TAG,
"Malformed gateway port");
178 bookmark.getGatewaySettings().setHostname(gwHost);
179 bookmark.getGatewaySettings().setPort(gwPort);
180 bookmark.setEnableGatewaySettings(
true);
182 i = p.getInteger(
"gatewayusagemethod");
184 bookmark.setEnableGatewaySettings(i == 1 || i == 2);
186 i = p.getInteger(
"redirectprinters");
188 advanced.setRedirectPrinter(i == 1);
189 i = p.getInteger(
"disableprinterredirection");
191 advanced.setRedirectPrinter(i == 0);
193 s = p.getString(
"pcb");
194 if (s !=
null && !s.isEmpty())
196 advanced.setVmConnectMode(
true);
197 advanced.setVmConnectGuid(s);
201 public static String toRdpString(BookmarkBase bookmark)
203 StringBuilder sb =
new StringBuilder();
204 BookmarkBase.ScreenSettings screen = bookmark.getActiveScreenSettings();
205 BookmarkBase.PerformanceFlags perf = bookmark.getActivePerformanceFlags();
206 BookmarkBase.AdvancedSettings adv = bookmark.getAdvancedSettings();
208 String host = bookmark.getHostname();
209 int port = bookmark.getPort();
210 writeString(sb,
"full address", port != 3389 ? host +
":" + port : host);
212 String username = bookmark.getUsername();
213 if (!username.isEmpty())
214 writeString(sb,
"username", username);
216 String domain = bookmark.getDomain();
217 if (!domain.isEmpty())
218 writeString(sb,
"domain", domain);
220 if (screen.getResolution() == BookmarkBase.ScreenSettings.CUSTOM)
222 writeInt(sb,
"desktopwidth", screen.getWidth());
223 writeInt(sb,
"desktopheight", screen.getHeight());
225 writeInt(sb,
"session bpp", screen.getColors());
227 writeInt(sb,
"disable wallpaper", perf.getWallpaper() ? 0 : 1);
228 writeInt(sb,
"allow font smoothing", perf.getFontSmoothing() ? 1 : 0);
229 writeInt(sb,
"allow desktop composition", perf.getDesktopComposition() ? 1 : 0);
230 writeInt(sb,
"disable menu anims", perf.getMenuAnimations() ? 0 : 1);
231 writeInt(sb,
"disable themes", perf.getTheming() ? 0 : 1);
232 writeInt(sb,
"disable full window drag", perf.getFullWindowDrag() ? 0 : 1);
234 if (adv.getConsoleMode())
235 writeInt(sb,
"connect to console", 1);
237 int audioMode = adv.getRedirectSound();
239 writeInt(sb,
"audiomode", audioMode);
241 if (adv.getRedirectMicrophone())
242 writeInt(sb,
"audiocapturemode", 1);
244 String lbInfo = adv.getLoadBalanceInfo();
245 if (!lbInfo.isEmpty())
246 writeString(sb,
"loadbalanceinfo", lbInfo);
248 String remoteApp = adv.getRemoteProgram();
249 if (!remoteApp.isEmpty())
250 writeString(sb,
"remoteapplicationprogram", remoteApp);
252 String workDir = adv.getWorkDir();
253 if (!workDir.isEmpty())
254 writeString(sb,
"shell working directory", workDir);
256 if (bookmark.getEnableGatewaySettings())
258 BookmarkBase.GatewaySettings gw = bookmark.getGatewaySettings();
259 String gwHost = gw.getHostname();
260 int gwPort = gw.getPort();
261 writeString(sb,
"gatewayhostname", gwPort != 443 ? gwHost +
":" + gwPort : gwHost);
262 writeInt(sb,
"gatewayusagemethod", 2);
265 if (adv.getVmConnectMode())
266 writeString(sb,
"pcb", adv.getVmConnectGuid());
268 if (adv.getRedirectPrinter())
269 writeInt(sb,
"redirectprinters", 1);
271 return sb.toString();
274 private static void writeString(StringBuilder sb, String key, String value)
276 sb.append(key).append(
":s:").append(value).append(
"\r\n");
279 private static void writeInt(StringBuilder sb, String key,
int value)
281 sb.append(key).append(
":i:").append(value).append(
"\r\n");