@ -20,13 +20,15 @@ namespace MediaBrowser.Dlna
private readonly IXmlSerializer _xmlSerializer ;
private readonly IFileSystem _fileSystem ;
private readonly ILogger _logger ;
private readonly IJsonSerializer _jsonSerializer ;
public DlnaManager ( IXmlSerializer xmlSerializer , IFileSystem fileSystem , IApplicationPaths appPaths , ILogger logger )
public DlnaManager ( IXmlSerializer xmlSerializer , IFileSystem fileSystem , IApplicationPaths appPaths , ILogger logger , IJsonSerializer jsonSerializer )
{
_xmlSerializer = xmlSerializer ;
_fileSystem = fileSystem ;
_appPaths = appPaths ;
_logger = logger ;
_jsonSerializer = jsonSerializer ;
//DumpProfiles();
}
@ -381,10 +383,66 @@ namespace MediaBrowser.Dlna
public void CreateProfile ( DeviceProfile profile )
{
profile = ReserializeProfile ( profile ) ;
if ( string . IsNullOrWhiteSpace ( profile . Name ) )
{
throw new ArgumentException ( "Profile is missing Name" ) ;
}
var newFilename = _fileSystem . GetValidFilename ( profile . Name ) + ".xml" ;
var path = Path . Combine ( UserProfilesPath , newFilename ) ;
_xmlSerializer . SerializeToFile ( profile , path ) ;
}
public void UpdateProfile ( DeviceProfile profile )
{
profile = ReserializeProfile ( profile ) ;
if ( string . IsNullOrWhiteSpace ( profile . Id ) )
{
throw new ArgumentException ( "Profile is missing Id" ) ;
}
if ( string . IsNullOrWhiteSpace ( profile . Name ) )
{
throw new ArgumentException ( "Profile is missing Name" ) ;
}
var current = GetProfileInfosInternal ( ) . First ( i = > string . Equals ( i . Info . Id , profile . Id , StringComparison . OrdinalIgnoreCase ) ) ;
if ( current . Info . Type = = DeviceProfileType . System )
{
throw new ArgumentException ( "System profiles are readonly" ) ;
}
var newFilename = _fileSystem . GetValidFilename ( profile . Name ) + ".xml" ;
var path = Path . Combine ( UserProfilesPath , newFilename ) ;
if ( ! string . Equals ( path , current . Path , StringComparison . Ordinal ) )
{
File . Delete ( current . Path ) ;
}
_xmlSerializer . SerializeToFile ( profile , path ) ;
}
/// <summary>
/// Recreates the object using serialization, to ensure it's not a subclass.
/// If it's a subclass it may not serlialize properly to xml (different root element tag name)
/// </summary>
/// <param name="profile"></param>
/// <returns></returns>
private DeviceProfile ReserializeProfile ( DeviceProfile profile )
{
if ( profile . GetType ( ) = = typeof ( DeviceProfile ) )
{
return profile ;
}
var json = _jsonSerializer . SerializeToString ( profile ) ;
return _jsonSerializer . DeserializeFromString < DeviceProfile > ( json ) ;
}
class InternalProfileInfo