--- /dev/null
+/*
+ * Copyright (C) 2009 by Matthias Ringwald
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
+ * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/*
+ * SpringBoardAcess.c
+ *
+ * Created by Matthias Ringwald on 9/20/09.
+ *
+ */
+
+#include "SpringBoardAccess.h"
+
+#import <CoreFoundation/CoreFoundation.h>
+
+static CFMessagePortRef springBoardAccessMessagePort = 0;
+
+
+static void SBA_refresh(){
+ // still valid
+ if (springBoardAccessMessagePort && !CFMessagePortIsValid(springBoardAccessMessagePort)){
+ CFRelease(springBoardAccessMessagePort);
+ springBoardAccessMessagePort = NULL;
+ }
+ // create new one
+ if (!springBoardAccessMessagePort) {
+ springBoardAccessMessagePort = CFMessagePortCreateRemote(NULL, CFSTR(SBA_MessagePortName));
+ }
+}
+
+int SBA_available(){
+ SBA_refresh();
+ if (springBoardAccessMessagePort) return 1;
+ return 0;
+}
+
+static int SBA_sendMessage(UInt8 cmd, UInt16 dataLen, UInt8 *data, CFDataRef *resultData){
+
+ SBA_refresh();
+
+ // well, won't work
+ if (!springBoardAccessMessagePort) {
+ return kCFMessagePortIsInvalid;
+ }
+ // create and send message
+ CFDataRef cfData = CFDataCreate(NULL, data, dataLen);
+ CFStringRef replyMode = NULL;
+ if (resultData) {
+ replyMode = kCFRunLoopDefaultMode;
+ }
+ int result = CFMessagePortSendRequest(springBoardAccessMessagePort, cmd, cfData, 1, 1, replyMode, resultData);
+ CFRelease(cfData);
+ return result;
+}
+
+int SBA_addStatusBarImage(char *name){
+ return SBA_sendMessage(SBAC_addStatusBarImage, strlen(name), (UInt8*) name, NULL);
+}
+
+int SBA_removeStatusBarImage(char *name){
+ return SBA_sendMessage(SBAC_removeStatusBarImage, strlen(name), (UInt8*) name, NULL);
+}
+
+int SBA_getBluetoothEnabled() {
+ CFDataRef cfData;
+ int result = SBA_sendMessage(SBAC_getBluetoothEnabled, 0, NULL, &cfData);
+ if (result == 0){
+ const uint8_t *data = CFDataGetBytePtr(cfData);
+ UInt16 dataLen = CFDataGetLength(cfData);
+ if (!dataLen) return -10;
+ if (data[0]) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+ CFRelease(cfData);
+ } else {
+ // error talking to SpringBoardAccess
+ // well, assume it's off and hope for the best
+ result = 0;
+ }
+ return result;
+}
+
+int SBA_setBluetoothEnabled(int on){
+ uint8_t enabled = 0;
+ if (on) enabled = 1;
+ return SBA_sendMessage(SBAC_setBluetoothEnabled, 1, (UInt8*) &enabled, NULL);
+}
+
+
--- /dev/null
+/*
+ * Copyright (C) 2009 by Matthias Ringwald
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
+ * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/*
+ * SpringBoardAccess.h
+ *
+ * Allows to add and remove images to/from status bar
+ *
+ * The images must be installed in:
+ * /System/Library/CoreServices/SpringBoard.app/
+ *
+ * Only the base name is required, e.g., Bluetooth instead of Default_Bluetooth.png
+ * Created by Matthias Ringwald on 9/20/09.
+ *
+ */
+#pragma once
+
+#define SBA_MessagePortName "SpringBoardAccess"
+
+#define SBAC_nop
+#define SBAC_addStatusBarImage 1
+#define SBAC_removeStatusBarImage 2
+#define SBAC_getBluetoothEnabled 3
+#define SBAC_setBluetoothEnabled 4
+
+/**
+ * Enables named status bar icon in Springboard
+ * @returns CFMessagePortSendRequest error: 0 = ok
+ */
+int SBA_addStatusBarImage(char *name);
+
+/**
+ * Disables named status bar icon in Springboard
+ * @returns CFMessagePortSendRequest error: 0 = ok
+ */
+int SBA_removeStatusBarImage(char *name);
+
+/**
+ * Get Bluetoot enabled property
+ * @returns < 0 error: 0 = OFF, 1 = ON
+ */
+int SBA_getBluetoothEnabled();
+
+/**
+ * Set Bluetooth enable property: 0 for OFF, otherwise on
+ * @returns CFMessagePortSendRequest error: 0 = ok
+ */
+int SBA_setBluetoothEnabled(int on);
+
+/**
+ * Tests if SpringBoardAccess server is available
+ */
+int SBA_available();