(→Server) |
Douglassrs (talk | contribs) m (→The Callback) |
||
(8 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
LightMessaging is | LightMessaging is a work-in-progress [[IPC|inter-process communication]] header-only library by [[User:Rpetrich|Ryan Petrich]]. According to its [https://github.com/rpetrich/LightMessaging GitHub page], it is a "simple low-level replacement for CFMessagePort". | ||
== How to use this library == | == How to use this library == | ||
Line 17: | Line 17: | ||
<source lang="objc"> | <source lang="objc"> | ||
#define LIGHTMESSAGING_USE_ROCKETBOOTSTRAP 0 | #define LIGHTMESSAGING_USE_ROCKETBOOTSTRAP 0 | ||
</source> | |||
=== Timeouts === | |||
Use this directive (before including the LM header) to set the timeout: | |||
<source lang="objc"> | |||
#define LIGHTMESSAGING_TIMEOUT 500 // 500 ms timeout | |||
</source> | </source> | ||
== Server == | == Server == | ||
This must be done in a non-sandboxed process. Typically, this is done in [[SpringBoard.app|SpringBoard]] or a | This must be done in a non-sandboxed process. Typically, this is done in [[SpringBoard.app|SpringBoard]] or a ''non-sandboxed'' [[Daemons|daemon]]. If you put the server anywhere other than SpringBoard, then you must register the service in SpringBoard using <code>rocketbootstrap_unlock</code>. [[RocketBootstrap#Usage_notes|More info here]]. | ||
'''Disclaimer''': The server interface is not finished yet; it may change in a future version. | |||
=== The Callback === | === The Callback === | ||
<source lang="objc"> | <source lang="objc"> | ||
void some_callback(CFMachPortRef port, | void some_callback(CFMachPortRef port, LMMessage *message, CFIndex size, void *info) { | ||
{ | |||
// get the reply port | // get the reply port | ||
mach_port_t replyPort = | mach_port_t replyPort = message->head.msgh_remote_port; | ||
// | // Check validity of message | ||
if (size | if (!LMDataWithSizeIsValidMessage(message, size)) { | ||
LMSendReply(replyPort, NULL, 0); | LMSendReply(replyPort, NULL, 0); | ||
LMResponseBufferFree((LMResponseBuffer *) | LMResponseBufferFree((LMResponseBuffer *)message); | ||
return; | return; | ||
} | } | ||
// | // Get the data you received | ||
void *data = LMMessageGetData( | void *data = LMMessageGetData(message); | ||
size_t length = LMMessageGetDataLength(message); | |||
// Make it into a CFDataRef object | |||
CFDataRef cfdata = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (const UInt8 *)data ?: (const UInt8 *)&data, length, kCFAllocatorNull); | |||
// | // Send some data back | ||
const char *msg = "lol"; | const char *msg = "lol"; | ||
LMSendReply(replyPort, msg, strlen(msg) + 1); | LMSendReply(replyPort, msg, strlen(msg) + 1); | ||
// | // Free the CFDataRef object | ||
LMResponseBufferFree((LMResponseBuffer *) | if (cfdata) { | ||
CFRelease(cfdata); | |||
} | |||
// Free the response buffer | |||
LMResponseBufferFree((LMResponseBuffer *)message); | |||
} | } | ||
</source> | </source> | ||
Line 79: | Line 92: | ||
// do whatever you want !!!! | // do whatever you want !!!! | ||
const char *data = LMMessageGetData(response); | const char *data = LMMessageGetData(response); | ||
//cleanup | |||
LMResponseBufferFree(&buffer); | |||
</source> | </source> | ||
Line 91: | Line 107: | ||
* [https://github.com/r-plus/libcanopenurl/blob/master/LCCanOpenURL.x libcanopenurl] | * [https://github.com/r-plus/libcanopenurl/blob/master/LCCanOpenURL.x libcanopenurl] | ||
* [https://github.com/rpetrich/AppList/blob/master/ALApplicationList.x AppList] | * [https://github.com/rpetrich/AppList/blob/master/ALApplicationList.x AppList] | ||
* [https://github.com/a3tweaks/Flipswitch/blob/master/FSSwitchMainPanel.m#L750 FlipSwitch] | |||
== External links == | == External links == |
Latest revision as of 19:00, 24 March 2017
LightMessaging is a work-in-progress inter-process communication header-only library by Ryan Petrich. According to its GitHub page, it is a "simple low-level replacement for CFMessagePort".
How to use this library
Headers are available from LightMessaging's GitHub project. If using Theos, place the headers in $THEOS/include/LightMessaging
.
Include directive
#import <LightMessaging/LightMessaging.h>
RocketBootstrap
LightMessaging uses RocketBootstrap by default, so be sure to have it set up (instructions here). To have LightMessaging not use RBS, add the following directive before including the LM header:
#define LIGHTMESSAGING_USE_ROCKETBOOTSTRAP 0
Timeouts
Use this directive (before including the LM header) to set the timeout:
#define LIGHTMESSAGING_TIMEOUT 500 // 500 ms timeout
Server
This must be done in a non-sandboxed process. Typically, this is done in SpringBoard or a non-sandboxed daemon. If you put the server anywhere other than SpringBoard, then you must register the service in SpringBoard using rocketbootstrap_unlock
. More info here.
Disclaimer: The server interface is not finished yet; it may change in a future version.
The Callback
void some_callback(CFMachPortRef port, LMMessage *message, CFIndex size, void *info) {
// get the reply port
mach_port_t replyPort = message->head.msgh_remote_port;
// Check validity of message
if (!LMDataWithSizeIsValidMessage(message, size)) {
LMSendReply(replyPort, NULL, 0);
LMResponseBufferFree((LMResponseBuffer *)message);
return;
}
// Get the data you received
void *data = LMMessageGetData(message);
size_t length = LMMessageGetDataLength(message);
// Make it into a CFDataRef object
CFDataRef cfdata = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (const UInt8 *)data ?: (const UInt8 *)&data, length, kCFAllocatorNull);
// Send some data back
const char *msg = "lol";
LMSendReply(replyPort, msg, strlen(msg) + 1);
// Free the CFDataRef object
if (cfdata) {
CFRelease(cfdata);
}
// Free the response buffer
LMResponseBufferFree((LMResponseBuffer *)message);
}
Starting the Server
LMStartService("net.iphonedevwiki.some.server", CFRunLoopGetCurrent(), (CFMachPortCallBack)some_callback);
Client
This can be run anywhere; like a command line program, sandboxed process, daemon, etc.
// setup connection
LMConnection connection = {
MACH_PORT_NULL,
"net.iphonedevwiki.some.server"
};
//send message
LMResponseBuffer buffer;
const char *msg = "lol wtf";
SInt32 messageId = 0x1111; // this is arbitrary i think
LMConnectionSendTwoWay(&connection, messageId, msg, strlen(msg) + 1, &buffer);
LMMessage *response = &(buffer.message);
// do whatever you want !!!!
const char *data = LMMessageGetData(response);
//cleanup
LMResponseBufferFree(&buffer);
Type helpers
There are some cool helper functions for if you want to send Images / PropertyLists / etc instead of just strings. Look at the header file or other examples to see how to use them.
(this section should be expanded)
Examples
External links
|