
commit
88315be53a
5 changed files with 181 additions and 0 deletions
@ -0,0 +1,4 @@ |
|||
syntax: glob |
|||
*.o |
|||
*.a |
|||
*.swp |
@ -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; |
|||
} |
|||
}; |
|||
}; |
|||
|
@ -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; |
|||
}; |
|||
}; |
|||
}; |
|||
|
@ -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) |
@ -0,0 +1,2 @@ |
|||
# TARGET=libpEpAdapter.a
|
|||
# PEPENGINE_IN=$(HOME)
|
Loading…
Reference in new issue