// Copyright (c) 2015-2022 Vector 35 Inc
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
#include "binaryninjaapi.h"
using namespace BinaryNinja;
using namespace std;
namespace BinaryNinja {
struct UpdateProgress
{
function func;
static bool UpdateCallback(void* ctxt, uint64_t progress, uint64_t total)
{
UpdateProgress* self = (UpdateProgress*)ctxt;
return self->func(progress, total);
}
};
} // namespace BinaryNinja
vector UpdateChannel::GetList()
{
size_t count;
char* errors;
BNUpdateChannel* channels = BNGetUpdateChannels(&count, &errors);
if (errors)
{
string errorStr = errors;
BNFreeString(errors);
throw UpdateException(errorStr);
}
vector result;
result.reserve(count);
for (size_t i = 0; i < count; i++)
{
UpdateChannel channel;
channel.name = channels[i].name;
channel.description = channels[i].description;
channel.latestVersion = channels[i].latestVersion;
result.push_back(channel);
}
BNFreeUpdateChannelList(channels, count);
return result;
}
bool UpdateChannel::AreUpdatesAvailable(uint64_t* expireTime, uint64_t* serverTime)
{
char* errors;
bool result = BNAreUpdatesAvailable(name.c_str(), expireTime, serverTime, &errors);
if (errors)
{
string errorStr = errors;
BNFreeString(errors);
throw UpdateException(errorStr);
}
return result;
}
BNUpdateResult UpdateChannel::UpdateToVersion(const string& version)
{
return UpdateToVersion(version, [](uint64_t, uint64_t) { return true; });
}
BNUpdateResult UpdateChannel::UpdateToVersion(
const string& version, const function& progress)
{
UpdateProgress up;
up.func = progress;
char* errors;
BNUpdateResult result =
BNUpdateToVersion(name.c_str(), version.c_str(), &errors, UpdateProgress::UpdateCallback, &up);
if (errors)
{
string errorStr = errors;
BNFreeString(errors);
throw UpdateException(errorStr);
}
return result;
}
BNUpdateResult UpdateChannel::UpdateToLatestVersion()
{
return UpdateToLatestVersion([](uint64_t, uint64_t) { return true; });
}
BNUpdateResult UpdateChannel::UpdateToLatestVersion(const function& progress)
{
UpdateProgress up;
up.func = progress;
char* errors;
BNUpdateResult result = BNUpdateToLatestVersion(name.c_str(), &errors, UpdateProgress::UpdateCallback, &up);
if (errors)
{
string errorStr = errors;
BNFreeString(errors);
throw UpdateException(errorStr);
}
return result;
}
vector UpdateVersion::GetChannelVersions(const string& channel)
{
size_t count;
char* errors;
BNUpdateVersion* versions = BNGetUpdateChannelVersions(channel.c_str(), &count, &errors);
if (errors)
{
string errorStr = errors;
BNFreeString(errors);
throw UpdateException(errorStr);
}
vector result;
result.reserve(count);
for (size_t i = 0; i < count; i++)
{
UpdateVersion version;
version.version = versions[i].version;
version.notes = versions[i].notes;
version.time = (time_t)versions[i].time;
result.push_back(version);
}
BNFreeUpdateChannelVersionList(versions, count);
return result;
}
bool BinaryNinja::AreAutoUpdatesEnabled()
{
return BNAreAutoUpdatesEnabled();
}
void BinaryNinja::SetAutoUpdatesEnabled(bool enabled)
{
BNSetAutoUpdatesEnabled(enabled);
}
uint64_t BinaryNinja::GetTimeSinceLastUpdateCheck()
{
return BNGetTimeSinceLastUpdateCheck();
}
void BinaryNinja::UpdatesChecked()
{
BNUpdatesChecked();
}
string BinaryNinja::GetActiveUpdateChannel()
{
char* channel = BNGetActiveUpdateChannel();
string result = channel;
BNFreeString(channel);
return result;
}
void BinaryNinja::SetActiveUpdateChannel(const string& channel)
{
BNSetActiveUpdateChannel(channel.c_str());
}