Showing with 651 additions and 824 deletions.
  1. +1 −1 MediaPortal/Incubator/Login/Login.csproj
  2. +13 −22 MediaPortal/Incubator/Login/Models/LoginModel.cs
  3. +1 −0 MediaPortal/Incubator/Login/Models/UserConfigModel.cs
  4. +2 −2 ...ortal/Incubator/Login/Settings/Configuration/{AutoLoginUsertSetting.cs → AutoLoginUserSetting.cs}
  5. +1 −1 MediaPortal/Incubator/Login/plugin.xml
  6. +20 −0 ...ediaPortal.Backend/Services/UserProfileDataManagement/UPnPUserProfileDataManagementServiceImpl.cs
  7. +13 −1 ...l/Source/Core/MediaPortal.Backend/Services/UserProfileDataManagement/UserProfileDataManagement.cs
  8. +2 −25 MediaPortal/Source/Core/MediaPortal.Common/{Services/ServerCommunication → Async}/AsyncExtensions.cs
  9. +26 −0 MediaPortal/Source/Core/MediaPortal.Common/Async/AsyncResult.cs
  10. +61 −0 MediaPortal/Source/Core/MediaPortal.Common/Async/SynchronizationContextRemover.cs
  11. +3 −1 MediaPortal/Source/Core/MediaPortal.Common/MediaPortal.Common.csproj
  12. +1 −0 ...l/Source/Core/MediaPortal.Common/Services/ServerCommunication/UPnPContentDirectoryServiceProxy.cs
  13. +9 −0 ...Core/MediaPortal.Common/Services/ServerCommunication/UPnPUserProfileDataManagementServiceProxy.cs
  14. +80 −28 MediaPortal/Source/Core/MediaPortal.Common/Services/Settings/SettingsManager.cs
  15. +2 −0 MediaPortal/Source/Core/MediaPortal.Common/UserProfileDataManagement/IUserProfileDataManagement.cs
  16. +36 −14 MediaPortal/Source/Core/MediaPortal.UI/Services/UserManagement/UserManagement.cs
  17. +5 −3 MediaPortal/Source/Core/MediaPortal.UI/Services/UserManagement/UserMessageHandler.cs
  18. +13 −11 MediaPortal/Source/Extensions/MetadataExtractors/ImageMetadataExtractor/ImageMetadataExtractor.cs
  19. +32 −21 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/GeoLocationService.cs
  20. +10 −12 ...ortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Common/ExternalIPResolver.cs
  21. +35 −24 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/FreeGeoIP/IPLookup.cs
  22. +7 −9 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Google/Maps.cs
  23. +3 −2 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/IAddressResolver.cs
  24. +3 −2 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/ICoordinateResolver.cs
  25. +16 −8 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/IGeoLocationService.cs
  26. +24 −36 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Microsoft/GPSLookup.cs
  27. +6 −14 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/OpenStreetMap/Geocoder.cs
  28. +1 −0 MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/OnlineLibraries.csproj
  29. +33 −1 MediaPortal/Source/UI/SkinEngine/SkinEnginePlugin.cs
  30. +1 −0 MediaPortal/Source/UI/TV/SlimTvClient/MediaItemActions/DeleteRecordingFromStorage.cs
  31. +1 −0 MediaPortal/Source/UI/TV/SlimTvClient/Models/SlimTvGuideModelBase.cs
  32. +1 −0 MediaPortal/Source/UI/TV/SlimTvInterfaces/IChannelAndGroupInfo.cs
  33. +1 −0 MediaPortal/Source/UI/TV/SlimTvInterfaces/IProgramInfo.cs
  34. +1 −0 MediaPortal/Source/UI/TV/SlimTvInterfaces/IScheduleControl.cs
  35. +1 −0 MediaPortal/Source/UI/TV/SlimTvInterfaces/ITimeshiftControl.cs
  36. +1 −0 MediaPortal/Source/UI/TV/SlimTvInterfaces/ITimeshiftControlEx.cs
  37. +1 −0 MediaPortal/Source/UI/TV/SlimTvNativeProvider/UPnP/NativeTvProxy.cs
  38. +1 −0 MediaPortal/Source/UI/TV/SlimTvService/AbstractSlimTvService.cs
  39. +1 −0 MediaPortal/Source/UI/TV/SlimTvService/UPnP/SlimTvServiceImpl.cs
  40. +1 −0 MediaPortal/Source/UI/TV/SlimTvService3/SlimTvService3.cs
  41. +1 −0 MediaPortal/Source/UI/UiComponents/Media/Extensions/IMediaItemAction.cs
  42. +1 −0 MediaPortal/Source/UI/UiComponents/Media/MediaItemActions/AbstractMediaItemAction.cs
  43. +1 −0 MediaPortal/Source/UI/UiComponents/Media/MediaItemActions/AbstractRefeshMediaItemAction.cs
  44. +1 −0 MediaPortal/Source/UI/UiComponents/Media/MediaItemActions/AbstractWatchedAction.cs
  45. +1 −0 MediaPortal/Source/UI/UiComponents/Media/MediaItemActions/AddAllToPlaylist.cs
  46. +1 −0 MediaPortal/Source/UI/UiComponents/Media/MediaItemActions/AddSingleToPlaylist.cs
  47. +1 −0 MediaPortal/Source/UI/UiComponents/Media/MediaItemActions/DeleteFromStorage.cs
  48. +73 −55 MediaPortal/Source/UI/UiComponents/Weather/Grabbers/OpenWeatherMap.cs
  49. +0 −407 MediaPortal/Source/UI/UiComponents/Weather/Grabbers/WorldWeatherOnlineCatcher.cs
  50. +2 −2 MediaPortal/Source/UI/UiComponents/Weather/Helper Classes/CitySetupInfo.cs
  51. +14 −2 MediaPortal/Source/UI/UiComponents/Weather/Helper Classes/IWeatherCatcher.cs
  52. +7 −12 MediaPortal/Source/UI/UiComponents/Weather/Models/CurrentWeatherModel.cs
  53. +41 −80 MediaPortal/Source/UI/UiComponents/Weather/Models/WeatherModel.cs
  54. +11 −10 MediaPortal/Source/UI/UiComponents/Weather/Models/WeatherSetupModel.cs
  55. +0 −1 MediaPortal/Source/UI/UiComponents/Weather/Weather.csproj
  56. +3 −3 MediaPortal/Tools/Transifex/tx_0_GetStatus.bat
  57. +9 −0 MediaPortal/Tools/Transifex/tx_0_InitBuild.bat
  58. +3 −3 MediaPortal/Tools/Transifex/tx_0_Init_User.bat
  59. +3 −3 MediaPortal/Tools/Transifex/tx_1_Verify_tx_project.bat
  60. +2 −2 MediaPortal/Tools/Transifex/tx_2_ToCache.bat
  61. +2 −2 MediaPortal/Tools/Transifex/tx_3_Push_Templates.bat
  62. +2 −2 MediaPortal/Tools/Transifex/tx_4_Pull_Translations.bat
  63. +2 −2 MediaPortal/Tools/Transifex/tx_6_FromCache.bat
@@ -55,7 +55,7 @@
<Compile Include="LoginPlugin.cs" />
<Compile Include="Models\LoginModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Settings\Configuration\AutoLoginUsertSetting.cs" />
<Compile Include="Settings\Configuration\AutoLoginUserSetting.cs" />
<Compile Include="Settings\Configuration\AutoLogoutTimeoutSetting.cs" />
<Compile Include="Settings\Configuration\AutoLogoutSettings.cs" />
<Compile Include="Settings\Configuration\UserLoginScreenSettings.cs" />
@@ -34,6 +34,7 @@
using MediaPortal.UI.Presentation.Workflow;
using System.Collections.Generic;
using System.Threading.Tasks;
using MediaPortal.Common.Async;
using MediaPortal.UI.Presentation.Screens;
using MediaPortal.UiComponents.Login.General;
using MediaPortal.Common.Messaging;
@@ -42,6 +43,7 @@
using MediaPortal.UI.Presentation.Players;
using MediaPortal.Common.Localization;
using MediaPortal.Common.Services.ServerCommunication;
using MediaPortal.Common.Services.SystemResolver.Settings;
using MediaPortal.Common.Settings;
using MediaPortal.Common.UserManagement;
using MediaPortal.UI.ServerCommunication;
@@ -323,7 +325,7 @@ private bool CheckIfIdle()
{
TimeSpan idleTimeout = TimeSpan.FromMinutes(UserSettingStorage.AutoLogoutIdleTimeoutInMin);
IInputManager inputManager = ServiceRegistration.Get<IInputManager>();
if((_lastActivity - inputManager.LastMouseUsageTime) < idleTimeout ||
if ((_lastActivity - inputManager.LastMouseUsageTime) < idleTimeout ||
(_lastActivity - inputManager.LastInputTime) < idleTimeout)
{
_lastActivity = DateTime.Now;
@@ -352,7 +354,7 @@ private void OnMessageReceived(AsynchronousMessageQueue queue, SystemMessage mes
{
case SystemMessaging.MessageType.SystemStateChanged:
SystemState newState = (SystemState)message.MessageData[SystemMessaging.NEW_STATE];
if(newState == SystemState.Running)
if (newState == SystemState.Running)
{
StartTimer();
if (UserSettingStorage.AutoLoginUser == Guid.Empty && UserSettingStorage.UserLoginScreenEnabled && UserSettingStorage.UserLoginEnabled)
@@ -371,7 +373,7 @@ private void OnMessageReceived(AsynchronousMessageQueue queue, SystemMessage mes
break;
}
}
else if(message.ChannelName == ServerConnectionMessaging.CHANNEL)
else if (message.ChannelName == ServerConnectionMessaging.CHANNEL)
{
ServerConnectionMessaging.MessageType messageType = (ServerConnectionMessaging.MessageType)message.MessageType;
switch (messageType)
@@ -402,7 +404,7 @@ private async Task SetCurrentUser(UserProfile userProfile = null)
}
}
}
if(userProfile == null)
if (userProfile == null)
{
// Init with system default
userProfileDataManagement.CurrentUser = null;
@@ -442,29 +444,16 @@ private async Task RefreshUserList()
if (userManagement.UserProfileDataManagement == null)
return;

UserProfile defaultProfile = new UserProfile(Guid.Empty,
LocalizationHelper.Translate(Consts.RES_SYSTEM_DEFAULT_TEXT) + " (" + System.Windows.Forms.SystemInformation.ComputerName + ")",
UserProfileType.ClientProfile);
UserProxy proxy = new UserProxy();
proxy.SetLabel(Consts.KEY_NAME, defaultProfile.Name);
proxy.SetUserProfile(defaultProfile);
proxy.Selected = true;
proxy.SelectedProperty.Attach(OnAutoLoginUserSelectionChanged);
_autoLoginUserList.Add(proxy);
// Get our local client profile, it will be available for local login
var localSystemGuid = Guid.Parse(ServiceRegistration.Get<ISettingsManager>().Load<SystemResolverSettings>().SystemId);

UserProxy proxy;
// add users to expose them
var users = await userManagement.UserProfileDataManagement.GetProfilesAsync();
foreach (UserProfile user in users)
{
if (user.ProfileType != UserProfileType.ClientProfile)
{
proxy = new UserProxy();
proxy.SetLabel(Consts.KEY_NAME, user.Name);
proxy.SetUserProfile(user);
_loginUserList.Add(proxy);
}

if (!user.Name.Equals(System.Windows.Forms.SystemInformation.ComputerName, StringComparison.InvariantCultureIgnoreCase))
var isCurrentClient = user.ProfileId == localSystemGuid;
if (user.ProfileType != UserProfileType.ClientProfile || isCurrentClient)
{
proxy = new UserProxy();
proxy.SetLabel(Consts.KEY_NAME, user.Name);
@@ -473,6 +462,8 @@ private async Task RefreshUserList()
proxy.Selected = true;
proxy.SelectedProperty.Attach(OnAutoLoginUserSelectionChanged);
_autoLoginUserList.Add(proxy);
if (!isCurrentClient)
_loginUserList.Add(proxy);
}
}

@@ -45,6 +45,7 @@
using MediaPortal.Utilities.Graphics;
using System.Drawing.Imaging;
using System.Threading.Tasks;
using MediaPortal.Common.Async;
using MediaPortal.Common.ResourceAccess;
using MediaPortal.Common.Services.ServerCommunication;
using MediaPortal.Common.UserManagement;
@@ -26,7 +26,7 @@

namespace MediaPortal.UiComponents.Login.Settings.Configuration
{
public class AutoLoginUsertSetting : CustomConfigSetting
public class AutoLoginUserSetting : CustomConfigSetting
{
}
}
}
@@ -103,7 +103,7 @@
RestrictionGroup="Settings.UserProfile"
Text="[Settings.Users.Config.AutoLoginUser]"
HelpText="[Settings.Users.Config.AutoLoginUser.Help]"
ClassName="MediaPortal.UiComponents.Login.Settings.Configuration.AutoLoginUsertSetting"
ClassName="MediaPortal.UiComponents.Login.Settings.Configuration.AutoLoginUserSetting"
AdditionalData="WorkflowState=D3C5EC78-F901-4851-8DB8-83CF27E80EA8,ConfAppPanel=..."/>

<CustomConfigSetting
@@ -145,6 +145,16 @@ public class UPnPUserProfileDataManagementServiceImpl : DvService
});
AddAction(createProfileAction);

DvAction createClientProfileAction = new DvAction("CreateClientProfile", OnCreateClientProfile,
new DvArgument[] {
new DvArgument("ProfileId", A_ARG_TYPE_Uuid, ArgumentDirection.In),
new DvArgument("ProfileName", A_ARG_TYPE_String, ArgumentDirection.In)
},
new DvArgument[] {
new DvArgument("ProfileId", A_ARG_TYPE_Uuid, ArgumentDirection.Out, true)
});
AddAction(createClientProfileAction);

DvAction createUserProfileAction = new DvAction("CreateUserProfile", OnCreateUserProfile,
new DvArgument[] {
new DvArgument("ProfileName", A_ARG_TYPE_String, ArgumentDirection.In),
@@ -383,6 +393,16 @@ public class UPnPUserProfileDataManagementServiceImpl : DvService
return null;
}

static UPnPError OnCreateClientProfile(DvAction action, IList<object> inParams, out IList<object> outParams,
CallContext context)
{
Guid profileGuid = MarshallingHelper.DeserializeGuid((string)inParams[0]);
string profileName = (string)inParams[1];
Guid profileId = ServiceRegistration.Get<IUserProfileDataManagement>().CreateClientProfileAsync(profileGuid, profileName).Result;
outParams = new List<object> { profileId };
return null;
}

static UPnPError OnCreateUserProfile(DvAction action, IList<object> inParams, out IList<object> outParams,
CallContext context)
{
@@ -34,6 +34,7 @@
using MediaPortal.Common.UserProfileDataManagement;
using MediaPortal.Utilities.Exceptions;
using MediaPortal.Backend.Services.MediaLibrary.QueryEngine;
using MediaPortal.Common.Async;
using MediaPortal.Common.MediaManagement.MLQueries;
using MediaPortal.Common.Services.ServerCommunication;

@@ -178,16 +179,27 @@ public async Task<Guid> CreateProfileAsync(string profileName)
return profileId;
}

public Task<Guid> CreateClientProfileAsync(Guid profileId, string profileName)
{
var guid = CreateProfileInternal(profileId, profileName, UserProfileType.ClientProfile, null);
return Task.FromResult(guid);
}

public async Task<Guid> CreateProfileAsync(string profileName, UserProfileType profileType, string profilePassword)
{
//Profile might already exist.
var result = await GetProfileByNameAsync(profileName);
if (result.Success)
return result.Result.ProfileId;

Guid profileId = Guid.NewGuid();
return CreateProfileInternal(profileId, profileName, profileType, profilePassword);
}

private Guid CreateProfileInternal(Guid profileId, string profileName, UserProfileType profileType, string profilePassword)
{
ISQLDatabase database = ServiceRegistration.Get<ISQLDatabase>();
ITransaction transaction = database.BeginTransaction();
Guid profileId = Guid.NewGuid();
try
{
using (IDbCommand command = UserProfileDataManagement_SubSchema.CreateUserProfileCommand(transaction, profileId, profileName, profileType, profilePassword))
@@ -29,32 +29,8 @@
using MediaPortal.Common.Logging;
using UPnP.Infrastructure.CP.DeviceTree;

namespace MediaPortal.Common.Services.ServerCommunication
namespace MediaPortal.Common.Async
{
/// <summary>
/// Wrapper class for common async method calls. It contains the <see cref="Success"/> return values and one additional <see cref="Result"/>.
/// It is used to transform methods with out parameters more easy into async pattern where "out" and "ref" are not possible.
/// </summary>
/// <typeparam name="T"></typeparam>
public class AsyncResult<T>
{
public AsyncResult() { }

public AsyncResult(bool success, T result)
{
Success = success;
Result = result;
}
/// <summary>
/// Returns <c>true</c> if successful.
/// </summary>
public bool Success { get; set; }
/// <summary>
/// Returns <c>true</c> if successful.
/// </summary>
public T Result { get; set; }
}

public static class AsyncExtensions
{
/// <summary>
@@ -111,6 +87,7 @@ public static async Task<IList<object>> InvokeAsyncTask(this CpAction action, IL
{
return await Task.Factory.FromAsync((callback, stateObject) => action.BeginInvokeAction(inParameters, callback, stateObject), action.EndInvokeAction, null).ConfigureAwait(false);
}

public static ConfiguredTaskAwaitable<IList<object>> InvokeAsync(this CpAction action, IList<object> inParameters)
{
return Task.Factory.FromAsync((callback, stateObject) => action.BeginInvokeAction(inParameters, callback, stateObject), action.EndInvokeAction, null).ConfigureAwait(false);
@@ -0,0 +1,26 @@
namespace MediaPortal.Common.Async
{
/// <summary>
/// Wrapper class for common async method calls. It contains the <see cref="Success"/> return values and one additional <see cref="Result"/>.
/// It is used to transform methods with out parameters more easy into async pattern where "out" and "ref" are not possible.
/// </summary>
/// <typeparam name="T"></typeparam>
public class AsyncResult<T>
{
public AsyncResult() { }

public AsyncResult(bool success, T result)
{
Success = success;
Result = result;
}
/// <summary>
/// Returns <c>true</c> if successful.
/// </summary>
public bool Success { get; set; }
/// <summary>
/// Returns <c>true</c> if successful.
/// </summary>
public T Result { get; set; }
}
}
@@ -0,0 +1,61 @@
#region Copyright (C) 2007-2017 Team MediaPortal

/*
Copyright (C) 2007-2017 Team MediaPortal
http://www.team-mediaportal.com
This file is part of MediaPortal 2
MediaPortal 2 is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MediaPortal 2 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MediaPortal 2. If not, see <http://www.gnu.org/licenses/>.
*/

#endregion

using System;
using System.Runtime.CompilerServices;
using System.Threading;

namespace MediaPortal.Common.Async
{
public struct SynchronizationContextRemover : INotifyCompletion
{
public bool IsCompleted
{
get { return SynchronizationContext.Current == null; }
}

public void OnCompleted(Action continuation)
{
var prevContext = SynchronizationContext.Current;
try
{
SynchronizationContext.SetSynchronizationContext(null);
continuation();
}
finally
{
SynchronizationContext.SetSynchronizationContext(prevContext);
}
}

public SynchronizationContextRemover GetAwaiter()
{
return this;
}

public void GetResult()
{
}
}
}
@@ -57,6 +57,8 @@
</ItemGroup>
<ItemGroup>
<Compile Include="ApplicationCore.cs" />
<Compile Include="Async\AsyncResult.cs" />
<Compile Include="Async\SynchronizationContextRemover.cs" />
<Compile Include="Commands\AsyncMethodDelegateCommand.cs" />
<Compile Include="Certifications\CertificationMapper.cs" />
<Compile Include="Certifications\CetificationMapping.cs" />
@@ -182,7 +184,7 @@
<Compile Include="Services\ResourceAccess\RawUrlResourceProvider\RawUrlResourceProvider.cs" />
<Compile Include="Services\ResourceAccess\RawUrlResourceProvider\RawUrlResourceAccessor.cs" />
<Compile Include="Services\Runtime\PowerEventHandler.cs" />
<Compile Include="Services\ServerCommunication\AsyncExtensions.cs" />
<Compile Include="Async\AsyncExtensions.cs" />
<Compile Include="Services\ServerCommunication\UPnPServerWatcher.cs" />
<Compile Include="Services\Settings\SettingsChangeWatcher.cs" />
<Compile Include="Services\Settings\SettingsManagerMessaging.cs" />
@@ -27,6 +27,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MediaPortal.Common.Async;
using MediaPortal.Common.General;
using MediaPortal.Common.MediaManagement;
using MediaPortal.Common.MediaManagement.MLQueries;
@@ -30,6 +30,7 @@
using UPnP.Infrastructure.CP.DeviceTree;
using System.Linq;
using System.Threading.Tasks;
using MediaPortal.Common.Async;
using MediaPortal.Common.MediaManagement.MLQueries;

namespace MediaPortal.Common.Services.ServerCommunication
@@ -76,6 +77,14 @@ public async Task<Guid> CreateProfileAsync(string profileName)
return MarshallingHelper.DeserializeGuid((string)outParameters[0]);
}

public async Task<Guid> CreateClientProfileAsync(Guid profileId, string profileName)
{
CpAction action = GetAction("CreateClientProfile");
IList<object> inParameters = new List<object> { MarshallingHelper.SerializeGuid(profileId), profileName };
IList<object> outParameters = await action.InvokeAsync(inParameters);
return MarshallingHelper.DeserializeGuid((string)outParameters[0]);
}

public async Task<Guid> CreateProfileAsync(string profileName, UserProfileType profileType, string profilePassword)
{
CpAction action = GetAction("CreateUserProfile");