void display_close(time_t now) { switch(DisplayMode) { case DisplayReport: report_close(); break; case DisplayTXT: txt_close(); break; case DisplayXML: xml_close(); break; case DisplayJSON: json_close(); break; case DisplayCSV: csv_close(now); break; case DisplayCurses: #ifdef IPINFO if (ipinfo_no >= 0) asn_close(); #endif mtr_curses_close(); break; case DisplaySplit: split_close(); break; case DisplayGTK: gtk_close(); break; } }
void display_close(void) { switch(DisplayMode) { case DisplayReport: report_close(); break; case DisplayTXT: txt_close(); break; case DisplayXML: xml_close(); break; case DisplayCSV: csv_close(); break; case DisplayCurses: mtr_curses_close(); break; case DisplaySplit: /* BL */ split_close(); break; case DisplayGTK: gtk_close(); break; } }
static struct xml_parser * xml_open( char * nptr, void * payload ) { struct xml_application * xptr; struct xml_parser * sptr; FILE * h; if (!( h = fopen(nptr,"r"))) return((struct xml_parser*) 0); else if (!( sptr = allocate( sizeof( struct xml_parser ) ) )) { fclose(h); return( sptr); } else { sptr->handle = h; sptr->lines = 0; sptr->length = 0; sptr->column = 0; sptr->ungotch = 0; sptr->punctuation = 0; sptr->state = _TAG_IDLE; sptr->nesting = 0; sptr->echo = xml_echo_state; sptr->name = (char *) 0; sptr->work = (struct xml_application *) 0; sptr->user = (struct xml_relay *) 0; if (!( sptr->work = allocate( sizeof ( struct xml_application ) ) )) return( xml_close( sptr ) ); else { xml_reset(sptr->work,xml_echo_state, payload); if (!( sptr->name = duplicate_string( nptr ) )) return( xml_close( sptr ) ); else if (!(sptr->user = allocate( sizeof( struct xml_relay ) ))) return( xml_close( sptr ) ); else { sptr->user->open_tag = xml_open_tag; sptr->user->atb_name = xml_atb_name; sptr->user->atb_value = xml_atb_value; sptr->user->white_space = xml_white_space; sptr->user->token = xml_data_token; sptr->user->punctuation = xml_data_punctuation; sptr->user->close_tag = xml_close_tag; sptr->user->failure = xml_failure; return( sptr ); } } } }
int xml_parse( char * nptr, struct xml_relay * fptr, void * aptr ) { int status=0; int c; int lno=0; struct xml_parser * sptr; /* attempt to open the source context */ /* ---------------------------------- */ if (!( sptr = xml_open( nptr, aptr ))) return(_XML_FILE_ERROR); else { /* install user relay table if provided */ /* ------------------------------------ */ xml_use_relays( sptr, fptr ); /* connect application to parser */ /* ----------------------------- */ sptr->work->parent = sptr; /* Parse until end of source */ /* ------------------------- */ status = xml_parse_tokens(sptr); /* detect incomplete termination */ /* ----------------------------- */ if ( status ) { if ( status != 48 ) { lno = sptr->lines; sptr = xml_close( sptr ); if (!( fptr->failure )) return( status ); else return((fptr->failure)(nptr,status,lno)); } else return( _XML_SUCCESS ); } else if (!( sptr->nesting )) { sptr = xml_close( sptr ); return( _XML_SUCCESS ); } else { sptr = xml_close( sptr ); return( _XML_UNEXPECTED_EOF ); } } }
void ColorOptions::loadColorSchemaButtonClicked() { char path[MAX_PATH_LENGTH], scratchpad[2048], *result; struct xml_handle *xml_hdl; strcpy(path, QFileDialog::getOpenFileName(0, "Load colorschema", QString::fromLocal8Bit(mainwindow->recent_colordir), "Montage files (*.color *.COLOR)").toLocal8Bit().data()); if(!strcmp(path, "")) { return; } get_directory_from_path(mainwindow->recent_colordir, path, MAX_PATH_LENGTH); xml_hdl = xml_get_handle(path); if(xml_hdl==NULL) { sprintf(scratchpad, "Can not open colorschema:\n%s", path); QMessageBox messagewindow(QMessageBox::Critical, "Error", QString::fromLocal8Bit(scratchpad)); messagewindow.exec(); return; } if(strcmp(xml_hdl->elementname, PROGRAM_NAME "_colorschema")) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this colorschema."); messagewindow.exec(); xml_close(xml_hdl); return; } mainwindow->get_rgbcolor_settings(xml_hdl, "backgroundcolor", 0, &mainwindow->maincurve->backgroundcolor); mainwindow->get_rgbcolor_settings(xml_hdl, "small_ruler_color", 0, &mainwindow->maincurve->small_ruler_color); mainwindow->get_rgbcolor_settings(xml_hdl, "big_ruler_color", 0, &mainwindow->maincurve->big_ruler_color); mainwindow->get_rgbcolor_settings(xml_hdl, "mouse_rect_color", 0, &mainwindow->maincurve->mouse_rect_color); mainwindow->get_rgbcolor_settings(xml_hdl, "text_color", 0, &mainwindow->maincurve->text_color); mainwindow->get_rgbcolor_settings(xml_hdl, "baseline_color", 0, &mainwindow->maincurve->baseline_color); mainwindow->get_rgbcolor_settings(xml_hdl, "annot_marker_color", 0, &mainwindow->maincurve->annot_marker_color); if(xml_goto_nth_element_inside(xml_hdl, "signal_color", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->maincurve->signal_color = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "floating_ruler_color", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->maincurve->floating_ruler_color = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "blackwhite_printing", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->maincurve->blackwhite_printing = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "show_annot_markers", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->show_annot_markers = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "show_baselines", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->show_baselines = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "clip_to_pane", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->clip_to_pane = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "crosshair_1_color", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->maincurve->crosshair_1.color = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "crosshair_2_color", 0)) { xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } mainwindow->maincurve->crosshair_2.color = atoi(result); free(result); xml_close(xml_hdl); update_interface(); }
void UI_LoadMontagewindow::LoadButtonClicked() { int i, k, n, p, tmp, skip, found, signalcomps_read=0, signals_read, signal_cnt, filters_read, filter_cnt=0, ravg_filter_cnt=0, fidfilter_cnt=0, len, order=1, type=0, model=0, size=0, amp_cat[3], f_ruler_cnt=0; char *result, scratchpad[2048], str[128], *err, *filter_spec, spec_str[256]; double frequency=1.0, frequency2=2.0, ripple=1.0; struct xml_handle *xml_hdl; struct signalcompblock *newsignalcomp; if(mainwindow->files_open==1) n = 0; else n = filelist->currentRow(); if(mtg_path[0]==0) { strcpy(mtg_path, QFileDialog::getOpenFileName(0, "Load montage", QString::fromLocal8Bit(mainwindow->recent_montagedir), "Montage files (*.mtg *.MTG)").toLocal8Bit().data()); if(!strcmp(mtg_path, "")) { return; } get_directory_from_path(mainwindow->recent_montagedir, mtg_path, MAX_PATH_LENGTH); } xml_hdl = xml_get_handle(mtg_path); if(xml_hdl==NULL) { sprintf(scratchpad, "Can not open montage file:\n%s", mtg_path); QMessageBox messagewindow(QMessageBox::Critical, "Error", QString::fromLocal8Bit(scratchpad)); messagewindow.exec(); mainwindow->remove_recent_file_mtg_path(mtg_path); return; } if(strcmp(xml_hdl->elementname, PROGRAM_NAME "_montage")) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } //////////////////////////////////////////// for(k=0; k<mainwindow->signalcomps; ) { if(mainwindow->signalcomp[k]->filenum==n) { if(mainwindow->spectrumdock->signalcomp == mainwindow->signalcomp[k]) { mainwindow->spectrumdock->clear(); mainwindow->spectrumdock->dock->hide(); } for(i=0; i<MAXSPECTRUMDIALOGS; i++) { p = mainwindow->signalcomp[k]->spectr_dialog[i]; if(p != 0) { delete mainwindow->spectrumdialog[p - 1]; mainwindow->spectrumdialog[p - 1] = NULL; } } for(i=0; i<MAXAVERAGECURVEDIALOGS; i++) { p = mainwindow->signalcomp[k]->avg_dialog[i]; if(p != 0) { delete mainwindow->averagecurvedialog[p - 1]; mainwindow->averagecurvedialog[p - 1] = NULL; } } if(mainwindow->signalcomp[k]->hascursor2) { /* crosshair_2_active = 0; crosshair_2_moving = 0;*/ } if(mainwindow->signalcomp[k]->hascursor1) { // crosshair_1_active = 0; // crosshair_2_active = 0; // crosshair_1_moving = 0; // crosshair_2_moving = 0; for(i=0; i<mainwindow->signalcomps; i++) { mainwindow->signalcomp[i]->hascursor2 = 0; } } for(i=0; i<mainwindow->signalcomp[k]->filter_cnt; i++) { free(mainwindow->signalcomp[k]->filter[i]); } mainwindow->signalcomp[k]->filter_cnt = 0; for(i=0; i<mainwindow->signalcomp[k]->ravg_filter_cnt; i++) { free_ravg_filter(mainwindow->signalcomp[k]->ravg_filter[i]); } mainwindow->signalcomp[k]->ravg_filter_cnt = 0; for(i=0; i<mainwindow->signalcomp[k]->fidfilter_cnt; i++) { free(mainwindow->signalcomp[k]->fidfilter[i]); fid_run_free(mainwindow->signalcomp[k]->fid_run[i]); fid_run_freebuf(mainwindow->signalcomp[k]->fidbuf[i]); fid_run_freebuf(mainwindow->signalcomp[k]->fidbuf2[i]); } mainwindow->signalcomp[k]->fidfilter_cnt = 0; if(mainwindow->signalcomp[k]->ecg_filter != NULL) { free_ecg_filter(mainwindow->signalcomp[k]->ecg_filter); mainwindow->signalcomp[k]->ecg_filter = NULL; strcpy(mainwindow->signalcomp[k]->signallabel, mainwindow->signalcomp[k]->signallabel_bu); mainwindow->signalcomp[k]->signallabellen = mainwindow->signalcomp[k]->signallabellen_bu; } free(mainwindow->signalcomp[k]); for(i=k; i<mainwindow->signalcomps - 1; i++) { mainwindow->signalcomp[i] = mainwindow->signalcomp[i + 1]; } mainwindow->signalcomps--; k = 0; } else { k++; } } //////////////////////////////////////////// while(1) { skip = 0; xml_goto_root(xml_hdl); signals_read = 0; if(xml_goto_nth_element_inside(xml_hdl, "signalcomposition", signalcomps_read)) { break; } newsignalcomp = (struct signalcompblock *)calloc(1, sizeof(struct signalcompblock)); if(newsignalcomp==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Internal error: Memory allocation error:\n\"new signal composition\""); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "num_of_signals", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); signal_cnt = atoi(result); free(result); if((signal_cnt<1)||(signal_cnt>MAXSIGNALS)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } newsignalcomp->edfhdr = mainwindow->edfheaderlist[n]; newsignalcomp->filenum = n; newsignalcomp->num_of_signals = signal_cnt; newsignalcomp->hascursor1 = 0; newsignalcomp->hascursor2 = 0; newsignalcomp->hasoffsettracking = 0; newsignalcomp->hasgaintracking = 0; newsignalcomp->screen_offset = 0; newsignalcomp->filter_cnt = 0; newsignalcomp->ravg_filter_cnt = 0; newsignalcomp->ecg_filter = NULL; newsignalcomp->fidfilter_cnt = 0; newsignalcomp->hasruler = 0; newsignalcomp->polarity = 1; newsignalcomp->type = -1; xml_go_up(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "alias", 0))) { result = xml_get_content_of_element(xml_hdl); if(result[0] != 0) { strncpy(newsignalcomp->alias, result, 16); newsignalcomp->alias[16] = 0; latin1_to_ascii(newsignalcomp->alias, 16); remove_trailing_spaces(newsignalcomp->alias); remove_leading_spaces(newsignalcomp->alias); } free(result); xml_go_up(xml_hdl); } if(xml_goto_nth_element_inside(xml_hdl, "voltpercm", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); newsignalcomp->voltpercm = atof(result); if(newsignalcomp->voltpercm==0.0) newsignalcomp->voltpercm = 0.000000001; free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "screen_offset", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); newsignalcomp->screen_offset = atof(result); free(result); xml_go_up(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "polarity", 0))) { result = xml_get_content_of_element(xml_hdl); newsignalcomp->polarity = atoi(result); if(newsignalcomp->polarity != -1) { newsignalcomp->polarity = 1; } free(result); xml_go_up(xml_hdl); } if(xml_goto_nth_element_inside(xml_hdl, "color", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); newsignalcomp->color = atoi(result); if((newsignalcomp->color < 2) || (newsignalcomp->color > 18)) { newsignalcomp->color = 2; } free(result); xml_go_up(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "filter_cnt", 0))) { result = xml_get_content_of_element(xml_hdl); filter_cnt = atoi(result); if(filter_cnt < 0) filter_cnt = 0; if(filter_cnt > MAXFILTERS) filter_cnt = MAXFILTERS; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "ravg_filter_cnt", 0))) { result = xml_get_content_of_element(xml_hdl); ravg_filter_cnt = atoi(result); if(ravg_filter_cnt < 0) filter_cnt = 0; if(ravg_filter_cnt > MAXFILTERS) ravg_filter_cnt = MAXFILTERS; free(result); xml_go_up(xml_hdl); } if(filter_cnt) { fidfilter_cnt = 0; } else { if(!(xml_goto_nth_element_inside(xml_hdl, "fidfilter_cnt", 0))) { result = xml_get_content_of_element(xml_hdl); fidfilter_cnt = atoi(result); if(fidfilter_cnt < 0) fidfilter_cnt = 0; if(fidfilter_cnt > MAXFILTERS) fidfilter_cnt = MAXFILTERS; free(result); xml_go_up(xml_hdl); } } for(signals_read=0; signals_read<signal_cnt; signals_read++) { if(xml_goto_nth_element_inside(xml_hdl, "signal", signals_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "factor", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); newsignalcomp->factor[signals_read] = atoi(result); if(newsignalcomp->factor[signals_read] < -128) { newsignalcomp->factor[signals_read] = -128; } if(newsignalcomp->factor[signals_read] > 128) { newsignalcomp->factor[signals_read] = 128; } if(newsignalcomp->factor[signals_read] == 0) { newsignalcomp->factor[signals_read] = 1; } free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "edfindex", 0)) { if(xml_goto_nth_element_inside(xml_hdl, "label", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); remove_trailing_spaces(result); found = 0; for(i=0; i<newsignalcomp->edfhdr->edfsignals; i++) { strcpy(scratchpad, newsignalcomp->edfhdr->edfparam[i].label); remove_trailing_spaces(scratchpad); if(!strcmp(scratchpad, result)) { newsignalcomp->edfsignal[signals_read] = i; if(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[signals_read]].annotation) { found = 0; } else { found = 1; } break; } } } else { result = xml_get_content_of_element(xml_hdl); newsignalcomp->edfsignal[signals_read] = atoi(result); if((newsignalcomp->edfsignal[signals_read] < 0) || (newsignalcomp->edfsignal[signals_read] >= newsignalcomp->edfhdr->edfsignals)) { found = 0; } else { if(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[signals_read]].annotation) { found = 0; } else { found = 1; } } } free(result); if(!found) { free(newsignalcomp); skip = 1; signalcomps_read++; xml_go_up(xml_hdl); xml_go_up(xml_hdl); break; } if(signals_read) { if(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[signals_read]].smp_per_record != newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record) { free(newsignalcomp); skip = 1; signalcomps_read++; xml_go_up(xml_hdl); xml_go_up(xml_hdl); break; } } newsignalcomp->sensitivity[signals_read] = newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[signals_read]].bitvalue / (newsignalcomp->voltpercm * mainwindow->pixelsizefactor); if(!signals_read) { newsignalcomp->signallabel[0] = 0; } if(signal_cnt>1) { if(newsignalcomp->factor[signals_read]<0) { strcat(newsignalcomp->signallabel, "- "); } else { if(signals_read) { strcat(newsignalcomp->signallabel, "+ "); } } } strcpy(str, newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[signals_read]].label); strip_types_from_label(str); strcat(newsignalcomp->signallabel, str); strcat(newsignalcomp->signallabel, " "); len = strlen(newsignalcomp->signallabel); for(k=(len-1); k>0; k--) { if(newsignalcomp->signallabel[k]!=' ') break; } newsignalcomp->signallabel[k+2] = 0; newsignalcomp->file_duration = newsignalcomp->edfhdr->long_data_record_duration * newsignalcomp->edfhdr->datarecords; newsignalcomp->signallabellen = strlen(newsignalcomp->signallabel); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } if(skip) continue; strcpy(newsignalcomp->physdimension, newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].physdimension); remove_trailing_spaces(newsignalcomp->physdimension); for(filters_read=0; filters_read<filter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "filter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "LPF", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); type = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "frequency", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); frequency = atof(result); free(result); if((type < 0) || (type > 1) || (frequency < 0.0001)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (filter values)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(frequency >= ((newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record / newsignalcomp->edfhdr->data_record_duration) / 2.0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "The frequency of the filter(s) must be less than: samplerate / 2"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(type == 0) { sprintf(spec_str, "HpBu1/%f", frequency); } if(type == 1) { sprintf(spec_str, "LpBu1/%f", frequency); } filter_spec = spec_str; err = fid_parse(((double)(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record)) / newsignalcomp->edfhdr->data_record_duration, &filter_spec, &newsignalcomp->fidfilter[filters_read]); if(err != NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", err); messagewindow.exec(); free(err); free(newsignalcomp); xml_close(xml_hdl); return; } newsignalcomp->fid_run[filters_read] = fid_run_new(newsignalcomp->fidfilter[filters_read], &newsignalcomp->fidfuncp[filters_read]); newsignalcomp->fidbuf[filters_read] = fid_run_newbuf(newsignalcomp->fid_run[filters_read]); newsignalcomp->fidbuf2[filters_read] = fid_run_newbuf(newsignalcomp->fid_run[filters_read]); newsignalcomp->fidfilter_freq[filters_read] = frequency; newsignalcomp->fidfilter_freq2[filters_read] = frequency * 1.12; newsignalcomp->fidfilter_ripple[filters_read] = -1.0; newsignalcomp->fidfilter_order[filters_read] = 1; newsignalcomp->fidfilter_type[filters_read] = type; newsignalcomp->fidfilter_model[filters_read] = 0; newsignalcomp->fidfilter_setup[filters_read] = 1; newsignalcomp->fidfilter_cnt = filters_read + 1; xml_go_up(xml_hdl); xml_go_up(xml_hdl); } for(filters_read=0; filters_read<ravg_filter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "ravg_filter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); type = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "size", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); size = atoi(result); free(result); if((type < 0) || (type > 1) || (size < 2) || (size > 10000)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (ravg_filter values)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } newsignalcomp->ravg_filter[filters_read] = create_ravg_filter(type, size); if(newsignalcomp->ravg_filter[filters_read] == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "A memory allocation error occurred when creating an ravg filter."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } newsignalcomp->ravg_filter_size[filters_read] = size; newsignalcomp->ravg_filter_type[filters_read] = type; newsignalcomp->ravg_filter_cnt = filters_read + 1; xml_go_up(xml_hdl); xml_go_up(xml_hdl); } for(filters_read=0; filters_read<fidfilter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "fidfilter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (fidfilter)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (type)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); type = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "model", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (model)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); model = atoi(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "frequency", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (frequency)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); frequency = atof(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "frequency2", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (frequency2)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); frequency2 = atof(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "ripple", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (ripple)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); ripple = atof(result); free(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "order", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (order)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); order = atoi(result); free(result); if((model < 0) || (model > 2) || (order < 1) || (order > 100) || (type < 0) || (type > 4) || (ripple < (-6.0)) || (ripple > (-0.1)) || (frequency < 0.0001) || (frequency2 < 0.0001)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (fidfilter values)"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(frequency >= ((newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record / newsignalcomp->edfhdr->data_record_duration) / 2.0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "The frequency of the filter(s) must be less than: samplerate / 2"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } if(type > 2) { if(frequency2 >= ((newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record / newsignalcomp->edfhdr->data_record_duration) / 2.0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "The frequency of the filter(s) must be less than: samplerate / 2"); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } } if((type == 0) || (type == 1)) { if(order > 8) { order = 8; } } if(type == 0) { if(model == 0) { sprintf(spec_str, "HpBu%i/%f", order, frequency); } if(model == 1) { sprintf(spec_str, "HpCh%i/%f/%f", order, ripple, frequency); } if(model == 2) { sprintf(spec_str, "HpBe%i/%f", order, frequency); } } if(type == 1) { if(model == 0) { sprintf(spec_str, "LpBu%i/%f", order, frequency); } if(model == 1) { sprintf(spec_str, "LpCh%i/%f/%f", order, ripple, frequency); } if(model == 2) { sprintf(spec_str, "LpBe%i/%f", order, frequency); } } if(type == 2) { if(order > 100) { order = 100; } if(order < 3) { order = 3; } if(model == 0) { sprintf(spec_str, "BsRe/%i/%f", order, frequency); } } if((type == 3) || (type == 4)) { if(order < 2) { order = 2; } if(order % 2) { order++; } if(order > 16) { order = 16; } } if(type == 3) { if(model == 0) { sprintf(spec_str, "BpBu%i/%f-%f", order, frequency, frequency2); } if(model == 1) { sprintf(spec_str, "BpCh%i/%f/%f-%f", order, ripple, frequency, frequency2); } if(model == 2) { sprintf(spec_str, "BpBe%i/%f-%f", order, frequency, frequency2); } } if(type == 4) { if(model == 0) { sprintf(spec_str, "BsBu%i/%f-%f", order, frequency, frequency2); } if(model == 1) { sprintf(spec_str, "BsCh%i/%f/%f-%f", order, ripple, frequency, frequency2); } if(model == 2) { sprintf(spec_str, "BsBe%i/%f-%f", order, frequency, frequency2); } } filter_spec = spec_str; err = fid_parse(((double)(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record)) / newsignalcomp->edfhdr->data_record_duration, &filter_spec, &newsignalcomp->fidfilter[filters_read]); if(err != NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", err); messagewindow.exec(); free(err); free(newsignalcomp); xml_close(xml_hdl); return; } newsignalcomp->fid_run[filters_read] = fid_run_new(newsignalcomp->fidfilter[filters_read], &newsignalcomp->fidfuncp[filters_read]); newsignalcomp->fidbuf[filters_read] = fid_run_newbuf(newsignalcomp->fid_run[filters_read]); newsignalcomp->fidbuf2[filters_read] = fid_run_newbuf(newsignalcomp->fid_run[filters_read]); newsignalcomp->fidfilter_freq[filters_read] = frequency; newsignalcomp->fidfilter_freq2[filters_read] = frequency2; newsignalcomp->fidfilter_ripple[filters_read] = ripple; newsignalcomp->fidfilter_order[filters_read] = order; newsignalcomp->fidfilter_type[filters_read] = type; newsignalcomp->fidfilter_model[filters_read] = model; newsignalcomp->fidfilter_setup[filters_read] = 1; newsignalcomp->fidfilter_cnt = filters_read + 1; xml_go_up(xml_hdl); xml_go_up(xml_hdl); } if(!xml_goto_nth_element_inside(xml_hdl, "ecg_filter", 0)) { if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); type = atoi(result); free(result); if(type == 1) { newsignalcomp->ecg_filter = create_ecg_filter(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record / newsignalcomp->edfhdr->data_record_duration, newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].bitvalue, mainwindow->powerlinefreq); if(newsignalcomp->ecg_filter == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "A memory allocation error occurred when creating an ECG filter."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } strcpy(newsignalcomp->signallabel_bu, newsignalcomp->signallabel); newsignalcomp->signallabellen_bu = newsignalcomp->signallabellen; strcpy(newsignalcomp->signallabel, "HR"); newsignalcomp->signallabellen = strlen(newsignalcomp->signallabel); strcpy(newsignalcomp->physdimension_bu, newsignalcomp->physdimension); strcpy(newsignalcomp->physdimension, "bpm"); } xml_go_up(xml_hdl); xml_go_up(xml_hdl); } if(newsignalcomp->ecg_filter == NULL) { if(!xml_goto_nth_element_inside(xml_hdl, "zratio_filter", 0)) { if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); type = atoi(result); free(result); xml_go_up(xml_hdl); if(type == 1) { if(xml_goto_nth_element_inside(xml_hdl, "crossoverfreq", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); newsignalcomp->zratio_crossoverfreq = atof(result); free(result); if((newsignalcomp->zratio_crossoverfreq < 5.0) || (newsignalcomp->zratio_crossoverfreq > 9.5)) { newsignalcomp->zratio_crossoverfreq = 7.5; } newsignalcomp->zratio_filter = create_zratio_filter(newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].smp_per_record, newsignalcomp->edfhdr->long_data_record_duration, newsignalcomp->zratio_crossoverfreq, newsignalcomp->edfhdr->edfparam[newsignalcomp->edfsignal[0]].bitvalue); if(newsignalcomp->zratio_filter == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "A memory allocation error occurred when creating a Z-ratio filter."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } strcpy(newsignalcomp->signallabel_bu, newsignalcomp->signallabel); newsignalcomp->signallabellen_bu = newsignalcomp->signallabellen; strcpy(newsignalcomp->signallabel, "Z-ratio "); strcat(newsignalcomp->signallabel, newsignalcomp->signallabel_bu); newsignalcomp->signallabellen = strlen(newsignalcomp->signallabel); strcpy(newsignalcomp->physdimension_bu, newsignalcomp->physdimension); strcpy(newsignalcomp->physdimension, ""); xml_go_up(xml_hdl); } xml_go_up(xml_hdl); } } if(f_ruler_cnt == 0) { if(!xml_goto_nth_element_inside(xml_hdl, "floating_ruler", 0)) { if(xml_goto_nth_element_inside(xml_hdl, "hasruler", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); free(newsignalcomp); xml_close(xml_hdl); return; } result = xml_get_content_of_element(xml_hdl); tmp = atoi(result); free(result); xml_go_up(xml_hdl); if(tmp == 1) { f_ruler_cnt = 1; mainwindow->maincurve->ruler_x_position = 200; mainwindow->maincurve->ruler_y_position = 200; mainwindow->maincurve->floating_ruler_value = 0; if(!xml_goto_nth_element_inside(xml_hdl, "ruler_x_position", 0)) { result = xml_get_content_of_element(xml_hdl); tmp = atoi(result); free(result); if((tmp >= 0) && (tmp < 5000)) { mainwindow->maincurve->ruler_x_position = tmp; } xml_go_up(xml_hdl); } if(!xml_goto_nth_element_inside(xml_hdl, "ruler_y_position", 0)) { result = xml_get_content_of_element(xml_hdl); tmp = atoi(result); free(result); if((tmp >= 0) && (tmp < 5000)) { mainwindow->maincurve->ruler_y_position = tmp; } xml_go_up(xml_hdl); } if(!xml_goto_nth_element_inside(xml_hdl, "floating_ruler_value", 0)) { result = xml_get_content_of_element(xml_hdl); tmp = atoi(result); free(result); if((tmp >= 0) && (tmp < 2)) { mainwindow->maincurve->floating_ruler_value = tmp; } xml_go_up(xml_hdl); } newsignalcomp->hasruler = 1; } xml_go_up(xml_hdl); } } mainwindow->signalcomp[mainwindow->signalcomps] = newsignalcomp; mainwindow->signalcomps++; signalcomps_read++; } xml_goto_root(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "pagetime", 0))) { result = xml_get_content_of_element(xml_hdl); mainwindow->pagetime = atoll(result); if(mainwindow->pagetime < 10000LL) { mainwindow->pagetime = 10000LL; } free(result); } xml_close(xml_hdl); if(LoadMontageDialog!=NULL) LoadMontageDialog->close(); mainwindow->setMainwindowTitle(mainwindow->edfheaderlist[mainwindow->sel_viewtime]); if(mainwindow->files_open == 1) { strcpy(&mainwindow->recent_file_mtg_path[0][0], mtg_path); } for(i=0; i<3; i++) { amp_cat[i] = 0; } for(i=0; i<mainwindow->signalcomps; i++) { tmp = round_125_cat(mainwindow->signalcomp[i]->voltpercm); switch(tmp) { case 10 : amp_cat[0]++; break; case 20 : amp_cat[1]++; break; case 50 : amp_cat[2]++; break; } } mainwindow->amplitude_doubler = 10; if((amp_cat[1] > amp_cat[0]) && (amp_cat[1] >= amp_cat[2])) { mainwindow->amplitude_doubler = 20; } if((amp_cat[2] > amp_cat[0]) && (amp_cat[2] > amp_cat[1])) { mainwindow->amplitude_doubler = 50; } if(f_ruler_cnt == 1) { mainwindow->maincurve->ruler_active = 1; } mainwindow->setup_viewbuf(); }
void UI_RAW2EDFapp::loadbuttonpressed() { char path[MAX_PATH_LENGTH], *result; struct xml_handle *xml_hdl; strcpy(path, QFileDialog::getOpenFileName(0, "Load parameters", QString::fromLocal8Bit(recent_opendir), "Template files (*.template *.TEMPLATE)").toLocal8Bit().data()); if(!strcmp(path, "")) { return; } get_directory_from_path(recent_opendir, path, MAX_PATH_LENGTH); xml_hdl = xml_get_handle(path); if(xml_hdl==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open file for reading."); messagewindow.exec(); return; } if(strcmp(xml_hdl->elementname, PROGRAM_NAME "_raw2edf_template")) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this template."); messagewindow.exec(); xml_close(xml_hdl); return; } if(!(xml_goto_nth_element_inside(xml_hdl, "sf", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->sf = atoi(result); if(raw2edf_var->sf < 1) raw2edf_var->sf = 1; if(raw2edf_var->sf > 1000000) raw2edf_var->sf = 1000000; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "chns", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->chns = atoi(result); if(raw2edf_var->chns < 1) raw2edf_var->chns = 1; if(raw2edf_var->chns > 256) raw2edf_var->chns = 256; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "phys_max", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->phys_max = atoi(result); if(raw2edf_var->phys_max < 1) raw2edf_var->phys_max = 1; if(raw2edf_var->phys_max > 10000000) raw2edf_var->phys_max = 10000000; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "straightbinary", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->straightbinary = atoi(result); if(raw2edf_var->straightbinary < 0) raw2edf_var->straightbinary = 0; if(raw2edf_var->straightbinary > 1) raw2edf_var->straightbinary = 1; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "endianness", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->endianness = atoi(result); if(raw2edf_var->endianness < 0) raw2edf_var->endianness = 0; if(raw2edf_var->endianness > 1) raw2edf_var->endianness = 1; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "samplesize", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->samplesize = atoi(result); if(raw2edf_var->samplesize < 1) raw2edf_var->samplesize = 1; if(raw2edf_var->samplesize > 2) raw2edf_var->samplesize = 2; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "offset", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->offset = atoi(result); if(raw2edf_var->offset < 0) raw2edf_var->offset = 0; if(raw2edf_var->offset > 1000000) raw2edf_var->offset = 1000000; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "skipblocksize", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->skipblocksize = atoi(result); if(raw2edf_var->skipblocksize < 0) raw2edf_var->skipblocksize = 0; if(raw2edf_var->skipblocksize > 1000000) raw2edf_var->skipblocksize = 1000000; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "skipbytes", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } raw2edf_var->skipbytes = atoi(result); if(raw2edf_var->skipbytes < 1) raw2edf_var->skipbytes = 1; if(raw2edf_var->skipbytes > 1000000) raw2edf_var->skipbytes = 1000000; free(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "phys_dim", 0))) { result = xml_get_content_of_element(xml_hdl); if(result==NULL) { xml_close(xml_hdl); return; } strncpy(raw2edf_var->phys_dim, result, 16); raw2edf_var->phys_dim[15] = 0; latin1_to_ascii(raw2edf_var->phys_dim, 16); remove_leading_spaces(raw2edf_var->phys_dim); remove_trailing_spaces(raw2edf_var->phys_dim); free(result); xml_go_up(xml_hdl); } xml_close(xml_hdl); SamplefreqSpinbox->setValue(raw2edf_var->sf); SignalsSpinbox->setValue(raw2edf_var->chns); PhysicalMaximumSpinbox->setValue(raw2edf_var->phys_max); EncodingCombobox->setCurrentIndex(raw2edf_var->straightbinary); EndiannessCombobox->setCurrentIndex(raw2edf_var->endianness); SampleSizeSpinbox->setValue(raw2edf_var->samplesize); OffsetSpinbox->setValue(raw2edf_var->offset); skipblocksizeSpinbox->setValue(raw2edf_var->skipblocksize); skipbytesSpinbox->setValue(raw2edf_var->skipbytes); }
/****************************************************************************** * *Function: conf_finish * *Description: close xml file * *Input: none * *Output: none * *Return: none * *Date: 2016/8/22 * ****************************************************************************/ void conf_finish() { xml_close(); }
void UI_ViewMontagewindow::SelectButtonClicked() { int signalcomps_read=0, signals_read, signal_cnt, filters_read, color, filter_cnt=0, spike_filter_cnt=0, ravg_filter_cnt=0, fidfilter_cnt=0, islpf, factor[MAXSIGNALS], signalcomps, screen_offset, order, model, type, size, polarity=1, holdoff=100; char result[XML_STRBUFLEN], composition_txt[2048], label[256]; double frequency, frequency2, voltpercm, ripple, timescale, d_tmp, velocity; QStandardItem *parentItem, *signalItem, *filterItem; struct xml_handle *xml_hdl; strcpy(mtg_path, QFileDialog::getOpenFileName(0, "Choose a montage", QString::fromLocal8Bit(mtg_dir), "Montage files (*.mtg *.MTG)").toLocal8Bit().data()); if(!strcmp(mtg_path, "")) { return; } get_directory_from_path(mtg_dir, mtg_path, MAX_PATH_LENGTH); xml_hdl = xml_get_handle(mtg_path); if(xml_hdl==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open file for reading."); messagewindow.exec(); return; } if(strcmp(xml_hdl->elementname[xml_hdl->level], PROGRAM_NAME "_montage")) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } ViewMontageDialog->setWindowTitle(mtg_path); t_model->clear(); parentItem = t_model->invisibleRootItem(); for(signalcomps=0; ; signalcomps++) { xml_goto_root(xml_hdl); signals_read = 0; filter_cnt = 0; ravg_filter_cnt = 0; fidfilter_cnt = 0; if(xml_goto_nth_element_inside(xml_hdl, "signalcomposition", signalcomps_read)) { break; } if(xml_goto_nth_element_inside(xml_hdl, "num_of_signals", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } signal_cnt = atoi(result); if((signal_cnt<1)||(signal_cnt>256)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "voltpercm", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } voltpercm = atof(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "screen_offset", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } screen_offset = atoi(result); xml_go_up(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "polarity", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } polarity = atoi(result); if(polarity != -1) { polarity = 1; } xml_go_up(xml_hdl); } if(xml_goto_nth_element_inside(xml_hdl, "color", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } color = atoi(result); xml_go_up(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "spike_filter_cnt", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } spike_filter_cnt = atoi(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "filter_cnt", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } filter_cnt = atoi(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "ravg_filter_cnt", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } ravg_filter_cnt = atoi(result); xml_go_up(xml_hdl); } if(!(xml_goto_nth_element_inside(xml_hdl, "fidfilter_cnt", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } fidfilter_cnt = atoi(result); xml_go_up(xml_hdl); } composition_txt[0] = 0; if(!(xml_goto_nth_element_inside(xml_hdl, "alias", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(result[0] != 0) { strcpy(composition_txt, "alias: "); strcat(composition_txt, result); strcat(composition_txt, " "); } xml_go_up(xml_hdl); } for(signals_read=0; signals_read<signal_cnt; signals_read++) { if(xml_goto_nth_element_inside(xml_hdl, "signal", signals_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "factor", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } factor[signals_read] = atoi(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "label", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } strcpy(label, result); sprintf(composition_txt + strlen(composition_txt), "%+ix %s", factor[signals_read], label); remove_trailing_spaces(composition_txt); strcat(composition_txt, " "); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } if(polarity == -1) { strcat(composition_txt, "inverted: yes"); } signalItem = new QStandardItem(composition_txt); parentItem->appendRow(signalItem); sprintf(composition_txt, "amplitude: %f", voltpercm); remove_trailing_zeros(composition_txt); sprintf(composition_txt + strlen(composition_txt), "/cm offset: %f", (double)screen_offset * mainwindow->pixelsizefactor * voltpercm); remove_trailing_zeros(composition_txt); strcat(composition_txt, " color: "); switch(color) { case Qt::white : strcat(composition_txt, "white"); break; case Qt::black : strcat(composition_txt, "black"); break; case Qt::red : strcat(composition_txt, "red"); break; case Qt::darkRed : strcat(composition_txt, "dark red"); break; case Qt::green : strcat(composition_txt, "green"); break; case Qt::darkGreen : strcat(composition_txt, "dark green"); break; case Qt::blue : strcat(composition_txt, "blue"); break; case Qt::darkBlue : strcat(composition_txt, "dark blue"); break; case Qt::cyan : strcat(composition_txt, "cyan"); break; case Qt::darkCyan : strcat(composition_txt, "dark cyan"); break; case Qt::magenta : strcat(composition_txt, "magenta"); break; case Qt::darkMagenta : strcat(composition_txt, "dark magenta"); break; case Qt::yellow : strcat(composition_txt, "yellow"); break; case Qt::darkYellow : strcat(composition_txt, "dark yellow"); break; case Qt::gray : strcat(composition_txt, "gray"); break; case Qt::darkGray : strcat(composition_txt, "dark gray"); break; case Qt::lightGray : strcat(composition_txt, "light gray"); break; } signalItem->appendRow(new QStandardItem(composition_txt)); filterItem = new QStandardItem("Filters"); signalItem->appendRow(filterItem); for(filters_read=0; filters_read<spike_filter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "spike_filter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (filter)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "velocity", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (velocity)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } velocity = atof(result); if(velocity < 0.0001) velocity = 0.0001; if(velocity > 10E9) velocity = 10E9; xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "holdoff", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (holdoff)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } holdoff = atoi(result); if(holdoff < 10) holdoff = 10; if(holdoff > 1000) holdoff = 1000; sprintf(composition_txt, "Spike: Velocity: %.8f", velocity); remove_trailing_zeros(composition_txt); sprintf(composition_txt + strlen(composition_txt), " Hold-off: %i milli-Sec.", holdoff); filterItem->appendRow(new QStandardItem(composition_txt)); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } for(filters_read=0; filters_read<filter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "filter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (filter)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "LPF", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (LPF)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } islpf = atoi(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "frequency", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (frequency)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } frequency = atof(result); if(islpf) { sprintf(composition_txt, "LPF: %fHz", frequency); } else { sprintf(composition_txt, "HPF: %fHz", frequency); } remove_trailing_zeros(composition_txt); filterItem->appendRow(new QStandardItem(composition_txt)); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } for(filters_read=0; filters_read<ravg_filter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "ravg_filter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (filter)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (type)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } type = atoi(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "size", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (size)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } size = atoi(result); if(type == 0) { sprintf(composition_txt, "highpass moving average %ismpls", size); } if(type == 1) { sprintf(composition_txt, "lowpass moving average %ismpls", size); } filterItem->appendRow(new QStandardItem(composition_txt)); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } for(filters_read=0; filters_read<fidfilter_cnt; filters_read++) { if(xml_goto_nth_element_inside(xml_hdl, "fidfilter", filters_read)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (fidfilter)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (type)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } type = atoi(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "frequency", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (frequency)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } frequency = atof(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "frequency2", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (frequency2)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } frequency2 = atof(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "ripple", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (ripple)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } ripple = atof(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "order", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (order)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } order = atoi(result); xml_go_up(xml_hdl); if(xml_goto_nth_element_inside(xml_hdl, "model", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file. (model)"); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } model = atoi(result); if(type == 0) { if(model == 0) { sprintf(composition_txt, "highpass Butterworth %fHz %ith order ", frequency, order); } if(model == 1) { sprintf(composition_txt, "highpass Chebyshev %fHz %ith order %fdB ripple ", frequency, order, ripple); } if(model == 2) { sprintf(composition_txt, "highpass Bessel %fHz %ith order ", frequency, order); } } if(type == 1) { if(model == 0) { sprintf(composition_txt, "lowpass Butterworth %fHz %ith order ", frequency, order); } if(model == 1) { sprintf(composition_txt, "lowpass Chebyshev %fHz %ith order %fdB ripple ", frequency, order, ripple); } if(model == 2) { sprintf(composition_txt, "lowpass Bessel %fHz %ith order ", frequency, order); } } if(type == 2) { sprintf(composition_txt, "notch %fHz Q-factor %i ", frequency, order); } if(type == 3) { if(model == 0) { sprintf(composition_txt, "bandpass Butterworth %f-%fHz %ith order ", frequency, frequency2, order); } if(model == 1) { sprintf(composition_txt, "bandpass Chebyshev %f-%fHz %ith order %fdB ripple ", frequency, frequency2, order, ripple); } if(model == 2) { sprintf(composition_txt, "bandpass Bessel %f-%fHz %ith order ", frequency, frequency2, order); } } if(type == 4) { if(model == 0) { sprintf(composition_txt, "bandstop Butterworth %f-%fHz %ith order ", frequency, frequency2, order); } if(model == 1) { sprintf(composition_txt, "bandstop Chebyshev %f-%fHz %ith order %fdB ripple ", frequency, frequency2, order, ripple); } if(model == 2) { sprintf(composition_txt, "bandstop Bessel %f-%fHz %ith order ", frequency, frequency2, order); } } remove_trailing_zeros(composition_txt); filterItem->appendRow(new QStandardItem(composition_txt)); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } if(!xml_goto_nth_element_inside(xml_hdl, "ecg_filter", 0)) { if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } type = atoi(result); if(type == 1) { sprintf(composition_txt, "ECG heartrate detection"); } filterItem->appendRow(new QStandardItem(composition_txt)); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } if(!xml_goto_nth_element_inside(xml_hdl, "zratio_filter", 0)) { if(xml_goto_nth_element_inside(xml_hdl, "type", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } type = atoi(result); xml_go_up(xml_hdl); if(type == 1) { if(xml_goto_nth_element_inside(xml_hdl, "crossoverfreq", 0)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } d_tmp = atof(result); sprintf(composition_txt, "Z-ratio cross-over frequency is %.1f", d_tmp); } filterItem->appendRow(new QStandardItem(composition_txt)); xml_go_up(xml_hdl); xml_go_up(xml_hdl); } signalcomps_read++; } xml_goto_root(xml_hdl); if(!(xml_goto_nth_element_inside(xml_hdl, "pagetime", 0))) { if(xml_get_content_of_element(xml_hdl, result, XML_STRBUFLEN)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "There seems to be an error in this montage file."); messagewindow.exec(); xml_close(xml_hdl); return; } timescale = atof(result); timescale /= TIME_DIMENSION; sprintf(composition_txt, "timescale: %f seconds", timescale); remove_trailing_zeros(composition_txt); parentItem->appendRow(new QStandardItem(composition_txt)); } xml_close(xml_hdl); tree->expandAll(); }
int main(int argc, char **argv, char **envp) { int postsize; char *xmldata, *data; xmlDocPtr doc; xmlNodePtr cur, anode; int bbdnsock; int bbdnport; char *status = NULL; struct config_t maincfg; /* Read in config file */ maincfg = maincfgopen(); bbdnport = maincfg_get_int(&maincfg, "BLDPORT"); maincfgclose(&maincfg); key_get(systemkey); char *request_method; if (!bbdn_conect(&bbdnsock, "", bbdnport)) cgi_error(500, bstrerror()); request_method = getenv("HTTP_REQUEST_METHOD")!=NULL ? strdup(getenv("HTTP_REQUEST_METHOD")) : strdup(getenv("REQUEST_METHOD")); // We will handel the post stuf our self. Set REQUEST_METHOD to GET so cgi-util ignores it. setenv("REQUEST_METHOD", "GET", 1); if (cgi_init() != CGIERR_NONE) { cgi_error(500, "Can't init cgi-util"); } /* * Either called from command line, and then we want a file. * or a http get/put * Or we are handling a web request, and getting the data from stdin. */ if ((cgi_getentrystr("method") != NULL) && (strcmp(cgi_getentrystr("method"),"rest") == 0)) { char api[100], coll[100], url[512]; char *requrle; if (getenv("REQUEST_URI") == NULL) { cgi_error(500, "Can't read REQUEST_URI"); } requrle = strdup(getenv("REQUEST_URI")); unescape_url(requrle); sscanf(requrle,"/%[a-z]/%[a-zA-Z0-9_-]/%[^?]", api, coll, url); #ifdef DEBUG fprintf(stderr, "api: \"%s\"\n",api); fprintf(stderr, "coll: \"%s\"\n",coll); fprintf(stderr, "url: \"%s\"\n",url); fprintf(stderr, "request_method: \"%s\"\n",request_method); fprintf(stderr, "reques url \"%s\"\n",getenv("REQUEST_URI")); fprintf(stderr, "reques url unescaped \"%s\"\n",requrle); #endif free(requrle); if (strcmp(request_method,"POST") == 0 || strcmp(request_method,"ADDDELAYED") == 0 || strcmp(request_method,"PUT") == 0) { if (getenv("CONTENT_LENGTH") == NULL) { cgi_error(500, "Can't read CONTENT_LENGTH"); } // Get data length postsize = atoi(getenv("CONTENT_LENGTH")); data = malloc(postsize + 1); if (data == NULL) { cgi_error(500, "Can't allocate data."); } // Read data fread(data, 1, postsize, stdin); data[postsize] = '\0'; // add in to repo if (bbdn_docadd(bbdnsock, coll, // collection name url, // url cgi_getentrystr("documenttype"), // document type data, // data postsize, // data size 0, // lastmodified cgi_getentrystr("acl_allow")!=NULL ? cgi_getentrystr("acl_allow") : "Everyone", // acl allow cgi_getentrystr("acl_denied"), // acl denied cgi_getentrystr("title"), // title cgi_getentrystr("documentformat"), // document format cgi_getentrystr("attributes"), // attributes NULL, // image 0 // image size ) != 1) { cgi_error(500, "bbdn_docadd() failed. Can't add document."); } if (strcmp(request_method,"ADDDELAYED") != 0) { // close it sd_close(bbdnsock, coll); } asprintf(&status,"Added %s to %s\n",url,coll); } else if (strcmp(request_method,"DELETE") == 0) { if (url[0] == '\0') { if (sd_deletecollection(bbdnsock, coll) != 1) { cgi_error(500, "Can't delete collection"); } asprintf(&status,"Deleted collection %s\n",coll); } else { if (bbdn_deleteuri(bbdnsock, coll, url) != 1) { cgi_error(500, "Can't delete document"); } asprintf(&status,"Deleted url %s in %s\n",url,coll); } } else if (strcmp(request_method,"CLOSE") == 0) { sd_close(bbdnsock, coll); asprintf(&status,"Closed %s\n",coll); } else { cgi_error(500, "Unknown request method \"%s\"", request_method ); } #ifdef DEBUG // Print the envirement so we can better see what is going on. char** env; for (env = envp; *env != 0; env++) { char* thisEnv = *env; fprintf(stderr, "%s\n", thisEnv); } #endif } else if ((cgi_getentrystr("do") != NULL) && (strcmp(cgi_getentrystr("do"),"add") == 0)) { char *data; int datasize; int n; const char *url = getenv("HTTP_X_FILENAME") ? getenv("HTTP_X_FILENAME") : cgi_getentrystr("url"); const char *coll = cgi_getentrystr("collection"); if (url == NULL) { cgi_error(500, "No url specified. Either set http header HTTP_X_FILENAME or get parameter 'url'.\n"); } if (coll == NULL) { cgi_error(500, "No collection specified\n"); } char *tmpname; FILE *fh; asprintf(&tmpname,"/tmp/%s",url); fh = fopen(tmpname,"wb"); if (fh == NULL) { cgi_error(500, "Can't open file %s",tmpname); } if ((data = malloc( atoi(getenv("CONTENT_LENGTH")) )) == NULL) { cgi_error(500, "Can't malloc data"); } datasize = 0; while ((n = fread ((unsigned char *)(data + datasize),1,1024,stdin)) > 0) { datasize += n; } fwrite(data,1,datasize,fh); fclose(fh); free(tmpname); // bbdn_docadd(bbdnsock, xmldoc.collection, uri, xmldoc.documenttype, xmldoc.body, xmldoc.bodysize, // xmldoc.lastmodified, xmldoc.aclallow, xmldoc.acldeny, xmldoc.title, xmldoc.documentformat, xmldoc.attributes, image, image_size); bbdn_docadd(bbdnsock, coll, url, "", data, datasize, 0, "Everyone", "", "omp1", "", "", NULL, 0); // close it sd_close(bbdnsock, coll); } else if ((cgi_getentrystr("do") != NULL) && (strcmp(cgi_getentrystr("do"),"delete") == 0)) { const char *url = getenv("HTTP_X_FILENAME") ? getenv("HTTP_X_FILENAME") : cgi_getentrystr("url"); const char *coll = cgi_getentrystr("collection"); if (url == NULL) { cgi_error(500, "No url specified. Either set http header HTTP_X_FILENAME or get parameter 'url'.\n"); } if (coll == NULL) { cgi_error(500, "No collection specified\n"); } bbdn_deleteuri(bbdnsock, coll, url); asprintf(&status,"%s deleted.\n", url); } else if (getenv("CONTENT_LENGTH") != NULL) { // Get data length postsize = atoi(getenv("CONTENT_LENGTH")); xmldata = malloc(postsize + 1); // Read data fread(xmldata, 1, postsize, stdin); xmldata[postsize] = '\0'; //fprintf(stderr, "Received %i bytes.\n", postsize); //fprintf(stderr, "Got document:\n%s\n", xmldata); //parsing xml doc = xmlParseDoc((xmlChar*)xmldata); if (doc == NULL) cgi_error(500, "Unable to parse document"); cur = xmlDocGetRootElement(doc); if (cur == NULL) { xmlFreeDoc(doc); cgi_error(500, "empty document"); } // Some document checking if (xmlStrcmp(cur->name, (const xmlChar *)ROOT_NODE_NAME)) { xmlFreeDoc(doc); cgi_error(500, "document of the wrong type, root node != %s, but %s\n", ROOT_NODE_NAME, cur->name); } if ((anode = xml_find_child(cur, "key")) != NULL) { char *p; p = (char *)xmlNodeListGetString(doc, anode->xmlChildrenNode, 1); if (p == NULL) cgi_error(500, "No key data"); if ((systemkey[0] != '\0') && (!key_equal(systemkey, p))) { cgi_error(500, "Keys does not match: Got \"%s\" but wanted \"%s\"\n",p,systemkey); } } else { cgi_error(500, "Did not receive a key"); } if ((anode = xml_find_child(cur, "version")) != NULL) { xmlChar *p; p = xmlNodeListGetString(doc, anode->xmlChildrenNode, 1); version = atoi((char*)p); xmlFree(p); } else { cgi_error(500, "Did not receive a version number"); } for (cur = cur->xmlChildrenNode; cur != NULL; cur = cur->next) { if ((!xmlStrcmp(cur->name, (const xmlChar *) "key"))){ // Ignore } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "version"))){ // Ignore } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "add"))){ xml_add(bbdnsock, doc, cur); } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "delete"))){ xml_delete(bbdnsock, doc, cur); } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "close"))) { xml_close(bbdnsock, doc, cur); } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "create"))) { xml_create(bbdnsock, doc, cur); } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "users"))) { xml_users(doc, cur); } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "gcwhispers"))) { xml_gcwhispers(bbdnsock, doc, cur); } else if ((!xmlStrcmp(cur->name, (const xmlChar *) "error"))) { xml_errormsg(bbdnsock, doc, cur); } else if ((!xmlStrcmp(cur->name, (xmlChar*)"text"))) { //fprintf(stderr, "Got text: %s\n", xmlNodeListGetString(doc, cur, 1)); // Ignore for now } else { warnx("Unknown xml node '%s'", cur->name); } } } else { cgi_error(500, "Didn't receive any command or data."); } if (status != NULL) { printf("Content-type: text/plain\n\n"); printf(status); } else { cgi_error(500, "Reached end of program without status."); } return 0; }