/* * Copyright 2019–present MongoDB, Inc. * * 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.Runtime.InteropServices; namespace MongoDB.Libmongocrypt { /// /// A LibMongoCrypt Status /// /// internal class Status : IDisposable { private StatusSafeHandle _handle; public Status() { _handle = Library.mongocrypt_status_new(); } public Status(StatusSafeHandle handle) { _handle = handle; } public void Check(IStatus status) { status.Check(this); ThrowExceptionIfNeeded(); } public void SetStatus(uint code, string msg) { IntPtr stringPointer = (IntPtr)Marshal.StringToHGlobalAnsi(msg); try { Library.mongocrypt_status_set(_handle, (int)Library.StatusType.MONGOCRYPT_STATUS_ERROR_CLIENT, code, stringPointer, -1); } finally { Marshal.FreeHGlobal(stringPointer); } } #region IDisposable public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // Adapted from: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.safehandle?view=netcore-3.0 if (_handle != null && !_handle.IsInvalid) { // Free the handle _handle.Dispose(); } } #endregion internal StatusSafeHandle Handle => _handle; internal void ThrowExceptionIfNeeded() { if (!Library.mongocrypt_status_ok(_handle)) { var statusType = Library.mongocrypt_status_type(_handle); var statusCode = Library.mongocrypt_status_code(_handle); uint length; IntPtr msgPtr = Library.mongocrypt_status_message(_handle, out length); var message = Marshal.PtrToStringAnsi(msgPtr); throw new CryptException(statusType, statusCode, message); } } } }