Difference between revisions of "LightMessaging"

From iPhone Development Wiki
Jump to: navigation, search
(Server)
Line 1: Line 1:
LightMessaging is an [[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".
+
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 22: Line 22:
  
 
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]].
 
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 ===

Revision as of 02:21, 15 August 2016

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

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 *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; 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);

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