mas01cr@243: #include "audioDB.h" mas01cr@243: #include "adb.nsmap" mas01cr@243: mas01cr@243: /* Command-line client definitions */ mas01cr@243: mas01cr@243: // FIXME: this can't propagate the sequence length argument (used for mas01cr@243: // dudCount). See adb__status() definition for the other half of mas01cr@243: // this. -- CSR, 2007-10-01 mas01cr@243: void audioDB::ws_status(const char*dbName, char* hostport){ mas01cr@243: struct soap soap; mas01cr@243: adb__statusResponse adbStatusResponse; mas01cr@243: mas01cr@243: // Query an existing adb database mas01cr@243: soap_init(&soap); mas01cr@243: if(soap_call_adb__status(&soap,hostport,NULL,(char*)dbName,adbStatusResponse)==SOAP_OK) { mas01cr@243: std::cout << "numFiles = " << adbStatusResponse.result.numFiles << std::endl; mas01cr@243: std::cout << "dim = " << adbStatusResponse.result.dim << std::endl; mas01cr@243: std::cout << "length = " << adbStatusResponse.result.length << std::endl; mas01cr@243: std::cout << "dudCount = " << adbStatusResponse.result.dudCount << std::endl; mas01cr@243: std::cout << "nullCount = " << adbStatusResponse.result.nullCount << std::endl; mas01cr@243: std::cout << "flags = " << adbStatusResponse.result.flags << std::endl; mas01cr@243: } else { mas01cr@243: soap_print_fault(&soap,stderr); mas01cr@243: } mas01cr@243: mas01cr@243: soap_destroy(&soap); mas01cr@243: soap_end(&soap); mas01cr@243: soap_done(&soap); mas01cr@243: } mas01cr@243: mas01cr@243: void audioDB::ws_query(const char*dbName, const char *trackKey, const char* hostport){ mas01cr@243: struct soap soap; mas01cr@243: adb__queryResponse adbQueryResponse; mas01cr@243: mas01cr@243: soap_init(&soap); mas01cr@243: if(soap_call_adb__query(&soap,hostport,NULL, mas01cr@243: (char*)dbName,(char*)trackKey,(char*)trackFileName,(char*)timesFileName, mas01cr@243: queryType, queryPoint, pointNN, trackNN, sequenceLength, adbQueryResponse)==SOAP_OK){ mas01cr@243: //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl; mas01cr@243: for(int i=0; iqPos, qPosStr); mas01cr@243: INTSTRINGIFY(parms->pointNN, pointNNStr); mas01cr@243: INTSTRINGIFY(parms->segNN, trackNNStr); mas01cr@243: /* FIXME: decide which of segLen and seqLen should live */ mas01cr@243: INTSTRINGIFY(parms->segLen, seqLenStr); mas01cr@243: mas01cr@243: DOUBLESTRINGIFY(parms->relative_threshold, relative_thresholdStr); mas01cr@243: DOUBLESTRINGIFY(parms->absolute_threshold, absolute_thresholdStr); mas01cr@243: mas01cr@243: const char *argv[] = { mas01cr@243: "./audioDB", mas01cr@243: COM_QUERY, mas01cr@243: "sequence", mas01cr@243: COM_DATABASE, mas01cr@243: dbName, mas01cr@243: COM_FEATURES, mas01cr@243: qKey, mas01cr@243: COM_KEYLIST, mas01cr@243: /* FIXME: when this branch is merged, use ENSURE_STRING */ mas01cr@243: parms->keyList==0?"":parms->keyList, mas01cr@243: COM_TIMES, mas01cr@243: parms->timesFileName==0?"":parms->timesFileName, mas01cr@243: COM_QUERYPOWER, mas01cr@243: parms->powerFileName==0?"":parms->powerFileName, mas01cr@243: COM_QPOINT, mas01cr@243: qPosStr, mas01cr@243: COM_POINTNN, mas01cr@243: pointNNStr, mas01cr@243: COM_TRACKNN, mas01cr@243: trackNNStr, mas01cr@243: COM_SEQLEN, mas01cr@243: seqLenStr, mas01cr@243: COM_RELATIVE_THRESH, mas01cr@243: relative_thresholdStr, mas01cr@243: COM_ABSOLUTE_THRESH, mas01cr@243: absolute_thresholdStr mas01cr@243: }; mas01cr@243: mas01cr@243: const unsigned argc = 25; mas01cr@243: mas01cr@243: try { mas01cr@243: audioDB(argc, (char* const*)argv, &adbQueryResponse); mas01cr@243: return SOAP_OK; mas01cr@243: } catch (char *err) { mas01cr@243: soap_receiver_fault(soap, err, ""); mas01cr@243: return SOAP_FAULT; mas01cr@243: } mas01cr@243: } mas01cr@243: mas01cr@243: /* Server loop */ mas01cr@243: void audioDB::startServer(){ mas01cr@243: struct soap soap; mas01cr@243: int m, s; // master and slave sockets mas01cr@243: soap_init(&soap); mas01cr@243: // FIXME: largely this use of SO_REUSEADDR is to make writing (and mas01cr@243: // running) test cases more convenient, so that multiple test runs mas01cr@243: // in close succession don't fail because of a bin() error. mas01cr@243: // Investigate whether there are any potential drawbacks in this, mas01cr@243: // and also whether there's a better way to write the tests. -- mas01cr@243: // CSR, 2007-10-03 mas01cr@243: soap.bind_flags |= SO_REUSEADDR; mas01cr@243: m = soap_bind(&soap, NULL, port, 100); mas01cr@243: if (m < 0) mas01cr@243: soap_print_fault(&soap, stderr); mas01cr@243: else mas01cr@243: { mas01cr@243: fprintf(stderr, "Socket connection successful: master socket = %d\n", m); mas01cr@243: for (int i = 1; ; i++) mas01cr@243: { mas01cr@243: s = soap_accept(&soap); mas01cr@243: if (s < 0) mas01cr@243: { mas01cr@243: soap_print_fault(&soap, stderr); mas01cr@243: break; mas01cr@243: } mas01cr@243: /* FIXME: find a way to play nice with logging when run from mas01cr@243: /etc/init.d scripts: at present this just goes nowhere */ mas01cr@243: fprintf(stderr, "%d: accepted connection from IP=%lu.%lu.%lu.%lu socket=%d\n", i, mas01cr@243: (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s); mas01cr@243: if (soap_serve(&soap) != SOAP_OK) // process RPC request mas01cr@243: soap_print_fault(&soap, stderr); // print error mas01cr@243: fprintf(stderr, "request served\n"); mas01cr@243: soap_destroy(&soap); // clean up class instances mas01cr@243: soap_end(&soap); // clean up everything and close socket mas01cr@243: } mas01cr@243: } mas01cr@243: soap_done(&soap); // close master socket and detach environment mas01cr@243: }