/** * \brief Create a MythMedia instance and insert in MythMediaMonitor list * * We are a friend class of MythMediaMonitor, * so that we can add or remove from its list of media objects. */ void MonitorThreadDarwin::diskInsert(const char *devName, const char *volName, QString model, bool isCDorDVD) { MythMediaDevice *media; QString msg = "MonitorThreadDarwin::diskInsert"; LOG(VB_MEDIA, LOG_DEBUG, msg + QString("(%1,%2,'%3',%4)") .arg(devName).arg(volName).arg(model).arg(isCDorDVD)); if (isCDorDVD) media = MythCDROM::get(NULL, devName, true, m_Monitor->m_AllowEject); else media = MythHDD::Get(NULL, devName, true, false); if (!media) { LOG(VB_GENERAL, LOG_ALERT, msg + "Couldn't create MythMediaDevice."); return; } // We store the volume name for user activities like ChooseAndEjectMedia(). media->setVolumeID(volName); media->setDeviceModel(model.toLatin1()); // Same for the Manufacturer and model // Mac OS X devices are pre-mounted here: QString mnt = "/Volumes/"; mnt += volName; media->setMountPath(mnt.toLatin1()); int attempts = 0; QDir d(mnt); while (!d.exists()) { LOG(VB_MEDIA, LOG_WARNING, (msg + "() - Waiting for mount '%1' to become stable.").arg(mnt)); usleep(120000); if ( ++attempts > 4 ) usleep(200000); if ( attempts > 8 ) { delete media; LOG(VB_MEDIA, LOG_ALERT, msg + "() - Giving up"); return; } } media->setStatus(MEDIASTAT_MOUNTED); // This is checked in AddDevice(), but checking earlier means // we can avoid scanning all the files to determine its type if (m_Monitor->shouldIgnore(media)) return; // We want to use MythMedia's code to work out the mediaType. // media->onDeviceMounted() is protected, // so to call it indirectly, we pretend to mount it here. media->mount(); m_Monitor->AddDevice(media); }
/** * \brief Deal with the user, or another program, renaming a volume * * iTunes has a habit of renaming the disk volumes and track files * after it looks up a disk on the GraceNote CDDB. */ void MonitorThreadDarwin::diskRename(const char *devName, const char *volName) { LOG(VB_MEDIA, LOG_DEBUG, QString("MonitorThreadDarwin::diskRename(%1,%2)") .arg(devName).arg(volName)); MythMediaDevice *pDevice = m_Monitor->GetMedia(devName); if (m_Monitor->ValidateAndLock(pDevice)) { // Send message to plugins to ignore this drive: if (m_Monitor->m_SendEvent) pDevice->setStatus(MEDIASTAT_NODISK); pDevice->setVolumeID(volName); pDevice->setMountPath((QString("/Volumes/") + volName).toLatin1()); // Plugins can now use it again: if (m_Monitor->m_SendEvent) pDevice->setStatus(MEDIASTAT_USEABLE); m_Monitor->Unlock(pDevice); } else LOG(VB_MEDIA, LOG_INFO, QString("Couldn't find MythMediaDevice: %1").arg(devName)); }
// Given a fstab entry to a media device determine what type of device it is bool MediaMonitorUnix::AddDevice(struct fstab * mep) { if (!mep) return false; #ifndef Q_OS_ANDROID QString devicePath( mep->fs_spec ); #if 0 LOG(VB_GENERAL, LOG_DEBUG, "AddDevice - " + devicePath); #endif MythMediaDevice* pDevice = NULL; struct stat sbuf; bool is_supermount = false; bool is_cdrom = false; if (stat(mep->fs_spec, &sbuf) < 0) return false; // Can it be mounted? if ( ! ( ((strstr(mep->fs_mntops, "owner") && (sbuf.st_mode & S_IRUSR)) || strstr(mep->fs_mntops, "user")) && (strstr(mep->fs_vfstype, MNTTYPE_ISO9660) || strstr(mep->fs_vfstype, MNTTYPE_UDF) || strstr(mep->fs_vfstype, MNTTYPE_AUTO)) ) ) { if (strstr(mep->fs_mntops, MNTTYPE_ISO9660) && strstr(mep->fs_vfstype, MNTTYPE_SUPERMOUNT)) { is_supermount = true; } else { return false; } } if (strstr(mep->fs_mntops, MNTTYPE_ISO9660) || strstr(mep->fs_vfstype, MNTTYPE_ISO9660) || strstr(mep->fs_vfstype, MNTTYPE_UDF) || strstr(mep->fs_vfstype, MNTTYPE_AUTO)) { is_cdrom = true; #if 0 LOG(VB_GENERAL, LOG_DEBUG, "Device is a CDROM"); #endif } if (!is_supermount) { if (is_cdrom) pDevice = MythCDROM::get(this, mep->fs_spec, is_supermount, m_AllowEject); } else { char *dev = 0; int len = 0; dev = strstr(mep->fs_mntops, SUPER_OPT_DEV); if (dev == NULL) return false; dev += sizeof(SUPER_OPT_DEV)-1; while (dev[len] != ',' && dev[len] != ' ' && dev[len] != 0) len++; if (dev[len] != 0) { char devstr[256]; strncpy(devstr, dev, len); devstr[len] = 0; if (is_cdrom) pDevice = MythCDROM::get(this, devstr, is_supermount, m_AllowEject); } else return false; } if (pDevice) { pDevice->setMountPath(mep->fs_file); if (pDevice->testMedia() == MEDIAERR_OK) { if (AddDevice(pDevice)) return true; } pDevice->deleteLater(); } #endif return false; }