summaryrefslogtreecommitdiff
path: root/gatosocket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gatosocket.cpp')
-rw-r--r--gatosocket.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/gatosocket.cpp b/gatosocket.cpp
index e814e8c..73567b5 100644
--- a/gatosocket.cpp
+++ b/gatosocket.cpp
@@ -126,6 +126,11 @@ GatoSocket::SecurityLevel GatoSocket::securityLevel() const
bt_security bt_sec;
socklen_t len = sizeof(bt_sec);
+ if (s == StateDisconnected) {
+ qWarning() << "Socket not connected";
+ return SecurityNone;
+ }
+
if (::getsockopt(fd, SOL_BLUETOOTH, BT_SECURITY, &bt_sec, &len) == 0) {
switch (bt_sec.level) {
case BT_SECURITY_SDP:
@@ -144,6 +149,39 @@ GatoSocket::SecurityLevel GatoSocket::securityLevel() const
return SecurityNone;
}
+bool GatoSocket::setSecurityLevel(SecurityLevel level)
+{
+ bt_security bt_sec;
+ socklen_t len = sizeof(bt_sec);
+
+ if (s == StateDisconnected) {
+ qWarning() << "Socket not connected";
+ return SecurityNone;
+ }
+
+ switch (level) {
+ case SecurityNone:
+ case SecurityLow:
+ bt_sec.level = BT_SECURITY_LOW;
+ break;
+ case SecurityMedium:
+ bt_sec.level = BT_SECURITY_MEDIUM;
+ break;
+ case SecurityHigh:
+ // Will this even work in BT LE?
+ bt_sec.level = BT_SECURITY_HIGH;
+ break;
+ }
+ bt_sec.key_size = 0;
+
+ if (::setsockopt(fd, SOL_BLUETOOTH, BT_SECURITY, &bt_sec, len) == 0) {
+ return true;
+ } else {
+ qErrnoWarning("Could not set security level in L2 socket");
+ return false;
+ }
+}
+
bool GatoSocket::transmit(const QByteArray &pkt)
{
int written = ::write(fd, pkt.constData(), pkt.size());