t_osc_err osc_bundle_u_addressExists(t_osc_bndl_u *bndl, char *address, int fullmatch, int *res) { *res = 0; t_osc_bndl_it_u *it = osc_bndl_it_u_get(bndl); while(osc_bndl_it_u_hasNext(it)){ t_osc_msg_u *m = osc_bndl_it_u_next(it); int po, ao; char *a = osc_message_u_getAddress(m); if(!a){ continue; } int r = osc_match(address, osc_message_u_getAddress(m), &po, &ao); if(fullmatch){ if(r != (OSC_MATCH_ADDRESS_COMPLETE | OSC_MATCH_PATTERN_COMPLETE)){ continue; } }else{ if(r == 0 || (((r & OSC_MATCH_PATTERN_COMPLETE) == 0) && address[po] != '/')){ continue; } } *res = 1; break; } osc_bndl_it_u_destroy(it); return OSC_ERR_NONE; }
int OSCMessage::match(const char * pattern, int addr_offset){ int pattern_offset; int address_offset; int ret = osc_match((char *) msgData + addr_offset, pattern, &address_offset, &pattern_offset); char * next = (char *) msgData + addr_offset + address_offset; if (*next == '\0' || *next == '/'){ if (ret) { return address_offset; } } else { return 0; } }
t_osc_msg_ar_u *osc_bundle_u_lookupAddress(t_osc_bndl_u *bndl, const char *address, int fullmatch) { int matchbuflen = 16, n = 0; //t_osc_msg_u **matches = osc_mem_alloc(matchbuflen * sizeof(t_osc_msg_u *)); t_osc_msg_ar_u *ar = osc_message_array_u_alloc(matchbuflen); osc_array_clear(ar); //memset(matches, '\0', matchbuflen * sizeof(t_osc_msg_u *)); t_osc_bndl_it_u *it = osc_bndl_it_u_get(bndl); while(osc_bndl_it_u_hasNext(it)){ if(n >= matchbuflen){ //matches = osc_mem_resize(matches, (matchbuflen + 16) * sizeof(t_osc_msg_u *)); t_osc_err e = osc_array_resize(ar, matchbuflen + 16); if(e){ return NULL; } matchbuflen += 16; } t_osc_msg_u *current_message = osc_bndl_it_u_next(it); int po, ao; int r = osc_match(address, osc_message_u_getAddress(current_message), &po, &ao); if(fullmatch){ if(r != (OSC_MATCH_ADDRESS_COMPLETE | OSC_MATCH_PATTERN_COMPLETE)){ continue; } }else{ if(r == 0 || (((r & OSC_MATCH_PATTERN_COMPLETE) == 0) && address[po] != '/')){ continue; } } //osc_message_u_copy(matches + n++, current_message); t_osc_msg_u *p = osc_array_get(ar, n++); osc_message_u_deepCopy(&p, current_message); } osc_bndl_it_u_destroy(it); osc_array_resize(ar, n); return ar; }
bool OSCMessage::fullMatch(const char * pattern, int addr_offset){ int pattern_offset; int address_offset; int ret = osc_match((char *) msgData + addr_offset, pattern, &address_offset, &pattern_offset); return (ret==3); }
void cheapCommRcv::update(){ while(myosc.hasWaitingMessages()){ // get the next message ofxOscMessage m; myosc.getNextMessage(&m); // check for mouse moved message //cout << m.getAddress()<<endl; //((testApp*)ofGetAppPtr()); int pattrOffset = 0; int addrOffset = 0; int matchResult1 = 0; int matchResult2 = 0; char* addr = (char*)(m.getAddress()).c_str(); /*ir a escena */ string pattern="/sync/*/start_event"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); //cout << "matchresult aa"<< matchResult1 << endl; if(matchResult1==3){ if(m.getAddress()=="/sync/electromagnetism/start_event") ((testApp*)ofGetAppPtr())->toScene(EM); if(m.getAddress()=="/sync/gravity/start_event") ((testApp*)ofGetAppPtr())->toScene(GRAVEDAD); if(m.getAddress()=="/sync/weak_nuclear/start_event") ((testApp*)ofGetAppPtr())->toScene(NUCLEAR_DEBIL); if(m.getAddress()=="/sync/strong_nuclear/start_event") ((testApp*)ofGetAppPtr())->toScene(NUCLEAR_FUERTE); if(m.getAddress()=="/sync/menu/start_event") ((testApp*)ofGetAppPtr())->toScene(MENU); //return; /* pattrOffset = 0; addrOffset = 0; matchResult1 = 0; matchResult2 = 0; addr = (char*)(m.getAddress()).c_str(); myosc.getNextMessage(&m); */ } pattern="/sync/*/end_event"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); //cout << "matchresult aa"<< matchResult1 << endl; if(matchResult1==3){ if(m.getAddress()=="/sync/electromagnetism/end_event") ((testApp*)ofGetAppPtr())->endScene(EM); if(m.getAddress()=="/sync/gravity/end_event") ((testApp*)ofGetAppPtr())->endScene(GRAVEDAD); if(m.getAddress()=="/sync/weak_nuclear/end_event") ((testApp*)ofGetAppPtr())->endScene(NUCLEAR_DEBIL); if(m.getAddress()=="/sync/strong_nuclear/end_event") ((testApp*)ofGetAppPtr())->endScene(NUCLEAR_FUERTE); if(m.getAddress()=="/sync/menu/end_event") ((testApp*)ofGetAppPtr())->endScene(MENU); //return; } /** si no dentro de cada escena recibe lo suyo **/ pattern="/sync/electromagnetism"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); if(matchResult1==2) { ((testApp*)ofGetAppPtr())->parseEmOsc(m.getAddress().substr(addrOffset),m ); //return; } pattern="/sync/weak_nuclear"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); if(matchResult1==2){ ((testApp*)ofGetAppPtr())->parseWeakOsc(m.getAddress().substr(addrOffset),m); //return; } pattern="/sync/strong_nuclear"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); if(matchResult1==2){ ((testApp*)ofGetAppPtr())->parseStrongOsc(m.getAddress().substr(addrOffset),m); //return; } pattern="/sync/gravity"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); if(matchResult1==2){ ((testApp*)ofGetAppPtr())->parseGravityOsc(m.getAddress().substr(addrOffset),m); //return; } pattern="/sync/menu"; matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset); if(matchResult1==2){ ((testApp*)ofGetAppPtr())->parseMenuOsc(m.getAddress().substr(addrOffset),m); //return; } /* cout << "matchresult"<< matchResult1 << endl; cout << "addrOffset"<< addrOffset << " "; cout << "pattrOffset"<< m.getAddress().substr(addrOffset) << endl; */ } }
void omax_object_createIOReport(t_object *x, t_symbol *msg, int argc, t_atom *argv, long *buflen, char **buf) { t_symbol *classname = object_classname(x); if(!classname){ return; } t_hashtab *ht = omax_class_getHashtab(classname->s_name); if(!ht){ return; } long nkeys = 0; t_symbol **keys = NULL; hashtab_getkeys(ht, &nkeys, &keys); t_osc_bndl_u *bndl_u = osc_bundle_u_alloc(); int i; for(i = 0; i < nkeys; i++){ if(!osc_error_validateAddress(keys[i]->s_name)){ int j; for(j = 0; j < argc; j++){ t_atom *a = argv + j; if(atom_gettype(a) == A_SYM){ int ret = 0; int ao, po; if(atom_getsym(a) == gensym("/*")){ ret = OSC_MATCH_ADDRESS_COMPLETE; }else{ ret = osc_match(atom_getsym(a)->s_name, keys[i]->s_name, &po, &ao); } if(ret && OSC_MATCH_ADDRESS_COMPLETE){ t_omax_method *m = NULL; hashtab_lookup(ht, keys[i], (t_object **)(&m)); if(!m){ continue; } if(m->type == OMAX_PARAMETER){ t_object *attr = object_attr_get(x, m->sym); long argc = 0; t_atom *argv = NULL; //m->m.m_fun(ob, attr, &argc, &argv); char getter[128]; sprintf(getter, "get%s", m->sym->s_name); long get; method f = object_attr_method(x, gensym(getter), (void **)(&attr), &get); if(f){ f(x, attr, &argc, &argv); if(argv){ char address[128]; sprintf(address, "/%s", m->sym->s_name); t_atom a[argc + 1]; atom_setsym(a, gensym(address)); memcpy(a + 1, argv, argc * sizeof(t_atom)); t_osc_msg_u *msg_u = NULL; t_osc_err e = omax_util_maxAtomsToOSCMsg_u(&msg_u, ps_oscioreport, argc + 1, a); if(e){ object_error((t_object *)x, "%s", osc_error_string(e)); if(bndl_u){ osc_bundle_u_free(bndl_u); } return; } osc_bundle_u_addMsg(bndl_u, msg_u); sysmem_freeptr(argv); } } } } } } } } //*buflen = pos; t_osc_bndl_s *bs = osc_bundle_u_serialize(bndl_u); if(bs){ *buflen = osc_bundle_s_getLen(bs); *buf = osc_bundle_s_getPtr(bs); osc_bundle_s_free(bs); } if(bndl_u){ osc_bundle_u_free(bndl_u); } }
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); } }