I have read docs, but still cannot realize.
I have desktop application written in C and Chrome extension. I know how to receive this message in my chrome extension:
port.onMessage.addListener(function(msg) {
console.log("Received" + msg);
});
What should I write in my C application to send a message to my chrome extension?
Python/NodeJS examples are also appropriate.
In order for a native messaging host to send data back to Chrome, you must first send four bytes of length information and then send the JSON formatted message as a string/char-array.
Below are two examples for C and C++ respectively that do the same thing in slightly different ways.
C example:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
// Define our message
char message[] = "{\"text\": \"This is a response message\"}";
// Collect the length of the message
unsigned int len = strlen(message);
// We need to send the 4 bytes of length information
printf("%c%c%c%c", (char) (len & 0xff),
(char) ((len>>8) & 0xFF),
(char) ((len>>16) & 0xFF),
(char) ((len>>24) & 0xFF));
// Now we can output our message
printf("%s", message);
return 0;
}
C++ example:
#include <string.h>
int main(int argc, char* argv[]) {
// Define our message
std::string message = "{\"text\": \"This is a response message\"}";
// Collect the length of the message
unsigned int len = message.length();
// We need to send the 4 bytes of length information
std::cout << char(((len>>0) & 0xFF))
<< char(((len>>8) & 0xFF))
<< char(((len>>16) & 0xFF))
<< char(((len>>24) & 0xFF));
// Now we can output our message
std::cout << message;
return 0;
}
(The actual message can be sent at the same time as the length information; it is merely broken out for clarity.)
So following the OP Chrome example, here is how to output the message:
port.onMessage.addListener(function(msg) {
console.log("Received" + msg.text);
});
In reality, there is no requirement to use "text" as the key returned from your native messaging app; it could be anything. The JSON string passed to the listener from your native messaging app is converted to a JavaScript Object.
For a C++ example of a native messaging app that uses the above technique in combination with jsoncpp (C++ JSON library) and also parses the request sent to the app, see here: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501
You can take a look here, this is an example python script which sends and receives messages to the extension:
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442
As far as I understand it, in order to send the message you need to:
- write to console the length of the message as bynary
- write three \0 characters
- write your message in plain text
this is the C# code that did the job for me:
String str = "{\"text\": \"testmessage\"}";
Stream stdout = Console.OpenStandardOutput();
stdout.WriteByte((byte)str.Length);
stdout.WriteByte((byte)'\0');
stdout.WriteByte((byte)'\0');
stdout.WriteByte((byte)'\0');
Console.Write(str);
And the python code from the above link:
sys.stdout.write(struct.pack('I', len(message)))
sys.stdout.write(message)
sys.stdout.flush()
Interestingly it doesn't explicitly output the three \0 characters, but they seem to appear after outputting the struct.pack, not sure why...
Also note that you need to send the message in JSON format, otherwise it doesn't seem to work.
I used function write:
write(1,buf,n);
buf is your message, n is length if your message
You also can use printf.