/* vim: set sw=3 ts=3 sts=3 expandtab: */ #include "ecdb.h" void _ecdb_drive_set_capabilities(Ecdb_Drive_Info *drive, E_Hal_Device_Get_All_Properties_Return *ret) { Eina_List *write_speeds, *l; char *val; int i; /* Drive Capabilities */ drive->write_cdr = e_hal_property_bool_get(ret, "storage.cdrom.cdr", NULL); drive->write_cdrw = e_hal_property_bool_get(ret, "storage.cdrom.cdrw", NULL); drive->write_dvdr = e_hal_property_bool_get(ret, "storage.cdrom.dvdr", NULL); drive->write_dvdrw = e_hal_property_bool_get(ret, "storage.cdrom.dvdrw", NULL); drive->write_dvdram = e_hal_property_bool_get(ret, "storage.cdrom.dvdram", NULL); drive->write_dvdplusrw = e_hal_property_bool_get(ret, "storage.cdrom.dvdplusrw", NULL); drive->write_dvdplusrwdl = e_hal_property_bool_get(ret, "storage.cdrom.dvdplusrwdl", NULL); drive->write_dvdplusrdl = e_hal_property_bool_get(ret, "storage.cdrom.dvdplusrdl", NULL); drive->write_bdr = e_hal_property_bool_get(ret, "storage.cdrom.bdr", NULL); drive->write_bdre = e_hal_property_bool_get(ret, "storage.cdrom.bdre", NULL); drive->write_hddvdr = e_hal_property_bool_get(ret, "storage.cdrom.hddvdr", NULL); drive->write_hddvdrw = e_hal_property_bool_get(ret, "storage.cdrom.hddvdrw", NULL); drive->support_multisession = e_hal_property_bool_get(ret, "storage.cdrom.support_multisession", NULL); /* Write speeds */ write_speeds = e_hal_property_strlist_get(ret, "storage.cdrom.write_speeds", NULL); drive->write_speeds = calloc(eina_list_count(write_speeds) + 1, sizeof(int)); drive->write_speeds[0] = eina_list_count(write_speeds) + 1; i = 1; EINA_LIST_FOREACH(write_speeds, l, val) { drive->write_speeds[i] = atoi(val); i++; } } int ecdb_update_drive_info(Ecdb_Drive_Info *drive, E_Hal_Device_Get_All_Properties_Return *ret, char *udi) { /* Assume that nothing about the physical hardware has changed */ drive->udi = udi; /* Update the drive directories */ FREE(drive->write_speeds); _ecdb_drive_set_capabilities(drive, ret); return TRUE; } int ecdb_aquire_drive_info(E_Hal_Device_Get_All_Properties_Return *ret, char *mnt, char *udi) { Ecdb_Drive_Info *drive; drive = calloc(1, sizeof(Ecdb_Drive_Info)); if (!drive) { return FALSE; } /* General Info */ drive->vendor = e_hal_property_string_get(ret, "storage.vendor", NULL); drive->product = e_hal_property_string_get(ret, "storage.model", NULL); drive->revision = e_hal_property_string_get(ret, "storage.firmware_revision", NULL); drive->location = mnt; drive->udi = udi; /* Update current directories */ _ecdb_drive_set_capabilities(drive, ret); em->drives = eina_list_append(em->drives, drive); return TRUE; } void ecdb_drive_info_list_free(Eina_List *list) { Ecdb_Drive_Info *info; EINA_LIST_FREE(list, info) { if (!info) continue; FREE(info->write_speeds); FREE(info->vendor); FREE(info->product); FREE(info->revision); FREE(info->location); FREE(info->udi); free(info); } } void ecdb_print_drive_info(void) { Eina_List *l; Ecdb_Drive_Info *drive; int j, i; em->drives = eina_list_nth_list(em->drives, 0); EINA_LIST_FOREACH(em->drives, l, drive) { /* Leave these as printfs, they shouldn't go the stderr */ printf("Vendor: %s, Product: %s, Revision: %s, " "Location: %s\n", drive->vendor, drive->product, drive->revision, drive->location); printf("Write CD-R: %d, Write CD-RW: %d\n", drive->write_cdr, drive->write_cdrw); printf("Write DVD-R: %d, Write DVD-RW: %d, Write DVD-RAM: %d\n", drive->write_dvdr, drive->write_dvdrw, drive->write_dvdram); printf("Write DVD+R: %d, Write DVD+RW: %d, Write DVD+RWDL: %d\n", drive->write_dvdplusr, drive->write_dvdplusrw, drive->write_dvdplusrwdl); printf("Write DVD+DL: %d\n", drive->write_dvdplusrdl); printf("Write BR-R: %d, Write BR-RW: %d\n", drive->write_bdr, drive->write_bdre); printf("Write HDDVD-R: %d, Write HDDVD-RW: %d\n", drive->write_hddvdr, drive->write_hddvdrw); j = drive->write_speeds[0]; for (i = 1; i < j; i ++) { printf("Write: %d\n", drive->write_speeds[i]); } } } int ecdb_aquire_drive(Ecdb_Project *proj, unsigned int idx) { Ecdb_Drive_Info *info; char adr[BURN_DRIVE_ADR_LEN]; info = eina_list_nth(em->drives, idx); if (burn_drive_convert_fs_adr(info->location, adr) <= 0) { EINA_ERROR_PWARN("Error: Address doesn't provide cd burner!\n"); return FALSE; } if (burn_drive_scan_and_grab(&info->tangible, adr, 1) > 0) { proj->drive = info; return TRUE; } else { info->tangible = NULL; return FALSE; } }