2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Collections.Generic;
20 using System.Threading;
21 using Native = Interop.MediaControllerClient;
22 using NativeHandle = Interop.MediaControllerClientHandle;
24 namespace Tizen.Multimedia.Remoting
27 /// Provides a means to retrieve active controllers and observe controllers added and removed.
29 /// <since_tizen> 4 </since_tizen>
30 public partial class MediaControllerManager : IDisposable
32 private NativeHandle _handle;
34 private Dictionary<string, MediaController> _activated = new Dictionary<string, MediaController>();
36 private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
38 internal NativeHandle Handle
44 throw new ObjectDisposedException(nameof(MediaControllerManager));
52 /// Initializes a new instance of the <see cref="MediaControllerManager"/> class.
54 /// <privilege>http://tizen.org/privilege/mediacontroller.client</privilege>
55 /// <exception cref="InvalidOperationException">An internal error occurs.</exception>
56 /// <exception cref="UnauthorizedAccessException">The caller does not have required privilege.</exception>
57 /// <since_tizen> 4 </since_tizen>
58 public MediaControllerManager()
60 Native.Create(out _handle).ThrowIfError("Failed to create media controller client.");
64 LoadActivatedServers();
67 private bool _disposed;
70 /// Releases all resources used by the <see cref="MediaControllerManager"/>.
72 /// <since_tizen> 4 </since_tizen>
79 /// Releases the unmanaged resources used by the <see cref="MediaControllerManager"/>.
81 /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>
82 /// <since_tizen> 4 </since_tizen>
83 protected virtual void Dispose(bool disposing)
89 // To be used if there are any other disposable objects
98 /// Gets the active controllers.
100 /// <returns>An array of <see cref="MediaController"/>.</returns>
101 /// <since_tizen> 4 </since_tizen>
102 public MediaController[] GetActiveControllers()
106 return new MediaController[0];
111 _lock.EnterReadLock();
112 return _activated.Values.ToArray();
116 _lock.ExitReadLock();
120 #region Controllers-related operations
122 #region Unlocking operations
124 private MediaController HandleActivation(string serverName)
126 if (_activated.ContainsKey(serverName))
131 var controller = new MediaController(this, serverName);
132 _activated.Add(serverName, controller);
137 private MediaController HandleDeactivation(string serverName)
139 if (_activated.TryGetValue(serverName, out var controller))
141 _activated.Remove(serverName);
148 #region Locking operations
150 private MediaController HandleServerUpdated(string serverName, MediaControllerNativeServerState state)
154 _lock.EnterWriteLock();
156 if (state == MediaControllerNativeServerState.Activated)
158 return HandleActivation(serverName);
161 return HandleDeactivation(serverName);
165 _lock.ExitWriteLock();
169 private MediaController GetController(string serverName)
173 _lock.EnterReadLock();
175 _activated.TryGetValue(serverName, out var value);
180 _lock.ExitReadLock();
184 private void LoadActivatedServers()
188 _lock.EnterWriteLock();
190 Native.ActivatedServerCallback serverCallback = (serverName, _) =>
192 _activated.Add(serverName, new MediaController(this, serverName));
196 Native.ForeachActivatedServer(Handle, serverCallback, IntPtr.Zero).
197 ThrowIfError("Failed to get activated servers.");
201 _lock.ExitWriteLock();