// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Text;
internal static partial class Interop
{
///
/// Helper for making interop calls that return a string, but we don't know
/// the correct size of buffer to make. So invoke the interop call with an
/// increasing buffer until the size is big enough.
///
internal static bool CallStringMethod(
Func interopCall,
TArg1 arg1,
TArg2 arg2,
TArg3 arg3,
out string result)
{
const int initialStringSize = 80;
const int maxDoubleAttempts = 5;
StringBuilder stringBuilder = StringBuilderCache.Acquire(initialStringSize);
for (int i = 0; i < maxDoubleAttempts; i++)
{
GlobalizationInterop.ResultCode resultCode = interopCall(arg1, arg2, arg3, stringBuilder);
if (resultCode == GlobalizationInterop.ResultCode.Success)
{
result = StringBuilderCache.GetStringAndRelease(stringBuilder);
return true;
}
else if (resultCode == GlobalizationInterop.ResultCode.InsufficentBuffer)
{
// increase the string size and loop
stringBuilder.EnsureCapacity(stringBuilder.Capacity * 2);
}
else
{
// if there is an unknown error, don't proceed
break;
}
}
StringBuilderCache.Release(stringBuilder);
result = null;
return false;
}
}