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