summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2022-12-18 18:56:19 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2022-12-18 21:37:11 +0100
commit86293ff20d9f8625615e855d98249175e8cd5cd3 (patch)
tree7eb1fe3a34ce1d6a24a9338f3dd3008b500fffe0 /include
parent77fc16d21158c6542addcbaaff47b801d3b5f5c7 (diff)
Contact service and contacts using stored set
Diffstat (limited to 'include')
-rw-r--r--include/erebos/contact.h65
-rw-r--r--include/erebos/set.h12
2 files changed, 66 insertions, 11 deletions
diff --git a/include/erebos/contact.h b/include/erebos/contact.h
index e56346a..ef9c3b6 100644
--- a/include/erebos/contact.h
+++ b/include/erebos/contact.h
@@ -2,6 +2,8 @@
#include <erebos/identity.h>
#include <erebos/list.h>
+#include <erebos/pairing.h>
+#include <erebos/set.h>
#include <erebos/state.h>
#include <erebos/storage.h>
@@ -17,31 +19,80 @@ using std::shared_ptr;
using std::string;
using std::vector;
+struct ContactData;
+
class Contact
{
public:
+ Contact(vector<Stored<ContactData>> data);
Contact(const Contact &) = default;
Contact(Contact &&) = default;
Contact & operator=(const Contact &) = default;
Contact & operator=(Contact &&) = default;
- static List<Contact> prepend(const Storage &, Identity, List<Contact>);
-
- Identity identity() const;
- optional<string> name() const;
+ optional<Identity> identity() const;
+ optional<string> customName() const;
+ string name() const;
bool operator==(const Contact &) const;
bool operator!=(const Contact &) const;
- static List<Contact> loadList(const vector<Ref> &);
- vector<Ref> refs() const;
+ vector<Stored<ContactData>> data() const;
private:
struct Priv;
shared_ptr<Priv> p;
Contact(shared_ptr<Priv> p): p(p) {}
+
+ friend class ContactService;
+};
+
+DECLARE_SHARED_TYPE(Set<Contact>)
+
+struct ContactData
+{
+ static ContactData load(const Ref &);
+ Ref store(const Storage &) const;
+
+ vector<Stored<ContactData>> prev;
+ vector<Stored<Signed<IdentityData>>> identity;
+ optional<string> name;
+};
+
+template<> struct Mergeable<Contact>
+{
+ using Component = ContactData;
+ static vector<Stored<ContactData>> components(const Contact & c) { return c.data(); }
+ static Contact merge(vector<Stored<ContactData>> x) { return Contact(move(x)); }
+};
+
+struct ContactAccepted;
+
+class ContactService : public PairingService<ContactAccepted>
+{
+public:
+ ContactService();
+ virtual ~ContactService();
+
+ UUID uuid() const override;
+
+ void serverStarted(const class Server &) override;
+
+ void request(const Peer &);
+
+protected:
+ virtual Stored<ContactAccepted> handlePairingComplete(const Peer &) override;
+ virtual void handlePairingResult(Context &, Stored<ContactAccepted>) override;
+
+ const class Server * server;
};
-DECLARE_SHARED_TYPE(List<Contact>)
+template<class T> class Signed;
+
+struct ContactAccepted
+{
+ static ContactAccepted load(const Ref &);
+ Ref store(const Storage &) const;
+};
}
diff --git a/include/erebos/set.h b/include/erebos/set.h
index f625cb0..539ffa0 100644
--- a/include/erebos/set.h
+++ b/include/erebos/set.h
@@ -17,13 +17,17 @@ protected:
SetBase();
SetBase(const vector<Ref> &);
SetBase(shared_ptr<const Priv>);
-
- shared_ptr<const Priv> add(Storage &, const vector<Ref> &) const;
+
+ shared_ptr<const Priv> add(const Storage &, const vector<Ref> &) const;
vector<vector<Ref>> toList() const;
public:
+ bool operator==(const SetBase &) const;
+ bool operator!=(const SetBase &) const;
+
vector<Digest> digests() const;
+ vector<Ref> store() const;
protected:
shared_ptr<const Priv> p;
@@ -43,7 +47,7 @@ public:
static Set<T> load(const vector<Ref> & refs) { return Set<T>(move(refs)); }
- Set<T> add(Storage &, const T &) const;
+ Set<T> add(const Storage &, const T &) const;
template<class F>
SetView<T> view(F && cmp) const;
@@ -64,7 +68,7 @@ private:
};
template<class T>
-Set<T> Set<T>::add(Storage & st, const T & x) const
+Set<T> Set<T>::add(const Storage & st, const T & x) const
{
return Set<T>(SetBase::add(st, storedRefs(Mergeable<T>::components(x))));
}