#include "binaryninjaapi.h" #include "json/json.h" #include using namespace BinaryNinja; using namespace std; Settings::Settings(BNSettings* settings) { m_object = BNNewSettingsReference(settings); } Settings::Settings(const std::string& instanceId) : m_instanceId(instanceId) { m_object = BNCreateSettings(m_instanceId.c_str()); } Ref Settings::Instance(const std::string& instanceId) { static Ref defaultInstance = new Settings("default"); if (!instanceId.size() || (instanceId == "default")) return defaultInstance; else return new Settings(instanceId); } void Settings::SetResourceId(const string& resourceId) { return BNSettingsSetResourceId(m_object, resourceId.c_str()); } bool Settings::RegisterGroup(const string& group, const string& title) { return BNSettingsRegisterGroup(m_object, group.c_str(), title.c_str()); } bool Settings::RegisterSetting(const string& key, const string& properties) { return BNSettingsRegisterSetting(m_object, key.c_str(), properties.c_str()); } bool Settings::Contains(const string& key) { return BNSettingsContains(m_object, key.c_str()); } bool Settings::IsEmpty() { return BNSettingsIsEmpty(m_object); } vector Settings::Keys() { size_t size = 0; char** outBuffer = (char**)BNSettingsKeysList(m_object, &size); vector result; result.reserve(size); for (size_t i = 0; i < size; i++) result.emplace_back(outBuffer[i]); BNFreeStringList(outBuffer, size); return result; } template<> vector Settings::QueryProperty>(const string& key, const string& property) { size_t size = 0; char** outBuffer = (char**)BNSettingsQueryPropertyStringList(m_object, key.c_str(), property.c_str(), &size); vector result; result.reserve(size); for (size_t i = 0; i < size; i++) result.emplace_back(outBuffer[i]); BNFreeStringList(outBuffer, size); return result; } bool Settings::UpdateProperty(const std::string& key, const std::string& property) { return BNSettingsUpdateProperty(m_object, key.c_str(), property.c_str()); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, bool value) { return BNSettingsUpdateBoolProperty(m_object, key.c_str(), property.c_str(), value); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, double value) { return BNSettingsUpdateDoubleProperty(m_object, key.c_str(), property.c_str(), value); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, int value) { return BNSettingsUpdateInt64Property(m_object, key.c_str(), property.c_str(), value); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, int64_t value) { return BNSettingsUpdateInt64Property(m_object, key.c_str(), property.c_str(), value); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, uint64_t value) { return BNSettingsUpdateUInt64Property(m_object, key.c_str(), property.c_str(), value); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, const char* value) { return BNSettingsUpdateStringProperty(m_object, key.c_str(), property.c_str(), value); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, const std::string& value) { return BNSettingsUpdateStringProperty(m_object, key.c_str(), property.c_str(), value.c_str()); } bool Settings::UpdateProperty(const std::string& key, const std::string& property, const std::vector<:string>& value) { char** buffer = new char*[value.size()]; if (!buffer) return false; for (size_t i = 0; i < value.size(); i++) buffer[i] = BNAllocString(value[i].c_str()); bool result = BNSettingsUpdateStringListProperty(m_object, key.c_str(), property.c_str(), (const char**)buffer, value.size()); BNFreeStringList(buffer, value.size()); return result; } bool Settings::DeserializeSchema(const string& schema, BNSettingsScope scope, bool merge) { return BNSettingsDeserializeSchema(m_object, schema.c_str(), scope, merge); } string Settings::SerializeSchema() { char* schemaStr = BNSettingsSerializeSchema(m_object); string schema(schemaStr); BNFreeString(schemaStr); return schema; } bool Settings::DeserializeSettings(const string& contents, Ref view, BNSettingsScope scope) { return BNDeserializeSettings(m_object, contents.c_str(), view ? view->GetObject() : nullptr, scope); } string Settings::SerializeSettings(Ref view, BNSettingsScope scope) { char* settingsStr = BNSerializeSettings(m_object, view ? view->GetObject() : nullptr, scope); string settings(settingsStr); BNFreeString(settingsStr); return settings; } bool Settings::Reset(const string& key, Ref view, BNSettingsScope scope) { return BNSettingsReset(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); } bool Settings::ResetAll(Ref view, BNSettingsScope scope, bool schemaOnly) { return BNSettingsResetAll(m_object, view ? view->GetObject() : nullptr, scope, schemaOnly); } template<> bool Settings::Get(const string& key, Ref view, BNSettingsScope* scope) { return BNSettingsGetBool(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); } template<> double Settings::Get(const string& key, Ref view, BNSettingsScope* scope) { return BNSettingsGetDouble(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); } template<> int64_t Settings::Get(const string& key, Ref view, BNSettingsScope* scope) { return BNSettingsGetInt64(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); } template<> uint64_t Settings::Get(const string& key, Ref view, BNSettingsScope* scope) { return BNSettingsGetUInt64(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); } template<> string Settings::Get(const string& key, Ref view, BNSettingsScope* scope) { char* tmpStr = BNSettingsGetString(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); string result(tmpStr); BNFreeString(tmpStr); return result; } template<> vector Settings::Get>(const string& key, Ref view, BNSettingsScope* scope) { size_t size = 0; char** outBuffer = (char**)BNSettingsGetStringList(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope, &size); vector result; result.reserve(size); for (size_t i = 0; i < size; i++) result.emplace_back(outBuffer[i]); BNFreeStringList(outBuffer, size); return result; } string Settings::GetJson(const string& key, Ref view, BNSettingsScope* scope) { char* tmpStr = BNSettingsGetJson(m_object, key.c_str(), view ? view->GetObject() : nullptr, scope); string result(tmpStr); BNFreeString(tmpStr); return result; } bool Settings::Set(const string& key, bool value, Ref view, BNSettingsScope scope) { return BNSettingsSetBool(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value); } bool Settings::Set(const string& key, double value, Ref view, BNSettingsScope scope) { return BNSettingsSetDouble(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value); } bool Settings::Set(const string& key, int value, Ref view, BNSettingsScope scope) { return BNSettingsSetInt64(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value); } bool Settings::Set(const string& key, int64_t value, Ref view, BNSettingsScope scope) { return BNSettingsSetInt64(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value); } bool Settings::Set(const string& key, uint64_t value, Ref view, BNSettingsScope scope) { return BNSettingsSetUInt64(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value); } bool Settings::Set(const string& key, const char* value, Ref view, BNSettingsScope scope) { return BNSettingsSetString(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value); } bool Settings::Set(const string& key, const string& value, Ref view, BNSettingsScope scope) { return BNSettingsSetString(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value.c_str()); } bool Settings::Set(const string& key, const vector& value, Ref view, BNSettingsScope scope) { char** buffer = new char*[value.size()]; if (!buffer) return false; for (size_t i = 0; i < value.size(); i++) buffer[i] = BNAllocString(value[i].c_str()); bool result = BNSettingsSetStringList(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), (const char**)buffer, value.size()); BNFreeStringList(buffer, value.size()); return result; } bool Settings::SetJson(const string& key, const string& value, Ref view, BNSettingsScope scope) { return BNSettingsSetJson(m_object, view ? view->GetObject() : nullptr, scope, key.c_str(), value.c_str()); }