Example #1
0
int32_t osc_message_s_renameCopy(char *dest, t_osc_msg_s *src, int32_t new_address_len, char *new_address)
{
	if(!dest){
		return 0;
	}
	if(osc_error_validateAddress(new_address)){
		return 0;
	}
	int32_t oldlen = osc_message_s_getSize(src);
	//int32_t old_address_len = strlen(osc_message_s_getAddress(src));
	//int32_t newlen = oldlen - (old_address_len - new_address_len);
	//while(newlen % 4){
	//newlen++;
	//}
	int32_t newlen = oldlen - osc_util_getPaddedStringLen(osc_message_s_getAddress(src)) + osc_util_getPaddingForNBytes(new_address_len);
	*((int32_t *)dest) = hton32(newlen);
	char *ptr = dest + 4;
	if(new_address_len > 0){
		memcpy(ptr, new_address, new_address_len);
	}
	ptr += new_address_len;
	*ptr++ = '\0';
	while((ptr - dest) % 4){
		*ptr++ = '\0';
	}
	memcpy(ptr, src->typetags, oldlen - (src->typetags - src->address));
	return newlen;
}
Example #2
0
//void omiterate_fullPacket(t_omiterate *x, long len, long ptr)
void omiterate_fullPacket(t_omiterate *x, t_symbol *msg, int argc, t_atom *argv)
{
	OMAX_UTIL_GET_LEN_AND_PTR;
	t_osc_bndl_it_s *it = osc_bndl_it_s_get(len, ptr);
	while(osc_bndl_it_s_hasNext(it)){
		t_osc_msg_s *m = osc_bndl_it_s_next(it);
		long l = osc_message_s_getSize(m);
		char *p = osc_message_s_getAddress(m);
		omax_util_outletOSC(x->outlet, l, p);
	}
	osc_bndl_it_s_destroy(it);
}
Example #3
0
void ocoll_fullPacket_impl(t_ocoll *x, long len, char *ptr)
{
	osc_bundle_s_wrap_naked_message(len, ptr);
	if(len == OSC_HEADER_SIZE){
		// empty bundle
		return;
	}
	critical_enter(x->lock);
	if(x->buffer_pos + len > x->buffer_len){
		char *tmp = (char *)osc_mem_resize(x->buffer, x->buffer_pos + len);
		if(!tmp){
			object_error((t_object *)x, "Out of memory...sayonara max...");
			critical_exit(x->lock);
			return;
		}
		x->buffer = tmp;
		memset(x->buffer + x->buffer_pos, '\0', len);
		x->buffer_len = x->buffer_pos + len;
	}
	t_osc_bndl_it_s *it = osc_bndl_it_s_get(len, ptr);
	while(osc_bndl_it_s_hasNext(it)){
		t_osc_msg_s *m = osc_bndl_it_s_next(it);
		t_osc_msg_ar_s *match = osc_bundle_s_lookupAddress(x->buffer_pos, x->buffer, osc_message_s_getAddress(m), 1);
		if(!match){
			long l = osc_message_s_getSize(m) + 4;
			memcpy(x->buffer + x->buffer_pos, osc_message_s_getPtr(m), l);
			x->buffer_pos += l;
		}else{
			// this function can resize its buffer, but we don't have to worry about that
			// since we already resized it above to accommidate the entire bundle
			int i;
			for(i = 0; i < osc_message_array_s_getLen(match); i++){
				t_osc_msg_s *mm = osc_message_array_s_get(match, i);
				osc_bundle_s_replaceMessage(&(x->buffer_len),
                                            &(x->buffer_pos),
                                            &(x->buffer),
                                            mm,
                                            m);
			}
			osc_message_array_s_free(match);
		}
	}
	osc_bndl_it_s_destroy(it);
	critical_exit(x->lock);
}
Example #4
0
void omax_FullPacketCallback(t_osc_msg_s *msg, void *context)
{
	t_context *c = (t_context *)context;
	int ao, po;
	char *msg_address = osc_message_s_getAddress(msg);
	int msg_argc = osc_message_s_getArgCount(msg);
	char *msg_ptr = osc_message_s_getPtr(msg);
	int msg_size = osc_message_s_getSize(msg);
	//if(osc_match(msg.address, c->osc_classname->s_name, &po, &ao)){
	if(1){
		// the first part of the address matches our class name, so this message is meant for us
		// now iterate through all of our message names and see if we get a match
		t_hashtab *ht = omax_class_getHashtab(c->classname->s_name);
		if(!ht){
			// oops...
			return;
		}
		long nkeys;
		t_symbol **keys = NULL;		
		hashtab_getkeys(ht, &nkeys, &keys);		
		int i;
		int matched = 0;
		for(i = 0; i < nkeys; i++){
			int r = osc_match(msg_address, keys[i]->s_name, &po, &ao);
			if(r == (OSC_MATCH_ADDRESS_COMPLETE | OSC_MATCH_PATTERN_COMPLETE)){
				matched++;
				// match
				// t_max_err object_method_typed(void *x, t_symbol *s, long ac, t_atom *av, t_atom *rv);
				t_atom rv;
				t_omax_method *m = NULL;
				long argc = 0;
				hashtab_lookup(ht, keys[i], (t_object **)(&m));
				if(m){
					switch(m->type){
					case OMAX_METHOD:
						{
							t_atom argv[msg_argc + 1];
							omax_util_oscMsg2MaxAtoms(msg, argv);
							object_method_typedfun(c->ob, (t_messlist *)(m->thing), ((t_messlist *)(m->thing))->m_sym, argc - 1, argv + 1, &rv);
						}
						break;
					case OMAX_PARAMETER:
						{
							t_object *attr = NULL;
							long get;
							method f = object_attr_method(c->ob, m->sym, (void **)(&attr), &get);
							t_atom argv[msg_argc + 1];
							omax_util_oscMsg2MaxAtoms(msg, argv);
							f(c->ob, attr, msg_argc, argv + 1);
							c->should_output_state = 1;
						}
						break;
					}
				}
			}
		}
		if(!matched){
			memcpy(c->buf + c->bufpos, msg_ptr, msg_size + 4);
			c->bufpos += (msg_size + 4);
		}
	}else{
		memcpy(c->buf + c->bufpos, msg_ptr, msg_size + 4);
		c->bufpos += (msg_size + 4);
	}
	
}
Example #5
0
//void oO_fullPacket(t_oO *x, long len, long ptr)
void oO_fullPacket(t_oO *x, t_symbol *msg, int argc, t_atom *argv)
{
	char bracket[] = {'[', ']', '{', '}'};
	char wild[] = {'*', '?'};
	char alphanum[62];
	for(int i = 0; i < 10; i++){
		alphanum[i] = i + 48;
	}
	for(int i = 0; i < 26; i++){
		alphanum[i + 10] = i + 65;
	}
	for(int i = 0; i < 26; i++){
		alphanum[i + 36] = i + 97;
	}

	OMAX_UTIL_GET_LEN_AND_PTR;
	char copy[len];
	memcpy(copy, ptr, len);
	int n = 0;
	osc_bundle_s_getMsgCount(len, copy, &n);
	long r = floor(((double)random() / 2147483647.) * n);
	t_osc_bndl_it_s *it = osc_bndl_it_s_get(len, copy);
	int i = 0;
	t_osc_msg_s *m = NULL;
	while(i <= r && osc_bndl_it_s_hasNext(it)){
		i++;
		m = osc_bndl_it_s_next(it);
	}
	osc_bndl_it_s_destroy(it);
	if(m){
		char *p = osc_message_s_getAddress(m);
		if(p){
			int n = osc_message_s_getSize(m);
			long r = floor(((double)random() / 2147483647.) * n);
			if(r <= strlen(p)){
				// inside address section---can add a random NULL byte or f**k with wildcard chars
				switch(random() & 0x1){
				case 0:
					object_post((t_object *)x, "replaced '%c' at position %d with NULL\n", p[r], r);
					p[r] = '\0';
					break;
				case 1:
					{
						int isbracket = 0;
						for(int i = 0; i < sizeof(bracket); i++){
							if(bracket[i] == p[r]){
								isbracket = 1;
								break;
							}
						}
						if(isbracket){
							// we have a bracket, replace it with an alphanum char or NULL
							switch(random() & 0x1){
							case 0:
								{
									long rrr = (long)floor(((double)random() / 2147483647.) * sizeof(alphanum));
									object_post((t_object *)x, "replaced '%c' at position %d with '%c'\n", p[r], r, alphanum[rrr]);
									p[r] = alphanum[rrr];
								}
								break;
							case 1:
								object_post((t_object *)x, "replaced '%c' at position %d with NULL\n", p[r], r);
								p[r] = NULL;
								break;
							}
						}else{
							// not a bracket, replace it with one or NULL
							switch(random() & 0x1){
							case 0:
								{
									long rrr = (long)floor(((double)random() / 2147483647.) * sizeof(bracket));
									object_post((t_object *)x, "replaced '%c' at position %d with '%c'\n", p[r], r, bracket[rrr]);
									p[r] = bracket[rrr];
								}
								break;
							case 1:
								object_post((t_object *)x, "replaced '%c' at position %d with NULL\n", p[r], r);
								p[r] = NULL;
								break;
							}
						}
					}
					break;
				}
			}else if(r < (osc_message_s_getData(m) - p)){
				// typetag section---add a NULL or char
				if(p[r] == NULL){
					long rrr = (long)floor(((double)random() / 2147483647.) * sizeof(alphanum));
					object_post((t_object *)x, "replaced NULL at position %d with '%c'\n", r, alphanum[rrr]);
					p[r] = alphanum[rrr];
				}else{
					object_post((t_object *)x, "replaced '%c' at position %d with NULL\n", p[r], r);
					p[r] = NULL;
				}
			}else{
				// not much we can do here unles we know it's a string or something else with NULL padding, 
				// so just try again
				oO_fullPacket(x, msg, argc, argv);
				return;
			}
		}
	}
	omax_util_outletOSC(x->outlet, len, copy);
}