diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/identity.cpp | 55 | ||||
-rw-r--r-- | src/identity.h | 1 |
2 files changed, 54 insertions, 2 deletions
diff --git a/src/identity.cpp b/src/identity.cpp index 0d35122..9077db2 100644 --- a/src/identity.cpp +++ b/src/identity.cpp @@ -109,12 +109,13 @@ bool Identity::sameAs(const Identity & other) const bool Identity::operator==(const Identity & other) const { - return p->data == other.p->data; + return p->data == other.p->data && + p->updates == other.p->updates; } bool Identity::operator!=(const Identity & other) const { - return p->data != other.p->data; + return !(*this == other); } optional<Ref> Identity::ref() const @@ -124,6 +125,24 @@ optional<Ref> Identity::ref() const return nullopt; } +vector<Ref> Identity::refs() const +{ + vector<Ref> res; + res.reserve(p->data.size()); + for (const auto & idata : p->data) + res.push_back(idata.ref()); + return res; +} + +vector<Ref> Identity::updates() const +{ + vector<Ref> res; + res.reserve(p->updates.size()); + for (const auto & idata : p->updates) + res.push_back(idata.ref()); + return res; +} + Identity::Builder Identity::create(const Storage & st) { return Builder (new Builder::Priv { @@ -143,6 +162,37 @@ Identity::Builder Identity::modify() const }); } +Identity Identity::update(const vector<Stored<Signed<IdentityData>>> & updates) const +{ + vector<Stored<Signed<IdentityData>>> ndata = p->data; + vector<Stored<Signed<IdentityData>>> ownerUpdates = p->updates; + + for (const auto & u : updates) { + vector<Stored<Signed<IdentityData>>> tmp = p->data; + tmp.push_back(u); + + size_t tmp_size = tmp.size(); + filterAncestors(tmp); + + if (tmp.size() < tmp_size) + ndata.push_back(u); + else + ownerUpdates.push_back(u); + } + + filterAncestors(ndata); + filterAncestors(ownerUpdates); + + if (auto p = Priv::validate(ndata)) { + p->updates = move(ownerUpdates); + if (p->owner && !p->updates.empty()) + p->owner = p->owner->update(p->updates); + return Identity(move(p)); + } + + return *this; +} + Identity::Builder::Builder(Priv * p): p(p) {} @@ -263,6 +313,7 @@ shared_ptr<Identity::Priv> Identity::Priv::validate(const vector<Stored<Signed<I auto p = new Priv { .data = sdata, + .updates = {}, .name = {}, .owner = nullopt, .keyMessage = keyMessageItem.value()->keyMessage.value(), diff --git a/src/identity.h b/src/identity.h index e0d2803..4b61c66 100644 --- a/src/identity.h +++ b/src/identity.h @@ -28,6 +28,7 @@ struct IdentityData struct Identity::Priv { vector<Stored<Signed<IdentityData>>> data; + vector<Stored<Signed<IdentityData>>> updates; shared_future<optional<string>> name; optional<Identity> owner; Stored<PublicKey> keyMessage; |