fix: decode base64-encoded file content

This commit is contained in:
2026-05-27 12:20:59 -05:00
parent 5b48e316c6
commit 92ba4d8618
@@ -1,76 +1,128 @@
LyoKICogQ29weXJpZ2h0IDIwMDkgQ2VkcmljIFByaXNjYWwKICogCiAqIExpY2Vuc2VkIHVuZGVy /*
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3Ug * Copyright 2009 Cedric Priscal
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu *
c2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiAKICogaHR0 * Licensed under the Apache License, Version 2.0 (the "License");
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqIAogKiBVbmxlc3MgcmVx * you may not use this file except in compliance with the License.
dWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJl * You may obtain a copy of the License at
CiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB *
UyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL * http://www.apache.org/licenses/LICENSE-2.0
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRo *
ZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRp * Unless required by applicable law or agreed to in writing, software
b25zIHVuZGVyIHRoZSBMaWNlbnNlLiAKICovCgpwYWNrYWdlIGFuZHJvaWQuc2VyaWFscG9ydDsK * distributed under the License is distributed on an "AS IS" BASIS,
CmltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
YS5pby5GaWxlUmVhZGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEu * See the License for the specific language governing permissions and
aW8uTGluZU51bWJlclJlYWRlcjsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGph * limitations under the License.
dmEudXRpbC5WZWN0b3I7CgpwdWJsaWMgY2xhc3MgU2VyaWFsUG9ydEZpbmRlciB7CgogICAgcHVi */
bGljIGNsYXNzIERyaXZlciB7CiAgICAgICAgcHVibGljIERyaXZlcihTdHJpbmcgbmFtZSwgU3Ry
aW5nIHJvb3QpIHsKICAgICAgICAgICAgbURyaXZlck5hbWUgPSBuYW1lOwogICAgICAgICAgICBt package android.serialport;
RGV2aWNlUm9vdCA9IHJvb3Q7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIFN0cmluZyBtRHJp
dmVyTmFtZTsKICAgICAgICBwcml2YXRlIFN0cmluZyBtRGV2aWNlUm9vdDsKICAgICAgICBWZWN0 import android.util.Log;
b3I8RmlsZT4gbURldmljZXMgPSBudWxsOwoKICAgICAgICBwdWJsaWMgVmVjdG9yPEZpbGU+IGdl import java.io.File;
dERldmljZXMoKSB7CiAgICAgICAgICAgIGlmIChtRGV2aWNlcyA9PSBudWxsKSB7CiAgICAgICAg import java.io.FileReader;
ICAgICAgICBtRGV2aWNlcyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKICAgICAgICAgICAgICAgIEZp import java.io.IOException;
bGUgZGV2ID0gbmV3IEZpbGUoIi9kZXYiKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg import java.io.LineNumberReader;
ICAgRmlsZVtdIGZpbGVzID0gZGV2Lmxpc3RGaWxlcygpOwoKICAgICAgICAgICAgICAgIGlmIChm import java.util.Iterator;
aWxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAg import java.util.Vector;
ICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKS5zdGFydHNXaXRoKG1EZXZp public class SerialPortFinder {
Y2VSb290KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRm91bmQg
bmV3IGRldmljZTogIiArIGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1E public class Driver {
ZXZpY2VzLmFkZChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg public Driver(String name, String root) {
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAg mDriverName = name;
cmV0dXJuIG1EZXZpY2VzOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1l mDeviceRoot = root;
KCkgewogICAgICAgICAgICByZXR1cm4gbURyaXZlck5hbWU7CiAgICAgICAgfQogICAgfQoKICAg }
IHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2VyaWFsUG9ydCI7CgogICAgcHJp
dmF0ZSBWZWN0b3I8RHJpdmVyPiBtRHJpdmVycyA9IG51bGw7CgogICAgVmVjdG9yPERyaXZlcj4g private String mDriverName;
Z2V0RHJpdmVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaWYgKG1Ecml2ZXJzID09 private String mDeviceRoot;
IG51bGwpIHsKICAgICAgICAgICAgbURyaXZlcnMgPSBuZXcgVmVjdG9yPERyaXZlcj4oKTsKICAg Vector<File> mDevices = null;
ICAgICAgICAgTGluZU51bWJlclJlYWRlciByID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IEZp
bGVSZWFkZXIoIi9wcm9jL3R0eS9kcml2ZXJzIikpOwogICAgICAgICAgICBTdHJpbmcgbDsKICAg public Vector<File> getDevices() {
ICAgICAgICAgd2hpbGUgKChsID0gci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAg if (mDevices == null) {
ICAgICAvLyBJc3N1ZSAzOgogICAgICAgICAgICAgICAgLy8gU2luY2UgZHJpdmVyIG5hbWUgbWF5 mDevices = new Vector<File>();
IGNvbnRhaW4gc3BhY2VzLCB3ZSBkbyBub3QgZXh0cmFjdCBkcml2ZXIgbmFtZSB3aXRoIHNwbGl0 File dev = new File("/dev");
KCkKICAgICAgICAgICAgICAgIFN0cmluZyBkcml2ZXJuYW1lID0gbC5zdWJzdHJpbmcoMCwgMHgx
NSkudHJpbSgpOwogICAgICAgICAgICAgICAgU3RyaW5nW10gdyA9IGwuc3BsaXQoIiArIik7CiAg File[] files = dev.listFiles();
ICAgICAgICAgICAgICBpZiAoKHcubGVuZ3RoID49IDUpICYmICh3W3cubGVuZ3RoIC0gMV0uZXF1
YWxzKCJzZXJpYWwiKSkpIHsKICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGb3VuZCBu if (files != null) {
ZXcgZHJpdmVyICIgKyBkcml2ZXJuYW1lICsgIiBvbiAiICsgd1t3Lmxlbmd0aCAtIDRdKTsKICAg int i;
ICAgICAgICAgICAgICAgICBtRHJpdmVycy5hZGQobmV3IERyaXZlcihkcml2ZXJuYW1lLCB3W3cu for (i = 0; i < files.length; i++) {
bGVuZ3RoIC0gNF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAg if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
ICByLmNsb3NlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtRHJpdmVyczsKICAgIH0KCiAg Log.d(TAG, "Found new device: " + files[i]);
ICBwdWJsaWMgU3RyaW5nW10gZ2V0QWxsRGV2aWNlcygpIHsKICAgICAgICBWZWN0b3I8U3RyaW5n mDevices.add(files[i]);
PiBkZXZpY2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CiAgICAgICAgLy8gUGFyc2UgZWFjaCBk }
cml2ZXIKICAgICAgICBJdGVyYXRvcjxEcml2ZXI+IGl0ZHJpdjsKICAgICAgICB0cnkgewogICAg }
ICAgICAgICBpdGRyaXYgPSBnZXREcml2ZXJzKCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgd2hp }
bGUgKGl0ZHJpdi5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgIERyaXZlciBkcml2ZXIgPSBp }
dGRyaXYubmV4dCgpOwogICAgICAgICAgICAgICAgSXRlcmF0b3I8RmlsZT4gaXRkZXYgPSBkcml2 return mDevices;
ZXIuZ2V0RGV2aWNlcygpLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoaXRkZXYu }
aGFzTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZSA9IGl0ZGV2Lm5l
eHQoKS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3RyaW5n public String getName() {
LmZvcm1hdCgiJXMgKCVzKSIsIGRldmljZSwgZHJpdmVyLmdldE5hbWUoKSk7CiAgICAgICAgICAg return mDriverName;
ICAgICAgICAgZGV2aWNlcy5hZGQodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg }
ICB9CiAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50 }
U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5l
dyBTdHJpbmdbZGV2aWNlcy5zaXplKCldKTsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nW10gZ2V0 private static final String TAG = "SerialPort";
QWxsRGV2aWNlc1BhdGgoKSB7CiAgICAgICAgVmVjdG9yPFN0cmluZz4gZGV2aWNlcyA9IG5ldyBW
ZWN0b3I8U3RyaW5nPigpOwogICAgICAgIC8vIFBhcnNlIGVhY2ggZHJpdmVyCiAgICAgICAgSXRl private Vector<Driver> mDrivers = null;
cmF0b3I8RHJpdmVyPiBpdGRyaXY7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaXRkcml2ID0g
Z2V0RHJpdmVycygpLml0ZXJhdG9yKCk7CiAgICAgICAgICAgIHdoaWxlIChpdGRyaXYuaGFzTmV4 Vector<Driver> getDrivers() throws IOException {
dCgpKSB7CiAgICAgICAgICAgICAgICBEcml2ZXIgZHJpdmVyID0gaXRkcml2Lm5leHQoKTsKICAg if (mDrivers == null) {
ICAgICAgICAgICAgIEl0ZXJhdG9yPEZpbGU+IGl0ZGV2ID0gZHJpdmVyLmdldERldmljZXMoKS5p mDrivers = new Vector<Driver>();
dGVyYXRvcigpOwogICAgICAgICAgICAgICAgd2hpbGUgKGl0ZGV2Lmhhc05leHQoKSkgewogICAg LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
ICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UgPSBpdGRldi5uZXh0KCkuZ2V0QWJzb2x1dGVQ String l;
YXRoKCk7CiAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAg while ((l = r.readLine()) != null) {
ICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsK // Issue 3:
ICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJu // Since driver name may contain spaces, we do not extract driver name with split()
IGRldmljZXMudG9BcnJheShuZXcgU3RyaW5nW2RldmljZXMuc2l6ZSgpXSk7CiAgICB9Cn0K String drivername = l.substring(0, 0x15).trim();
String[] w = l.split(" +");
if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) {
Log.d(TAG, "Found new driver " + drivername + " on " + w[w.length - 4]);
mDrivers.add(new Driver(drivername, w[w.length - 4]));
}
}
r.close();
}
return mDrivers;
}
public String[] getAllDevices() {
Vector<String> devices = new Vector<String>();
// Parse each driver
Iterator<Driver> itdriv;
try {
itdriv = getDrivers().iterator();
while (itdriv.hasNext()) {
Driver driver = itdriv.next();
Iterator<File> itdev = driver.getDevices().iterator();
while (itdev.hasNext()) {
String device = itdev.next().getName();
String value = String.format("%s (%s)", device, driver.getName());
devices.add(value);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return devices.toArray(new String[devices.size()]);
}
public String[] getAllDevicesPath() {
Vector<String> devices = new Vector<String>();
// Parse each driver
Iterator<Driver> itdriv;
try {
itdriv = getDrivers().iterator();
while (itdriv.hasNext()) {
Driver driver = itdriv.next();
Iterator<File> itdev = driver.getDevices().iterator();
while (itdev.hasNext()) {
String device = itdev.next().getAbsolutePath();
devices.add(device);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return devices.toArray(new String[devices.size()]);
}
}