Browse Source

initial version

LPA-1
Volker Birk 4 years ago
commit
88315be53a
5 changed files with 181 additions and 0 deletions
  1. +4
    -0
      .hgignore
  2. +87
    -0
      BlobList.cc
  3. +65
    -0
      BlobList.hh
  4. +23
    -0
      Makefile
  5. +2
    -0
      Makefile.conf

+ 4
- 0
.hgignore View File

@ -0,0 +1,4 @@
syntax: glob
*.o
*.a
*.swp

+ 87
- 0
BlobList.cc View File

@ -0,0 +1,87 @@
#include "BlobList.hh"
namespace pEp {
namespace Common {
BlobList::Iterator& BlobList::Iterator::operator= (const BlobList::Iterator& second)
{
p = second.p;
return *this;
}
const BlobList::Blob& BlobList::Iterator::operator* ()
{
if (!p)
throw out_of_range("BlobList::Iterator points to nowhere");
if (_p != p) {
_b = { p->filename, p->mime_type, p->value, p->size, p->disposition };
_p = p;
}
return _b;
}
BlobList::Iterator& BlobList::Iterator::operator++ ()
{
if (!p)
throw out_of_range("BlobList::Iterator points to nowhere");
p = p->next;
return *this;
}
BlobList::Iterator BlobList::Iterator::operator++ (int)
{
Iterator second = *this;
(*this)++;
return second;
}
BlobList::Iterator BlobList::end()
{
return BlobList::Iterator();
}
BlobList::Iterator BlobList::begin()
{
BlobList::Iterator _begin;
_begin.iterating = this;
_begin.p = this->bl.get();
return _begin;
}
BlobList::BlobList()
: bl(::new_bloblist(nullptr, 0, nullptr, nullptr), &::free_bloblist),
_size(0)
{
if (!bl.get())
throw bad_alloc();
bl->release_value = release_value;
}
BlobList::BlobList(const BlobList& second)
: bl(::bloblist_dup(second.bl.get()), &::free_bloblist),
_size(second._size)
{
if (!bl.get())
throw bad_alloc();
}
BlobList& BlobList::operator= (const BlobList& second)
{
bl = blobdata(::bloblist_dup(second.bl.get()), &::free_bloblist);
return *this;
}
void BlobList::release_value(char *v)
{
delete[] v;
}
void BlobList::push_back(const Blob& val)
{
::bloblist_add(bl.get(), val.blob, val.size, val.mime_type.c_str(), val.filename.c_str());
++_size;
}
};
};

+ 65
- 0
BlobList.hh View File

@ -0,0 +1,65 @@
#pragma once
#include <vector>
#include <string>
#include <iterator>
#include <pEp/bloblist.h>
namespace pEp {
namespace Common {
using namespace std;
class BlobList {
public:
struct Blob {
string filename;
string mime_type;
char *blob = nullptr;
size_t size = 0;
content_disposition_type cd = PEP_CONTENT_DISP_ATTACHMENT;
};
class Iterator : public iterator< forward_iterator_tag, Blob > {
friend class BlobList;
private:
::bloblist_t *p = nullptr;
::bloblist_t *_p = nullptr;
Blob _b;
BlobList *iterating = nullptr;
public:
Iterator() { }
Iterator(const Iterator& second) : p(second.p), iterating(second.iterating) { }
Iterator& operator= (const Iterator& second);
~Iterator() { }
bool operator== (const Iterator& second) const { return p == second.p; }
bool operator!= (const Iterator& second) const { return p != second.p; }
const Blob& operator* ();
operator bloblist_t *() { return p; }
Iterator& operator++ ();
Iterator operator++ (int);
};
Iterator end();
Iterator begin();
BlobList();
BlobList(const BlobList& second);
BlobList& operator= (const BlobList& second);
~BlobList();
void push_back(const Blob& val);
size_t size() const { return _size; }
bool empty() const { return _size == 0; }
private:
static void release_value(char *v);
typedef unique_ptr< ::bloblist_t, decltype(&::free_bloblist) > blobdata;
blobdata bl;
size_t _size;
};
};
};

+ 23
- 0
Makefile View File

@ -0,0 +1,23 @@
include Makefile.conf
-include local.conf
TARGET?=libpEpAdapter.a
PEPENGINE_IN?=$(HOME)
CXXFLAGS += -I$(HOME)/include -std=c++14
SOURCE=$(wildcard *.cc)
OBJECTS=$(subst .cc,.o,$(SOURCE))
all: $(TARGET)
%.o: %.cc %.hh
$(CXX) $(CXXFLAGS) -c $<
$(TARGET): $(OBJECTS)
ar -rc $@ $^
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJECTS)

+ 2
- 0
Makefile.conf View File

@ -0,0 +1,2 @@
# TARGET=libpEpAdapter.a
# PEPENGINE_IN=$(HOME)

Loading…
Cancel
Save