status_t CDDBLookup::Lookup(CDDBServer& server, const dev_t device, bool dumpOnly, bool verbose) { scsi_toc_toc* toc = (scsi_toc_toc*)malloc(kMaxTocSize); if (toc == NULL) return B_NO_MEMORY; uint32 cddbID; if (!_ReadTOC(device, &cddbID, toc)) { free(toc); fprintf(stderr, "Skipping device with id %" B_PRId32 ".\n", device); return B_BAD_TYPE; } printf("Looking up CD with CDDB Id %08" B_PRIx32 ".\n", cddbID); BObjectList<QueryResponseData> queryResponses(10, true); status_t result = server.Query(cddbID, toc, queryResponses); if (result != B_OK) { fprintf(stderr, "Error when querying CD: %s\n", strerror(result)); free(toc); return result; } free(toc); const QueryResponseData* diskData = _SelectResult(queryResponses); if (diskData == NULL) { fprintf(stderr, "Could not find any CD entries in query response.\n"); return B_BAD_INDEX; } ReadResponseData readResponse; result = server.Read(*diskData, readResponse, verbose); if (result != B_OK) { fprintf(stderr, "Could not read detailed CD entry from server: %s\n", strerror(result)); return result; } if (dumpOnly) _Dump(readResponse); if (!dumpOnly) { result = _WriteCDData(device, *diskData, readResponse); if (result == B_OK) printf("CD data saved.\n"); else fprintf(stderr, "Error writing CD data: %s\n", strerror(result)); } return B_OK; }
status_t CDDBDaemon::_Lookup(const dev_t device) { scsi_toc_toc* toc = (scsi_toc_toc*)malloc(kMaxTocSize); if (toc == NULL) return B_NO_MEMORY; uint32 cddbId; if (!_CanLookup(device, &cddbId, toc)) { free(toc); printf("Skipping device with id %ld.\n", device); return B_BAD_TYPE; } printf("Looking up CD with CDDB Id %08lx.\n", cddbId); CDDBServer cddb_server("freedb.freedb.org:80"); status_t result; BList queryResponse; if ((result = cddb_server.Query(cddbId, toc, &queryResponse)) != B_OK) { printf("Error when querying CD.\n"); free(toc); return result; } free(toc); QueryResponseData* diskData = _SelectResult(&queryResponse); if (diskData == NULL) { printf("Could not find any CD entries in query response.\n"); return B_BAD_INDEX; } ReadResponseData readResponse; if ((result = cddb_server.Read(diskData, &readResponse)) != B_OK) { return result; } if (_WriteCDData(device, diskData, &readResponse) == B_OK) { printf("CD data saved.\n"); } else { printf("Error writting CD data.\n" ); } // Delete itens in the query response BList; int32 count = queryResponse.CountItems(); for (int32 i = 0; i < count; ++i) { delete (QueryResponseData*)queryResponse.RemoveItem(0L); } queryResponse.MakeEmpty(); // Delete itens in the track data BList in the read response data; count = readResponse.tracks.CountItems(); for (int32 i = 0; i < count; ++i) { delete (TrackData*)readResponse.tracks.RemoveItem(0L); } readResponse.tracks.MakeEmpty(); return B_OK; }