|
@@ -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
|