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.
19 namespace Tizen.System
22 /// The class to access the storage device information.
24 /// <since_tizen> 3 </since_tizen>
27 private const string LogTag = "Tizen.System";
28 private Interop.Storage.StorageState _state;
29 private Interop.Storage.StorageDevice _devicetype;
30 private Interop.Storage.StorageArea _storagetype;
31 private string _fstype;
32 private string _fsuuid;
33 private ulong _totalSpace;
34 private bool _primary;
36 private bool information_set = false;
38 internal Storage(int storageID, Interop.Storage.StorageArea storageType, Interop.Storage.StorageState storagestate, string rootDirectory)
41 _storagetype = storageType;
42 RootDirectory = rootDirectory;
43 _state = storagestate;
46 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetTotalSpace(Id, out _totalSpace);
47 if (err != Interop.Storage.ErrorCode.None)
49 Log.Warn(LogTag, string.Format("Failed to get total storage space for storage Id: {0}. err = {1}", Id, err));
52 s_stateChangedEventCallback = (id, state, userData) =>
57 s_stateChangedEventHandler?.Invoke(this, EventArgs.Empty);
62 internal Storage(int storageID, Interop.Storage.StorageArea storageType, Interop.Storage.StorageState storagestate, string rootDirectory, Interop.Storage.StorageDevice devicetype, string fstype, string fsuuid, bool primary, int flags)
65 _storagetype = storageType;
66 RootDirectory = rootDirectory;
67 _state = storagestate;
68 _devicetype = devicetype;
73 information_set = true;
75 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetTotalSpace(Id, out _totalSpace);
76 if (err != Interop.Storage.ErrorCode.None)
78 Log.Warn(LogTag, string.Format("Failed to get total storage space for storage Id: {0}. err = {1}", Id, err));
81 s_stateChangedEventCallback = (id, state, userData) =>
86 s_stateChangedEventHandler?.Invoke(this, EventArgs.Empty);
91 private EventHandler s_stateChangedEventHandler;
92 private Interop.Storage.StorageStateChangedCallback s_stateChangedEventCallback;
94 private void RegisterStateChangedEvent()
96 Interop.Storage.ErrorCode err = Interop.Storage.StorageSetStateChanged(Id, s_stateChangedEventCallback, IntPtr.Zero);
97 if (err != Interop.Storage.ErrorCode.None)
99 Log.Warn(LogTag, string.Format("Failed to Register state changed event callback for storage Id: {0}. err = {1}", Id, err));
103 private void UnregisterStateChangedEvent()
105 Interop.Storage.ErrorCode err = Interop.Storage.StorageUnsetStateChanged(Id, s_stateChangedEventCallback);
106 if (err != Interop.Storage.ErrorCode.None)
108 Log.Warn(LogTag, string.Format("Failed to Register state changed event callback for storage Id: {0}. err = {1}", Id, err));
113 /// StorageStateChanged event. This event is occurred when a storage state changes.
116 /// The storage state will be updated before calling the event handler.
118 /// <since_tizen> 3 </since_tizen>
119 /// <feature> http://tizen.org/feature/storage.external </feature>
122 /// myStorage.StorageStateChanged += (s, e) =>
124 /// var storage = s as Storage;
125 /// Console.WriteLine(string.Format("State Changed to {0}", storage.State));
129 public event EventHandler StorageStateChanged
133 if (s_stateChangedEventHandler == null)
135 _state = (Interop.Storage.StorageState)State;
136 RegisterStateChangedEvent();
138 s_stateChangedEventHandler += value;
142 if (s_stateChangedEventHandler != null)
144 s_stateChangedEventHandler -= value;
145 if (s_stateChangedEventHandler == null)
147 UnregisterStateChangedEvent();
156 /// <since_tizen> 3 </since_tizen>
157 /// <feature> http://tizen.org/feature/storage.external </feature>
158 public int Id { get; }
160 /// The type of storage.
162 /// <since_tizen> 3 </since_tizen>
163 /// <feature> http://tizen.org/feature/storage.external </feature>
164 public StorageArea StorageType { get { return (StorageArea)_storagetype; } }
166 /// The root directory for the storage.
168 /// <since_tizen> 3 </since_tizen>
169 /// <feature> http://tizen.org/feature/storage.external </feature>
170 public string RootDirectory { get; }
172 /// The total storage size in bytes.
174 /// <since_tizen> 3 </since_tizen>
175 /// <feature> http://tizen.org/feature/storage.external </feature>
176 public ulong TotalSpace { get { return _totalSpace; } }
179 /// The StorageState.
181 /// <since_tizen> 3 </since_tizen>
182 /// <feature> http://tizen.org/feature/storage.external </feature>
183 public StorageState State
187 if (s_stateChangedEventHandler == null)
189 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetState(Id, out _state);
190 if (err != Interop.Storage.ErrorCode.None)
192 Log.Warn(LogTag, string.Format("Failed to get storage state for storage Id: {0}. err = {1}", Id, err));
195 return (StorageState)_state;
200 /// The StorageDevice.
202 /// <since_tizen> 5 </since_tizen>
203 /// <feature> http://tizen.org/feature/storage.external </feature>
204 /// <exception cref="InvalidOperationException">Thrown when DeviceType is not initialized.</exception>
205 public StorageDevice DeviceType
209 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetTypeDev(Id, out _storagetype, out _devicetype);
210 if (err != Interop.Storage.ErrorCode.None)
212 Log.Warn(LogTag, string.Format("Failed to get storage device type for storage Id: {0}. err = {1}", Id, err));
214 return (StorageDevice)_devicetype;
219 /// The type of file system.
221 /// <since_tizen> 5 </since_tizen>
222 /// <feature> http://tizen.org/feature/storage.external </feature>
223 /// <exception cref="InvalidOperationException">Thrown when Fstype is not initialized.</exception>
228 if (!information_set)
230 Log.Error(LogTag, string.Format("Doesn't know fstype."));
231 throw new InvalidOperationException("Doesn't know type of file system");
238 /// The UUID of the file system.
240 /// <since_tizen> 5 </since_tizen>
241 /// <feature> http://tizen.org/feature/storage.external </feature>
242 /// <exception cref="InvalidOperationException">Thrown when Fsuuid is not initialized.</exception>
247 if (!information_set)
249 Log.Error(LogTag, string.Format("Doesn't know fsuuid."));
250 throw new InvalidOperationException("Doesn't know uuid of file system");
257 /// Information whether this is a primary partition.
259 /// <since_tizen> 5 </since_tizen>
260 /// <feature> http://tizen.org/feature/storage.external </feature>
261 /// <exception cref="InvalidOperationException">Thrown when primary is not initialized.</exception>
266 if (!information_set)
268 Log.Error(LogTag, string.Format("Doesn't know primary information."));
269 throw new InvalidOperationException("Doesn't know primary information");
276 /// The flags for the storage status.
278 /// <since_tizen> 5 </since_tizen>
279 /// <feature> http://tizen.org/feature/storage.external </feature>
280 /// <exception cref="InvalidOperationException">Thrown when flags are not initialized.</exception>
285 if (!information_set)
287 Log.Error(LogTag, string.Format("Doesn't know flags."));
288 throw new InvalidOperationException("Doesn't know flags");
295 /// [Obsolete("Please do not use! this will be deprecated")]
297 /// <since_tizen> 3 </since_tizen>
298 /// Please do not use! this will be deprecated!
299 /// Instead please use AvailableSpace.
300 [Obsolete("Please do not use! This will be deprecated! Please use AvailableSpace instead!")]
301 public ulong AvaliableSpace
306 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetAvailableSpace(Id, out available);
307 if (err != Interop.Storage.ErrorCode.None)
309 Log.Warn(LogTag, string.Format("Failed to get available storage stace for storage Id: {0}. err = {1}", Id, err));
317 /// The available storage size in bytes.
319 /// <since_tizen> 5 </since_tizen>
320 /// <feature> http://tizen.org/feature/storage.external </feature>
321 public ulong AvailableSpace
326 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetAvailableSpace(Id, out available);
327 if (err != Interop.Storage.ErrorCode.None)
329 Log.Warn(LogTag, string.Format("Failed to get available storage stace for storage Id: {0}. err = {1}", Id, err));
337 /// Absolute path for a given directory type in the storage.
340 /// The returned directory path may not exist, so you must make sure that it exists before using it.
341 /// For accessing internal storage except the ringtones directory, the application should have http://tizen.org/privilege/mediastorage privilege.
342 /// For accessing ringtones directory, the application should have http://tizen.org/privilege/systemsettings privilege.
343 /// For accessing external storage, the application should have http://tizen.org/privilege/externalstorage privilege.
345 /// <since_tizen> 3 </since_tizen>
346 /// <param name="dirType">Directory type.</param>
347 /// <returns>Absolute path for a given directory type in the storage.</returns>
348 /// <feature> http://tizen.org/feature/storage.external </feature>
349 /// <exception cref="ArgumentException">Thrown when failed because of an invalid argument.</exception>
350 /// <exception cref="OutOfMemoryException">Thrown when failed due to out of memory exception.</exception>
351 /// <exception cref="NotSupportedException">Thrown when the storage is not supported or the application does not have the permission to access the directory path.</exception>
352 /// <privilege>http://tizen.org/privilege/mediastorage</privilege>
353 /// <privilege>http://tizen.org/privilege/systemsettings</privilege>
354 /// <privilege>http://tizen.org/privilege/externalstorage</privilege>
357 /// // To get the video directories for all the supported storage,
358 /// var storageList = StorageManager.Storages as List<Storage>;
359 /// foreach (var storage in storageList)
361 /// string pathForVideoDir = storage.GetAbsolutePath(DirectoryType.Videos);
365 public string GetAbsolutePath(DirectoryType dirType)
368 Interop.Storage.ErrorCode err = Interop.Storage.StorageGetAbsoluteDirectory(Id, (Interop.Storage.DirectoryType)dirType, out path);
369 if (err != Interop.Storage.ErrorCode.None)
371 Log.Warn(LogTag, string.Format("Failed to get package Id. err = {0}", err));
374 case Interop.Storage.ErrorCode.InvalidParameter:
375 throw new ArgumentException("Invalid Arguments");
376 case Interop.Storage.ErrorCode.OutOfMemory:
377 throw new OutOfMemoryException("Out of Memory");
378 case Interop.Storage.ErrorCode.NotSupported:
379 throw new NotSupportedException("Storage Not Supported");
381 throw new InvalidOperationException("Error = " + err);