(→Server) |
(→Server) |
||
Line 21: | Line 21: | ||
== Server == | == Server == | ||
Typically this is done in [[SpringBoard.app|SpringBoard]] or a [[Daemons|daemon]]. If you put the server anywhere other than SpringBoard, then you must register the service in SpringBoard. [[RocketBootstrap#Usage_notes|Further explanation here]]. | |||
=== The Callback === | === The Callback === |
Revision as of 03:29, 7 August 2016
LightMessaging is an 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
Server
Typically this is done in SpringBoard or a daemon. If you put the server anywhere other than SpringBoard, then you must register the service in SpringBoard. Further explanation here.
The Callback
void some_callback(CFMachPortRef port,
LMMessage *request,
CFIndex size,
void *info)
{
// get the reply port
mach_port_t replyPort = request->head.msgh_remote_port;
// sanity check
if (size < sizeof(LMMessage)) {
LMSendReply(replyPort, NULL, 0);
LMResponseBufferFree((LMResponseBuffer *)request);
return;
}
// get the data you recieved
void *data = LMMessageGetData(request);
// send some data back
const char *msg = "lol";
LMSendReply(replyPort, msg, strlen(msg) + 1);
// free the response buffer??
LMResponseBufferFree((LMResponseBuffer *)request);
}
Starting the Server
LMStartService("net.iphonedevwiki.some.server", CFRunLoopGetCurrent(), (CFMachPortCallBack)some_callback);
Client
This can be run anywhere that has the appropriate permissions to send/receive data on a message port.
// 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);
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
|