No edit summary |
|||
Line 71: | Line 71: | ||
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. | 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. | ||
== Working, Digestible Example Code == | |||
== References == | |||
=== Working, Digestible Example Code === | |||
* [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/rweichler/lucy/blob/master/client/liblucy.c lucy client], [https://github.com/rweichler/lucy/blob/master/server/springboard.m lucy server] | * [https://github.com/rweichler/lucy/blob/master/client/liblucy.c lucy client], [https://github.com/rweichler/lucy/blob/master/server/springboard.m lucy server] | ||
== | === From rpetrich himself === | ||
* [https://rpetri.ch/jbcon2016/JailbreakCon2016.pdf rpetrich's JailbreakCon 2016 keynote on IPC] | * [https://rpetri.ch/jbcon2016/JailbreakCon2016.pdf rpetrich's JailbreakCon 2016 keynote on IPC] | ||
* [https://github.com/rpetrich/LightMessaging/blob/master/LightMessaging.h LightMessaging.h] | * [https://github.com/rpetrich/LightMessaging/blob/master/LightMessaging.h LightMessaging.h] |
Revision as of 01:26, 3 August 2016
LightMessaging is a sexy header-only IPC framework by the grate god Ryan Petrich. According to its GitHub page, it is a "simple low-level replacement for CFMessagePort".
Why should I use this?
- Ryan Petrich.
- Everyone else is using it.
Server
It is recommended that this is only done in SpringBoard.
Starting the Server
LMStartService("net.iphonedevwiki.some.server", CFRunLoopGetCurrent(), (CFMachPortCallBack)some_callback);
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);
}
Client
This can be put literally anywhere.
// 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);
ConsumeInteger / ConsumePropertyList / etc
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.