void dumpOSCmsg(int inSize, char* inData)
{
	int size;
	char *data;

	if (inData[0]) {
		char *addr = inData;
		data = OSCstrskip(inData);
		size = inSize - (data - inData);
		scprintf("[ \"%s\",", addr);
	}
	else
	{
		scprintf("[ %d,", OSCint(inData));
		data = inData + 4;
		size = inSize - 4;
	}

	sc_msg_iter msg(size, data);

	while (msg.remain())
	{
		char c = msg.nextTag('i');
		switch(c)
		{
			case 'i' :
				scprintf(" %d", msg.geti());
				break;
			case 'f' :
				scprintf(" %g", msg.getf());
				break;
			case 'd' :
				scprintf(" %g", msg.getd());
				break;
			case 's' :
				scprintf(" \"%s\"", msg.gets());
				break;
			case 'b' :
				scprintf(" DATA[%d]", msg.getbsize());
				msg.skipb();
				break;
			case '[' :
				scprintf("[");
				msg.count++;
				break;
			case ']' :
				scprintf("]");
				msg.count++;
				break;
		    default :
				scprintf(" !unknown tag '%c' 0x%02x !", isprint(c)?c:'?', (unsigned char)c & 255);
				goto leave;
		}
		if (msg.remain() && (c!= '[')) scprintf(",");
	}
leave:
	scprintf(" ]");
}
jobject convertMessageToJava(JNIEnv* myEnv, char* inData, int inSize) {

    jclass oscMessageClass = myEnv->FindClass(OSC_MESSAGE_CLASS);

	if (!oscMessageClass) {
		scprintf("convertMessageToJava could not find the JAVA OSC representation");
		return NULL;
	}

	if (inSize<=0 || !inData) {
		return NULL;
	}

	jmethodID oscConstructor = myEnv->GetMethodID(oscMessageClass, "<init>", "()V");
	if (!oscConstructor) {
		scprintf("convertMessageToJava could not find a constructor for the JAVA OSC representation");
		return NULL;
	}

	jobject oscObject = myEnv->NewObject(oscMessageClass, oscConstructor);
	jmethodID addInt = myEnv->GetMethodID(oscMessageClass, "add", "(I)Z");
	jmethodID addStr = myEnv->GetMethodID(oscMessageClass, "add", "(Ljava/lang/String;)Z");
	jmethodID addFlt = myEnv->GetMethodID(oscMessageClass, "add", "(F)Z");
	jmethodID addLng = myEnv->GetMethodID(oscMessageClass, "add", "(J)Z");

	// Did I steal this wholesale from dumpOSCmsg?  Yes I did.  -ajs 20100826
	char * data;
	int size;
	if (inData[0]) {
		char *addr = inData;
		data = OSCstrskip(inData);
		size = inSize - (data - inData);
		jstring jaddr = myEnv->NewStringUTF(addr);
		myEnv->CallBooleanMethod(oscObject,addStr,jaddr);
	}
	else
	{
		myEnv->CallBooleanMethod(oscObject,addInt,OSCint(inData));
		data = inData + 4;
		size = inSize - 4;
	}

	sc_msg_iter msg(size, data);

	bool ok(true);
	while (msg.remain() && ok)
	{
		char c = msg.nextTag('i');
		jstring jstr;
		switch(c)
		{
			case 'i' :
				myEnv->CallBooleanMethod(oscObject,addInt,msg.geti());
				break;
			case 'f' :
				myEnv->CallBooleanMethod(oscObject,addFlt,msg.getf());
				break;
			case 's' :
				jstr = myEnv->NewStringUTF(msg.gets());
				myEnv->CallBooleanMethod(oscObject,addStr,jstr);
				break;
			default :
				scprintf("convertMessageToJava unknown/unimplemented tag '%c' 0x%02x", isprint(c)?c:'?', (unsigned char)c & 255);
				ok = false;
			break;
		}
	}
	return oscObject;
}
Ejemplo n.º 3
0
static bool dumpOSCmsg(int inSize, char* inData, bool skipStatus = false)
{
	int size;
	const char *data;

	if (inData[0]) {
		const char *addr = inData;
		if (skipStatus) {
			if (strcmp(addr, "/status") == 0 || strcmp(addr, "status") == 0) // skip /status messages
				return false; // nothing has been printed
		}

		data = OSCstrskip(inData);
		size = inSize - (data - inData);
		scprintf("[ \"%s\",", addr);
	} else {
		scprintf("[ %d,", OSCint(inData));
		data = inData + 4;
		size = inSize - 4;
	}

	sc_msg_iter msg(size, data);

	while (msg.remain())
	{
		char c = msg.nextTag('i');
		switch(c)
		{
		case 'i' :
			scprintf(" %d", msg.geti());
			break;
		case 'f' :
			scprintf(" %g", msg.getf());
			break;
		case 'd' :
			scprintf(" %g", msg.getd());
			break;
		case 's' :
			scprintf(" \"%s\"", msg.gets());
			break;
		case '[' :
			scprintf(" [");
			msg.count ++;
			break;
		case ']' :
			scprintf(" ]");
			msg.count ++;
			break;
		case 'b' :
			scprintf(" DATA[%zu]", msg.getbsize());
			msg.skipb();
			break;
		case 'm' : {
			char midi [4];
			msg.getb (midi, 4);
			scprintf(" MIDI[0x%02x 0x%02x 0x%02x 0x%02x]", midi[0], midi[1], midi[2], midi[3]);
			break;
		}
		case 'c' :
			scprintf(" %c", (char)msg.geti());
			break;
		case 't' :
			scprintf(" %" PRId64 "", msg.gett());
			break;
		case 'T' :
			scprintf(" true");
			msg.count ++;
			break;
		case 'F' :
			scprintf(" false");
			msg.count ++;
			break;
		case 'I' :
			scprintf(" infinitum");
			msg.count ++;
			break;
		case 'N' :
			scprintf(" nil");
			msg.count ++;
			break;
		default :
			scprintf(" !unknown tag '%c' 0x%02x !", isprint(c)?c:'?', (unsigned char)c & 255);
			goto leave;
		}
		if (msg.remain() && (c!= '[')) scprintf(",");
	}
leave:
	scprintf(" ]");
	return true;  // something has been printed
}