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 public partial class MediaControllerManager : IDisposable
31 private NativeHandle _handle;
33 private Dictionary<string, MediaController> _activated = new Dictionary<string, MediaController>();
35 private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
37 internal NativeHandle Handle
43 throw new ObjectDisposedException(nameof(MediaControllerManager));
51 /// Initializes a new instance of the <see cref="MediaControllerManager"/> class.
53 /// <privilege>http://tizen.org/privilege/mediacontroller.client</privilege>
54 /// <exception cref="InvalidOperationException">An internal error occurs.</exception>
55 /// <exception cref="UnauthorizedAccessException">Caller does not have required privilege.</exception>
56 public MediaControllerManager()
58 Native.Create(out _handle).ThrowIfError("Failed to create media controller client.");
62 LoadActivatedServers();
65 private bool _disposed;
68 /// Releases all resources used by the <see cref="MediaControllerManager"/>.
76 /// Releases the unmanaged resources used by the <see cref="MediaControllerManager"/>.
78 /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>
79 protected virtual void Dispose(bool disposing)
85 // To be used if there are any other disposable objects
94 /// Gets the active controllers.
96 /// <returns>An array of <see cref="MediaController"/>.</returns>
97 public MediaController[] GetActiveControllers()
101 return new MediaController[0];
106 _lock.EnterReadLock();
107 return _activated.Values.ToArray();
111 _lock.ExitReadLock();
115 #region Controllers-related operations
117 #region Unlocking operations
119 private MediaController HandleActivation(string serverName)
121 if (_activated.ContainsKey(serverName))
126 var controller = new MediaController(this, serverName);
127 _activated.Add(serverName, controller);
132 private MediaController HandleDeactivation(string serverName)
134 if (_activated.TryGetValue(serverName, out var controller))
136 _activated.Remove(serverName);
143 #region Locking operations
145 private MediaController HandleServerUpdated(string serverName, MediaControllerServerState state)
149 _lock.EnterWriteLock();
151 if (state == MediaControllerServerState.Activated)
153 return HandleActivation(serverName);
156 return HandleDeactivation(serverName);
160 _lock.ExitWriteLock();
164 private MediaController GetController(string serverName)
168 _lock.EnterReadLock();
170 _activated.TryGetValue(serverName, out var value);
175 _lock.ExitReadLock();
179 private void LoadActivatedServers()
183 _lock.EnterWriteLock();
185 Native.ActivatedServerCallback serverCallback = (serverName, _) =>
187 _activated.Add(serverName, new MediaController(this, serverName));
191 Native.ForeachActivatedServer(Handle, serverCallback, IntPtr.Zero).
192 ThrowIfError("Failed to get activated servers.");
196 _lock.ExitWriteLock();