Add format check utils method for bcradio metadata
Added format check method for AIDL broadcast radio HAL metadata in
AIDL utils library. Also corrected local variable name in
getMetadataString method.
Bug: 318868350
Test: atest broadcastradio_utils_aidl_test
Change-Id: I8220e2845143931e99b4e4da0e07c9cae585588e
diff --git a/broadcastradio/common/utilsaidl/src/Utils.cpp b/broadcastradio/common/utilsaidl/src/Utils.cpp
index b647442..ddc5b8d 100644
--- a/broadcastradio/common/utilsaidl/src/Utils.cpp
+++ b/broadcastradio/common/utilsaidl/src/Utils.cpp
@@ -442,9 +442,9 @@
}
std::optional<std::string> getMetadataString(const ProgramInfo& info, const Metadata::Tag& tag) {
- auto isRdsPs = [tag](const Metadata& item) { return item.getTag() == tag; };
+ auto hasMetadataType = [tag](const Metadata& item) { return item.getTag() == tag; };
- auto it = std::find_if(info.metadata.begin(), info.metadata.end(), isRdsPs);
+ auto it = std::find_if(info.metadata.begin(), info.metadata.end(), hasMetadataType);
if (it == info.metadata.end()) {
return std::nullopt;
}
@@ -579,6 +579,45 @@
return getHdFrequency(sel);
}
+bool isValidMetadata(const Metadata& metadata) {
+ bool valid = true;
+
+ auto expect = [&valid](bool condition, const std::string& message) {
+ if (!condition) {
+ valid = false;
+ LOG(ERROR) << "metadata not valid, expected " << message;
+ }
+ };
+
+ switch (metadata.getTag()) {
+ case Metadata::rdsPty:
+ expect(metadata.get<Metadata::rdsPty>() >= 0, "RDS PTY >= 0");
+ expect(metadata.get<Metadata::rdsPty>() <= std::numeric_limits<uint8_t>::max(),
+ "8bit RDS PTY");
+ break;
+ case Metadata::rbdsPty:
+ expect(metadata.get<Metadata::rbdsPty>() >= 0, "RBDS PTY >= 0");
+ expect(metadata.get<Metadata::rbdsPty>() <= std::numeric_limits<uint8_t>::max(),
+ "8bit RBDS PTY");
+ break;
+ case Metadata::dabEnsembleNameShort:
+ expect(metadata.get<Metadata::dabEnsembleNameShort>().size() <= 8,
+ "Dab ensemble name abbreviated length <= 8");
+ break;
+ case Metadata::dabServiceNameShort:
+ expect(metadata.get<Metadata::dabServiceNameShort>().size() <= 8,
+ "Dab component name abbreviated length <= 8");
+ break;
+ case Metadata::dabComponentNameShort:
+ expect(metadata.get<Metadata::dabComponentNameShort>().size() <= 8,
+ "Dab component name abbreviated length <= 8");
+ break;
+ default:
+ break;
+ }
+ return valid;
+}
+
bool parseArgInt(const std::string& s, int* out) {
return ::android::base::ParseInt(s, out);
}
diff --git a/broadcastradio/common/utilsaidl/src/UtilsV2.cpp b/broadcastradio/common/utilsaidl/src/UtilsV2.cpp
index ef739df..6c75759 100644
--- a/broadcastradio/common/utilsaidl/src/UtilsV2.cpp
+++ b/broadcastradio/common/utilsaidl/src/UtilsV2.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "BcRadioAidlDef.utilsV2"
#include "broadcastradio-utils-aidl/UtilsV2.h"
+#include "broadcastradio-utils-aidl/Utils.h"
#include <android-base/logging.h>
#include <android-base/strings.h>
@@ -137,10 +138,33 @@
return isValidV2(sel.primaryId);
}
-std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag) {
- auto isRdsPs = [tag](const Metadata& item) { return item.getTag() == tag; };
+bool isValidMetadataV2(const Metadata& metadata) {
+ if (!isValidMetadata(metadata)) {
+ return false;
+ }
- auto it = std::find_if(info.metadata.begin(), info.metadata.end(), isRdsPs);
+ if (metadata.getTag() == Metadata::hdStationNameShort) {
+ if (metadata.get<Metadata::hdStationNameShort>().size() > 12) {
+ LOG(ERROR) << "metadata not valid, expected HD short name length <= 12";
+ return false;
+ }
+ } else if (metadata.getTag() == Metadata::hdSubChannelsAvailable) {
+ if (metadata.get<Metadata::hdSubChannelsAvailable>() < 0) {
+ LOG(ERROR) << "metadata not valid, expected HD subchannels available >= 0";
+ return false;
+ } else if (metadata.get<Metadata::hdSubChannelsAvailable>() >
+ std::numeric_limits<uint8_t>::max()) {
+ LOG(ERROR) << "metadata not valid, expected 8bit HD subchannels available";
+ return false;
+ }
+ }
+ return true;
+}
+
+std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag) {
+ auto hasMetadataType = [tag](const Metadata& item) { return item.getTag() == tag; };
+
+ auto it = std::find_if(info.metadata.begin(), info.metadata.end(), hasMetadataType);
if (it == info.metadata.end()) {
return std::nullopt;
}