/* assumes size or nmemb is 1, which it seems to be in the only call at vorbisfile.c (size is hardcoded to 1) */ size_t tta_read_function( void* ptr, size_t size, size_t nmemb, void* datasource) { char no_eof = 1; size_t bytes_read = 0; size = nmemb; while (no_eof && bytes_read < size) { char byte; #ifdef __TCE_V1__ int ne = no_eof; int b = byte; _TCE_INPUT_DATA(b, ne, 1); *(char*)ptr = byte; ++ptr; ++bytes_read; #else WRITETO(input_data.1, 1); READINT(input_data.2, byte); *(char*)ptr = byte; ++ptr; ++bytes_read; READINT(input_data.3, no_eof); #endif } if (no_eof) return bytes_read; else return 0; }
/* parsing lists {{{*/ if(service) { xmlNodePtr memberships = findNode(service->children, "Memberships", 1); xmlNodePtr ms; xmlNodePtr role; xmlNodePtr members, member; xmlNodePtr pname; xmlNodePtr type; xmlNodePtr lastchange; xmlChar *content; int flag = 0; lastchange = findNode(service->children, "LastChange", 1); content = xmlNodeGetContent(lastchange); cl->lastchange = strdup((char*)content); DMSG(stderr, "Contact: lastchange = %s\n", cl->lastchange); if(!memberships) { fprintf(stderr, "NULL membership\n"); count = 0; goto cleanup; } for(ms=memberships->children;ms;ms=ms->next) { int ctype = 1; if(!ms->children) continue; role = findNode(ms->children, "MemberRole", 1); if(!role) { fprintf(stderr, "Null role\n"); count = 0; goto cleanup; } members = findNode(role, "Members", 1); if(!members) continue; if(xmlStrEqual(role->children->content, (xmlChar*)"Allow")) flag = 3; else if(xmlStrEqual(role->children->content, (xmlChar*)"Block")) flag = 4; else continue; for(member=members->children;member;member=member->next) { Contact *c; type = findNode(member->children, "Type", 1); content = xmlNodeGetContent(type); if(!content) { fprintf(stderr, "NULL Type\n"); continue; } if(xmlStrEqual(content, (xmlChar*)"Passport")) { pname = findNode(member->children, "PassportName", 1); ctype = 1; } else if(xmlStrEqual(content, (xmlChar*)"Email")) { pname = findNode(member->children, "Email", 1); ctype = 32; } else continue; xmlFree(content); if(!pname) { fprintf(stderr, "NULL PassportName or Email\n"); continue; } content = xmlNodeGetContent(pname); if(content) { char name[32]; char domain[32]; if(sscanf((char*)content, "%[^@]@%s", name, domain) != 2) { fprintf(stderr, "parse contact: malformed email: %s\n", content); continue; } c = contact_new((char*)content); c->name = strdup(name); c->type = ctype; c->status = NA; c->inlist |= flag; c->domain = NULL; /* should be filled during sort */ cl_append_contact(cl, c, name, domain); xmlFree(content); count++; } } } }/*}}}*/ DMSG(stderr, "parsed contact count: %d\n", count); cleanup: cl->flag &= ~CL_INITLIST; return count; }/*}}}*/ int _cl_do_soapreq_ab(CL *cl)/*{{{*/ { TCPClient *client; char *req = NULL; char *header; char buf[512]; int ret, len; char *ptr = NULL; client = tcpclient_new("contacts.msn.com", 80); ret = _cl_load_soapreq_ab(cl, cl->ablastchange, &req, TRUE); if(ret) { tcpclient_connect(client); header = (char*)xmalloc(strlen(ab_request_header) + 32); DMSG(stderr, "sending ab request\n"); len = sprintf(header, "%s%d\r\n\r\n", ab_request_header, ret); if(tcpclient_send(client, header, len) <= 0) goto cleanup; if(tcpclient_send(client, req, ret) <= 0) goto cleanup; len = tcpclient_recv_header(client, &ptr); /* header */ if(ptr) { HTTPHeader *header; xmlDocPtr doc; xmlParserCtxtPtr ctxt; FILE *fp; DMSG(stderr, "AB response header:\n%s", ptr); header = http_parse_header(ptr); len = header->content_length; DMSG(stderr, "Length: %d\n", len); http_header_destroy(header); memset(buf, 0, sizeof(buf)); fp = fopen("addressbook.xml", "w"); fprintf(fp, buf); len -= (ret = tcpclient_recv(client, buf, sizeof(buf)-1)); ctxt = xmlCreatePushParserCtxt(NULL, NULL, buf, ret, "addressbook.xml"); fprintf(fp, buf); if(ctxt == NULL) { fprintf(stderr, "failed to create parser context"); return 0; } while(len > 0) { memset(buf, 0, sizeof(buf)); len -= (ret=tcpclient_recv(client, buf, sizeof(buf)-1)); fprintf(fp, buf); xmlParseChunk(ctxt, buf, ret, 0); } fclose(fp); xmlParseChunk(ctxt, buf, 0, 1); tcpclient_destroy(client); client = NULL; doc = ctxt->myDoc; len = ctxt->wellFormed; xmlFreeParserCtxt(ctxt); //count += _cl_parse_contacts(cl, doc); xmlFreeDoc(doc); xmlCleanupParser(); DMSG(stderr, "addressbook xml parsing done: %s\n", len?"good":"malformed"); xfree(ptr); } else { DMSG(stderr, "ab: no header found\n\r"); } } else { fprintf(stderr, "failed to load abreq\n"); } cleanup: xfree(header); return 0; }/*}}}*/ int cl_load_contacts(CL *cl, const char* file)/*{{{*/ { int ret; xmlDocPtr doc; xmlNodePtr root; xmlNodePtr contact; xmlNodePtr node; xmlChar *content; doc = xmlReadFile(file, NULL, 0); if (doc == NULL) { fprintf(stderr, "Failed to parse %s\n", file); return 0; } ret = 0; root = xmlDocGetRootElement(doc); contact = findNode(root->children, "contact", 3); #define READSTR(dst,elem) node = findNode(contact->children, elem, 1); \ content = xmlNodeGetContent(node); \ dst = strdup((char*)content); \ xmlFree(content) #define READINT(dst, elem) node = findNode(contact->children, elem, 1); \ content = xmlNodeGetContent(node); \ dst = atoi((char*)content); \ xmlFree(content) for(;contact;contact=contact->next) { Contact *c; node = findNode(contact->children, "nick", 1); content = xmlNodeGetContent(node); c = contact_new((char*)content); xmlFree(content); READSTR(c->name, "name"); READSTR(c->PSM, "PSM"); READINT(c->inlist, "inlist"); READINT(c->type, "type"); c->status = NA; node = findNode(contact->children, "domain", 1); content = xmlNodeGetContent(node); c->domain = NULL; /* should be filled during sort */ cl_append_contact(cl, c, c->name, (char*)content); xmlFree(content); ret++; } node = findNode(root->children, "lastchange", 3); if(node) { content = xmlNodeGetContent(node); cl->lastchange = strdup((char*)content); xmlFree(content); } xmlFreeDoc(doc); return ret; }/*}}}*/
int handleDialogSizeMsgs(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, dlgSizeInfo *inf) { char tmp[512]; #define READINT(d,x,y) sprintf(tmp,"%s_" x,inf->name); (d) = g_config->ReadInt(tmp,(y)) #define WRITEINT(x,y) sprintf(tmp,"%s_" x,inf->name); g_config->WriteInt(tmp,y) if (uMsg == WM_INITDIALOG) { int w,h,x,y; READINT(w,"width",inf->defw); READINT(h,"height",inf->defh); READINT(x,"x",inf->defx); READINT(y,"y",inf->defy); if (w>0&&h>0) { SetWindowPos(hwndDlg,NULL,x,y,w,h,SWP_NOACTIVATE|SWP_NOZORDER); }; } else if (uMsg == WM_MOVE) { WINDOWPLACEMENT wp={sizeof(wp),}; GetWindowPlacement(hwndDlg,&wp); if (wp.showCmd != SW_SHOWMAXIMIZED && wp.showCmd != SW_SHOWMINIMIZED) { RECT r; GetWindowRect(hwndDlg,&r); WRITEINT("x",r.left); WRITEINT("y",r.top); }; } else if (uMsg == WM_SIZE) { if (wParam == SIZE_MAXIMIZED) { WRITEINT("maximized",1); }; if (wParam == SIZE_RESTORED) { WINDOWPLACEMENT wp={sizeof(wp),}; GetWindowPlacement(hwndDlg,&wp); if (wp.showCmd != SW_SHOWMAXIMIZED) { ShowWindow(hwndDlg,SW_SHOW); ShowWindow(hwndDlg,SW_RESTORE); WRITEINT("maximized",0); }; }; int m; READINT(m,"maximized",0); if (!m) { WINDOWPLACEMENT wp={sizeof(wp),}; GetWindowPlacement(hwndDlg,&wp); if (wp.showCmd != SW_SHOWMAXIMIZED && wp.showCmd != SW_SHOWMINIMIZED) { RECT r; GetWindowRect(hwndDlg,&r); WRITEINT("width",r.right-r.left); WRITEINT("height",r.bottom-r.top); }; }; }; return 0; #undef READINT #undef WRITEINT }
/** * parce command buffer buf with length len * return 0 if buffer processed or len if there's not enough data in buffer */ int parce_incoming_buf(char *buf, int len){ uint8_t command; //uint32_t utmp; int i = 0; if(Uval_ready == UVAL_START){ // we are in process of user's value reading i += read_int(buf, len); } if(Uval_ready == UVAL_ENTERED){ //print_int(User_value); // printout readed integer value for error control Uval_ready = UVAL_BAD; // clear Uval I(User_value); return 0; } for(; i < len; i++){ command = buf[i]; if(!command) continue; // omit zero switch (command){ case '1': gpio_toggle(LEDS_PORT, LED_D1_PIN); break; case '2': gpio_toggle(LEDS_PORT, LED_D2_PIN); break; case 'H': // show help help(); break; case 'I': // enter integer & show its value I = show_int; READINT(); break; case 'T': newline(); print_int(Timer); // be careful for Time >= 2^{31}!!! newline(); break; case '\n': // show newline, space and tab as is case '\r': case ' ': case '\t': break; default: command = '?'; // echo '?' on unknown command in byte mode } usb_send(command); // echo readed byte } return 0; // all data processed - 0 bytes leave in buffer }
static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv) { int i, j, j2, k, outc = 1, blob = 0, typeonset, dataonset, nfield; t_atom *outv; if (!argc) return; for (i = 0; i < argc; i++) if (argv[i].a_type != A_FLOAT) { pd_error(x, "oscparse: takes numbers only"); return; } if (argv[0].a_w.w_float == '#') /* it's a bundle */ { if (argv[1].a_w.w_float != 'b' || argc < 16) { pd_error(x, "oscparse: malformed bundle"); return; } /* we ignore the timetag since there's no correct way to convert it to Pd logical time that I can think of. LATER consider at least outputting timetag differentially converted into Pd time units. */ for (i = 16; i < argc-4; ) { int msize = READINT(argv+i); if (msize <= 0 || msize & 3) { pd_error(x, "oscparse: bad bundle element size"); return; } oscparse_list(x, 0, msize, argv+i+4); i += msize+4; } return; } else if (argv[0].a_w.w_float != '/') { pd_error(x, "oscparse: not an OSC message (no leading slash)"); return; } for (i = 1; i < argc && argv[i].a_w.w_float != 0; i++) if (argv[i].a_w.w_float == '/') outc++; i = ROUNDUPTO4(i+1); if (argv[i].a_w.w_float != ',' || (i+1) >= argc) { pd_error(x, "oscparse: malformed type string (char %d, index %d)", (int)(argv[i].a_w.w_float), i); return; } typeonset = ++i; for (; i < argc && argv[i].a_w.w_float != 0; i++) if (argv[i].a_w.w_float == 'b') blob = 1; nfield = i - typeonset; if (blob) outc += argc - typeonset; else outc += nfield; outv = (t_atom *)alloca(outc * sizeof(t_atom)); dataonset = ROUNDUPTO4(i + 1); /* post("outc %d, typeonset %d, dataonset %d, nfield %d", outc, typeonset, dataonset, nfield); */ for (i = j = 0; i < typeonset-1 && argv[i].a_w.w_float != 0 && j < outc; j++) SETSYMBOL(outv+j, grabstring(argc, argv, &i, 1)); for (i = typeonset, k = dataonset; i < typeonset + nfield; i++) { union { float z_f; uint32_t z_i; } z; float f; int blobsize; switch ((int)(argv[i].a_w.w_float)) { case 'f': if (k > argc - 4) goto tooshort; z.z_i = READINT(argv+k); f = z.z_f; if (PD_BADFLOAT(f)) f = 0; if (j >= outc) { bug("oscparse 1: %d >=%d", j, outc); return; } SETFLOAT(outv+j, f); j++; k += 4; break; case 'i': if (k > argc - 4) goto tooshort; if (j >= outc) { bug("oscparse 2"); return; } SETFLOAT(outv+j, READINT(argv+k)); j++; k += 4; break; case 's': if (j >= outc) { bug("oscparse 3"); return; } SETSYMBOL(outv+j, grabstring(argc, argv, &k, 0)); j++; break; case 'b': if (k > argc - 4) goto tooshort; blobsize = READINT(argv+k); k += 4; if (blobsize < 0 || blobsize > argc - k) goto tooshort; if (j + blobsize + 1 > outc) { bug("oscparse 4"); return; } if (k + blobsize > argc) goto tooshort; SETFLOAT(outv+j, blobsize); j++; for (j2 = 0; j2 < blobsize; j++, j2++, k++) SETFLOAT(outv+j, argv[k].a_w.w_float); k = ROUNDUPTO4(k); break; default: pd_error(x, "oscparse: unknown tag '%c' (%d)", (int)(argv[i].a_w.w_float), (int)(argv[i].a_w.w_float)); } } outlet_list(x->x_obj.ob_outlet, 0, j, outv); return; tooshort: pd_error(x, "oscparse: OSC message ended prematurely"); }