- If the name of a CD was changed, return this name instead of the generic
"Audio CD" or CD Text obtained one. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30732 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
277ddffee4
commit
44f7948892
@ -102,7 +102,8 @@ class Volume {
|
|||||||
size_t BufferSize() const { return 32 * kFrameSize; }
|
size_t BufferSize() const { return 32 * kFrameSize; }
|
||||||
// TODO: for now
|
// TODO: for now
|
||||||
|
|
||||||
static void DetermineName(cdtext& text, char* name, size_t length);
|
static void DetermineName(uint32 cddbId, int DeviceFD, char* name,
|
||||||
|
size_t length);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Inode* _CreateNode(Inode* parent, const char* name,
|
Inode* _CreateNode(Inode* parent, const char* name,
|
||||||
@ -437,6 +438,58 @@ read_attributes(int fd, Inode* inode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
open_attributes(uint32 cddbId, int deviceFD, int mode,
|
||||||
|
enum attr_mode attrMode)
|
||||||
|
{
|
||||||
|
char* path = (char*)malloc(B_PATH_NAME_LENGTH);
|
||||||
|
if (path == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
bool create = (mode & O_WRONLY) != 0;
|
||||||
|
|
||||||
|
if (find_directory(B_USER_SETTINGS_DIRECTORY, -1, create, path,
|
||||||
|
B_PATH_NAME_LENGTH) != B_OK) {
|
||||||
|
free(path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strlcat(path, "/cdda", B_PATH_NAME_LENGTH);
|
||||||
|
if (create)
|
||||||
|
mkdir(path, 0755);
|
||||||
|
|
||||||
|
if (attrMode == kDiscIDAttributes) {
|
||||||
|
char id[64];
|
||||||
|
snprintf(id, sizeof(id), "/%08lx", cddbId);
|
||||||
|
strlcat(path, id, B_PATH_NAME_LENGTH);
|
||||||
|
} else if (attrMode == kDeviceAttributes) {
|
||||||
|
uint32 length = strlen(path);
|
||||||
|
char* device = path + length;
|
||||||
|
if (ioctl(deviceFD, B_GET_PATH_FOR_DEVICE, device,
|
||||||
|
B_PATH_NAME_LENGTH - length) < B_OK) {
|
||||||
|
free(path);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
device++;
|
||||||
|
|
||||||
|
// replace slashes in the device path
|
||||||
|
while (device[0]) {
|
||||||
|
if (device[0] == '/')
|
||||||
|
device[0] = '_';
|
||||||
|
|
||||||
|
device++;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
strlcat(path, "/shared", B_PATH_NAME_LENGTH);
|
||||||
|
|
||||||
|
int fd = open(path, mode | (create ? O_CREAT | O_TRUNC : 0), 0644);
|
||||||
|
|
||||||
|
free(path);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fill_stat_buffer(Volume* volume, Inode* inode, Attribute* attribute,
|
fill_stat_buffer(Volume* volume, Inode* inode, Attribute* attribute,
|
||||||
struct stat& stat)
|
struct stat& stat)
|
||||||
@ -545,15 +598,33 @@ Volume::InitCheck()
|
|||||||
|
|
||||||
|
|
||||||
/*static*/ void
|
/*static*/ void
|
||||||
Volume::DetermineName(cdtext& text, char* name, size_t length)
|
Volume::DetermineName(uint32 cddbId, int deviceFD, char* name, size_t length)
|
||||||
{
|
{
|
||||||
if (text.artist != NULL && text.album != NULL)
|
int attrFD = open_attributes(cddbId, deviceFD, O_RDONLY,
|
||||||
snprintf(name, length, "%s - %s", text.artist, text.album);
|
kDiscIDAttributes);
|
||||||
else if (text.artist != NULL || text.album != NULL) {
|
if (attrFD < 0) {
|
||||||
snprintf(name, length, "%s", text.artist != NULL
|
// We do not have attributes set. Read CD text.
|
||||||
? text.artist : text.album);
|
cdtext text;
|
||||||
} else
|
read_cdtext(deviceFD, text);
|
||||||
strlcpy(name, "Audio CD", length);
|
if (text.artist != NULL && text.album != NULL)
|
||||||
|
snprintf(name, length, "%s - %s", text.artist, text.album);
|
||||||
|
else if (text.artist != NULL || text.album != NULL) {
|
||||||
|
snprintf(name, length, "%s", text.artist != NULL
|
||||||
|
? text.artist : text.album);
|
||||||
|
} else
|
||||||
|
strlcpy(name, "Audio CD", length);
|
||||||
|
} else {
|
||||||
|
// We have an attribute file. Read name from it.
|
||||||
|
char line[B_FILE_NAME_LENGTH];
|
||||||
|
if (!read_line(attrFD, line, B_FILE_NAME_LENGTH)) {
|
||||||
|
// Could not get name from attribute file. use default name.
|
||||||
|
strlcpy(name, "Audio CD", length);
|
||||||
|
} else {
|
||||||
|
// We got a name. Use it.
|
||||||
|
strlcpy(name, line, length);
|
||||||
|
}
|
||||||
|
close(attrFD);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -685,7 +756,7 @@ Volume::Mount(const char* device)
|
|||||||
free(toc);
|
free(toc);
|
||||||
|
|
||||||
// determine volume title
|
// determine volume title
|
||||||
DetermineName(text, title, sizeof(title));
|
DetermineName(fDiscID, fDevice, title, sizeof(title));
|
||||||
|
|
||||||
fName = strdup(title);
|
fName = strdup(title);
|
||||||
if (fName == NULL)
|
if (fName == NULL)
|
||||||
@ -787,51 +858,7 @@ Volume::SetName(const char* name)
|
|||||||
int
|
int
|
||||||
Volume::_OpenAttributes(int mode, enum attr_mode attrMode)
|
Volume::_OpenAttributes(int mode, enum attr_mode attrMode)
|
||||||
{
|
{
|
||||||
char* path = (char*)malloc(B_PATH_NAME_LENGTH);
|
return open_attributes(fDiscID, fDevice, mode, attrMode);
|
||||||
if (path == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
bool create = (mode & O_WRONLY) != 0;
|
|
||||||
|
|
||||||
if (find_directory(B_USER_SETTINGS_DIRECTORY, -1, create, path,
|
|
||||||
B_PATH_NAME_LENGTH) != B_OK) {
|
|
||||||
free(path);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
strlcat(path, "/cdda", B_PATH_NAME_LENGTH);
|
|
||||||
if (create)
|
|
||||||
mkdir(path, 0755);
|
|
||||||
|
|
||||||
if (attrMode == kDiscIDAttributes) {
|
|
||||||
char id[64];
|
|
||||||
snprintf(id, sizeof(id), "/%08lx", fDiscID);
|
|
||||||
strlcat(path, id, B_PATH_NAME_LENGTH);
|
|
||||||
} else if (attrMode == kDeviceAttributes) {
|
|
||||||
uint32 length = strlen(path);
|
|
||||||
char* device = path + length;
|
|
||||||
if (ioctl(fDevice, B_GET_PATH_FOR_DEVICE, device,
|
|
||||||
B_PATH_NAME_LENGTH - length) < B_OK) {
|
|
||||||
free(path);
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
device++;
|
|
||||||
|
|
||||||
// replace slashes in the device path
|
|
||||||
while (device[0]) {
|
|
||||||
if (device[0] == '/')
|
|
||||||
device[0] = '_';
|
|
||||||
|
|
||||||
device++;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
strlcat(path, "/shared", B_PATH_NAME_LENGTH);
|
|
||||||
|
|
||||||
int fd = open(path, mode | (create ? O_CREAT | O_TRUNC : 0), 0644);
|
|
||||||
|
|
||||||
free(path);
|
|
||||||
return fd;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1357,11 +1384,9 @@ cdda_scan_partition(int fd, partition_data* partition, void* _cookie)
|
|||||||
|
|
||||||
// determine volume title
|
// determine volume title
|
||||||
|
|
||||||
cdtext text;
|
uint32 cddbId = compute_cddb_disc_id(*toc);
|
||||||
read_cdtext(fd, text);
|
|
||||||
|
|
||||||
char name[256];
|
char name[256];
|
||||||
Volume::DetermineName(text, name, sizeof(name));
|
Volume::DetermineName(cddbId, fd, name, sizeof(name));
|
||||||
partition->content_name = strdup(name);
|
partition->content_name = strdup(name);
|
||||||
if (partition->content_name == NULL)
|
if (partition->content_name == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
Loading…
Reference in New Issue
Block a user