public override long GetChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length)
{
// if the object doesn't contain a char[] then the user will get an exception
string s = (string)_values[i];
char[] data = s.ToCharArray();
int cchars = data.Length;
// since arrays can't handle 64 bit values and this interface doesn't
// allow chunked access to data, a dataIndex outside the rang of Int32
// is invalid
if (dataIndex > int.MaxValue)
{
throw ADP.InvalidSourceBufferIndex(cchars, dataIndex, nameof(dataIndex));
}
int ndataIndex = (int)dataIndex;
// if no buffer is passed in, return the number of characters we have
if (null == buffer)
{
return cchars;
}
try
{
if (ndataIndex < cchars)
{
// help the user out in the case where there's less data than requested
if ((ndataIndex + length) > cchars)
{
cchars = cchars - ndataIndex;
}
else
{
cchars = length;
}
}
Array.Copy(data, ndataIndex, buffer, bufferIndex, cchars);
}
catch (Exception e) when (ADP.IsCatchableExceptionType(e))
{
cchars = data.Length;
if (length < 0)
{
throw ADP.InvalidDataLength(length);
}
// if bad buffer index, throw
if (bufferIndex < 0 || bufferIndex >= buffer.Length)
{
throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, nameof(bufferIndex));
}
// if bad data index, throw
if (ndataIndex < 0 || ndataIndex >= cchars)
{
throw ADP.InvalidSourceBufferIndex(cchars, dataIndex, nameof(dataIndex));
}
// if there is not enough room in the buffer for data
if (cchars + bufferIndex > buffer.Length)
{
throw ADP.InvalidBufferSizeOrIndex(cchars, bufferIndex);
}
}
return cchars;
}