KiCad PCB EDA Suite
Loading...
Searching...
No Matches
remote_provider_settings.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
21
22#include <algorithm>
23
24#include <json_conversions.h>
25#include <picosha2.h>
26
27#include <nlohmann/json.hpp>
28
29
30namespace
31{
32wxString normalizeProviderUrl( const wxString& aUrl )
33{
34 wxString normalized = aUrl;
35
36 normalized.Trim( true ).Trim( false );
37
38 if( normalized.EndsWith( wxS( "/" ) ) )
39 normalized.RemoveLast();
40
41 return normalized.Lower();
42}
43} // namespace
44
45
47{
48 return wxS( "${KIPRJMOD}/RemoteLibrary" );
49}
50
51
53{
54 return wxS( "remote" );
55}
56
57
58wxString REMOTE_PROVIDER_SETTINGS::CreateProviderId( const wxString& aMetadataUrl )
59{
60 const std::string normalized = normalizeProviderUrl( aMetadataUrl ).ToStdString();
61 std::string hashHex;
62
63 picosha2::hash256_hex_string( normalized, hashHex );
64
65 return wxString::Format( wxS( "provider-%s" ),
66 wxString::FromUTF8( hashHex.substr( 0, 12 ).c_str() ) );
67}
68
69
78
79
81{
82 auto it = std::find_if( providers.begin(), providers.end(),
83 [&]( const REMOTE_PROVIDER_ENTRY& aEntry )
84 {
85 return aEntry.provider_id == aProviderId;
86 } );
87
88 return it == providers.end() ? nullptr : &(*it);
89}
90
91
93 const wxString& aProviderId ) const
94{
95 return const_cast<REMOTE_PROVIDER_SETTINGS*>( this )->FindProviderById( aProviderId );
96}
97
98
100 const wxString& aMetadataUrl )
101{
102 const wxString normalized = normalizeProviderUrl( aMetadataUrl );
103
104 auto it = std::find_if( providers.begin(), providers.end(),
105 [&]( const REMOTE_PROVIDER_ENTRY& aEntry )
106 {
107 return normalizeProviderUrl( aEntry.metadata_url ) == normalized;
108 } );
109
110 return it == providers.end() ? nullptr : &(*it);
111}
112
113
115 const wxString& aMetadataUrl ) const
116{
117 return const_cast<REMOTE_PROVIDER_SETTINGS*>( this )->FindProviderByMetadataUrl( aMetadataUrl );
118}
119
120
122{
123 if( REMOTE_PROVIDER_ENTRY* existing = FindProviderByMetadataUrl( aMetadataUrl ) )
124 return *existing;
125
126 REMOTE_PROVIDER_ENTRY provider;
127 provider.metadata_url = normalizeProviderUrl( aMetadataUrl );
128 provider.provider_id = CreateProviderId( provider.metadata_url );
129 provider.last_auth_status = wxS( "signed_out" );
130 providers.push_back( provider );
131 return providers.back();
132}
133
134
135void to_json( nlohmann::json& aJson, const REMOTE_PROVIDER_ENTRY& aEntry )
136{
137 aJson = nlohmann::json{
138 { "provider_id", aEntry.provider_id },
139 { "metadata_url", aEntry.metadata_url },
140 { "display_name_override", aEntry.display_name_override },
141 { "last_account_label", aEntry.last_account_label },
142 { "last_auth_status", aEntry.last_auth_status }
143 };
144}
145
146
147void from_json( const nlohmann::json& aJson, REMOTE_PROVIDER_ENTRY& aEntry )
148{
149 aEntry = REMOTE_PROVIDER_ENTRY();
150
151 if( aJson.contains( "provider_id" ) )
152 aEntry.provider_id = aJson.at( "provider_id" ).get<wxString>();
153
154 if( aJson.contains( "metadata_url" ) )
155 aEntry.metadata_url = aJson.at( "metadata_url" ).get<wxString>();
156
157 if( aJson.contains( "display_name_override" ) )
158 aEntry.display_name_override = aJson.at( "display_name_override" ).get<wxString>();
159
160 if( aJson.contains( "last_account_label" ) )
161 aEntry.last_account_label = aJson.at( "last_account_label" ).get<wxString>();
162
163 if( aJson.contains( "last_auth_status" ) )
164 aEntry.last_auth_status = aJson.at( "last_auth_status" ).get<wxString>();
165
166 aEntry.metadata_url = normalizeProviderUrl( aEntry.metadata_url );
167
168 if( aEntry.provider_id.IsEmpty() && !aEntry.metadata_url.IsEmpty() )
170}
171
172
173void to_json( nlohmann::json& aJson, const REMOTE_PROVIDER_SETTINGS& aSettings )
174{
175 aJson = nlohmann::json{
176 { "providers", aSettings.providers },
177 { "last_used_provider_id", aSettings.last_used_provider_id },
178 { "destination_dir", aSettings.destination_dir },
179 { "library_prefix", aSettings.library_prefix },
180 { "add_to_global_table", aSettings.add_to_global_table }
181 };
182}
183
184
185void from_json( const nlohmann::json& aJson, REMOTE_PROVIDER_SETTINGS& aSettings )
186{
187 aSettings.ResetToDefaults();
188
189 if( aJson.contains( "providers" ) )
190 aSettings.providers = aJson.at( "providers" ).get<std::vector<REMOTE_PROVIDER_ENTRY>>();
191
192 if( aJson.contains( "last_used_provider_id" ) )
193 aSettings.last_used_provider_id = aJson.at( "last_used_provider_id" ).get<wxString>();
194
195 if( aJson.contains( "destination_dir" ) )
196 aSettings.destination_dir = aJson.at( "destination_dir" ).get<wxString>();
197
198 if( aJson.contains( "library_prefix" ) )
199 aSettings.library_prefix = aJson.at( "library_prefix" ).get<wxString>();
200
201 if( aJson.contains( "add_to_global_table" ) )
202 aSettings.add_to_global_table = aJson.at( "add_to_global_table" ).get<bool>();
203}
void to_json(nlohmann::json &aJson, const REMOTE_PROVIDER_ENTRY &aEntry)
void from_json(const nlohmann::json &aJson, REMOTE_PROVIDER_ENTRY &aEntry)
wxString provider_id
wxString last_account_label
wxString last_auth_status
wxString display_name_override
wxString metadata_url
std::vector< REMOTE_PROVIDER_ENTRY > providers
REMOTE_PROVIDER_ENTRY * FindProviderById(const wxString &aProviderId)
REMOTE_PROVIDER_ENTRY & UpsertProvider(const wxString &aMetadataUrl)
REMOTE_PROVIDER_ENTRY * FindProviderByMetadataUrl(const wxString &aMetadataUrl)
static wxString CreateProviderId(const wxString &aMetadataUrl)