void UPnpDeviceDesc::GetValidXML( const QString &sBaseAddress, int nPort, QTextStream &os, const QString &sUserAgent ) { #if 0 os.setEncoding( QTextStream::UnicodeUTF8 ); #endif QString BaseAddr; QHostAddress addr(sBaseAddress); BaseAddr = sBaseAddress; #if !defined(QT_NO_IPV6) // Basically if it appears to be an IPv6 IP surround the IP with [] // otherwise don't bother if (sBaseAddress.contains(":")) BaseAddr = "[" + sBaseAddress + "]"; #endif os << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<root xmlns=\"urn:schemas-upnp-org:device-1-0\" " " xmlns:mythtv=\"mythtv.org\">\n" "<specVersion>\n" "<major>1</major>\n" "<minor>0</minor>\n" "</specVersion>\n" "<URLBase>http://" << BaseAddr << ":" << nPort << "/</URLBase>\n"; OutputDevice( os, &m_rootDevice, sUserAgent ); os << "</root>\n"; os << flush; }
std::vector<OutputDevice> Connection::get_output_devices(){ if(output_devices.empty()){ std::vector<std::string> ret = execute_and_return("outputs"); int output_id; std::string output_name; bool output_enabled; for(int i=0; i<ret.size(); i++){ output_id=atoi(ret[i].substr(10).c_str()); i++; // Skip to the next line output_name=ret[i].substr(12); i++; // Skip to the next line output_enabled=atoi(ret[i].substr(15).c_str()); output_devices.push_back(OutputDevice(this, output_id, output_name.c_str(), output_enabled)); } } return output_devices; }
wxString BoxClass::TowxString() const { wxString routeString; for (routeListType::const_iterator r = routes.begin(); r != routes.end(); r++) routeString += wxString::Format(_T(" %d:(%d->%d->%d)"), (*r)->get_routefile_id(), (*r)->GetDeviceId(InputDevice()), (*r)->GetBoxId(), (*r)->GetDeviceId(OutputDevice())); return wxString::Format(_T("\nBox:\n\ session_id = %lu\n\ routefile_id = %d\n\ routes: %s\n"), (unsigned long)session_id(), routefile_id,routeString.c_str()); }
void UPnpDeviceDesc::GetValidXML( const QString &sBaseAddress, int nPort, QTextStream &os, const QString &sUserAgent ) { // os.setEncoding( QTextStream::UnicodeUTF8 ); os << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<root xmlns=\"urn:schemas-upnp-org:device-1-0\" xmlns:mythtv=\"mythtv.org\">\n" "<specVersion>\n" "<major>1</major>\n" "<minor>0</minor>\n" "</specVersion>\n" "<URLBase>http://" << sBaseAddress << ":" << nPort << "/</URLBase>\n"; OutputDevice( os, &m_rootDevice, sUserAgent ); os << "</root>\n"; os << flush; }
void UPnpDeviceDesc::GetValidXML( const QString &/*sBaseAddress*/, int /*nPort*/, QTextStream &os, const QString &sUserAgent ) { #if 0 os.setEncoding( QTextStream::UnicodeUTF8 ); #endif os << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<root xmlns=\"urn:schemas-upnp-org:device-1-0\" " " xmlns:mythtv=\"mythtv.org\">\n" "<specVersion>\n" "<major>1</major>\n" "<minor>0</minor>\n" "</specVersion>\n"; OutputDevice( os, &m_rootDevice, sUserAgent ); os << "</root>\n"; os << flush; }
void UPnpDeviceDesc::OutputDevice( QTextStream &os, UPnpDevice *pDevice, const QString &sUserAgent ) { if (pDevice == NULL) return; QString sFriendlyName = QString( "%1: %2" ) .arg( GetHostName() ) .arg( pDevice->m_sFriendlyName ); // ---------------------------------------------------------------------- // Only override the root device // ---------------------------------------------------------------------- if (pDevice == &m_rootDevice) sFriendlyName = UPnp::g_pConfig->GetValue( "UPnP/FriendlyName", sFriendlyName ); os << "<device>\n"; os << FormatValue( "deviceType" , pDevice->m_sDeviceType ); os << FormatValue( "friendlyName" , sFriendlyName ); // ---------------------------------------------------------------------- // XBox 360 needs specific values in the Device Description. // // -=>TODO: This should be externalized in a more generic/extension // kind of way. // ---------------------------------------------------------------------- bool bIsXbox360 = sUserAgent.startsWith(QString("Xbox/2.0"), Qt::CaseInsensitive) || sUserAgent.startsWith( QString("Mozilla/4.0"), Qt::CaseInsensitive); os << FormatValue( "manufacturer" , pDevice->m_sManufacturer ); os << FormatValue( "modelURL" , pDevice->m_sModelURL ); if ( bIsXbox360 ) { os << FormatValue( "modelName" , "Windows Media Connect Compatible (MythTV)"); } else { os << FormatValue( "modelName" , pDevice->m_sModelName ); } os << FormatValue( "manufacturerURL" , pDevice->m_sManufacturerURL ); os << FormatValue( "modelDescription" , pDevice->m_sModelDescription); os << FormatValue( "modelNumber" , pDevice->m_sModelNumber ); os << FormatValue( "serialNumber" , pDevice->m_sSerialNumber ); os << FormatValue( "UPC" , pDevice->m_sUPC ); os << FormatValue( "presentationURL" , pDevice->m_sPresentationURL ); // MythTV Custom information os << FormatValue( "mythtv:X_secure" , pDevice->m_securityPin ? "true" : "false"); os << FormatValue( "mythtv:X_protocol", pDevice->m_protocolVersion ); NameValues::const_iterator nit = pDevice->m_lstExtra.begin(); for (; nit != pDevice->m_lstExtra.end(); ++nit) { // -=>TODO: Hack to handle one element with attributes... need to // handle attributes in a more generic way. if ((*nit).sName == "dlna:X_DLNADOC") { os << QString("<dlna:X_DLNADOC xmlns:dlna=\"urn:" "schemas-dlna-org:device-1-0\">%1" "</dlna:X_DLNADOC>\n" ).arg((*nit).sValue); } else os << FormatValue( (*nit).sName, (*nit).sValue ); } // ---------------------------------------------------------------------- // Output Any Icons. // ---------------------------------------------------------------------- if (pDevice->m_listIcons.count() > 0) { os << "<iconList>\n"; UPnpIconList::const_iterator it = pDevice->m_listIcons.begin(); for (; it != pDevice->m_listIcons.end(); ++it) { os << "<icon>\n"; os << FormatValue( "mimetype", (*it)->m_sMimeType ); os << FormatValue( "width" , (*it)->m_nWidth ); os << FormatValue( "height" , (*it)->m_nHeight ); os << FormatValue( "depth" , (*it)->m_nDepth ); os << FormatValue( "url" , (*it)->m_sURL ); os << "</icon>\n"; } os << "</iconList>\n"; } os << FormatValue( "UDN" , pDevice->GetUDN() ); // ---------------------------------------------------------------------- // Output any Services // ---------------------------------------------------------------------- if (pDevice->m_listServices.count() > 0) { // ------------------------------------------------------------------ // -=>TODO: As a temporary fix don't expose the MSRR service unless we // as an XBox360 or Windows MediaPlayer. // // There is a problem with a DSM-520 with firmware 1.04 and // the Denon AVR-4306 receiver. // // If the MSRR Service is exposed, it won't let us browse // any media content. // // Need to find out real fix and remove this code. // ------------------------------------------------------------------ //bool bDSM = sUserAgent.startsWith( "INTEL_NMPR/2.1 DLNADOC/1.00", false ); os << "<serviceList>\n"; UPnpServiceList::const_iterator it = pDevice->m_listServices.begin(); for (; it != pDevice->m_listServices.end(); ++it) { if (!bIsXbox360 && (*it)->m_sServiceType.startsWith( "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar", Qt::CaseInsensitive)) { continue; } os << "<service>\n"; os << FormatValue( "serviceType", (*it)->m_sServiceType ); os << FormatValue( "serviceId" , (*it)->m_sServiceId ); os << FormatValue( "SCPDURL" , (*it)->m_sSCPDURL ); os << FormatValue( "controlURL" , (*it)->m_sControlURL ); os << FormatValue( "eventSubURL", (*it)->m_sEventSubURL ); os << "</service>\n"; } os << "</serviceList>\n"; } // ---------------------------------------------------------------------- // Output any Embedded Devices // ---------------------------------------------------------------------- // -=>Note: XBMC can't handle sub-devices, it's UserAgent is blank. #if 0 if (sUserAgent.length() > 0) { if (pDevice->m_listDevices.count() > 0) { os << "<deviceList>"; for ( UPnpDevice *pEmbeddedDevice = pDevice->m_listDevices.first(); pEmbeddedDevice != NULL; pEmbeddedDevice = pDevice->m_listDevices.next() ) { OutputDevice( os, pEmbeddedDevice ); } os << "</deviceList>"; } } #endif os << "</device>\n"; os << flush; }