Small Uuid class wrapping libuuid.

This will be used to generate the names of sample files,
as well as camera ids.
This commit is contained in:
Scott Lamb 2016-01-12 09:46:21 -08:00
parent 85b7027803
commit 29696688b5
6 changed files with 183 additions and 3 deletions

View File

@ -62,6 +62,7 @@ pkg_check_modules(LIBEVENT REQUIRED libevent)
pkg_check_modules(GLOG REQUIRED libglog) pkg_check_modules(GLOG REQUIRED libglog)
pkg_check_modules(OPENSSL REQUIRED libcrypto) pkg_check_modules(OPENSSL REQUIRED libcrypto)
pkg_check_modules(SQLITE REQUIRED sqlite3) pkg_check_modules(SQLITE REQUIRED sqlite3)
pkg_check_modules(UUID REQUIRED uuid)
# Check if ffmpeg support "stimeout". # Check if ffmpeg support "stimeout".
set(CMAKE_REQUIRED_INCLUDES ${FFMPEG_INCLUDES}) set(CMAKE_REQUIRED_INCLUDES ${FFMPEG_INCLUDES})

View File

@ -76,6 +76,8 @@ from source. It requires several packages to build:
This will be automatically downloaded during the build process, so it's This will be automatically downloaded during the build process, so it's
not necessary to install it beforehand. not necessary to install it beforehand.
* [re2](https://github.com/google/re2), for parsing with regular expressions. * [re2](https://github.com/google/re2), for parsing with regular expressions.
* libuuid from (util-linux)[https://en.wikipedia.org/wiki/Util-linux].
* [SQLite3](https://www.sqlite.org/).
On Ubuntu 15.10 or Raspbian Jessie, the following command will install all On Ubuntu 15.10 or Raspbian Jessie, the following command will install all
pre-requisites (see also the `Build-Depends` field in `debian/control`): pre-requisites (see also the `Build-Depends` field in `debian/control`):
@ -92,6 +94,8 @@ pre-requisites (see also the `Build-Depends` field in `debian/control`):
libgoogle-glog-dev \ libgoogle-glog-dev \
libgoogle-perftools-dev \ libgoogle-perftools-dev \
libre2-dev \ libre2-dev \
libsqlite3-dev \
libuuid-dev \
pkgconf \ pkgconf \
protobuf-compiler protobuf-compiler

2
debian/control vendored
View File

@ -3,7 +3,7 @@ Maintainer: Scott Lamb <slamb@slamb.org>
Section: video Section: video
Priority: optional Priority: optional
Standards-Version: 3.9.6.1 Standards-Version: 3.9.6.1
Build-Depends: debhelper (>= 9), dh-systemd, cmake, libprotobuf-dev, libavcodec-dev, libavformat-dev, libevent-dev, libgflags-dev, libgoogle-glog-dev, libgoogle-perftools-dev, libre2-dev, pkgconf, protobuf-compiler Build-Depends: debhelper (>= 9), dh-systemd, cmake, libprotobuf-dev, libavcodec-dev, libavformat-dev, libevent-dev, libgflags-dev, libgoogle-glog-dev, libgoogle-perftools-dev, libre2-dev, pkgconf, protobuf-compiler, libuuid-dev, libsqlite3-dev
Package: moonfire-nvr Package: moonfire-nvr
Architecture: any Architecture: any

View File

@ -39,7 +39,8 @@ set(MOONFIRE_DEPS
${PROFILER_LIBRARIES} ${PROFILER_LIBRARIES}
${PROTOBUF_LIBRARIES} ${PROTOBUF_LIBRARIES}
${RE2_LIBRARIES} ${RE2_LIBRARIES}
${SQLITE_LIBRARIES}) ${SQLITE_LIBRARIES}
${UUID_LIBRARIES})
set(MOONFIRE_NVR_SRCS set(MOONFIRE_NVR_SRCS
coding.cc coding.cc
@ -54,7 +55,8 @@ set(MOONFIRE_NVR_SRCS
recording.cc recording.cc
sqlite.cc sqlite.cc
string.cc string.cc
time.cc) time.cc
uuid.cc)
add_library(moonfire-nvr-lib ${MOONFIRE_NVR_SRCS} ${PROTO_SRCS} ${PROTO_HDRS}) add_library(moonfire-nvr-lib ${MOONFIRE_NVR_SRCS} ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(moonfire-nvr-lib ${MOONFIRE_DEPS}) target_link_libraries(moonfire-nvr-lib ${MOONFIRE_DEPS})

94
src/uuid.cc Normal file
View File

@ -0,0 +1,94 @@
// This file is part of Moonfire NVR, a security camera network video recorder.
// Copyright (C) 2016 Lamb <slamb@slamb.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// uuid.cc: implementation of uuid.h interface.
#include "uuid.h"
namespace moonfire_nvr {
namespace {
const size_t kTextFormatLength =
sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") - 1;
} // namespace
bool Uuid::ParseText(re2::StringPiece input) {
if (input.size() != kTextFormatLength) {
return false;
}
char tmp[kTextFormatLength + 1];
memcpy(tmp, input.data(), kTextFormatLength);
tmp[kTextFormatLength] = 0;
return uuid_parse(tmp, me_) == 0;
}
bool Uuid::ParseBinary(re2::StringPiece input) {
if (input.size() != sizeof(uuid_t)) {
return false;
}
memcpy(me_, input.data(), sizeof(uuid_t));
return true;
}
std::string Uuid::UnparseText() const {
char tmp[kTextFormatLength + 1];
uuid_unparse_lower(me_, tmp);
return tmp;
}
re2::StringPiece Uuid::binary_view() const {
return re2::StringPiece(reinterpret_cast<const char *>(me_), sizeof(me_));
}
bool Uuid::operator==(const Uuid &other) const {
return uuid_compare(me_, other.me_) == 0;
}
bool Uuid::operator<(const Uuid &other) const {
return uuid_compare(me_, other.me_) < 0;
}
class RealUuidGenerator : public UuidGenerator {
public:
Uuid Generate() final {
Uuid out;
uuid_generate(out.me_);
return out;
}
};
UuidGenerator *GetRealUuidGenerator() {
static RealUuidGenerator *gen = new RealUuidGenerator; // never freed.
return gen;
}
} // namespace moonfire_nvr

79
src/uuid.h Normal file
View File

@ -0,0 +1,79 @@
// This file is part of Moonfire NVR, a security camera network video recorder.
// Copyright (C) 2016 Lamb <slamb@slamb.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// uuid.h: small wrapper around the C UUID library for generating/parsing
// RFC 4122 UUIDs.
#ifndef MOONFIRE_NVR_UUID_H
#define MOONFIRE_NVR_UUID_H
#include <re2/stringpiece.h>
#include <uuid/uuid.h>
namespace moonfire_nvr {
class Uuid {
public:
// Create a null uuid.
Uuid() { uuid_clear(me_); }
// Parse the text UUID. Returns success.
bool ParseText(re2::StringPiece input);
// Parse a binary UUID. In practice any 16-byte string is considered valid.
bool ParseBinary(re2::StringPiece input);
// Return a 36-byte lowercase text representation, such as
// 1b4e28ba-2fa1-11d2-883f-0016d3cca427.
std::string UnparseText() const;
// Return a reference to the 16-byte binary form.
// Invalidated by any change to the Uuid object.
re2::StringPiece binary_view() const;
bool operator==(const Uuid &) const;
bool operator<(const Uuid &) const;
private:
friend class RealUuidGenerator;
uuid_t me_;
};
class UuidGenerator {
public:
virtual ~UuidGenerator() {}
virtual Uuid Generate() = 0;
};
UuidGenerator *GetRealUuidGenerator();
} // namespace moonfire_nvr
#endif // MOONFIRE_NVR_CODING_H