From 29696688b54df7bfbbb939d3ffd120ff2a0e0682 Mon Sep 17 00:00:00 2001 From: Scott Lamb Date: Tue, 12 Jan 2016 09:46:21 -0800 Subject: [PATCH] Small Uuid class wrapping libuuid. This will be used to generate the names of sample files, as well as camera ids. --- CMakeLists.txt | 1 + README.md | 4 ++ debian/control | 2 +- src/CMakeLists.txt | 6 ++- src/uuid.cc | 94 ++++++++++++++++++++++++++++++++++++++++++++++ src/uuid.h | 79 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 src/uuid.cc create mode 100644 src/uuid.h diff --git a/CMakeLists.txt b/CMakeLists.txt index da90c23..5821061 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ pkg_check_modules(LIBEVENT REQUIRED libevent) pkg_check_modules(GLOG REQUIRED libglog) pkg_check_modules(OPENSSL REQUIRED libcrypto) pkg_check_modules(SQLITE REQUIRED sqlite3) +pkg_check_modules(UUID REQUIRED uuid) # Check if ffmpeg support "stimeout". set(CMAKE_REQUIRED_INCLUDES ${FFMPEG_INCLUDES}) diff --git a/README.md b/README.md index 5bd9ff8..e382612 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,8 @@ from source. It requires several packages to build: This will be automatically downloaded during the build process, so it's not necessary to install it beforehand. * [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 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-perftools-dev \ libre2-dev \ + libsqlite3-dev \ + libuuid-dev \ pkgconf \ protobuf-compiler diff --git a/debian/control b/debian/control index 2a5a81b..06b60e8 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Maintainer: Scott Lamb Section: video Priority: optional 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 Architecture: any diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5ebc8fe..2721ad2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,7 +39,8 @@ set(MOONFIRE_DEPS ${PROFILER_LIBRARIES} ${PROTOBUF_LIBRARIES} ${RE2_LIBRARIES} - ${SQLITE_LIBRARIES}) + ${SQLITE_LIBRARIES} + ${UUID_LIBRARIES}) set(MOONFIRE_NVR_SRCS coding.cc @@ -54,7 +55,8 @@ set(MOONFIRE_NVR_SRCS recording.cc sqlite.cc string.cc - time.cc) + time.cc + uuid.cc) add_library(moonfire-nvr-lib ${MOONFIRE_NVR_SRCS} ${PROTO_SRCS} ${PROTO_HDRS}) target_link_libraries(moonfire-nvr-lib ${MOONFIRE_DEPS}) diff --git a/src/uuid.cc b/src/uuid.cc new file mode 100644 index 0000000..6d07d52 --- /dev/null +++ b/src/uuid.cc @@ -0,0 +1,94 @@ +// This file is part of Moonfire NVR, a security camera network video recorder. +// Copyright (C) 2016 Lamb +// +// 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 . +// +// 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(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 diff --git a/src/uuid.h b/src/uuid.h new file mode 100644 index 0000000..068bac2 --- /dev/null +++ b/src/uuid.h @@ -0,0 +1,79 @@ +// This file is part of Moonfire NVR, a security camera network video recorder. +// Copyright (C) 2016 Lamb +// +// 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 . +// +// 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 +#include + +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