fix: decode base64-encoded file content

This commit is contained in:
2026-05-27 12:20:35 -05:00
parent b09d082f11
commit 4658db7045
+247 -125
View File
@@ -1,125 +1,247 @@
LyoKICogQ29weXJpZ2h0IDIwMDktMjAxMSBDZWRyaWMgUHJpc2NhbAogKgogKiBMaWNlbnNlZCB1
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICog
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5Z
IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1
ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o
PgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8am5pLmg+
CgojaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgoKI2luY2x1ZGUgImFuZHJvaWQvbG9nLmgiCgpzdGF0
aWMgY29uc3QgY2hhciAqVEFHID0gInNlcmlhbF9wb3J0IjsKI2RlZmluZSBMT0dJKGZtdCwgYXJn
cy4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAgVEFHLCBmbXQsICMj
YXJncykKI2RlZmluZSBMT0dEKGZtdCwgYXJncy4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRS
T0lEX0xPR19ERUJVRywgVEFHLCBmbXQsICMjYXJncykKI2RlZmluZSBMT0dFKGZtdCwgYXJncy4u
LikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgVEFHLCBmbXQsICMjYXJn
cykKCnN0YXRpYyBzcGVlZF90IGdldEJhdWRyYXRlKGppbnQgYmF1ZHJhdGUpIHsKICAgIHN3aXRj
aCAoYmF1ZHJhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiBCMDsKICAg
ICAgICBjYXNlIDUwOgogICAgICAgICAgICByZXR1cm4gQjUwOwogICAgICAgIGNhc2UgNzU6CiAg
ICAgICAgICAgIHJldHVybiBCNzU7CiAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgIHJldHVy
biBCMTEwOwogICAgICAgIGNhc2UgMTM0OgogICAgICAgICAgICByZXR1cm4gQjEzNDsKICAgICAg
ICBjYXNlIDE1MDoKICAgICAgICAgICAgcmV0dXJuIEIxNTA7CiAgICAgICAgY2FzZSAyMDA6CiAg
ICAgICAgICAgIHJldHVybiBCMjAwOwogICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICByZXR1
cm4gQjMwMDsKICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgcmV0dXJuIEI2MDA7CiAgICAg
ICAgY2FzZSAxMjAwOgogICAgICAgICAgICByZXR1cm4gQjEyMDA7CiAgICAgICAgY2FzZSAxODAw
OgogICAgICAgICAgICByZXR1cm4gQjE4MDA7CiAgICAgICAgY2FzZSAyNDAwOgogICAgICAgICAg
ICByZXR1cm4gQjI0MDA7CiAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICByZXR1cm4gQjQ4
MDA7CiAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICByZXR1cm4gQjk2MDA7CiAgICAgICAg
Y2FzZSAxOTIwMDoKICAgICAgICAgICAgcmV0dXJuIEIxOTIwMDsKICAgICAgICBjYXNlIDM4NDAw
OgogICAgICAgICAgICByZXR1cm4gQjM4NDAwOwogICAgICAgIGNhc2UgNTc2MDA6CiAgICAgICAg
ICAgIHJldHVybiBCNTc2MDA7CiAgICAgICAgY2FzZSAxMTUyMDA6CiAgICAgICAgICAgIHJldHVy
biBCMTE1MjAwOwogICAgICAgIGNhc2UgMjMwNDAwOgogICAgICAgICAgICByZXR1cm4gQjIzMDQw
MDsKICAgICAgICBjYXNlIDQ2MDgwMDoKICAgICAgICAgICAgcmV0dXJuIEI0NjA4MDA7CiAgICAg
ICAgY2FzZSA1MDAwMDA6CiAgICAgICAgICAgIHJldHVybiBCNTAwMDAwOwogICAgICAgIGNhc2Ug
NTc2MDAwOgogICAgICAgICAgICByZXR1cm4gQjU3NjAwMDsKICAgICAgICBjYXNlIDkyMTYwMDoK
ICAgICAgICAgICAgcmV0dXJuIEI5MjE2MDA7CiAgICAgICAgY2FzZSAxMDAwMDAwOgogICAgICAg
ICAgICByZXR1cm4gQjEwMDAwMDA7CiAgICAgICAgY2FzZSAxMTUyMDAwOgogICAgICAgICAgICBy
ZXR1cm4gQjExNTIwMDA7CiAgICAgICAgY2FzZSAxNTAwMDAwOgogICAgICAgICAgICByZXR1cm4g
QjE1MDAwMDA7CiAgICAgICAgY2FzZSAyMDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjIwMDAw
MDA7CiAgICAgICAgY2FzZSAyNTAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjI1MDAwMDA7CiAg
ICAgICAgY2FzZSAzMDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjMwMDAwMDA7CiAgICAgICAg
Y2FzZSAzNTAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjM1MDAwMDA7CiAgICAgICAgY2FzZSA0
MDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjQwMDAwMDA7CiAgICAgICAgZGVmYXVsdDoKICAg
ICAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgovKgogKiBDbGFzczogICAgIGFuZHJvaWRfc2Vy
aWFscG9ydF9TZXJpYWxQb3J0CiAqIE1ldGhvZDogICAgb3BlbgogKiBTaWduYXR1cmU6IChMamF2
YS9sYW5nL1N0cmluZztJSUlJSSlMamF2YS9pby9GaWxlRGVzY3JpcHRvcjsKICovCkpOSUVYUE9S
VCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9hbmRyb2lkX3NlcmlhbHBvcnRfU2VyaWFsUG9ydF9vcGVu
CiAgICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgcGF0aCwgamludCBi
YXVkcmF0ZSwgamludCBkYXRhQml0cywgamludCBwYXJpdHksCiAgICAgICAgIGppbnQgc3RvcEJp
dHMsCiAgICAgICAgIGppbnQgZmxhZ3MpIHsKCiAgICBpbnQgZmQ7CiAgICBzcGVlZF90IHNwZWVk
OwogICAgam9iamVjdCBtRmlsZURlc2NyaXB0b3I7CgogICAgLyogQ2hlY2sgYXJndW1lbnRzICov
CiAgICB7CiAgICAgICAgc3BlZWQgPSBnZXRCYXVkcmF0ZShiYXVkcmF0ZSk7CiAgICAgICAgaWYg
KHNwZWVkID09IC0xKSB7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4Y2VwdGlvbiAq
LwogICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJhdWRyYXRlIik7CiAgICAgICAgICAgIHJldHVy
biBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBPcGVuaW5nIGRldmljZSAqLwogICAgewog
ICAgICAgIGpib29sZWFuIGlzY29weTsKICAgICAgICBjb25zdCBjaGFyICpwYXRoX3V0ZiA9ICgq
ZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBwYXRoLCAmaXNjb3B5KTsKICAgICAgICBMT0dE
KCJPcGVuaW5nIHNlcmlhbCBwb3J0ICVzIHdpdGggZmxhZ3MgMHgleCIsIHBhdGhfdXRmLCBPX1JE
V1IgfCBmbGFncyk7CiAgICAgICAgZmQgPSBvcGVuKHBhdGhfdXRmLCBPX1JEV1IgfCBmbGFncyk7
CiAgICAgICAgTE9HRCgib3BlbigpIGZkID0gJWQiLCBmZCk7CiAgICAgICAgKCplbnYpLT5SZWxl
YXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBwYXRoLCBwYXRoX3V0Zik7CiAgICAgICAgaWYgKGZkID09
IC0xKSB7CiAgICAgICAgICAgIC8qIFRocm93IGFuIGV4Y2VwdGlvbiAqLwogICAgICAgICAgICBM
T0dFKCJDYW5ub3Qgb3BlbiBwb3J0Iik7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4
Y2VwdGlvbiAqLwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAg
LyogQ29uZmlndXJlIGRldmljZSAqLwogICAgewogICAgICAgIHN0cnVjdCB0ZXJtaW9zIGNmZzsK
ICAgICAgICBMT0dEKCJDb25maWd1cmluZyBzZXJpYWwgcG9ydCIpOwogICAgICAgIGlmICh0Y2dl
dGF0dHIoZmQsICZjZmcpKSB7CiAgICAgICAgICAgIExPR0UoInRjZ2V0YXR0cigpIGZhaWxlZCIp
OwogICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4
Y2VwdGlvbiAqLwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIGNm
bWFrZXJhdygmY2ZnKTsKICAgICAgICBjZnNldGlzcGVlZCgmY2ZnLCBzcGVlZCk7CiAgICAgICAg
Y2ZzZXRvc3BlZWQoJmNmZywgc3BlZWQpOwoKCiAgICAgICAgY2ZnLmNfY2ZsYWcgJj0gfkNTSVpF
OwogICAgICAgIHN3aXRjaCAoZGF0YUJpdHMpIHsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAg
ICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M1OyAgICAvL+S9v+eUqDXkvY3mlbDmja7kvY0KICAg
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBj
ZmcuY19jZmxhZyB8PSBDUzY7ICAgIC8v5L2/55SoNuS9jeaVsOaNruS9jQogICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgIGNmZy5jX2NmbGFn
IHw9IENTNzsgICAgLy/kvb/nlKg35L2N5pWw5o2u5L2NCiAgICAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M4OyAg
ICAvL+S9v+eUqDjkvY3mlbDmja7kvY0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
ICBkZWZhdWx0OgogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M4OwogICAgICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHBhcml0eSkgewogICAgICAg
ICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjZmcuY19jZmxhZyAmPSB+UEFSRU5COyAgICAv
L+aXoOWlh+WBtuagoemqjAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ug
MToKICAgICAgICAgICAgICAgIGNmZy5jX2NmbGFnIHw9IChQQVJPREQgfCBQQVJFTkIpOyAgIC8v
5aWH5qCh6aqMCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAg
ICAgICAgICAgICAgY2ZnLmNfaWZsYWcgJj0gfihJR05QQVIgfCBQQVJNUkspOyAvLyDlgbbmoKHp
qowKICAgICAgICAgICAgICAgIGNmZy5jX2lmbGFnIHw9IElOUENLOwogICAgICAgICAgICAgICAg
Y2ZnLmNfY2ZsYWcgfD0gUEFSRU5COwogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgJj0gflBB
Uk9ERDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAg
ICAgICAgY2ZnLmNfY2ZsYWcgJj0gflBBUkVOQjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAg
ICAgIH0KCiAgICAgICAgc3dpdGNoIChzdG9wQml0cykgewogICAgICAgICAgICBjYXNlIDE6CiAg
ICAgICAgICAgICAgICBjZmcuY19jZmxhZyAmPSB+Q1NUT1BCOyAgICAvLzHkvY3lgZzmraLkvY0K
ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAg
ICBjZmcuY19jZmxhZyB8PSBDU1RPUEI7ICAgIC8vMuS9jeWBnOatouS9jQogICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjZmcuY19jZmxh
ZyAmPSB+Q1NUT1BCOyAgICAvLzHkvY3lgZzmraLkvY0KICAgICAgICAgICAgICAgIGJyZWFrOwog
ICAgICAgIH0KCiAgICAgICAgaWYgKHRjc2V0YXR0cihmZCwgVENTQU5PVywgJmNmZykpIHsKICAg
ICAgICAgICAgTE9HRSgidGNzZXRhdHRyKCkgZmFpbGVkIik7CiAgICAgICAgICAgIGNsb3NlKGZk
KTsKICAgICAgICAgICAgLyogVE9ETzogdGhyb3cgYW4gZXhjZXB0aW9uICovCiAgICAgICAgICAg
IHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDcmVhdGUgYSBjb3JyZXNwb25k
aW5nIGZpbGUgZGVzY3JpcHRvciAqLwogICAgewogICAgICAgIGpjbGFzcyBjRmlsZURlc2NyaXB0
b3IgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CiAg
ICAgICAgam1ldGhvZElEIGlGaWxlRGVzY3JpcHRvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52
LCBjRmlsZURlc2NyaXB0b3IsICI8aW5pdD4iLCAiKClWIik7CiAgICAgICAgamZpZWxkSUQgZGVz
Y3JpcHRvcklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY0ZpbGVEZXNjcmlwdG9yLCAiZGVz
Y3JpcHRvciIsICJJIik7CiAgICAgICAgbUZpbGVEZXNjcmlwdG9yID0gKCplbnYpLT5OZXdPYmpl
Y3QoZW52LCBjRmlsZURlc2NyaXB0b3IsIGlGaWxlRGVzY3JpcHRvcik7CiAgICAgICAgKCplbnYp
LT5TZXRJbnRGaWVsZChlbnYsIG1GaWxlRGVzY3JpcHRvciwgZGVzY3JpcHRvcklELCAoamludCkg
ZmQpOwogICAgfQoKICAgIHJldHVybiBtRmlsZURlc2NyaXB0b3I7Cn0KCi8qCiAqIENsYXNzOiAg
ICAgY2VkcmljX3NlcmlhbF9TZXJpYWxQb3J0CiAqIE1ldGhvZDogICAgY2xvc2UKICogU2lnbmF0
dXJlOiAoKVYKICovCkpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9hbmRyb2lkX3NlcmlhbHBv
cnRfU2VyaWFsUG9ydF9jbG9zZQogICAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KSB7
CiAgICBqY2xhc3MgU2VyaWFsUG9ydENsYXNzID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYs
IHRoaXopOwogICAgamNsYXNzIEZpbGVEZXNjcmlwdG9yQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFz
cyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CgogICAgamZpZWxkSUQgbUZkSUQgPSAo
KmVudiktPkdldEZpZWxkSUQoZW52LCBTZXJpYWxQb3J0Q2xhc3MsICJtRmQiLCAiTGphdmEvaW8v
RmlsZURlc2NyaXB0b3I7Iik7CiAgICBqZmllbGRJRCBkZXNjcmlwdG9ySUQgPSAoKmVudiktPkdl
dEZpZWxkSUQoZW52LCBGaWxlRGVzY3JpcHRvckNsYXNzLCAiZGVzY3JpcHRvciIsICJJIik7Cgog
ICAgam9iamVjdCBtRmQgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgdGhpeiwgbUZkSUQp
OwogICAgamludCBkZXNjcmlwdG9yID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIG1GZCwgZGVz
Y3JpcHRvcklEKTsKCiAgICBMT0dEKCJjbG9zZShmZCA9ICVkKSIsIGRlc2NyaXB0b3IpOwogICAg
Y2xvc2UoZGVzY3JpcHRvcik7Cn0KCg==
/*
* Copyright 2009-2011 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.
*/
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <jni.h>
#include "SerialPort.h"
#include "android/log.h"
static const char *TAG = "serial_port";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
static speed_t getBaudrate(jint baudrate) {
switch (baudrate) {
case 0:
return B0;
case 50:
return B50;
case 75:
return B75;
case 110:
return B110;
case 134:
return B134;
case 150:
return B150;
case 200:
return B200;
case 300:
return B300;
case 600:
return B600;
case 1200:
return B1200;
case 1800:
return B1800;
case 2400:
return B2400;
case 4800:
return B4800;
case 9600:
return B9600;
case 19200:
return B19200;
case 38400:
return B38400;
case 57600:
return B57600;
case 115200:
return B115200;
case 230400:
return B230400;
case 460800:
return B460800;
case 500000:
return B500000;
case 576000:
return B576000;
case 921600:
return B921600;
case 1000000:
return B1000000;
case 1152000:
return B1152000;
case 1500000:
return B1500000;
case 2000000:
return B2000000;
case 2500000:
return B2500000;
case 3000000:
return B3000000;
case 3500000:
return B3500000;
case 4000000:
return B4000000;
default:
return -1;
}
}
/*
* Class: android_serialport_SerialPort
* Method: open
* Signature: (Ljava/lang/String;IIIII)Ljava/io/FileDescriptor;
*/
JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open
(JNIEnv *env, jobject thiz, jstring path, jint baudrate, jint dataBits, jint parity,
jint stopBits,
jint flags) {
int fd;
speed_t speed;
jobject mFileDescriptor;
/* Check arguments */
{
speed = getBaudrate(baudrate);
if (speed == -1) {
/* TODO: throw an exception */
LOGE("Invalid baudrate");
return NULL;
}
}
/* Opening device */
{
jboolean iscopy;
const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags);
fd = open(path_utf, O_RDWR | flags);
LOGD("open() fd = %d", fd);
(*env)->ReleaseStringUTFChars(env, path, path_utf);
if (fd == -1) {
/* Throw an exception */
LOGE("Cannot open port");
/* TODO: throw an exception */
return NULL;
}
}
/* Configure device */
{
struct termios cfg;
LOGD("Configuring serial port");
if (tcgetattr(fd, &cfg)) {
LOGE("tcgetattr() failed");
close(fd);
/* TODO: throw an exception */
return NULL;
}
cfmakeraw(&cfg);
cfsetispeed(&cfg, speed);
cfsetospeed(&cfg, speed);
cfg.c_cflag &= ~CSIZE;
switch (dataBits) {
case 5:
cfg.c_cflag |= CS5; //使用5位数据位
break;
case 6:
cfg.c_cflag |= CS6; //使用6位数据位
break;
case 7:
cfg.c_cflag |= CS7; //使用7位数据位
break;
case 8:
cfg.c_cflag |= CS8; //使用8位数据位
break;
default:
cfg.c_cflag |= CS8;
break;
}
switch (parity) {
case 0:
cfg.c_cflag &= ~PARENB; //无奇偶校验
break;
case 1:
cfg.c_cflag |= (PARODD | PARENB); //奇校验
break;
case 2:
cfg.c_iflag &= ~(IGNPAR | PARMRK); // 偶校验
cfg.c_iflag |= INPCK;
cfg.c_cflag |= PARENB;
cfg.c_cflag &= ~PARODD;
break;
default:
cfg.c_cflag &= ~PARENB;
break;
}
switch (stopBits) {
case 1:
cfg.c_cflag &= ~CSTOPB; //1位停止位
break;
case 2:
cfg.c_cflag |= CSTOPB; //2位停止位
break;
default:
cfg.c_cflag &= ~CSTOPB; //1位停止位
break;
}
if (tcsetattr(fd, TCSANOW, &cfg)) {
LOGE("tcsetattr() failed");
close(fd);
/* TODO: throw an exception */
return NULL;
}
}
/* Create a corresponding file descriptor */
{
jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor");
jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "<init>", "()V");
jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I");
mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor);
(*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint) fd);
}
return mFileDescriptor;
}
/*
* Class: cedric_serial_SerialPort
* Method: close
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close
(JNIEnv *env, jobject thiz) {
jclass SerialPortClass = (*env)->GetObjectClass(env, thiz);
jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor");
jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd", "Ljava/io/FileDescriptor;");
jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I");
jobject mFd = (*env)->GetObjectField(env, thiz, mFdID);
jint descriptor = (*env)->GetIntField(env, mFd, descriptorID);
LOGD("close(fd = %d)", descriptor);
close(descriptor);
}