/*=========================================================================*/ int SLPDDatabaseFindType(SLPSrvTypeRqst* srvtyperqst, SLPDDatabaseSrvType* result, int count) /* Find service types */ /* */ /* srvtyperqst (IN) the request to find. */ /* */ /* result (OUT) pointer to an array of result structures that receives */ /* results */ /* */ /* count (IN) number of elements in the result array */ /* */ /* Returns - The number of srvtypes found or <0 on error. If the number */ /* of srvtypes found is exactly equal to the number of elements */ /* in the array, the call may be repeated with a larger array. */ /*=========================================================================*/ { SLPDDatabaseEntry* entry; int found; int i; found = 0; entry = (SLPDDatabaseEntry*)G_DatabaseList.head; while(entry) { if(SLPCompareNamingAuth(entry->srvtypelen, entry->srvtype, srvtyperqst->namingauthlen, srvtyperqst->namingauth) == 0) { if(SLPIntersectStringList(srvtyperqst->scopelistlen, srvtyperqst->scopelist, entry->scopelistlen, entry->scopelist)) { for(i = 0; i < found; i++) { if(SLPCompareString(result[i].typelen, result[i].type, entry->srvtypelen, entry->srvtype) == 0) { break; } } if(i == found) { result[found].type = entry->srvtype; result[found].typelen = entry->srvtypelen; found++; if(found >= count) { break; } } } } entry = (SLPDDatabaseEntry*)entry->listitem.next; } return found; }
/*=========================================================================*/ int SLPDDatabaseSrvTypeRqstStart(SLPMessage msg, SLPDDatabaseSrvTypeRqstResult** result) /* Find service types in the database */ /* */ /* msg (IN) the SrvTypRqst to find. */ /* */ /* result (OUT) pointer result structure */ /* */ /* Returns - Zero on success. Non-zero on failure */ /* */ /* Note: Caller must pass *result to SLPDDatabaseSrvtypeRqstEnd() to */ /* free */ /*=========================================================================*/ { SLPDatabaseHandle dh; SLPDatabaseEntry* entry; SLPSrvReg* entryreg; SLPSrvTypeRqst* srvtyperqst; dh = SLPDatabaseOpen(&G_SlpdDatabase.database); if ( dh ) { /* srvtyperqst is the SrvTypeRqst being made */ srvtyperqst = &(msg->body.srvtyperqst); while ( 1 ) { /*-----------------------------------------------------------------*/ /* Allocate result with generous srvtypelist of url entry pointers */ /*-----------------------------------------------------------------*/ *result = (SLPDDatabaseSrvTypeRqstResult*) xrealloc(*result, sizeof(SLPDDatabaseSrvTypeRqstResult) + G_SlpdDatabase.srvtypelistlen); if ( *result == NULL ) { /* out of memory */ SLPDatabaseClose(dh); return SLP_ERROR_INTERNAL_ERROR; } (*result)->srvtypelist = (char*)((*result) + 1); (*result)->srvtypelistlen = 0; (*result)->reserved = dh; /*-------------------------------------------------*/ /* Rewind enumeration in case we had to reallocate */ /*-------------------------------------------------*/ SLPDatabaseRewind(dh); while ( 1 ) { entry = SLPDatabaseEnum(dh); if ( entry == NULL ) { /* This is the only successful way out */ return 0; } /* entry reg is the SrvReg message from the database */ entryreg = &(entry->msg->body.srvreg); if ( SLPCompareNamingAuth(entryreg->srvtypelen, entryreg->srvtype, srvtyperqst->namingauthlen, srvtyperqst->namingauth) == 0 && SLPIntersectStringList(srvtyperqst->scopelistlen, srvtyperqst->scopelist, entryreg->scopelistlen, entryreg->scopelist) && SLPContainsStringList((*result)->srvtypelistlen, (*result)->srvtypelist, entryreg->srvtypelen, entryreg->srvtype) == 0 ) { /* Check to see if we allocated a big enough srvtypelist */ if ( (*result)->srvtypelistlen + entryreg->srvtypelen > G_SlpdDatabase.srvtypelistlen ) { /* Oops we did not allocate a big enough result */ G_SlpdDatabase.srvtypelistlen *= 2; break; } /* Append a comma if needed */ if ( (*result)->srvtypelistlen ) { (*result)->srvtypelist[(*result)->srvtypelistlen] = ','; (*result)->srvtypelistlen += 1; } /* Append the service type */ memcpy(((*result)->srvtypelist) + (*result)->srvtypelistlen, entryreg->srvtype, entryreg->srvtypelen); (*result)->srvtypelistlen += entryreg->srvtypelen; } } } SLPDatabaseClose(dh); } return 0; }