/// <summary>
        /// Get an Int64 value from an area description metadata.
        /// </summary>
        /// <returns><c>true</c>, if an Int64 value was found, <c>false</c> otherwise.</returns>
        /// <param name="rawMetadata">Area description metadata pointer.</param>
        /// <param name="key">Key name.</param>
        /// <param name="value">Output value for the specified key.</param>
        private static bool _MetadataGetInt64(IntPtr rawMetadata, string key, out Int64 value)
        {
            value = 0;

            IntPtr rawValue     = IntPtr.Zero;
            uint   rawValueSize = 0;

            if (AreaDescriptionAPI.TangoAreaDescriptionMetadata_get(rawMetadata, key, ref rawValueSize, ref rawValue)
                != Common.ErrorType.TANGO_SUCCESS)
            {
                Debug.Log(string.Format("key={0} Unable to get metadata value.\n" + Environment.StackTrace,
                                        key));
                return(false);
            }

            if (rawValueSize != INT64_BYTE_COUNT)
            {
                // Unexpected size change
                Debug.Log(string.Format("key={0} Unexpected byte size {1}.\n" + Environment.StackTrace,
                                        key, rawValueSize));
                return(false);
            }

            value = Marshal.ReadInt64(rawValue);
            return(true);
        }
        /// <summary>
        /// Get a fixed-size double array from an area description metadata.
        /// </summary>
        /// <returns><c>true</c>, if a double array of the specified size was found, <c>false</c> otherwise.</returns>
        /// <param name="rawMetadata">Area description metadata pointer.</param>
        /// <param name="key">Key name.</param>
        /// <param name="expectedCount">Expected size of the array.</param>
        /// <param name="value">Output value for the specified key.</param>
        private static bool _MetadataGetDoubleArray(IntPtr rawMetadata, string key, int expectedCount,
                                                    out double[] value)
        {
            value = new double[expectedCount];

            IntPtr rawValue     = IntPtr.Zero;
            uint   rawValueSize = 0;

            if (AreaDescriptionAPI.TangoAreaDescriptionMetadata_get(rawMetadata, key, ref rawValueSize, ref rawValue)
                != Common.ErrorType.TANGO_SUCCESS)
            {
                Debug.Log(string.Format("key={0} Unable to get metadata value.\n" + Environment.StackTrace,
                                        value));
                return(false);
            }

            if (rawValueSize != DOUBLE_BYTE_COUNT * expectedCount)
            {
                // Unexpected size change
                Debug.Log(string.Format("key={0} Unexpected byte size {1}.\n" + Environment.StackTrace,
                                        key, rawValueSize));
                return(false);
            }

            Marshal.Copy(rawValue, value, 0, expectedCount);
            return(true);
        }
        /// <summary>
        /// Get a string value from an area description metadata.
        /// </summary>
        /// <returns><c>true</c>, if a string value was found, <c>false</c> otherwise.</returns>
        /// <param name="rawMetadata">Area description metadata pointer.</param>
        /// <param name="key">Key name.</param>
        /// <param name="value">Output value for the specified key.</param>
        private static bool _MetadataGetString(IntPtr rawMetadata, string key, out string value)
        {
            value = String.Empty;

            IntPtr rawValue     = IntPtr.Zero;
            uint   rawValueSize = 0;

            if (AreaDescriptionAPI.TangoAreaDescriptionMetadata_get(rawMetadata, key, ref rawValueSize, ref rawValue)
                != Common.ErrorType.TANGO_SUCCESS)
            {
                Debug.Log(string.Format("key={0} Unable to get metadata value.\n" + Environment.StackTrace,
                                        key));
                return(false);
            }

            byte[] rawValueArray = new byte[rawValueSize];
            Marshal.Copy(rawValue, rawValueArray, 0, (int)rawValueSize);
            try
            {
                value = Encoding.UTF8.GetString(rawValueArray);
            }
            catch (Exception e)
            {
                Debug.Log(string.Format("key={0} Error during UTF-8 decoding {1}.\n" + Environment.StackTrace,
                                        key, e.Message));
                return(false);
            }

            return(true);
        }