/// Copyright 2016 by Samsung Electronics, Inc.,
///
/*
* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Tizen.Network.IoTConnectivity
{
///
/// This class represents current attributes of a resource.
/// It provides API to manage attributes.
/// This class is accessed by using a constructor to create a new instance of this object.
///
public class Attributes : IDictionary, IDisposable
{
internal IntPtr _resourceAttributesHandle = IntPtr.Zero;
private readonly IDictionary _attributes = new Dictionary();
private bool _disposed = false;
///
/// The Attributes constructor
///
/// Thrown when the iotcon is not supported
/// Thrown when there is not enough memory
/// Thrown when there is an invalid parameter
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes();
///
public Attributes()
{
int ret = Interop.IoTConnectivity.Common.Attributes.Create(out _resourceAttributesHandle);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to create attributes handle");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
internal Attributes(IntPtr attributesHandleToClone)
{
int ret = Interop.IoTConnectivity.Common.Attributes.Clone(attributesHandleToClone, out _resourceAttributesHandle);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to create attributes handle");
throw IoTConnectivityErrorFactory.GetException(ret);
}
SetAttributes(_resourceAttributesHandle);
}
///
/// Destructor of the Attributes class.
///
~Attributes()
{
Dispose(false);
}
///
/// Gets the number of keys
///
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// attributes.Add("brightness", 50);
/// var count = attributes.Count;
/// Console.WriteLine("There are {0} keys in the attribute object", count);
///
public int Count
{
get
{
return _attributes.Count;
}
}
///
/// Represents whether attribute is readonly
///
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// if (attributes.IsReadOnly)
/// Console.WriteLine("Read only attribute");
///
public bool IsReadOnly
{
get
{
return _attributes.IsReadOnly;
}
}
///
/// Contains all the attribute keys
///
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// var keys = attributes.Keys;
/// Console.WriteLine("Attribute contains keys {0} and {1}", keys.ElementAt(0), keys.ElementAt(1));
///
public ICollection Keys
{
get
{
return _attributes.Keys;
}
}
///
/// Contains all the attribute values
///
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// var values = attributes.Values;
/// Console.WriteLine("Attribute contains values {0} and {1}", values.ElementAt(0), values.ElementAt(1));
///
public ICollection Values
{
get
{
return _attributes.Values;
}
}
///
/// Gets or sets the attribute with the specified key.
///
/// The key of the attribute to get or set.
/// The element with the specified key.
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes();
/// attributes["state"] = "ON";
/// Console.WriteLine("Attribute value for key 'state' : {0}", attributes["state"]);
///
public object this[string key]
{
get
{
if (_attributes.ContainsKey(key))
return _attributes[key];
else
return null;
}
set
{
Add(key, value);
}
}
///
/// Adds attribute key and value as a key value pair
///
/// The key value pair to add
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes();
/// attributes.Add(new KeyValuePair ("state", "ON"));
///
public void Add(KeyValuePair item)
{
Add(item.Key, item.Value);
}
///
/// Adds an attribute
///
/// The key representing the attribute
/// The value representing the attribute
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes();
/// attributes.Add("brightness", 50);
///
public void Add(string key, object value)
{
int ret = 0;
if (value is int)
{
ret = Interop.IoTConnectivity.Common.Attributes.AddInt(_resourceAttributesHandle, key, (int)value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add int");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else if (value is Attributes)
{
Attributes attribs = (Attributes)value;
ret = Interop.IoTConnectivity.Common.Attributes.AddAttributes(_resourceAttributesHandle, key, attribs._resourceAttributesHandle);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else if (value is string)
{
ret = Interop.IoTConnectivity.Common.Attributes.AddStr(_resourceAttributesHandle, key, (string)value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add string");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else if (value is double)
{
ret = Interop.IoTConnectivity.Common.Attributes.AddDouble(_resourceAttributesHandle, key, (double)value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add double");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else if (value is bool)
{
ret = Interop.IoTConnectivity.Common.Attributes.AddBool(_resourceAttributesHandle, key, (bool)value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add bool");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else if (value is byte[])
{
byte[] val = value as byte[];
if (val == null)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get byte[] val");
throw new ArgumentException("Invalid Parameter");
}
ret = Interop.IoTConnectivity.Common.Attributes.AddByteStr(_resourceAttributesHandle, key, val, val.Length);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add bool");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else if (value is IEnumerable)
{
IntPtr listHandle = List.GetListHandle(value);
ret = Interop.IoTConnectivity.Common.Attributes.AddList(_resourceAttributesHandle, key, listHandle);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add list");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
else
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to Add");
throw IoTConnectivityErrorFactory.GetException((int)IoTConnectivityError.InvalidParameter);
}
_attributes.Add(key, value);
}
///
/// Clears attributes collection
///
/// Thrown when the iotcon is not supported
/// Thrown when there is an invalid parameter
/// Thrown when the operation is invalid
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes();
/// attributes.Add("brightness", 50);
/// attributes.Clear();
///
public void Clear()
{
foreach (string key in _attributes.Keys)
{
int ret = Interop.IoTConnectivity.Common.Attributes.Remove(_resourceAttributesHandle, key);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to clear attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
_attributes.Clear();
}
///
/// Checks whether the given key value pair exists in attributes collection
///
/// The status key value pair
/// true if exists. Otherwise, false
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// if (attributes.Contains(new KeyValuePair ("dim", 10))
/// Console.WriteLine("Attribute conatins pair ('dim', 10)");
///
public bool Contains(KeyValuePair item)
{
return _attributes.Contains(item);
}
///
/// Checks whether the given key exists in attributes collection
///
/// The status key to look for
/// true if exists. Otherwise, false
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// if (attributes.ContainsKey("dim"))
/// Console.WriteLine("Attribute conatins key : dim");
///
public bool ContainsKey(string key)
{
return _attributes.ContainsKey(key);
}
///
/// Copies the elements of the attributes to an array, starting at a particular index.
///
/// The destination array
/// The zero-based index in array at which copying begins.
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// KeyValuePair[] dest = new KeyValuePair[attributes.Count];
/// int index = 0;
/// attributes.CopyTo(dest, index);
/// Console.WriteLine("Dest conatins ({0}, {1})", dest[0].Key, dest[0].Value);
///
public void CopyTo(KeyValuePair[] array, int arrayIndex)
{
_attributes.CopyTo(array, arrayIndex);
}
///
/// Returns an enumerator that iterates through the collection.
///
/// An enumerator that can be used to iterate through the collection.
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// foreach (KeyValuePair pair in attributes)
/// {
/// Console.WriteLine("key : {0}, value : {1}", pair.Key, pair.Value);
/// }
///
public IEnumerator> GetEnumerator()
{
return _attributes.GetEnumerator();
}
///
/// Removes an attribute from collection
///
/// The attributes element to remove
/// true if operation is success. Otherwise, false
/// Thrown when the iotcon is not supported
/// Thrown when there is an invalid parameter
/// Thrown when the operation is invalid
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// if (attributes.Remove(new KeyValuePair("dim", 10)))
/// Console.WriteLine("Remove was successful");
///
public bool Remove(KeyValuePair item)
{
return Remove(item.Key);
}
///
/// Removes an attribute from collection using key
///
/// The attributes element to remove
/// true if operation is successful, Otherwise, false
/// Thrown when the iotcon is not supported
/// Thrown when there is an invalid parameter
/// Thrown when the operation is invalid
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" },
/// { "dim", 10 }
/// };
/// if (attributes.Remove("state"))
/// Console.WriteLine("Remove was successful");
///
public bool Remove(string key)
{
bool isRemoved = _attributes.Remove(key);
if (isRemoved)
{
int ret = Interop.IoTConnectivity.Common.Attributes.Remove(_resourceAttributesHandle, key);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
return isRemoved;
}
///
/// Gets the value associated with the specified key.
///
/// The key whose value to get.
/// The value associated with the specified key
/// true if the attributes collection contains an element with the specified key; otherwise, false.
///
/// Tizen.Network.IoTConnectivity.Attributes attributes = new Tizen.Network.IoTConnectivity.Attributes() {
/// { "state", "ON" }
/// };
/// object value;
/// var isPresent = attributes.TryGetValue("state", out value);
/// if (isPresent)
/// Console.WriteLine("value : {0}", value);
///
public bool TryGetValue(string key, out object value)
{
return _attributes.TryGetValue(key, out value);
}
///
/// Returns an enumerator that iterates through the collection.
///
IEnumerator IEnumerable.GetEnumerator()
{
return _attributes.GetEnumerator();
}
///
/// Releases any unmanaged resources used by this object.
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
///
/// Releases any unmanaged resources used by this object. Can also dispose any other disposable objects.
///
/// If true, disposes any disposable objects. If false, does not dispose disposable objects.
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
// Free managed objects
}
Interop.IoTConnectivity.Common.Attributes.Destroy(_resourceAttributesHandle);
_disposed = true;
}
private void SetAttributes(IntPtr attributesHandle)
{
Interop.IoTConnectivity.Common.Attributes.AttributesCallback cb = (IntPtr attributes, string key, IntPtr userData) =>
{
Interop.IoTConnectivity.Common.DataType dataType;
int ret = Interop.IoTConnectivity.Common.Attributes.GetType(attributes, key, out dataType);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get type");
throw IoTConnectivityErrorFactory.GetException(ret);
}
switch ((Interop.IoTConnectivity.Common.DataType)dataType)
{
case Interop.IoTConnectivity.Common.DataType.Int:
{
int value;
ret = Interop.IoTConnectivity.Common.Attributes.GetInt(attributes, key, out value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
_attributes.Add(key, value);
break;
}
case Interop.IoTConnectivity.Common.DataType.Bool:
{
bool value;
ret = Interop.IoTConnectivity.Common.Attributes.GetBool(attributes, key, out value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
_attributes.Add(key, value);
break;
}
case Interop.IoTConnectivity.Common.DataType.Double:
{
double value;
ret = Interop.IoTConnectivity.Common.Attributes.GetDouble(attributes, key, out value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
_attributes.Add(key, value);
break;
}
case Interop.IoTConnectivity.Common.DataType.String:
{
IntPtr value;
string Str;
ret = Interop.IoTConnectivity.Common.Attributes.GetStr(attributes, key, out value);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
Str = (value != IntPtr.Zero) ? Marshal.PtrToStringAnsi(value) : string.Empty;
_attributes.Add(key, Str);
break;
}
case Interop.IoTConnectivity.Common.DataType.ByteStr:
{
IntPtr byteStrPtr;
int byteStrSize;
ret = Interop.IoTConnectivity.Common.Attributes.GetByteStr(attributes, key, out byteStrPtr, out byteStrSize);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
byte[] byteStr = new byte[byteStrSize];
Marshal.Copy(byteStrPtr, byteStr, 0, byteStrSize);
_attributes.Add(key, byteStr);
break;
}
case Interop.IoTConnectivity.Common.DataType.Null:
{
_attributes.Add(key, null);
break;
}
case Interop.IoTConnectivity.Common.DataType.List:
{
IntPtr listHandle;
ret = Interop.IoTConnectivity.Common.Attributes.GetList(attributes, key, out listHandle);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
_attributes.Add(key, List.GetList(listHandle));
break;
}
case Interop.IoTConnectivity.Common.DataType.Attributes:
{
IntPtr attribsHandle;
ret = Interop.IoTConnectivity.Common.Attributes.GetAttributes(attributes, key, out attribsHandle);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
_attributes.Add(key, new Attributes(attribsHandle));
break;
}
default:
break;
}
return true;
};
int res = Interop.IoTConnectivity.Common.Attributes.Foreach(attributesHandle, cb, IntPtr.Zero);
if (res != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove attributes");
throw IoTConnectivityErrorFactory.GetException(res);
}
}
}
internal static class List
{
internal static IntPtr GetListHandle(object list)
{
IntPtr listHandle = IntPtr.Zero;
int ret;
int pos = 0;
if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.List, out listHandle);
pos = 0;
foreach (IEnumerable val in (IEnumerable)list)
{
IntPtr childList = GetListHandle(val);
ret = Interop.IoTConnectivity.Common.List.AddList(listHandle, childList, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add attributes");
Interop.IoTConnectivity.Common.List.Destroy(childList);
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.Int, out listHandle);
pos = 0;
foreach (int val in (IEnumerable)list)
{
ret = Interop.IoTConnectivity.Common.List.AddInt(listHandle, val, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.String, out listHandle);
pos = 0;
foreach (string val in (IEnumerable)list)
{
ret = Interop.IoTConnectivity.Common.List.AddStr(listHandle, val, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add str");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.Double, out listHandle);
pos = 0;
foreach (double val in (IEnumerable)list)
{
ret = Interop.IoTConnectivity.Common.List.AddDouble(listHandle, val, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add double");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.Bool, out listHandle);
pos = 0;
foreach (bool val in (IEnumerable)list)
{
ret = Interop.IoTConnectivity.Common.List.AddBool(listHandle, val, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add bool");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.Attributes, out listHandle);
pos = 0;
foreach (Attributes val in (IEnumerable)list)
{
ret = Interop.IoTConnectivity.Common.List.AddAttributes(listHandle, val._resourceAttributesHandle, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else if (list is IEnumerable)
{
ret = Interop.IoTConnectivity.Common.List.Create(Interop.IoTConnectivity.Common.DataType.ByteStr, out listHandle);
pos = 0;
foreach (byte[] val in (IEnumerable)list)
{
ret = Interop.IoTConnectivity.Common.List.AddByteStr(listHandle, val, val.Length, pos++);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to add byte[]");
throw IoTConnectivityErrorFactory.GetException(ret);
}
}
}
else
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to GetListHandle");
throw IoTConnectivityErrorFactory.GetException((int)IoTConnectivityError.InvalidParameter);
}
return listHandle;
}
internal static object GetList(IntPtr listHandle)
{
IList list = null;
int type;
int ret = Interop.IoTConnectivity.Common.List.GetType(listHandle, out type);
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get type");
throw IoTConnectivityErrorFactory.GetException(ret);
}
switch ((Interop.IoTConnectivity.Common.DataType)type)
{
case Interop.IoTConnectivity.Common.DataType.Int:
{
list = new List();
Interop.IoTConnectivity.Common.List.IntCallback cb = (int pos, int value, IntPtr userData) =>
{
list.Add(value);
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachInt(listHandle, cb, IntPtr.Zero);
break;
}
case Interop.IoTConnectivity.Common.DataType.Bool:
{
list = new List();
Interop.IoTConnectivity.Common.List.BoolCallback cb = (int pos, bool value, IntPtr userData) =>
{
list.Add(value);
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachBool(listHandle, cb, IntPtr.Zero);
break;
}
case Interop.IoTConnectivity.Common.DataType.Double:
{
list = new List();
Interop.IoTConnectivity.Common.List.DoubleCallback cb = (int pos, double value, IntPtr userData) =>
{
list.Add(value);
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachDouble(listHandle, cb, IntPtr.Zero);
break;
}
case Interop.IoTConnectivity.Common.DataType.String:
{
list = new List();
Interop.IoTConnectivity.Common.List.StrCallback cb = (int pos, string value, IntPtr userData) =>
{
list.Add(value);
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachStr(listHandle, cb, IntPtr.Zero);
break;
}
case Interop.IoTConnectivity.Common.DataType.Attributes:
{
list = new List();
Interop.IoTConnectivity.Common.List.AttribsCallback cb = (int pos, IntPtr value, IntPtr userData) =>
{
list.Add(new Attributes(value));
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachAttributes(listHandle, cb, IntPtr.Zero);
break;
}
case Interop.IoTConnectivity.Common.DataType.ByteStr:
{
list = new List();
Interop.IoTConnectivity.Common.List.ByteStrCallback cb = (int pos, byte[] value, int len, IntPtr userData) =>
{
list.Add(value);
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachByteStr(listHandle, cb, IntPtr.Zero);
break;
}
case Interop.IoTConnectivity.Common.DataType.List:
{
list = new List>();
Interop.IoTConnectivity.Common.List.ListCallback cb = (int pos, IntPtr value, IntPtr userData) =>
{
object childList = GetList(value);
if (childList != null)
list.Add(childList);
return true;
};
ret = Interop.IoTConnectivity.Common.List.ForeachList(listHandle, cb, IntPtr.Zero);
break;
}
default:
break;
}
if (ret != (int)IoTConnectivityError.None)
{
Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to get attributes");
throw IoTConnectivityErrorFactory.GetException(ret);
}
return list;
}
}
}