Compare commits
194
Commits
ndn-cxx-0.6.3
...
qsccp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58b423fe00 | ||
|
|
e72ce81d2b | ||
|
|
bdfb53aa09 | ||
|
|
287a7faad9 | ||
|
|
fa33f8d532 | ||
|
|
1caa634dca | ||
|
|
e36aae1eb8 | ||
|
|
670a52f2a3 | ||
|
|
97ee811129 | ||
|
|
599623c303 | ||
|
|
483087f56d | ||
|
|
81bd696ed9 | ||
|
|
17d7c47ca9 | ||
|
|
933a567c8a | ||
|
|
f2c4c53208 | ||
|
|
6b2cb79748 | ||
|
|
b74bbdab84 | ||
|
|
6d024bad65 | ||
|
|
8afba42296 | ||
|
|
2ca5e79633 | ||
|
|
905d40fad9 | ||
|
|
355fd789c8 | ||
|
|
75c3af824a | ||
|
|
46cdf909a5 | ||
|
|
9d1089aa29 | ||
|
|
6e262f0f1e | ||
|
|
09236c2b8d | ||
|
|
f601e1988b | ||
|
|
ab9d7ed25a | ||
|
|
3de8aac22d | ||
|
|
f165bb4e77 | ||
|
|
78ffc635cc | ||
|
|
14c56cd8bd | ||
|
|
bc2e78e074 | ||
|
|
a3c8bd1772 | ||
|
|
40ebaad603 | ||
|
|
3ad8923060 | ||
|
|
25d4f1c95e | ||
|
|
71c622bb68 | ||
|
|
394977c2f2 | ||
|
|
fbb6990abc | ||
|
|
702467b816 | ||
|
|
4c68b6e62c | ||
|
|
78338c5ee8 | ||
|
|
9603325ba6 | ||
|
|
ab7300b747 | ||
|
|
52a803cb9d | ||
|
|
2349e28c6d | ||
|
|
d776a93c9c | ||
|
|
ce9c1952ff | ||
|
|
53533947d1 | ||
|
|
97242f78e9 | ||
|
|
bc17d950e0 | ||
|
|
d247d49469 | ||
|
|
8d6d10ae53 | ||
|
|
9c8f00e3fb | ||
|
|
3b9a2c8b74 | ||
|
|
cf8ffd495a | ||
|
|
a39c0b5c48 | ||
|
|
21a4ea5ad7 | ||
|
|
813ae5831b | ||
|
|
7c67ab5938 | ||
|
|
39cb402377 | ||
|
|
39570d9313 | ||
|
|
009062db2e | ||
|
|
a421c80b10 | ||
|
|
0a6456cbe7 | ||
|
|
4fb35d8a35 | ||
|
|
12cef87c0c | ||
|
|
bc997e5ddd | ||
|
|
73940c93a6 | ||
|
|
56a812d633 | ||
|
|
e6e125ea1b | ||
|
|
5e494c0c3b | ||
|
|
cb672523a5 | ||
|
|
835f027df8 | ||
|
|
28a5bf107b | ||
|
|
75c56016a9 | ||
|
|
2fdb274627 | ||
|
|
0e0b389c80 | ||
|
|
ef654dd3ba | ||
|
|
140e9cbc62 | ||
|
|
869b11e5c5 | ||
|
|
4c5b7b88d6 | ||
|
|
92dbb008fe | ||
|
|
6c6e3854be | ||
|
|
b3f78b5db8 | ||
|
|
43eac58ed6 | ||
|
|
5149350bb4 | ||
|
|
7b2f58c9df | ||
|
|
fe407f2ddc | ||
|
|
65f697f5e8 | ||
|
|
2b0cc7bf01 | ||
|
|
720e25c294 | ||
|
|
adc9aa230c | ||
|
|
576b4ff50e | ||
|
|
ecfb391e20 | ||
|
|
700e12a0b8 | ||
|
|
9a04ddacb9 | ||
|
|
cf0baa2375 | ||
|
|
8b0344d4bc | ||
|
|
57a3276d44 | ||
|
|
c81637150c | ||
|
|
1bac111c3c | ||
|
|
ccce0bc969 | ||
|
|
3243c3dad3 | ||
|
|
48f97244b8 | ||
|
|
4ad933a757 | ||
|
|
77d9e815c5 | ||
|
|
0fe72eacc6 | ||
|
|
2ad2fbeb20 | ||
|
|
3510d299ba | ||
|
|
e37ec7ded4 | ||
|
|
530c10f523 | ||
|
|
5223ea82f5 | ||
|
|
c9650e4cb5 | ||
|
|
2ec13ebc10 | ||
|
|
fcdc873185 | ||
|
|
f1bb38d3aa | ||
|
|
0d748af32f | ||
|
|
0c31537e48 | ||
|
|
6b33040eae | ||
|
|
599ee3f242 | ||
|
|
78e3549c16 | ||
|
|
b310efbdaa | ||
|
|
fa995ac3d3 | ||
|
|
3891244ec3 | ||
|
|
9c19a3900b | ||
|
|
4bb06bcedf | ||
|
|
46b04a5f84 | ||
|
|
e7b90e5575 | ||
|
|
5437aa2375 | ||
|
|
1660d00046 | ||
|
|
a5f233e103 | ||
|
|
fd6123173d | ||
|
|
4fc9080417 | ||
|
|
fc27d3b659 | ||
|
|
77f1c7665e | ||
|
|
e209961817 | ||
|
|
923ba4415f | ||
|
|
fccb2dc91c | ||
|
|
4fdcb274a3 | ||
|
|
da9761f8e6 | ||
|
|
fd674016ab | ||
|
|
8fdae8909d | ||
|
|
d0fef21ce5 | ||
|
|
5c803b9b28 | ||
|
|
459a653226 | ||
|
|
b72360faee | ||
|
|
80609d44c3 | ||
|
|
7c5bc1e218 | ||
|
|
07115cc106 | ||
|
|
4e0cc6cf21 | ||
|
|
322e76e7ed | ||
|
|
6b99b6f185 | ||
|
|
ca48851110 | ||
|
|
c53df03ff3 | ||
|
|
60aaef0622 | ||
|
|
8db6152556 | ||
|
|
ec475a7da5 | ||
|
|
c554551d96 | ||
|
|
bfe3139ede | ||
|
|
22f7bc3006 | ||
|
|
64ae55d781 | ||
|
|
534b841bc0 | ||
|
|
ebe156c92f | ||
|
|
19b87de693 | ||
|
|
70d76eb4da | ||
|
|
1d23ff9277 | ||
|
|
1e36ceb0ff | ||
|
|
d1fc9a7104 | ||
|
|
24c5a00073 | ||
|
|
2c1d349bdb | ||
|
|
7e78064871 | ||
|
|
cf8a3684c2 | ||
|
|
946a51cc0e | ||
|
|
74daf741cd | ||
|
|
1944281719 | ||
|
|
3e3a989096 | ||
|
|
1bbce6df87 | ||
|
|
17b61b4101 | ||
|
|
8dfd91367f | ||
|
|
511712d863 | ||
|
|
dca56eacba | ||
|
|
679dbb006f | ||
|
|
241df42555 | ||
|
|
8b753a2e54 | ||
|
|
7b1124674a | ||
|
|
f714d1b520 | ||
|
|
ee77ca017a | ||
|
|
3e39a4d6a3 | ||
|
|
13fffa38f5 | ||
|
|
279f366d3f | ||
|
|
2cb33fa5ed |
No files matched your search
+1
-1
@@ -26,4 +26,4 @@ __pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# Other
|
||||
/VERSION
|
||||
/VERSION.info
|
||||
@@ -1,10 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
source .jenkins.d/util.sh
|
||||
|
||||
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
export CACHE_DIR=${CACHE_DIR:-/tmp}
|
||||
export WAF_JOBS=${WAF_JOBS:-1}
|
||||
[[ $JOB_NAME == *"code-coverage" ]] && export DISABLE_ASAN=yes
|
||||
|
||||
for file in "$DIR"/.jenkins.d/*; do
|
||||
nanos() {
|
||||
# Cannot use date(1) because macOS does not support %N format specifier
|
||||
python3 -c 'import time; print(int(time.time() * 1e9))'
|
||||
}
|
||||
|
||||
for file in .jenkins.d/*; do
|
||||
[[ -f $file && -x $file ]] || continue
|
||||
echo "Run: $file"
|
||||
|
||||
if [[ -n $TRAVIS ]]; then
|
||||
label=$(basename "$file" | sed -E 's/[[:digit:]]+-(.*)\..*/\1/')
|
||||
echo -ne "travis_fold:start:${label}\r"
|
||||
echo -ne "travis_time:start:${label}\r"
|
||||
start=$(nanos)
|
||||
fi
|
||||
|
||||
echo "\$ $file"
|
||||
"$file"
|
||||
|
||||
if [[ -n $TRAVIS ]]; then
|
||||
finish=$(nanos)
|
||||
echo -ne "travis_time:end:${label}:start=${start},finish=${finish},duration=$((finish-start)),event=${label}\r"
|
||||
echo -ne "travis_fold:end:${label}\r"
|
||||
fi
|
||||
done
|
||||
+20
-37
@@ -1,55 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
|
||||
set -x
|
||||
set -ex
|
||||
|
||||
if has OSX $NODE_LABELS; then
|
||||
FORMULAE=(boost pkg-config)
|
||||
if [[ -n $USE_OPENSSL_1_1 ]]; then
|
||||
FORMULAE+=(openssl@1.1)
|
||||
else
|
||||
FORMULAE+=(openssl)
|
||||
FORMULAE=(boost openssl pkg-config)
|
||||
if has OSX-10.13 $NODE_LABELS || has OSX-10.14 $NODE_LABELS; then
|
||||
FORMULAE+=(python)
|
||||
fi
|
||||
|
||||
brew update
|
||||
if [[ -n $TRAVIS ]]; then
|
||||
# travis images come with a large number of brew packages
|
||||
# pre-installed, don't waste time upgrading all of them
|
||||
# Travis images come with a large number of pre-installed
|
||||
# brew packages, don't waste time upgrading all of them
|
||||
brew list --versions "${FORMULAE[@]}" || brew update
|
||||
for FORMULA in "${FORMULAE[@]}"; do
|
||||
brew outdated $FORMULA || brew upgrade $FORMULA
|
||||
brew list --versions "$FORMULA" || brew install "$FORMULA"
|
||||
done
|
||||
# Ensure /usr/local/opt/openssl exists
|
||||
brew reinstall openssl
|
||||
else
|
||||
brew update
|
||||
brew upgrade
|
||||
brew install "${FORMULAE[@]}"
|
||||
brew cleanup
|
||||
fi
|
||||
brew install "${FORMULAE[@]}"
|
||||
brew cleanup
|
||||
fi
|
||||
|
||||
if has Ubuntu $NODE_LABELS; then
|
||||
elif has Ubuntu $NODE_LABELS; then
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qy install build-essential pkg-config libboost-all-dev \
|
||||
libsqlite3-dev libssl-dev
|
||||
sudo apt-get -qy install g++ pkg-config python3-minimal \
|
||||
libboost-all-dev libssl-dev libsqlite3-dev
|
||||
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
sudo apt-get -qy install lcov libgd-perl python-setuptools
|
||||
sudo easy_install --upgrade gcovr
|
||||
sudo apt-get -qy install gcovr lcov
|
||||
fi
|
||||
fi
|
||||
|
||||
if has CentOS $NODE_LABELS; then
|
||||
sudo yum -y install yum-utils pkgconfig \
|
||||
openssl-devel libtranslit-icu \
|
||||
python-devel sqlite-devel \
|
||||
devtoolset-7-libasan-devel \
|
||||
devtoolset-7-liblsan-devel
|
||||
sudo yum -y groupinstall 'Development Tools'
|
||||
|
||||
svn checkout https://github.com/cmscaltech/sandie-ndn/trunk/packaging/RPMS/x86_64
|
||||
sudo rpm -U --force x86_64/boost-license*
|
||||
sudo rpm -U --force x86_64/boost-doc-html*
|
||||
sudo rpm -U --force x86_64/libboost*
|
||||
sudo rpm -U --force x86_64/boost-devel*
|
||||
elif has CentOS-8 $NODE_LABELS; then
|
||||
sudo dnf -y install gcc-c++ libasan pkgconf-pkg-config python3 \
|
||||
boost-devel openssl-devel sqlite-devel
|
||||
fi
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
set -ex
|
||||
|
||||
sudo rm -f /usr/local/bin/ndnsec*
|
||||
sudo rm -fr /usr/local/include/ndn-cxx
|
||||
sudo rm -f /usr/local/lib{,64}/libndn-cxx*
|
||||
sudo rm -f /usr/local/lib{,64}/pkgconfig/libndn-cxx.pc
|
||||
+27
-35
@@ -1,56 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
set -ex
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
git submodule sync
|
||||
git submodule update --init
|
||||
|
||||
set -x
|
||||
|
||||
sudo rm -f /usr/local/bin/ndnsec*
|
||||
sudo rm -fr /usr/local/include/ndn-cxx
|
||||
sudo rm -f /usr/local/lib{,64}/libndn-cxx*
|
||||
sudo rm -f /usr/local/lib{,64}/pkgconfig/libndn-cxx.pc
|
||||
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
COVERAGE="--with-coverage"
|
||||
elif [[ -z $DISABLE_ASAN ]]; then
|
||||
if [[ -z $DISABLE_ASAN ]]; then
|
||||
ASAN="--with-sanitizer=address"
|
||||
fi
|
||||
if [[ -n $USE_OPENSSL_1_1 ]] && has OSX $NODE_LABELS; then
|
||||
OPENSSL="--with-openssl=/usr/local/opt/openssl@1.1"
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
COVERAGE="--with-coverage"
|
||||
fi
|
||||
if has CentOS-8 $NODE_LABELS; then
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1721553
|
||||
PCH="--without-pch"
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
sudo_preserve_env PATH -- ./waf --color=yes distclean
|
||||
|
||||
if [[ $JOB_NAME != *"code-coverage" && $JOB_NAME != *"limited-build" ]]; then
|
||||
# Configure/build static library in optimized mode with tests
|
||||
./waf --color=yes configure --enable-static --disable-shared --with-tests $OPENSSL
|
||||
./waf --color=yes build -j${WAF_JOBS:-1}
|
||||
# Build static library in release mode with tests and without precompiled headers
|
||||
./waf --color=yes configure --enable-static --disable-shared --with-tests --without-pch
|
||||
./waf --color=yes build -j$WAF_JOBS
|
||||
|
||||
# Cleanup
|
||||
sudo_preserve_env PATH -- ./waf --color=yes distclean
|
||||
# Cleanup
|
||||
./waf --color=yes distclean
|
||||
|
||||
# Configure/build static and shared library in optimized mode without tests
|
||||
./waf --color=yes configure --enable-static --enable-shared $OPENSSL
|
||||
./waf --color=yes build -j${WAF_JOBS:-1}
|
||||
# Build static and shared library in release mode without tests
|
||||
./waf --color=yes configure --enable-static --enable-shared $PCH
|
||||
./waf --color=yes build -j$WAF_JOBS
|
||||
|
||||
# Cleanup
|
||||
sudo_preserve_env PATH -- ./waf --color=yes distclean
|
||||
# Cleanup
|
||||
./waf --color=yes distclean
|
||||
fi
|
||||
|
||||
# Configure/build shared library in debug mode with tests/examples and without precompiled headers
|
||||
./waf --color=yes configure --disable-static --enable-shared --debug --with-tests \
|
||||
--with-examples --without-pch $ASAN $COVERAGE $OPENSSL
|
||||
./waf --color=yes build -j${WAF_JOBS:-1}
|
||||
# Build shared library in debug mode with tests and examples
|
||||
./waf --color=yes configure --disable-static --enable-shared --debug --with-tests --with-examples $ASAN $COVERAGE $PCH
|
||||
./waf --color=yes build -j$WAF_JOBS
|
||||
|
||||
# (tests will be run against debug version)
|
||||
# (tests will be run against the debug version)
|
||||
|
||||
# Install
|
||||
sudo_preserve_env PATH -- ./waf --color=yes install
|
||||
|
||||
if has CentOS-8 $NODE_LABELS; then
|
||||
sudo tee /etc/ld.so.conf.d/ndn.conf >/dev/null <<< /usr/local/lib64
|
||||
fi
|
||||
if has Linux $NODE_LABELS; then
|
||||
sudo ldconfig
|
||||
elif has FreeBSD $NODE_LABELS; then
|
||||
sudo ldconfig -a
|
||||
fi
|
||||
+11
-29
@@ -1,13 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
|
||||
set -x
|
||||
set -ex
|
||||
|
||||
# Prepare environment
|
||||
rm -Rf ~/.ndn
|
||||
rm -rf ~/.ndn
|
||||
|
||||
if has OSX $NODE_LABELS; then
|
||||
security unlock-keychain -p named-data
|
||||
@@ -15,33 +10,20 @@ fi
|
||||
|
||||
ndnsec-keygen "/tmp/jenkins/$NODE_NAME" | ndnsec-install-cert -
|
||||
|
||||
BOOST_VERSION=$(python -c "import sys; sys.path.append('build/c4che'); import _cache; print(_cache.BOOST_VERSION_NUMBER);")
|
||||
|
||||
ut_log_args() {
|
||||
if (( BOOST_VERSION >= 106200 )); then
|
||||
echo --logger=HRF,test_suite,stdout:XML,all,build/xunit-${1:-report}.xml
|
||||
else
|
||||
if [[ -n $XUNIT ]]; then
|
||||
echo --log_level=all $( (( BOOST_VERSION >= 106000 )) && echo -- ) \
|
||||
--log_format2=XML --log_sink2=build/xunit-${1:-report}.xml
|
||||
else
|
||||
echo --log_level=test_suite
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
|
||||
ASAN_OPTIONS="color=always"
|
||||
ASAN_OPTIONS+=":detect_stack_use_after_return=true"
|
||||
ASAN_OPTIONS+=":check_initialization_order=true"
|
||||
ASAN_OPTIONS+=":strict_init_order=true"
|
||||
ASAN_OPTIONS+=":detect_invalid_pointer_pairs=1"
|
||||
ASAN_OPTIONS+=":detect_container_overflow=false"
|
||||
ASAN_OPTIONS+=":strict_string_checks=true"
|
||||
ASAN_OPTIONS+=":check_initialization_order=1"
|
||||
ASAN_OPTIONS+=":detect_stack_use_after_return=1"
|
||||
ASAN_OPTIONS+=":strict_init_order=1"
|
||||
ASAN_OPTIONS+=":strict_string_checks=1"
|
||||
ASAN_OPTIONS+=":detect_invalid_pointer_pairs=2"
|
||||
ASAN_OPTIONS+=":strip_path_prefix=${PWD}/"
|
||||
export ASAN_OPTIONS
|
||||
|
||||
export BOOST_TEST_BUILD_INFO=1
|
||||
export BOOST_TEST_COLOR_OUTPUT=1
|
||||
export BOOST_TEST_DETECT_MEMORY_LEAK=0
|
||||
export BOOST_TEST_LOGGER=HRF,test_suite,stdout:XML,all,build/xunit-log.xml
|
||||
|
||||
# Run unit tests
|
||||
./build/unit-tests $(ut_log_args)
|
||||
./build/unit-tests
|
||||
@@ -1,15 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
|
||||
set -x
|
||||
set -ex
|
||||
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
gcovr --object-directory=build \
|
||||
--output=build/coverage.xml \
|
||||
--filter="$PWD/src" \
|
||||
--exclude="$PWD/(examples|tests)" \
|
||||
--root=. \
|
||||
--xml
|
||||
|
||||
@@ -28,7 +23,6 @@ if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
|
||||
genhtml --branch-coverage \
|
||||
--demangle-cpp \
|
||||
--frames \
|
||||
--legend \
|
||||
--output-directory build/coverage \
|
||||
--title "ndn-cxx unit tests" \
|
||||
|
||||
@@ -5,9 +5,18 @@
|
||||
# It's intentional not to use `set -e`, because this script wants to check all headers
|
||||
# (similar to running all test cases), instead of failing at the first error.
|
||||
|
||||
if [[ -n $DISABLE_HEADERS_CHECK ]]; then
|
||||
echo 'Skipping headers check.'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if has CentOS-8 $NODE_LABELS; then
|
||||
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
|
||||
fi
|
||||
|
||||
CXX=${CXX:-g++}
|
||||
STD=-std=c++14
|
||||
CXXFLAGS="-O2 -Wall -Wno-unused-const-variable -Wno-unused-local-typedef $(pkg-config --cflags libndn-cxx)"
|
||||
CXXFLAGS="-O2 -Wall -Wno-unneeded-internal-declaration -Wno-unused-const-variable $(pkg-config --cflags libndn-cxx)"
|
||||
INCLUDEDIR="$(pkg-config --variable=includedir libndn-cxx)"/ndn-cxx
|
||||
|
||||
echo "Using: $CXX $STD $CXXFLAGS"
|
||||
@@ -15,14 +24,14 @@ echo "Using: $CXX $STD $CXXFLAGS"
|
||||
NCHECKED=0
|
||||
NERRORS=0
|
||||
while IFS= read -r -d '' H; do
|
||||
echo "Verifying standalone header compilation for ${H#${INCLUDEDIR}/}"
|
||||
echo "Checking header ${H#${INCLUDEDIR}/}"
|
||||
"$CXX" -xc++ $STD $CXXFLAGS -c -o /dev/null "$H"
|
||||
[[ $? -eq 0 ]] || ((NERRORS++))
|
||||
((NCHECKED++))
|
||||
done < <(find "$INCLUDEDIR" -name '*.hpp' -type f -print0 2>/dev/null)
|
||||
|
||||
if [[ $NCHECKED -eq 0 ]]; then
|
||||
echo 'No header found. Is ndn-cxx installed?'
|
||||
echo 'No headers found. Is ndn-cxx installed?'
|
||||
exit 1
|
||||
else
|
||||
echo "$NCHECKED headers checked."
|
||||
+17
-22
@@ -1,33 +1,28 @@
|
||||
CONTINUOUS INTEGRATION SCRIPTS
|
||||
==============================
|
||||
# CONTINUOUS INTEGRATION SCRIPTS
|
||||
|
||||
Environment Variables Used in Build Scripts
|
||||
-------------------------------------------
|
||||
## Environment Variables Used in Build Scripts
|
||||
|
||||
- `NODE_LABELS`: the variable defines a list of OS properties. The set values are used by the
|
||||
build scripts to select proper behavior for different OS.
|
||||
- `NODE_LABELS`: space-separated list of platform properties. The included values are used by
|
||||
the build scripts to select the proper behavior for different operating systems and versions.
|
||||
|
||||
The list should include at least `[OS_TYPE]`, `[DISTRO_TYPE]`, and `[DISTRO_VERSION]`.
|
||||
The list should normally contain `[OS_TYPE]`, `[DISTRO_TYPE]`, and `[DISTRO_VERSION]`.
|
||||
|
||||
Possible values for Linux:
|
||||
Example values:
|
||||
|
||||
* `[OS_TYPE]`: `Linux`
|
||||
* `[DISTRO_TYPE]`: `Ubuntu`
|
||||
* `[DISTRO_VERSION]`: `Ubuntu-16.04`, `Ubuntu-18.04`
|
||||
- `[OS_TYPE]`: `Linux`, `OSX`
|
||||
- `[DISTRO_TYPE]`: `Ubuntu`, `CentOS`
|
||||
- `[DISTRO_VERSION]`: `Ubuntu-16.04`, `Ubuntu-18.04`, `CentOS-8`, `OSX-10.14`, `OSX-10.15`
|
||||
|
||||
Possible values for OS X / macOS:
|
||||
|
||||
* `[OS_TYPE]`: `OSX`
|
||||
* `[DISTRO_TYPE]`: `OSX` (can be absent)
|
||||
* `[DISTRO_VERSION]`: `OSX-10.11`, `OSX-10.12`, `OSX-10.13`
|
||||
|
||||
- `JOB_NAME`: optional variable to define type of the job. Depending on the defined job type,
|
||||
- `JOB_NAME`: optional variable that defines the type of build job. Depending on the job type,
|
||||
the build scripts can perform different tasks.
|
||||
|
||||
Possible values:
|
||||
|
||||
* empty: default build process
|
||||
* `code-coverage` (Linux OS is assumed): debug build with tests and code coverage analysis
|
||||
* `limited-build`: only a single debug build with tests
|
||||
- empty: default build task
|
||||
- `code-coverage`: debug build with tests and code coverage analysis (Ubuntu Linux is assumed)
|
||||
- `limited-build`: only a single debug build with tests
|
||||
|
||||
- `WAF_JOBS`: number of parallel build jobs used by waf, defaults to 1.
|
||||
- `CACHE_DIR`: directory containing cached files from previous builds, e.g., a compiled version
|
||||
of ndn-cxx. If not set, `/tmp` is used.
|
||||
|
||||
- `WAF_JOBS`: number of parallel build threads used by waf, defaults to 1.
|
||||
@@ -16,6 +16,7 @@ has() {
|
||||
set ${saved_xtrace}
|
||||
return ${ret}
|
||||
}
|
||||
export -f has
|
||||
|
||||
sudo_preserve_env() {
|
||||
local saved_xtrace
|
||||
@@ -35,3 +36,4 @@ sudo_preserve_env() {
|
||||
set ${saved_xtrace}
|
||||
sudo env "${vars[@]}" "$@"
|
||||
}
|
||||
export -f sudo_preserve_env
|
||||
@@ -0,0 +1,9 @@
|
||||
<jefft0@remap.ucla.edu> <jefft0@gmail.com>
|
||||
<aa@cs.fiu.edu> <alexander.afanasyev@ucla.edu>
|
||||
<davidepesa@gmail.com> <davide.pesavento@lip6.fr>
|
||||
<enewberry@email.arizona.edu> <enewberry@cs.arizona.edu>
|
||||
Teng Liang <philoliang2011@gmail.com>
|
||||
<lybmath2009@gmail.com> <lybmath@ucla.edu>
|
||||
Hila Ben Abraham <hilata@gmail.com>
|
||||
Laqin Fan <flq12021@gmail.com>
|
||||
Jeremy Clark <jrclark2@memphis.edu>
|
||||
+89
-74
@@ -1,101 +1,116 @@
|
||||
version: ~> 1.0
|
||||
language: cpp
|
||||
dist: xenial
|
||||
sudo: required
|
||||
os: linux
|
||||
dist: bionic
|
||||
|
||||
arch:
|
||||
- amd64
|
||||
- arm64
|
||||
- ppc64le
|
||||
- s390x
|
||||
|
||||
env:
|
||||
global:
|
||||
- JOB_NAME=limited-build
|
||||
- WAF_JOBS=2
|
||||
- COMPILER=g++-7
|
||||
- COMPILER=g++-9
|
||||
- COMPILER=clang++-6.0
|
||||
- COMPILER=clang++-9
|
||||
|
||||
matrix:
|
||||
jobs:
|
||||
include:
|
||||
# Linux/gcc
|
||||
# https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test/+packages
|
||||
- os: linux
|
||||
env: COMPILER=g++-5
|
||||
- os: linux
|
||||
env: COMPILER=g++-6
|
||||
- os: linux
|
||||
env: COMPILER=g++-7
|
||||
- os: linux
|
||||
env: COMPILER=g++-8
|
||||
# Linux
|
||||
- env: COMPILER=g++-5
|
||||
- env: COMPILER=g++-6
|
||||
- env: COMPILER=g++-8
|
||||
- env: COMPILER=clang++-4.0
|
||||
- env: COMPILER=clang++-5.0
|
||||
- env: COMPILER=clang++-7
|
||||
- env: COMPILER=clang++-8
|
||||
- env: COMPILER=clang++-10
|
||||
- env: COMPILER=clang++-11
|
||||
- env: COMPILER=clang++-12
|
||||
|
||||
# Linux/clang
|
||||
# https://apt.llvm.org/
|
||||
- os: linux
|
||||
env: COMPILER=clang++-3.6
|
||||
- os: linux
|
||||
env: COMPILER=clang++-3.7 DISABLE_ASAN=yes
|
||||
- os: linux
|
||||
env: COMPILER=clang++-3.8
|
||||
- os: linux
|
||||
env: COMPILER=clang++-3.9
|
||||
- os: linux
|
||||
env: COMPILER=clang++-4.0
|
||||
- os: linux
|
||||
env: COMPILER=clang++-5.0
|
||||
- os: linux
|
||||
env: COMPILER=clang++-6.0
|
||||
- os: linux
|
||||
env: COMPILER=clang++-7
|
||||
- os: linux
|
||||
env: COMPILER=clang++-8
|
||||
|
||||
# macOS/clang
|
||||
# https://docs.travis-ci.com/user/reference/osx/#OS-X-Version
|
||||
- os: osx
|
||||
osx_image: xcode7.3
|
||||
env: OSX_VERSION=10.11
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
env: OSX_VERSION=10.11
|
||||
- os: osx
|
||||
osx_image: xcode8.3
|
||||
env: OSX_VERSION=10.12
|
||||
- os: osx
|
||||
osx_image: xcode9.2
|
||||
env: OSX_VERSION=10.12
|
||||
# macOS
|
||||
- os: osx
|
||||
osx_image: xcode9.4
|
||||
env: OSX_VERSION=10.13
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode9.4
|
||||
env: OSX_VERSION=10.13 USE_OPENSSL_1_1=yes
|
||||
osx_image: xcode10.1
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode10
|
||||
env: OSX_VERSION=10.13
|
||||
osx_image: xcode10.3
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode11.3
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode11.6
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode12
|
||||
env: # default compiler
|
||||
|
||||
allow_failures:
|
||||
- env: COMPILER=clang++-3.6
|
||||
- env: COMPILER=clang++-3.7 DISABLE_ASAN=yes
|
||||
- env: COMPILER=clang++-8
|
||||
- env: OSX_VERSION=10.13 USE_OPENSSL_1_1=yes
|
||||
- env: COMPILER=g++-5
|
||||
- env: COMPILER=g++-6
|
||||
- env: COMPILER=clang++-4.0
|
||||
- env: COMPILER=clang++-12
|
||||
|
||||
fast_finish: true
|
||||
|
||||
install: |
|
||||
before_install:
|
||||
- |
|
||||
: Adding apt repositories
|
||||
case ${COMPILER} in
|
||||
g++-[6789])
|
||||
g++-9)
|
||||
# https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test/+packages
|
||||
travis_retry sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||
travis_retry sudo apt-get -qq update
|
||||
travis_retry sudo apt-get -qy install "${COMPILER}"
|
||||
;;
|
||||
clang++-*)
|
||||
CLANG_VERSION=${COMPILER/clang++}
|
||||
if [[ ${CLANG_VERSION} != "-3."* ]]; then
|
||||
travis_retry wget -nv -O - "https://apt.llvm.org/llvm-snapshot.gpg.key" | sudo apt-key add -
|
||||
travis_retry sudo add-apt-repository -y "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial${CLANG_VERSION/-8} main"
|
||||
fi
|
||||
clang++-1?)
|
||||
# https://apt.llvm.org/
|
||||
LLVM_REPO=${COMPILER/clang++/llvm-toolchain-${TRAVIS_DIST}}
|
||||
travis_retry wget -nv -O - "https://apt.llvm.org/llvm-snapshot.gpg.key" | sudo apt-key add -
|
||||
travis_retry sudo add-apt-repository -y "deb http://apt.llvm.org/${TRAVIS_DIST}/ ${LLVM_REPO%-12} main"
|
||||
travis_retry sudo apt-get -qq update
|
||||
travis_retry sudo apt-get -qy install "clang${CLANG_VERSION}"
|
||||
;;
|
||||
esac
|
||||
|
||||
install:
|
||||
- |
|
||||
: Installing C++ compiler
|
||||
if [[ -n ${COMPILER} ]]; then
|
||||
travis_retry sudo apt-get -qy install ${COMPILER/clang++/clang}
|
||||
fi
|
||||
|
||||
before_script:
|
||||
- if [[ ${TRAVIS_OS_NAME} == linux ]]; then export NODE_LABELS="Linux Ubuntu Ubuntu-16.04"; fi
|
||||
- if [[ ${TRAVIS_OS_NAME} == osx ]]; then export NODE_LABELS="OSX OSX-${OSX_VERSION}"; fi
|
||||
- if [[ -n ${COMPILER} ]]; then export CXX=${COMPILER}; fi
|
||||
- |
|
||||
: Setting environment variables
|
||||
if [[ -n ${COMPILER} ]]; then
|
||||
export CXX=${COMPILER}
|
||||
fi
|
||||
case ${TRAVIS_OS_NAME} in
|
||||
linux) export NODE_LABELS="Linux Ubuntu Ubuntu-18.04" ;;
|
||||
osx) export NODE_LABELS="OSX OSX-$(sw_vers -productVersion | cut -d . -f -2)" ;;
|
||||
esac
|
||||
export JOB_NAME=limited-build
|
||||
export WAF_JOBS=2
|
||||
- |
|
||||
: Enabling workarounds
|
||||
case "${TRAVIS_CPU_ARCH},${COMPILER}" in
|
||||
arm64,g++*)
|
||||
# Avoid exceeding the per-job time limit
|
||||
export DISABLE_HEADERS_CHECK=yes
|
||||
;;
|
||||
ppc64le,g++-7)
|
||||
# AddressSanitizer does not seem to be working
|
||||
export DISABLE_ASAN=yes
|
||||
;;
|
||||
*,clang++-8)
|
||||
# https://bugs.llvm.org/show_bug.cgi?id=40808
|
||||
export DISABLE_ASAN=yes
|
||||
;;
|
||||
esac
|
||||
- ${CXX:-c++} --version
|
||||
- python --version
|
||||
|
||||
script:
|
||||
- ./.jenkins
|
||||
+51
-40
@@ -56,6 +56,7 @@ from waflib.TaskGen import feature, after_method
|
||||
|
||||
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
|
||||
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
|
||||
|
||||
BOOST_VERSION_FILE = 'boost/version.hpp'
|
||||
BOOST_VERSION_CODE = '''
|
||||
#include <iostream>
|
||||
@@ -90,13 +91,18 @@ int main() { boost::thread t; }
|
||||
|
||||
BOOST_LOG_CODE = '''
|
||||
#include <boost/log/trivial.hpp>
|
||||
int main() { BOOST_LOG_TRIVIAL(info) << "boost_log is working"; }
|
||||
'''
|
||||
|
||||
BOOST_LOG_SETUP_CODE = '''
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/log/utility/setup/console.hpp>
|
||||
#include <boost/log/utility/setup/common_attributes.hpp>
|
||||
int main() {
|
||||
using namespace boost::log;
|
||||
add_common_attributes();
|
||||
add_console_log(std::clog, keywords::format = "%Message%");
|
||||
BOOST_LOG_TRIVIAL(debug) << "log is working" << std::endl;
|
||||
BOOST_LOG_TRIVIAL(info) << "boost_log_setup is working";
|
||||
}
|
||||
'''
|
||||
|
||||
@@ -145,7 +151,7 @@ def options(opt):
|
||||
opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
|
||||
help='''select libraries with tags (gd for debug, static is automatically added),
|
||||
see doc Boost, Getting Started, chapter 6.1''')
|
||||
opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
|
||||
opt.add_option('--boost-linkage_autodetect', action='store_true', dest='boost_linkage_autodetect',
|
||||
help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
|
||||
opt.add_option('--boost-toolset', type='string',
|
||||
default='', dest='boost_toolset',
|
||||
@@ -175,7 +181,7 @@ def boost_get_version(self, d):
|
||||
try:
|
||||
txt = node.read()
|
||||
except EnvironmentError:
|
||||
Logs.error("Could not read the file %r" % node.abspath())
|
||||
Logs.error('Could not read the file %r' % node.abspath())
|
||||
else:
|
||||
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.+)"', re.M)
|
||||
m1 = re_but1.search(txt)
|
||||
@@ -183,7 +189,7 @@ def boost_get_version(self, d):
|
||||
m2 = re_but2.search(txt)
|
||||
if m1 and m2:
|
||||
return (m1.group(1), m2.group(1))
|
||||
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(":")
|
||||
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(':')
|
||||
|
||||
@conf
|
||||
def boost_get_includes(self, *k, **kw):
|
||||
@@ -194,10 +200,10 @@ def boost_get_includes(self, *k, **kw):
|
||||
if self.__boost_get_version_file(d):
|
||||
return d
|
||||
if includes:
|
||||
self.end_msg('headers not found in %s' % includes)
|
||||
self.end_msg('headers not found in %s' % includes, 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
|
||||
self.end_msg('headers not found, please provide a --boost-includes argument (see help)', 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
|
||||
|
||||
@@ -240,10 +246,10 @@ def __boost_get_libs_path(self, *k, **kw):
|
||||
break
|
||||
if not path:
|
||||
if libs:
|
||||
self.end_msg('libs not found in %s' % libs)
|
||||
self.end_msg('libs not found in %s' % libs, 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
|
||||
self.end_msg('libs not found, please provide a --boost-libs argument (see help)', 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
|
||||
self.to_log('Found the boost path in %r with the libraries:' % path)
|
||||
@@ -313,7 +319,7 @@ def boost_get_libs(self, *k, **kw):
|
||||
libs.append(format_lib_name(file.name))
|
||||
break
|
||||
else:
|
||||
self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
|
||||
self.end_msg('lib %s not found in %s' % (lib, path.abspath()), 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
return libs
|
||||
|
||||
@@ -354,7 +360,7 @@ def _check_pthread_flag(self, *k, **kw):
|
||||
# ... -mt is also the pthreads flag for HP/aCC
|
||||
# -lpthread: GNU Linux, etc.
|
||||
# --thread-safe: KAI C++
|
||||
if Utils.unversioned_sys_platform() == "sunos":
|
||||
if Utils.unversioned_sys_platform() == 'sunos':
|
||||
# On Solaris (at least, for some versions), libc contains stubbed
|
||||
# (non-functional) versions of the pthreads routines, so link-based
|
||||
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
||||
@@ -362,23 +368,22 @@ def _check_pthread_flag(self, *k, **kw):
|
||||
# a function called by this macro, so we could check for that, but
|
||||
# who knows whether they'll stub that too in a future libc.) So,
|
||||
# we'll just look for -pthreads and -lpthread first:
|
||||
boost_pthread_flags = ["-pthreads", "-lpthread", "-mt", "-pthread"]
|
||||
boost_pthread_flags = ['-pthreads', '-lpthread', '-mt', '-pthread']
|
||||
else:
|
||||
boost_pthread_flags = ["", "-lpthreads", "-Kthread", "-kthread", "-llthread", "-pthread",
|
||||
"-pthreads", "-mthreads", "-lpthread", "--thread-safe", "-mt"]
|
||||
boost_pthread_flags = ['', '-lpthreads', '-Kthread', '-kthread', '-llthread', '-pthread',
|
||||
'-pthreads', '-mthreads', '-lpthread', '--thread-safe', '-mt']
|
||||
|
||||
for boost_pthread_flag in boost_pthread_flags:
|
||||
try:
|
||||
self.env.stash()
|
||||
self.env['CXXFLAGS_%s' % var] += [boost_pthread_flag]
|
||||
self.env['LINKFLAGS_%s' % var] += [boost_pthread_flag]
|
||||
self.check_cxx(code=PTHREAD_CODE, msg=None, use=var, execute=False)
|
||||
|
||||
self.check_cxx(code=PTHREAD_CODE, msg=None, use=var, execute=False, quiet=True)
|
||||
self.end_msg(boost_pthread_flag)
|
||||
return
|
||||
except self.errors.ConfigurationError:
|
||||
self.env.revert()
|
||||
self.end_msg('None')
|
||||
self.end_msg('none')
|
||||
|
||||
@conf
|
||||
def check_boost(self, *k, **kw):
|
||||
@@ -403,21 +408,24 @@ def check_boost(self, *k, **kw):
|
||||
|
||||
var = kw.get('uselib_store', 'BOOST')
|
||||
|
||||
self.find_program('dpkg-architecture', var='DPKG_ARCHITECTURE', mandatory=False)
|
||||
if self.env.DPKG_ARCHITECTURE:
|
||||
deb_host_multiarch = self.cmd_and_log([self.env.DPKG_ARCHITECTURE[0], '-qDEB_HOST_MULTIARCH'])
|
||||
BOOST_LIBS.insert(0, '/usr/lib/%s' % deb_host_multiarch.strip())
|
||||
if not self.env.DONE_FIND_BOOST_COMMON:
|
||||
self.find_program('dpkg-architecture', var='DPKG_ARCHITECTURE', mandatory=False)
|
||||
if self.env.DPKG_ARCHITECTURE:
|
||||
deb_host_multiarch = self.cmd_and_log([self.env.DPKG_ARCHITECTURE[0], '-qDEB_HOST_MULTIARCH'])
|
||||
BOOST_LIBS.insert(0, '/usr/lib/%s' % deb_host_multiarch.strip())
|
||||
|
||||
self.start_msg('Checking boost includes')
|
||||
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
|
||||
versions = self.boost_get_version(inc)
|
||||
self.env.BOOST_VERSION = versions[0]
|
||||
self.env.BOOST_VERSION_NUMBER = int(versions[1])
|
||||
self.end_msg("%d.%d.%d" % (int(versions[1]) / 100000,
|
||||
int(versions[1]) / 100 % 1000,
|
||||
int(versions[1]) % 100))
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
|
||||
self.start_msg('Checking boost includes')
|
||||
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
|
||||
versions = self.boost_get_version(inc)
|
||||
self.env.BOOST_VERSION = versions[0]
|
||||
self.env.BOOST_VERSION_NUMBER = int(versions[1])
|
||||
self.end_msg('%d.%d.%d' % (int(versions[1]) / 100000,
|
||||
int(versions[1]) / 100 % 1000,
|
||||
int(versions[1]) % 100))
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
|
||||
|
||||
self.env.DONE_FIND_BOOST_COMMON = True
|
||||
|
||||
if not params['lib'] and not params['stlib']:
|
||||
return
|
||||
@@ -429,7 +437,7 @@ def check_boost(self, *k, **kw):
|
||||
self.env['STLIBPATH_%s' % var] = [path]
|
||||
self.env['LIB_%s' % var] = libs
|
||||
self.env['STLIB_%s' % var] = stlibs
|
||||
self.end_msg('ok')
|
||||
self.end_msg(' '.join(libs + stlibs))
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN', ' path : %s' % path)
|
||||
Logs.pprint('CYAN', ' shared libs : %s' % libs)
|
||||
@@ -450,15 +458,18 @@ def check_boost(self, *k, **kw):
|
||||
self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
|
||||
if has_lib('thread'):
|
||||
self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
|
||||
if has_lib('log'):
|
||||
if has_lib('log') or has_lib('log_setup'):
|
||||
if not has_lib('thread'):
|
||||
self.env['DEFINES_%s' % var] += ['BOOST_LOG_NO_THREADS']
|
||||
if has_shlib('log'):
|
||||
if has_shlib('log') or has_shlib('log_setup'):
|
||||
self.env['DEFINES_%s' % var] += ['BOOST_LOG_DYN_LINK']
|
||||
self.check_cxx(fragment=BOOST_LOG_CODE, use=var, execute=False)
|
||||
if has_lib('log_setup'):
|
||||
self.check_cxx(fragment=BOOST_LOG_SETUP_CODE, use=var, execute=False)
|
||||
else:
|
||||
self.check_cxx(fragment=BOOST_LOG_CODE, use=var, execute=False)
|
||||
|
||||
if params.get('linkage_autodetect', False):
|
||||
self.start_msg("Attempting to detect boost linkage flags")
|
||||
self.start_msg('Attempting to detect boost linkage flags')
|
||||
toolset = self.boost_get_toolset(kw.get('toolset', ''))
|
||||
if toolset in ('vc',):
|
||||
# disable auto-linking feature, causing error LNK1181
|
||||
@@ -480,10 +491,10 @@ def check_boost(self, *k, **kw):
|
||||
# we attempt to play with some known-to-work CXXFLAGS combinations
|
||||
for cxxflags in (['/MD', '/EHsc'], []):
|
||||
self.env.stash()
|
||||
self.env["CXXFLAGS_%s" % var] += cxxflags
|
||||
self.env['CXXFLAGS_%s' % var] += cxxflags
|
||||
try:
|
||||
try_link()
|
||||
self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
|
||||
self.end_msg('ok: winning cxxflags combination: %s' % (self.env['CXXFLAGS_%s' % var]))
|
||||
exc = None
|
||||
break
|
||||
except Errors.ConfigurationError as e:
|
||||
@@ -491,17 +502,17 @@ def check_boost(self, *k, **kw):
|
||||
exc = e
|
||||
|
||||
if exc is not None:
|
||||
self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=exc)
|
||||
self.end_msg('Could not auto-detect boost linking flags combination, you may report it to boost.py author', ex=exc)
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
|
||||
self.end_msg('Boost linkage flags auto-detection not implemented (needed ?) for this toolchain')
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.start_msg('Checking for boost linkage')
|
||||
try:
|
||||
try_link()
|
||||
except Errors.ConfigurationError as e:
|
||||
self.end_msg("Could not link against boost libraries using supplied options")
|
||||
self.end_msg('Could not link against boost libraries using supplied options', 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
self.end_msg('ok')
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
import platform
|
||||
from waflib import Configure, Logs, Utils
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--debug', '--with-debug', action='store_true', default=False,
|
||||
help='Compile in debugging mode with minimal optimizations (-O0 or -Og)')
|
||||
help='Compile in debugging mode with minimal optimizations (-Og)')
|
||||
|
||||
def configure(conf):
|
||||
conf.start_msg('Checking C++ compiler version')
|
||||
@@ -17,15 +18,21 @@ def configure(conf):
|
||||
if cxx == 'gcc':
|
||||
if ccver < (5, 3, 0):
|
||||
errmsg = ('The version of gcc you are using is too old.\n'
|
||||
'The minimum supported gcc version is 5.3.0.')
|
||||
'The minimum supported gcc version is 7.4.0.')
|
||||
elif ccver < (7, 4, 0):
|
||||
warnmsg = ('Using a version of gcc older than 7.4.0 is not '
|
||||
'officially supported and may result in build failures.')
|
||||
conf.flags = GccFlags()
|
||||
elif cxx == 'clang':
|
||||
if ccver < (3, 6, 0):
|
||||
if Utils.unversioned_sys_platform() == 'darwin' and ccver < (9, 0, 0):
|
||||
errmsg = ('The version of Xcode you are using is too old.\n'
|
||||
'The minimum supported Xcode version is 9.0.')
|
||||
elif ccver < (4, 0, 0):
|
||||
errmsg = ('The version of clang you are using is too old.\n'
|
||||
'The minimum supported clang version is 3.6.0.')
|
||||
'The minimum supported clang version is 4.0.')
|
||||
conf.flags = ClangFlags()
|
||||
else:
|
||||
warnmsg = 'Note: %s compiler is unsupported' % cxx
|
||||
warnmsg = '%s compiler is unsupported' % cxx
|
||||
conf.flags = CompilerFlags()
|
||||
|
||||
if errmsg:
|
||||
@@ -33,7 +40,7 @@ def configure(conf):
|
||||
conf.fatal(errmsg)
|
||||
elif warnmsg:
|
||||
conf.end_msg(ccverstr, color='YELLOW')
|
||||
Logs.warn(warnmsg)
|
||||
Logs.warn('WARNING: ' + warnmsg)
|
||||
else:
|
||||
conf.end_msg(ccverstr)
|
||||
|
||||
@@ -129,23 +136,28 @@ class GccBasicFlags(CompilerFlags):
|
||||
def getGeneralFlags(self, conf):
|
||||
flags = super(GccBasicFlags, self).getGeneralFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-std=c++14']
|
||||
if Utils.unversioned_sys_platform() == 'linux':
|
||||
flags['LINKFLAGS'] += ['-fuse-ld=gold']
|
||||
elif Utils.unversioned_sys_platform() == 'freebsd':
|
||||
flags['LINKFLAGS'] += ['-fuse-ld=lld']
|
||||
return flags
|
||||
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(GccBasicFlags, self).getDebugFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-O0',
|
||||
'-Og', # gcc >= 4.8, clang >= 4.0
|
||||
flags['CXXFLAGS'] += ['-Og',
|
||||
'-g3',
|
||||
'-pedantic',
|
||||
'-Wall',
|
||||
'-Wextra',
|
||||
'-Werror',
|
||||
'-Wcatch-value=2',
|
||||
'-Wextra-semi',
|
||||
'-Wnon-virtual-dtor',
|
||||
'-Wno-error=deprecated-declarations', # Bug #3795
|
||||
'-Wno-error=maybe-uninitialized', # Bug #1615
|
||||
'-Wno-unused-parameter',
|
||||
]
|
||||
flags['LINKFLAGS'] += ['-fuse-ld=gold', '-Wl,-O1']
|
||||
flags['LINKFLAGS'] += ['-Wl,-O1']
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
@@ -155,56 +167,61 @@ class GccBasicFlags(CompilerFlags):
|
||||
'-pedantic',
|
||||
'-Wall',
|
||||
'-Wextra',
|
||||
'-Wcatch-value=2',
|
||||
'-Wextra-semi',
|
||||
'-Wnon-virtual-dtor',
|
||||
'-Wno-unused-parameter',
|
||||
]
|
||||
flags['LINKFLAGS'] += ['-fuse-ld=gold', '-Wl,-O1']
|
||||
flags['LINKFLAGS'] += ['-Wl,-O1']
|
||||
return flags
|
||||
|
||||
class GccFlags(GccBasicFlags):
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(GccFlags, self).getDebugFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color']
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color',
|
||||
'-Wredundant-tags',
|
||||
]
|
||||
if platform.machine() == 'armv7l' and self.getCompilerVersion(conf) >= (7, 1, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
flags = super(GccFlags, self).getOptimizedFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color']
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color',
|
||||
'-Wredundant-tags',
|
||||
]
|
||||
if platform.machine() == 'armv7l' and self.getCompilerVersion(conf) >= (7, 1, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
|
||||
return flags
|
||||
|
||||
class ClangFlags(GccBasicFlags):
|
||||
def getGeneralFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getGeneralFlags(conf)
|
||||
if Utils.unversioned_sys_platform() == 'darwin' and self.getCompilerVersion(conf) >= (9, 0, 0):
|
||||
if Utils.unversioned_sys_platform() == 'darwin':
|
||||
# Bug #4296
|
||||
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include'], # for Homebrew
|
||||
['-isystem', '/opt/local/include']] # for MacPorts
|
||||
elif Utils.unversioned_sys_platform() == 'freebsd':
|
||||
# Bug #4790
|
||||
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include']]
|
||||
return flags
|
||||
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getDebugFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fcolor-diagnostics',
|
||||
'-Wextra-semi',
|
||||
'-Wundefined-func-template',
|
||||
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
|
||||
]
|
||||
version = self.getCompilerVersion(conf)
|
||||
if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
|
||||
flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
|
||||
if version < (6, 0, 0):
|
||||
if self.getCompilerVersion(conf) < (6, 0, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getOptimizedFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fcolor-diagnostics',
|
||||
'-Wextra-semi',
|
||||
'-Wundefined-func-template',
|
||||
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
|
||||
]
|
||||
version = self.getCompilerVersion(conf)
|
||||
if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
|
||||
flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
|
||||
if version < (6, 0, 0):
|
||||
if self.getCompilerVersion(conf) < (6, 0, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
|
||||
return flags
|
||||
+20
-23
@@ -19,23 +19,20 @@ When using this tool, the wscript will look like:
|
||||
'''
|
||||
|
||||
import re
|
||||
from waflib import Utils, Logs
|
||||
from waflib import Utils
|
||||
from waflib.Configure import conf
|
||||
|
||||
OPENSSL_VERSION_FILE = 'opensslv.h'
|
||||
OPENSSL_DIR_OSX = ['/usr/local', '/opt/local', '/usr/local/opt/openssl']
|
||||
OPENSSL_DIR = ['/usr', '/usr/local', '/opt/local', '/sw']
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-openssl', type='string', default=None, dest='openssl_dir',
|
||||
help='''Path to where OpenSSL is installed, e.g., /usr/local''')
|
||||
|
||||
help='directory where OpenSSL is installed, e.g., /usr/local')
|
||||
|
||||
@conf
|
||||
def __openssl_get_version_file(self, dir):
|
||||
try:
|
||||
return self.root.find_dir(dir).find_node('%s/%s' % ('include/openssl',
|
||||
OPENSSL_VERSION_FILE))
|
||||
return self.root.find_dir(dir).find_node('include/openssl/opensslv.h')
|
||||
except:
|
||||
return None
|
||||
|
||||
@@ -47,8 +44,8 @@ def __openssl_find_root_and_version_file(self, *k, **kw):
|
||||
if root and file:
|
||||
return (root, file)
|
||||
|
||||
openssl_dir = [];
|
||||
if Utils.unversioned_sys_platform() == "darwin":
|
||||
openssl_dir = []
|
||||
if Utils.unversioned_sys_platform() == 'darwin':
|
||||
openssl_dir = OPENSSL_DIR_OSX
|
||||
else:
|
||||
openssl_dir = OPENSSL_DIR
|
||||
@@ -66,10 +63,7 @@ def __openssl_find_root_and_version_file(self, *k, **kw):
|
||||
|
||||
@conf
|
||||
def check_openssl(self, *k, **kw):
|
||||
atleast_version = kw.get('atleast_version', 0)
|
||||
var = kw.get('uselib_store', 'OPENSSL')
|
||||
|
||||
self.start_msg('Checking for OpenSSL lib')
|
||||
self.start_msg('Checking for OpenSSL version')
|
||||
(root, file) = self.__openssl_find_root_and_version_file(*k, **kw)
|
||||
|
||||
try:
|
||||
@@ -88,18 +82,21 @@ def check_openssl(self, *k, **kw):
|
||||
except:
|
||||
self.fatal('OpenSSL version file is not found or is not usable')
|
||||
|
||||
atleast_version = kw.get('atleast_version', 0)
|
||||
if int(version, 16) < atleast_version:
|
||||
self.fatal("The version of OpenSSL is too old\n" +
|
||||
"Please upgrade your distribution or install newer version of OpenSSL library")
|
||||
self.fatal('The version of OpenSSL is too old\n'
|
||||
'Please upgrade your distribution or manually install a newer version of OpenSSL')
|
||||
|
||||
kwargs = {}
|
||||
if 'msg' not in kw:
|
||||
kw['msg'] = 'Checking if OpenSSL library works'
|
||||
if 'lib' not in kw:
|
||||
kw['lib'] = ['ssl', 'crypto']
|
||||
if 'uselib_store' not in kw:
|
||||
kw['uselib_store'] = 'OPENSSL'
|
||||
if 'define_name' not in kw:
|
||||
kw['define_name'] = 'HAVE_%s' % kw['uselib_store']
|
||||
if root:
|
||||
kwargs['includes'] = "%s/include" % root
|
||||
kwargs['libpath'] = "%s/lib" % root
|
||||
kw['includes'] = '%s/include' % root
|
||||
kw['libpath'] = '%s/lib' % root
|
||||
|
||||
libcrypto = self.check_cxx(lib=['ssl', 'crypto'],
|
||||
msg='Checking if OpenSSL library works',
|
||||
define_name='HAVE_%s' % var,
|
||||
uselib_store=var,
|
||||
mandatory=True,
|
||||
**kwargs)
|
||||
self.check_cxx(**kw)
|
||||
@@ -44,28 +44,28 @@ def apply_sphinx(self):
|
||||
task.inputs.append(conf)
|
||||
|
||||
confdir = conf.parent.abspath()
|
||||
buildername = getattr(self, "builder", "html")
|
||||
srcdir = getattr(self, "srcdir", confdir)
|
||||
outdir = self.path.find_or_declare(getattr(self, "outdir", buildername)).get_bld()
|
||||
doctreedir = getattr(self, "doctreedir", os.path.join(outdir.abspath(), ".doctrees"))
|
||||
buildername = getattr(self, 'builder', 'html')
|
||||
srcdir = getattr(self, 'srcdir', confdir)
|
||||
outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
|
||||
doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))
|
||||
|
||||
task.env['BUILDERNAME'] = buildername
|
||||
task.env['SRCDIR'] = srcdir
|
||||
task.env['DOCTREEDIR'] = doctreedir
|
||||
task.env['OUTDIR'] = outdir.abspath()
|
||||
task.env['VERSION'] = "version=%s" % self.VERSION
|
||||
task.env['RELEASE'] = "release=%s" % self.VERSION
|
||||
task.env['VERSION'] = 'version=%s' % self.version
|
||||
task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)
|
||||
|
||||
import imp
|
||||
confData = imp.load_source('sphinx_conf', conf.abspath())
|
||||
|
||||
if buildername == "man":
|
||||
if buildername == 'man':
|
||||
for i in confData.man_pages:
|
||||
target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
|
||||
task.outputs.append(target)
|
||||
|
||||
if self.install_path:
|
||||
self.bld.install_files("%s/man%d/" % (self.install_path, i[4]), target)
|
||||
self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
|
||||
else:
|
||||
task.outputs.append(outdir)
|
||||
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
from waflib import Options, Logs
|
||||
from waflib.Configure import conf
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-sqlite3', type='string', default=None,
|
||||
dest='with_sqlite3', help='''Path to SQLite3, e.g., /usr/local''')
|
||||
opt.add_option('--with-sqlite3', type='string', default=None, dest='sqlite3_dir',
|
||||
help='directory where SQLite3 is installed, e.g., /usr/local')
|
||||
|
||||
@conf
|
||||
def check_sqlite3(self, *k, **kw):
|
||||
root = k and k[0] or kw.get('path', None) or Options.options.with_sqlite3
|
||||
root = k and k[0] or kw.get('path', self.options.sqlite3_dir)
|
||||
mandatory = kw.get('mandatory', True)
|
||||
var = kw.get('uselib_store', 'SQLITE3')
|
||||
|
||||
@@ -20,8 +19,8 @@ def check_sqlite3(self, *k, **kw):
|
||||
define_name='HAVE_%s' % var,
|
||||
uselib_store=var,
|
||||
mandatory=mandatory,
|
||||
includes="%s/include" % root,
|
||||
libpath="%s/lib" % root)
|
||||
includes='%s/include' % root,
|
||||
libpath='%s/lib' % root)
|
||||
else:
|
||||
try:
|
||||
self.check_cfg(package='sqlite3',
|
||||
|
||||
+57
-38
@@ -1,42 +1,61 @@
|
||||
ndn-cxx authors
|
||||
===============
|
||||
# ndn-cxx Authors
|
||||
|
||||
## The primary authors are (and/or have been):
|
||||
The following lists maintainers, primary developers, and all much-appreciated contributors to ndn-cxx in alphabetic order.
|
||||
The specific contributions of individual authors can be obtained from the git history of the [official ndn-cxx repository](https://github.com/named-data/ndn-cxx).
|
||||
If you would like to become a contributor to the official repository, please follow the recommendations in https://github.com/named-data/.github/blob/master/CONTRIBUTING.md.
|
||||
|
||||
* Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
|
||||
* Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/>
|
||||
* Junxiao Shi <http://www.cs.arizona.edu/people/shijunxiao/>
|
||||
* Jeff Thompson <jefft0@remap.ucla.edu>
|
||||
* Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
|
||||
* Sepehr Abdous <https://sepehrabdous.github.io>
|
||||
* ***(Maintainer)*** Alexander Afanasyev <https://users.cs.fiu.edu/~afanasyev>
|
||||
* Syed Obaid Amin <http://obaidamin.weebly.com>
|
||||
* Hila Ben Abraham <https://sites.wustl.edu/hbabraham>
|
||||
* Shuo Chen <https://github.com/chenatu>
|
||||
* Muktadir R. Chowdhury <https://github.com/alvyC>
|
||||
* Jeremy Clark <https://github.com/jrandallclark>
|
||||
* Damian Coomes <https://github.com/dmcoomes>
|
||||
* Stephanie DiBenedetto
|
||||
* Qiuhan Ding <https://irl.cs.ucla.edu/~qiuhanding>
|
||||
* Chengyu Fan <https://github.com/chengyu>
|
||||
* Laqin Fan <https://github.com/laqinfan>
|
||||
* Ashlesh Gawande <https://www.linkedin.com/in/agawande>
|
||||
* Chavoosh Ghasemi <https://chavoosh.github.io>
|
||||
* Mathias Gibbens <https://calenhad.com>
|
||||
* Nick Gordon <https://github.com/gorgonical>
|
||||
* Xiaoke Jiang <http://netarchlab.tsinghua.edu.cn/~shock>
|
||||
* Marcin Juszkiewicz <https://marcin.juszkiewicz.com.pl>
|
||||
* Luca Keidel <https://lucakeidel.de>
|
||||
* Spencer Lee <https://wwsw.linkedin.com/in/spenlee>
|
||||
* Vince Lehman <http://vslehman.com>
|
||||
* Yanbiao Li <https://www.linkedin.com/pub/yanbiao-li/24/7a1/4ba>
|
||||
* Teng Liang <https://cs.arizona.edu/~philoliang>
|
||||
* Weiwei Liu <https://www.linkedin.com/in/weiweiliu10>
|
||||
* Tianxing Ma <https://github.com/matianxing1992>
|
||||
* Xingyu Ma <https://www.linkedin.com/pub/xingyu-ma/1a/384/5a8>
|
||||
* Spyridon Mastorakis <https://sites.google.com/site/spyridonmastorakis>
|
||||
* Ernest McCracken <https://github.com/emccrckn>
|
||||
* Stephen McQuistin <https://smcquistin.uk>
|
||||
* Ilya Moiseenko <https://www.linkedin.com/in/ilya-moiseenko-52884317>
|
||||
* Alex Nano <http://alexnano.net>
|
||||
* Eric Newberry <https://ericnewberry.com>
|
||||
* Arthi Padmanabhan <https://github.com/arthipadmanabhan>
|
||||
* Ju Pan <https://cs-jupan.com>
|
||||
* João Pereira <http://website.jpereira.co.uk>
|
||||
* Davide Pesavento <https://github.com/Pesa>
|
||||
* José Quevedo <http://atnog.av.it.pt/members/jquevedo>
|
||||
* Md Ashiqur Rahman <https://ashiqrahman.com>
|
||||
* Niv Sardi <http://core.evilgiggle.com>
|
||||
* Wentao Shang <https://irl.cs.ucla.edu/~wentao>
|
||||
* Susmit Shannigrahi <https://susm.it>
|
||||
* Junxiao Shi <https://cs.arizona.edu/~shijunxiao>
|
||||
* Michael Sweatt <https://www.linkedin.com/in/michaelsweatt>
|
||||
* Jiewen Tan <https://github.com/alanwaketan>
|
||||
* ***(Former Maintainer)*** Jeff Thompson <https://remap.ucla.edu/jeff-thompson>
|
||||
* Yukai Tu <https://irl.cs.ucla.edu/~yukai>
|
||||
* Yingdi Yu <https://irl.cs.ucla.edu/~yingdi>
|
||||
* Zhiyi Zhang <https://zhiyi-zhang.com>
|
||||
* Zhenkai Zhu <https://irl.cs.ucla.edu/~zhenkai>
|
||||
|
||||
## All project authors and contributors
|
||||
## Technical Advisors
|
||||
|
||||
The following is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS,
|
||||
people who have reported bugs, submitted patches, and implemented new features
|
||||
in the library:
|
||||
|
||||
* Wentao Shang <http://irl.cs.ucla.edu/~wentao/>
|
||||
* Steve DiBenedetto <http://www.cs.colostate.edu/~dibenede/>
|
||||
* Davide Pesavento <https://www.linkedin.com/in/davidepesavento>
|
||||
* Syed Obaid Amin <http://obaidamin.weebly.com/>
|
||||
* Shuo Chen <chenatu2006@gmail.com>
|
||||
* Hila Ben Abraham <http://research.engineering.wustl.edu/~abrahamh/>
|
||||
* Xingyu Ma <http://www.linkedin.com/pub/xingyu-ma/1a/384/5a8>
|
||||
* Michael Sweatt <https://www.linkedin.com/in/michaelsweatt>
|
||||
* Lixia Zhang <http://www.cs.ucla.edu/~lixia/home.html>
|
||||
* Jeff Burke <http://remap.ucla.edu/jburke/>
|
||||
* Xiaoke Jiang <http://netarchlab.tsinghua.edu.cn/~shock/>
|
||||
* Jiewen Tan <alanwake@ucla.edu>
|
||||
* Vince Lehman <http://vslehman.com>
|
||||
* Mathias Gibbens <gibmat@cs.arizona.edu>
|
||||
* Chengyu Fan <chengyu@cs.colostate.edu>
|
||||
* Qiuhan Ding <http://irl.cs.ucla.edu/~qiuhanding/>
|
||||
* Spyridon Mastorakis <http://cs.ucla.edu/~mastorakis/>
|
||||
* Eric Newberry <http://cs.arizona.edu/~enewberry/>
|
||||
* João Pereira <http://website.jpereira.co.uk>
|
||||
* Mickey Sweatt <https://www.linkedin.com/in/michaelsweatt>
|
||||
* Yanbiao Li <https://www.linkedin.com/pub/yanbiao-li/24/7a1/4ba>
|
||||
* Marcin Juszkiewicz <http://marcin.juszkiewicz.com.pl/>
|
||||
* Susmit Shannigrahi <https://www.linkedin.com/in/susmit-shannigrahi-90433b8>
|
||||
* José Quevedo <http://atnog.av.it.pt/members/jquevedo>
|
||||
* Zhiyi Zhang <http://irl.cs.ucla.edu/~zhiyi/>
|
||||
* Jeff Burke <https://jeff-burke.com>
|
||||
* Beichuan Zhang <https://cs.arizona.edu/~bzhang>
|
||||
* Lixia Zhang <https://cs.ucla.edu/~lixia>
|
||||
@@ -6,9 +6,18 @@ ndn-cxx relies on third-party software, licensed under the following licenses:
|
||||
- The Boost libraries are licensed under the
|
||||
[Boost Software License 1.0](https://www.boost.org/users/license.html)
|
||||
|
||||
- any-lite by Martin Moene is licensed under the
|
||||
[Boost Software License 1.0](https://github.com/martinmoene/any-lite/blob/master/LICENSE.txt)
|
||||
|
||||
- optional-lite by Martin Moene is licensed under the
|
||||
[Boost Software License 1.0](https://github.com/martinmoene/optional-lite/blob/master/LICENSE.txt)
|
||||
|
||||
- scope-lite by Martin Moene is licensed under the
|
||||
[Boost Software License 1.0](https://github.com/martinmoene/scope-lite/blob/master/LICENSE.txt)
|
||||
|
||||
- variant-lite by Martin Moene is licensed under the
|
||||
[Boost Software License 1.0](https://github.com/martinmoene/variant-lite/blob/master/LICENSE.txt)
|
||||
|
||||
- SQLite is in the [public domain](https://www.sqlite.org/copyright.html)
|
||||
|
||||
- The waf build system is licensed under the terms of the
|
||||
|
||||
+17
-19
@@ -2,24 +2,23 @@ Notes for ndn-cxx developers
|
||||
============================
|
||||
|
||||
If you are new to the NDN community of software generally, read the
|
||||
[Contributor's Guide](https://github.com/named-data/NFD/blob/master/CONTRIBUTING.md).
|
||||
[Contributor's Guide](https://github.com/named-data/.github/blob/master/CONTRIBUTING.md).
|
||||
|
||||
Code style
|
||||
----------
|
||||
|
||||
ndn-cxx code is subject to [ndn-cxx code style](http://named-data.net/doc/ndn-cxx/current/code-style.html).
|
||||
ndn-cxx code is subject to [ndn-cxx code style](https://named-data.net/doc/ndn-cxx/current/code-style.html).
|
||||
|
||||
Licensing
|
||||
---------
|
||||
|
||||
Contributions to the library must be licensed under LGPL 3.0 or compatible license. If
|
||||
you are choosing LGPL 3.0, please use the following license boilerplate in all `.hpp` and
|
||||
Contributions to the library must be licensed under the LGPL v3 or compatible license. If
|
||||
you are choosing LGPL v3, please use the following license boilerplate in all `.hpp` and
|
||||
`.cpp` files:
|
||||
|
||||
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) [Year(s)] [Copyright Holder].
|
||||
* Copyright (c) [Year(s)] [Copyright Holder(s)].
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -46,29 +45,29 @@ you are choosing LGPL 3.0, please use the following license boilerplate in all `
|
||||
If you are affiliated to an NSF-supported NDN project institution, please use the [NDN Team License
|
||||
Boilerplate](https://redmine.named-data.net/projects/ndn-cxx/wiki/NDN_Team_License_Boilerplate_(ndn-cxx)).
|
||||
|
||||
Running unit-tests
|
||||
Running unit tests
|
||||
------------------
|
||||
|
||||
To run unit tests, ndn-cxx needs to be configured, build with unit test support, and installed
|
||||
To run the unit tests, ndn-cxx needs to be built with unit test support and installed
|
||||
into the configured location. For example:
|
||||
|
||||
./waf configure --with-tests
|
||||
./waf configure --with-tests # --debug is also strongly recommended while developing
|
||||
./waf
|
||||
sudo ./waf install
|
||||
|
||||
**Note**: On Linux platform you also need to run `sudo ldconfig` to reconfigure dynamic loader
|
||||
run-time bindings. On FreeBSD, use `sudo ldconfig -a` instead.
|
||||
**Note**: On Linux you also need to run `sudo ldconfig` to reconfigure dynamic loader
|
||||
run-time bindings.
|
||||
|
||||
The simplest way to run tests, is just to run the compiled binary without any parameters:
|
||||
The simplest way to run the tests is to launch the compiled binary without any parameters:
|
||||
|
||||
./build/unit-tests
|
||||
|
||||
[Boost.Test framework](https://www.boost.org/doc/libs/1_58_0/libs/test/doc/html/index.html)
|
||||
The [Boost.Test framework](https://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html)
|
||||
is very flexible and allows a number of run-time customization of what tests should be run.
|
||||
For example, it is possible to choose to run only a specific test suite, only a specific
|
||||
test case within a suite, or specific test cases within specific test suites:
|
||||
|
||||
# Run only Face test suite tests (tests/unit-tests/face.t.cpp)
|
||||
# Run only Face test suite tests (tests/unit/face.t.cpp)
|
||||
./build/unit-tests -t TestFace
|
||||
|
||||
# Run only test case ExpressInterestData from the same test suite
|
||||
@@ -79,8 +78,8 @@ test case within a suite, or specific test cases within specific test suites:
|
||||
|
||||
By default, Boost.Test framework will produce verbose output only when a test case fails.
|
||||
If it is desired to see verbose output (result of each test assertion), add `-l all`
|
||||
option to `./build/unit-tests` command. To see test progress, you can use `-l test_suite`
|
||||
or `-p` to show progress bar:
|
||||
option to `./build/unit-tests` command. To see test progress, you can use `-l test_suite`,
|
||||
or `-p` to show a progress bar:
|
||||
|
||||
# Show report all log messages including the passed test notification
|
||||
./build/unit-tests -l all
|
||||
@@ -95,9 +94,8 @@ or `-p` to show progress bar:
|
||||
./build/unit-tests -p
|
||||
|
||||
There are many more command line options available, information about which can be obtained
|
||||
either from the command line using `--help` switch, or online on
|
||||
[Boost.Test library](https://www.boost.org/doc/libs/1_58_0/libs/test/doc/html/index.html)
|
||||
website.
|
||||
either from the command line using the `--help` switch, or online on the
|
||||
[Boost.Test website](https://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html).
|
||||
|
||||
**Warning:** If you have customized parameters for NDN platform using `client.conf` in
|
||||
`/etc/ndn` or `/usr/local/etc/ndn` (or other `@SYSCONFDIR@/etc` if it was configured to custom
|
||||
|
||||
@@ -1,35 +1,42 @@
|
||||
ndn-cxx: NDN C++ library with eXperimental eXtensions
|
||||
=====================================================
|
||||
# ndn-cxx: NDN C++ library with eXperimental eXtensions
|
||||
|
||||

|
||||
[](https://travis-ci.org/named-data/ndn-cxx)
|
||||

|
||||
|
||||
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
|
||||
used to implement various NDN applications. The library is currently being used as part of
|
||||
the following projects:
|
||||
**ndn-cxx** is a C++14 library implementing Named Data Networking (NDN) primitives
|
||||
that can be used to write various NDN applications. The library is currently being
|
||||
used by the following projects:
|
||||
|
||||
* [NFD - NDN Forwarding Daemon](https://github.com/named-data/NFD)
|
||||
* [NLSR - Named-data Link-State Routing protocol](https://github.com/named-data/NLSR)
|
||||
* [repo-ng - Next generation of NDN repository](https://github.com/named-data/repo-ng)
|
||||
* [ChronoChat - Multi-user NDN chat application](https://github.com/named-data/ChronoChat)
|
||||
* [ChronoSync - Sync library for multiuser realtime applications for NDN](https://github.com/named-data/ChronoSync)
|
||||
* [ndn-tools - NDN Essential Tools](https://github.com/named-data/ndn-tools)
|
||||
* [ndn-traffic-generator - Traffic Generator For NDN](https://github.com/named-data/ndn-traffic-generator)
|
||||
* [ndn-tools - Essential NDN command-line tools](https://github.com/named-data/ndn-tools)
|
||||
* [repo-ng - Next generation NDN repository](https://github.com/named-data/repo-ng)
|
||||
* [ChronoSync - Sync library for multi-user real-time applications](https://github.com/named-data/ChronoSync)
|
||||
* [PSync - Partial and full synchronization library](https://github.com/named-data/PSync)
|
||||
* [ndn-traffic-generator - Traffic generator for NDN](https://github.com/named-data/ndn-traffic-generator)
|
||||
* [NAC - Name-based Access Control](https://github.com/named-data/name-based-access-control)
|
||||
* [NDNS - Domain Name Service for NDN](https://github.com/named-data/ndns)
|
||||
|
||||
See the file [`docs/INSTALL.rst`](https://github.com/named-data/ndn-cxx/blob/master/docs/INSTALL.rst)
|
||||
for build and install instructions.
|
||||
## Documentation
|
||||
|
||||
Please submit any bugs or issues to the ndn-cxx issue tracker:
|
||||
https://redmine.named-data.net/projects/ndn-cxx/issues
|
||||
See [`docs/INSTALL.rst`](docs/INSTALL.rst) for compilation and installation instructions.
|
||||
|
||||
## More documentation
|
||||
Extensive documentation is available on the library's [homepage](https://named-data.net/doc/ndn-cxx/).
|
||||
|
||||
Extensive documentation of the library is available on the library's homepage:
|
||||
http://www.named-data.net/doc/ndn-cxx/
|
||||
## Reporting bugs
|
||||
|
||||
If you are new to the NDN community of software generally, read the
|
||||
[Contributor's Guide](https://github.com/named-data/NFD/blob/master/CONTRIBUTING.md).
|
||||
Please submit any bugs or feature requests to the
|
||||
[ndn-cxx issue tracker](https://redmine.named-data.net/projects/ndn-cxx/issues).
|
||||
|
||||
## Contributing
|
||||
|
||||
We greatly appreciate contributions to the ndn-cxx code base.
|
||||
If you are new to the NDN software community, please read the
|
||||
[Contributor's Guide](https://github.com/named-data/.github/blob/master/CONTRIBUTING.md)
|
||||
to get started.
|
||||
|
||||
## License
|
||||
|
||||
ndn-cxx is an open source project licensed under LGPL 3.0 license. For more information about
|
||||
the license, refer to [`COPYING.md`](https://github.com/named-data/ndn-cxx/blob/master/COPYING.md).
|
||||
ndn-cxx is an open source project licensed under the LGPL version 3.
|
||||
See [`COPYING.md`](COPYING.md) for more information.
|
||||
+14
-12
@@ -1,25 +1,27 @@
|
||||
; "transport" specifies Face's default transport connection.
|
||||
; The value is a unix or tcp4 scheme Face URI.
|
||||
; The value can be a "unix:" or "tcp4:" Face URI.
|
||||
;
|
||||
; For example:
|
||||
;
|
||||
; unix:///var/run/nfd.sock
|
||||
; tcp://192.0.2.1
|
||||
; tcp4://example.com:6363
|
||||
|
||||
transport=unix:///var/run/nfd.sock
|
||||
;
|
||||
; The default value of this field is platform-dependent, being unix:///run/nfd.sock on Linux and
|
||||
; unix:///var/run/nfd.sock on other platforms.
|
||||
;
|
||||
;transport=unix:///var/run/nfd.sock
|
||||
|
||||
; "pib" determines which Public Info Base (PIB) should used by default in applications.
|
||||
; If "pib" is not specified, the default PIB will be used.
|
||||
; Note that default PIB could be different on different system.
|
||||
; If "pib" is not specified, a platform-dependent default will be used.
|
||||
; If "pib" is specified, it may have a value of:
|
||||
; pib-sqlite3
|
||||
; pib=pib-sqlite3
|
||||
;
|
||||
;pib=pib-sqlite3
|
||||
|
||||
; "tpm" determines which Trusted Platform Module (TPM) should used by default in applications.
|
||||
; If "tpm" is not specified, the default TPM will be used.
|
||||
; Note that default TPM could be different on different system.
|
||||
; If "tpm" is not specified, a platform-dependent default will be used.
|
||||
; If "tpm" is specified, it may have a value of:
|
||||
; tpm-osxkeychain (default in OS X)
|
||||
; tpm-file (default in operating systems other than OS X)
|
||||
; tpm=tpm-file
|
||||
; tpm-osxkeychain (default on macOS)
|
||||
; tpm-file (default in operating systems other than macOS)
|
||||
;
|
||||
;tpm=tpm-file
|
||||
+175
-196
@@ -1,218 +1,215 @@
|
||||
.. _Getting Started with ndn-cxx:
|
||||
|
||||
Getting started with ndn-cxx
|
||||
============================
|
||||
|
||||
Supported platforms
|
||||
-------------------
|
||||
|
||||
ndn-cxx uses continuous integration and has been tested on the following
|
||||
platforms:
|
||||
ndn-cxx is built against a continuous integration system and has been tested on the
|
||||
following platforms:
|
||||
|
||||
- Ubuntu 16.04 (amd64, armhf, i386)
|
||||
- Ubuntu 18.04 (amd64)
|
||||
- OS X 10.11
|
||||
- macOS 10.12
|
||||
- Ubuntu 18.04 (amd64, armhf, i386)
|
||||
- Ubuntu 20.04 (amd64)
|
||||
- macOS 10.13
|
||||
- macOS 10.14
|
||||
- macOS 10.15
|
||||
- CentOS 8
|
||||
|
||||
ndn-cxx is known to work on the following platforms, although they are not officially
|
||||
supported:
|
||||
|
||||
- Debian >= 9
|
||||
- Fedora >= 24
|
||||
- Debian 10 (Buster)
|
||||
- Fedora >= 29
|
||||
- Gentoo Linux
|
||||
- Raspbian >= 2017-08-16
|
||||
- Raspbian >= 2019-06-20 (Buster)
|
||||
- FreeBSD >= 11.3
|
||||
|
||||
Prerequisites
|
||||
-------------
|
||||
|
||||
Required:
|
||||
~~~~~~~~~
|
||||
Required
|
||||
~~~~~~~~
|
||||
|
||||
- GCC >= 5.3, or clang >= 3.6
|
||||
- ``python2`` >= 2.7, or ``python3`` >= 3.4
|
||||
- ``libsqlite3``
|
||||
- GCC >= 7.4 or clang >= 4.0 (on Linux and FreeBSD)
|
||||
- Xcode >= 9.0 (on macOS)
|
||||
- Python >= 3.6
|
||||
- pkg-config
|
||||
- Boost >= 1.65.1
|
||||
- OpenSSL >= 1.0.2
|
||||
- ``pkg-config``
|
||||
- Boost libraries >= 1.58
|
||||
- OSX Security framework (on OSX/macOS platform only)
|
||||
- SQLite 3.x
|
||||
|
||||
Following are the detailed steps for each platform to install the compiler, all necessary
|
||||
development tools and libraries, and ndn-cxx prerequisites.
|
||||
To build ndn-cxx from source, one must first install a C++ compiler and all necessary
|
||||
development tools and libraries:
|
||||
|
||||
- OS X / macOS
|
||||
|
||||
Install Xcode from AppStore or at least Command Line Tools (``xcode-select --install``)
|
||||
|
||||
* When using MacPorts
|
||||
|
||||
In a terminal, enter::
|
||||
|
||||
sudo port install pkgconfig boost sqlite3 openssl
|
||||
|
||||
* When using Homebrew
|
||||
|
||||
In a terminal, enter::
|
||||
|
||||
brew install boost openssl pkg-config
|
||||
|
||||
.. note::
|
||||
|
||||
If a major OS upgrade is performed after installing dependencies with
|
||||
MacPorts or Homebrew, remember to reinstall all packages.
|
||||
|
||||
- Ubuntu
|
||||
- On **Ubuntu**
|
||||
|
||||
In a terminal, enter::
|
||||
|
||||
sudo apt-get install build-essential libsqlite3-dev libboost-all-dev libssl-dev
|
||||
sudo apt install g++ pkg-config python3-minimal libboost-all-dev libssl-dev libsqlite3-dev
|
||||
|
||||
- Fedora
|
||||
- On **CentOS** and **Fedora**
|
||||
|
||||
In a terminal, enter::
|
||||
|
||||
sudo yum install gcc-g++ git
|
||||
sudo yum install sqlite-devel boost-devel openssl-devel
|
||||
sudo dnf install gcc-c++ pkgconf-pkg-config python3 boost-devel openssl-devel sqlite-devel
|
||||
|
||||
Optional:
|
||||
~~~~~~~~~
|
||||
- On **macOS**
|
||||
|
||||
To build tutorials, manpages, and API documentation the following
|
||||
dependencies need to be installed:
|
||||
* Install either Xcode (from the App Store) or the Command Line Tools
|
||||
(with ``xcode-select --install``)
|
||||
|
||||
- ``doxygen``
|
||||
- ``graphviz``
|
||||
- ``python-sphinx`` and sphinx extensions ``sphinxcontrib-doxylink``,
|
||||
``sphinxcontrib-googleanalytics``
|
||||
* If using Homebrew (recommended), enter the following in a terminal::
|
||||
|
||||
The following lists steps for common platforms to install these prerequisites:
|
||||
brew install boost openssl pkg-config
|
||||
|
||||
- On OS X / macOS with MacPorts::
|
||||
.. warning::
|
||||
|
||||
sudo port install doxygen graphviz py27-sphinx sphinx_select
|
||||
sudo port select sphinx py27-sphinx
|
||||
If a major OS upgrade is performed after installing the dependencies
|
||||
with Homebrew, remember to reinstall all packages.
|
||||
|
||||
# Install sphinx extensions
|
||||
sudo port install py27-pip
|
||||
sudo port select pip pip27
|
||||
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
|
||||
- On **FreeBSD**
|
||||
|
||||
- On Ubuntu::
|
||||
In a terminal, enter::
|
||||
|
||||
sudo apt-get install doxygen graphviz python-sphinx python-pip
|
||||
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
|
||||
sudo pkg install pkgconf python3 boost-libs openssl sqlite3
|
||||
|
||||
- On Fedora::
|
||||
Optional
|
||||
~~~~~~~~
|
||||
|
||||
sudo yum install doxygen graphviz python-sphinx
|
||||
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
|
||||
To build tutorials, manpages, and API documentation the following additional dependencies
|
||||
need to be installed:
|
||||
|
||||
.. _build:
|
||||
- doxygen
|
||||
- graphviz
|
||||
- sphinx >= 1.3
|
||||
- sphinxcontrib-doxylink
|
||||
|
||||
The following lists the steps to install these prerequisites on various common platforms.
|
||||
|
||||
- On **Ubuntu**:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
sudo apt install doxygen graphviz python3-pip
|
||||
sudo pip3 install sphinx sphinxcontrib-doxylink
|
||||
|
||||
- On **CentOS** and **Fedora**:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
sudo dnf config-manager --enable PowerTools # on CentOS only
|
||||
sudo dnf install doxygen graphviz python3-pip
|
||||
pip3 install --user sphinx sphinxcontrib-doxylink
|
||||
|
||||
- On **macOS**:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
brew install doxygen graphviz
|
||||
sudo pip install sphinx sphinxcontrib-doxylink
|
||||
|
||||
- On **FreeBSD**:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
sudo pkg install doxygen graphviz py37-sphinx
|
||||
|
||||
Build
|
||||
-----
|
||||
|
||||
(These are instructions to build ndn-cxx. To do development of ndn-cxx
|
||||
code and update the build system, see Development.)
|
||||
.. note::
|
||||
These are instructions for regular builds of ndn-cxx (release mode). If you are
|
||||
planning to develop the ndn-cxx code itself, you should do a :ref:`Development build`.
|
||||
|
||||
To build in a terminal, change directory to the ndn-cxx root. Enter:
|
||||
To build in a terminal, change directory to the ndn-cxx root, then enter:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure
|
||||
./waf configure # on CentOS, add --without-pch
|
||||
./waf
|
||||
sudo ./waf install
|
||||
|
||||
By default, only the shared version of ndn-cxx library is built. To build the static library,
|
||||
use ``--enable-static`` option for ``./waf configure`` command. For example::
|
||||
By default, only the shared variant of the ndn-cxx library will be built. To build the
|
||||
static library, pass ``--enable-static`` to the ``./waf configure`` command:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --enable-static
|
||||
|
||||
To disable build of the shared library and build only the static library, use additional
|
||||
``--disable-shared`` option. Note that at least one version of the library needs to be
|
||||
enabled.
|
||||
To disable the build of the shared library and build only the static library, use the
|
||||
additional ``--disable-shared`` option. Note that at least one variant of the library
|
||||
needs to be enabled.
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --enable-static --disable-shared
|
||||
|
||||
On Linux, it is necessary to run the following command after the shared library has
|
||||
been installed:
|
||||
|
||||
After the shared library is built and installed, some systems require additional actions.
|
||||
.. code-block:: sh
|
||||
|
||||
- on Linux::
|
||||
sudo ldconfig
|
||||
|
||||
sudo ldconfig
|
||||
.. note::
|
||||
When the library is installed in a non-standard path (in general: not in ``/usr/lib``
|
||||
or ``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
|
||||
additional actions may be necessary.
|
||||
|
||||
- on FreeBSD::
|
||||
The installation path should be added to ``/etc/ld.so.conf`` (or in
|
||||
``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example:
|
||||
|
||||
sudo ldconfig -m
|
||||
.. code-block:: sh
|
||||
|
||||
.. note::
|
||||
When library is installed in a non-standard path (in general: not in ``/usr/lib`` or
|
||||
``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
|
||||
additional actions may be necessary.
|
||||
echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
|
||||
|
||||
The installation path should be added to ``/etc/ld.so.conf`` (or in
|
||||
``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example::
|
||||
Alternatively, the ``LD_LIBRARY_PATH`` environment variable can be set to point to
|
||||
the installation directory of the shared library:
|
||||
|
||||
echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
|
||||
.. code-block:: sh
|
||||
|
||||
Alternatively, ``LD_LIBRARY_PATH`` environment variable should be set to the location of
|
||||
the library::
|
||||
export LD_LIBRARY_PATH=/usr/local/lib
|
||||
|
||||
export LD_LIBRARY_PATH=/usr/local/lib
|
||||
The ``./waf install`` command installs the following files:
|
||||
|
||||
This builds and installs the following items:
|
||||
|
||||
- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled)
|
||||
- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled).
|
||||
- ``<LIBPATH>/libndn-cxx.so``, ``<LIBPATH>/libndn-cxx.so.<VERSION>`` (on Linux),
|
||||
``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on OS X):
|
||||
shared NDN C++ library (if enabled)
|
||||
- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all
|
||||
neccessary flags to build against the library. For example, if
|
||||
pkgconfig or pkgconf package is installed and ``PKG_CONFIG_PATH`` is
|
||||
configured properly (or ``<LIBPATH>/pkgconfig`` is a default path),
|
||||
``pkgconfig --libs --clflags libndn-cxx`` will return all necessary
|
||||
compile and link flags for the library.
|
||||
- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates
|
||||
- ``<BINPATH>/ndnsec-*``: convenience scripts for ``ndnsec`` tools
|
||||
``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on macOS):
|
||||
shared NDN C++ library (if enabled).
|
||||
- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all necessary flags to
|
||||
build against the library. For example, if the ``pkg-config`` or ``pkgconf-pkg-config``
|
||||
package is installed and ``PKG_CONFIG_PATH`` is configured properly (or if
|
||||
``<LIBPATH>/pkgconfig`` is a default search path), the command ``pkg-config --cflags
|
||||
--libs libndn-cxx`` will return all necessary compile and link flags for the library.
|
||||
- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates.
|
||||
- ``<BINPATH>/ndnsec-*``: convenience aliases for ``ndnsec`` tools.
|
||||
|
||||
If configured with tests: ``./waf configure --with-tests``), the above
|
||||
commands will also produce:
|
||||
If configured with tests (``./waf configure --with-tests``), the above commands
|
||||
will also produce:
|
||||
|
||||
- ``build/unit-tests``: A unit test binary for the library
|
||||
- ``build/unit-tests``: a unit test binary for the library.
|
||||
|
||||
1.5GB available memory per CPU core is necessary for efficient compilation.
|
||||
On a multi-core machine with less than 1.5GB available memory per CPU core,
|
||||
limit the objects being compiled in parallel with ``./waf -jN`` where N is the amount
|
||||
of available memory divided by 1.5GB (eg. ``./waf -j1`` for 1.5GB memory),
|
||||
which could usually avoid memory thrashing and result in faster compilation.
|
||||
1.5 GB available memory per CPU core is necessary for efficient compilation. On a
|
||||
multi-core machine with less than 1.5 GB available memory per CPU core, limit the
|
||||
objects being compiled in parallel with ``./waf -jN``, where N is the amount of
|
||||
available memory divided by 1.5 GB (e.g., ``./waf -j2`` for 3 GB of memory). This
|
||||
should avoid memory thrashing and result in faster compilation.
|
||||
|
||||
Build with examples
|
||||
-------------------
|
||||
|
||||
By default, examples in ``examples/`` are not build. To enable them, use
|
||||
``--with-examples`` configure option:
|
||||
By default, the examples in the ``examples/`` directory will not be built. To enable
|
||||
them, pass ``--with-examples`` during the configuration step:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --with-examples
|
||||
./waf configure --with-examples # on CentOS, add --without-pch
|
||||
./waf
|
||||
sudo ./waf install
|
||||
sudo ldconfig # on Linux only
|
||||
|
||||
:ref:`Additional step <build>`:
|
||||
To run the examples:
|
||||
|
||||
- on Linux::
|
||||
|
||||
sudo ldconfig
|
||||
|
||||
- on FreeBSD::
|
||||
|
||||
sudo ldconfig -m
|
||||
|
||||
To run examples:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
# trivial producer app
|
||||
./build/examples/producer
|
||||
@@ -223,107 +220,89 @@ To run examples:
|
||||
# trivial consumer app with timers
|
||||
./build/examples/consumer-with-timer
|
||||
|
||||
If you want to test out a sample application, just create a ``.cpp`` file in ``examples/``
|
||||
folder and it will be compiled on the next run on ``./waf``. For example:
|
||||
If you want to make a new sample application, just create a ``.cpp`` file inside the
|
||||
``examples/`` directory and it will be compiled during the next run of ``./waf``:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
cp examples/consumer.cpp examples/my-new-consumer-app.cpp
|
||||
cp examples/consumer.cpp examples/my-new-app.cpp
|
||||
... # edit examples/my-new-app.cpp with your preferred editor
|
||||
./waf
|
||||
sudo ./waf install
|
||||
./build/examples/my-new-consumer-app
|
||||
|
||||
sudo ldconfig # on Linux only
|
||||
./build/examples/my-new-app
|
||||
|
||||
Debug symbols
|
||||
~~~~~~~~~~~~~
|
||||
-------------
|
||||
|
||||
The default compiler flags enable debug symbols to be included in binaries (i.e., ``-g``
|
||||
flag for ``./waf configure`` and ``-g3`` for ``./waf configure --debug``). This
|
||||
potentially allows more meaningful debugging information if your application crashes.
|
||||
The default compiler flags include debug symbols in binaries. This should provide
|
||||
more meaningful debugging information if ndn-cxx or your application crashes.
|
||||
|
||||
If it is undesirable, default flags can be easily overridden:
|
||||
If this is not desired, the default flags can be overridden to disable debug symbols.
|
||||
The following example shows how to completely disable debug symbols and configure
|
||||
ndn-cxx to be installed into ``/usr`` with configuration in the ``/etc`` directory.
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
CXXFLAGS="-O2" ./waf configure --prefix=/usr --sysconfdir=/etc
|
||||
./waf
|
||||
sudo ./waf install
|
||||
|
||||
:ref:`Additional step <build>`:
|
||||
Customizing the compiler
|
||||
------------------------
|
||||
|
||||
- on Linux::
|
||||
To build ndn-cxx with a different compiler (rather than the platform default), set the
|
||||
``CXX`` environment variable to point to the compiler binary. For example, to build
|
||||
with clang on Linux, use the following:
|
||||
|
||||
sudo ldconfig
|
||||
.. code-block:: sh
|
||||
|
||||
- on FreeBSD::
|
||||
CXX=clang++ ./waf configure
|
||||
|
||||
sudo ldconfig -m
|
||||
Building the documentation
|
||||
--------------------------
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
Tutorials and API documentation can be built using the following commands:
|
||||
|
||||
ndn-cxx tutorials and API documentation can be built using the following
|
||||
commands:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
# Full set of documentation (tutorials + API) in build/docs
|
||||
./waf docs
|
||||
|
||||
# Only tutorials in `build/docs`
|
||||
# Only tutorials in build/docs
|
||||
./waf sphinx
|
||||
|
||||
# Only API docs in `build/docs/doxygen`
|
||||
# Only API docs in build/docs/doxygen
|
||||
./waf doxygen
|
||||
|
||||
Manpages are automatically created and installed during the normal build
|
||||
process (e.g., during ``./waf`` and ``./waf install``), if
|
||||
``python-sphinx`` module is detected during ``./waf configure`` stage.
|
||||
By default, manpages are installed into ``${PREFIX}/share/man`` (where
|
||||
default value for ``PREFIX`` is ``/usr/local``). This location can be
|
||||
changed during ``./waf configure`` stage using ``--prefix``,
|
||||
``--datarootdir``, or ``--mandir`` options.
|
||||
If ``sphinx-build`` is detected during ``./waf configure``, manpages will automatically
|
||||
be built and installed during the normal build process (i.e., during ``./waf`` and
|
||||
``./waf install``). By default, manpages will be installed into ``${PREFIX}/share/man``
|
||||
(the default value for ``PREFIX`` is ``/usr/local``). This location can be changed
|
||||
during the ``./waf configure`` stage using the ``--prefix``, ``--datarootdir``, or
|
||||
``--mandir`` options.
|
||||
|
||||
For more details, refer to ``./waf --help``.
|
||||
For further details, please refer to ``./waf --help``.
|
||||
|
||||
Development Build
|
||||
.. _Development build:
|
||||
|
||||
Development build
|
||||
-----------------
|
||||
|
||||
The following is the suggested configure commands for development build.
|
||||
The following is the suggested build procedure for development builds:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --debug --with-tests
|
||||
./waf configure --debug --with-tests # on CentOS, add --without-pch
|
||||
./waf
|
||||
sudo ./waf install
|
||||
sudo ldconfig # on Linux only
|
||||
|
||||
:ref:`Additional step <build>`:
|
||||
In a development build, most compiler optimizations will be disabled and all warnings
|
||||
will be treated as errors. This default behavior can be overridden by setting the
|
||||
``CXXFLAGS`` environment variable before running ``./waf configure``, for example:
|
||||
|
||||
- on Linux::
|
||||
|
||||
sudo ldconfig
|
||||
|
||||
- on FreeBSD::
|
||||
|
||||
sudo ldconfig -m
|
||||
|
||||
In the development build all compiler optimizations are disabled by
|
||||
default and all warnings are treated as error. The default behavior can
|
||||
be overridden by setting ``CXXFLAGS`` environment variable before
|
||||
running ``./waf configure``:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
CXXFLAGS="-O1 -g3" ./waf configure --debug --with-tests
|
||||
...
|
||||
|
||||
Customize Compiler
|
||||
------------------
|
||||
|
||||
To choose a custom C++ compiler for building ndn-cxx, set ``CXX`` environment
|
||||
variable to point to the compiler binary. For example, to build with clang on
|
||||
Linux, use the following:
|
||||
|
||||
::
|
||||
|
||||
CXX=clang++ ./waf configure
|
||||
@@ -1,22 +0,0 @@
|
||||
ndn-cxx overview
|
||||
================
|
||||
|
||||
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
|
||||
used to implement various NDN applications. The library is currently being used as part of
|
||||
the following projects:
|
||||
|
||||
- `NFD - NDN Forwarding Daemon <http://named-data.net/doc/NFD>`__
|
||||
- `NLSR - Named-data Link-State Routing
|
||||
protocol <https://github.com/named-data/NLSR>`__
|
||||
- `repo-ng - Next generation of NDN
|
||||
repository <https://github.com/named-data/repo-ng>`__
|
||||
- `ChronoChat - Multi-user NDN chat
|
||||
application <https://github.com/named-data/ChronoChat>`__
|
||||
- `ChronoSync - Sync library for multiuser realtime applications for
|
||||
NDN <https://github.com/named-data/ChronoSync>`__
|
||||
- `ndn-tools - NDN Essential Tools <https://github.com/named-data/ndn-tools>`__
|
||||
- `ndn-traffic-generator - Traffic Generator For
|
||||
NDN <https://github.com/named-data/ndn-traffic-generator>`__
|
||||
|
||||
Please submit any bugs or issues to the `ndn-cxx issue tracker
|
||||
<https://redmine.named-data.net/projects/ndn-cxx/issues>`__.
|
||||
+25
-28
@@ -7,7 +7,7 @@ Based on
|
||||
The original document is available at `<http://geosoft.no/development/cppstyle.html>`_
|
||||
|
||||
* NDN Platform "C++, C, C#, Java and JavaScript Code Guidelines".
|
||||
The original document available at `<http://named-data.net/codebase/platform/documentation/ndn-platform-development-guidelines/cpp-code-guidelines/>`_
|
||||
The original document available at `<https://named-data.net/codebase/platform/documentation/ndn-platform-development-guidelines/cpp-code-guidelines/>`_
|
||||
|
||||
1. Code layout
|
||||
--------------
|
||||
@@ -432,7 +432,6 @@ extension ``.cpp``
|
||||
|
||||
my-class.hpp, my-class.cpp
|
||||
|
||||
|
||||
2.2. Names representing types must be written in English in mixed case starting with upper case.
|
||||
|
||||
.. code-block:: c++
|
||||
@@ -544,7 +543,6 @@ written in mixed case starting with lower case.
|
||||
static std::string s_name;
|
||||
};
|
||||
|
||||
|
||||
2.11. Variables with a large scope should have long (explicit) names, variables with a small
|
||||
scope can have short names.
|
||||
|
||||
@@ -612,7 +610,6 @@ scope can have short names.
|
||||
The notation is taken from mathematics where it is an established convention for
|
||||
indicating a number of objects.
|
||||
|
||||
|
||||
2.18. The suffix ``Num`` or ``No`` should be used for variables representing an entity number.
|
||||
|
||||
.. code-block:: c++
|
||||
@@ -672,9 +669,9 @@ notation).
|
||||
2.24. Exceptions can be suffixed with either ``Exception`` (e.g., ``SecurityException``) or
|
||||
``Error`` (e.g., ``SecurityError``).
|
||||
|
||||
The recommended method is to declare exception class ``Exception`` or ``Error`` as an
|
||||
inner class, from which the exception is thrown. For example, when declaring class
|
||||
``Foo`` that can throw errors, one can write the following:
|
||||
The recommended method is to declare an exception class ``Exception`` or ``Error`` as
|
||||
a nested type inside the class from which the exception is thrown. For example, when
|
||||
defining a class ``Foo`` that can throw errors, one can write the following:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -689,7 +686,7 @@ notation).
|
||||
// You can inherit constructors from std::runtime_error like this:
|
||||
using std::runtime_error::runtime_error;
|
||||
|
||||
// Additional constructors, if desired, can be declared like this:
|
||||
// Additional constructors, if desired, can be declared as usual:
|
||||
Error(const std::string& what, const std::exception& inner)
|
||||
: std::runtime_error(what + ": " + inner.what())
|
||||
{
|
||||
@@ -701,7 +698,6 @@ notation).
|
||||
hierarchy, then child classes should should define their own ``Error`` or
|
||||
``Exception`` classes that are inherited from the parent's Error class.
|
||||
|
||||
|
||||
2.25. Functions (methods returning something) should be named after what they return and
|
||||
procedures (void methods) after what they do.
|
||||
|
||||
@@ -717,8 +713,8 @@ not in the primary processing path.
|
||||
|
||||
3.2. Header files must contain an include guard.
|
||||
|
||||
For example, header file located in ``module/class-name.hpp`` or in
|
||||
``src/module/class-name.hpp`` should have header guard in the following form:
|
||||
For example, a header file named ``module/class-name.hpp`` or
|
||||
``src/module/class-name.hpp`` should have a header guard in the following form:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -727,39 +723,43 @@ not in the primary processing path.
|
||||
...
|
||||
#endif // APP_MODULE_CLASS_NAME_HPP
|
||||
|
||||
The name should follow the location of the file inside the source tree and prevents
|
||||
naming conflicts. Header guard should be prefixed with the application/library name
|
||||
to avoid conflicts with other packaged and libraries.
|
||||
The macro name should reflect the path of the header file relative to the root of the
|
||||
source tree, in order to prevent naming conflicts. The header guard should be prefixed
|
||||
with the application/library name to avoid conflicts with other packages and libraries.
|
||||
|
||||
3.3. Header files which are in the same source distribution should be included in
|
||||
``"quotes"``, if possible with a path relative to the source file. Header files for
|
||||
system and other external libraries should be included in ``<angle brackets>``.
|
||||
3.3. Include directives for system headers and other external libraries should use
|
||||
``<angle brackets>``. Header files in the same source code repository should be included
|
||||
using ``"quotes"``.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "ndn-cxx/util/random.hpp"
|
||||
|
||||
#include <string>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "util/random.hpp"
|
||||
All of a project's header files should be included with their path relative to
|
||||
the project's source directory. The use of UNIX directory shortcuts ``.``
|
||||
(the current directory) and ``..`` (the parent directory) is discouraged.
|
||||
|
||||
3.4. Include statements should be grouped. Same-project headers should be included first.
|
||||
Leave an empty line between groups of include statements. Sort alphabetically within a group.
|
||||
For example, the include section of ``ndn-cxx/foo/bar.cpp`` may look like this:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "detail/pending-interest.hpp"
|
||||
#include "util/random.hpp"
|
||||
#include "ndn-cxx/impl/pending-interest.hpp"
|
||||
#include "ndn-cxx/util/random.hpp"
|
||||
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
|
||||
3.5. Types that are local to one file only can be declared inside that file.
|
||||
|
||||
|
||||
3.6. Implicit conversion is generally allowed.
|
||||
|
||||
Implicit conversion between integer and floating point numbers can cause problems and
|
||||
@@ -773,7 +773,6 @@ Leave an empty line between groups of include statements. Sort alphabetically wi
|
||||
``const_cast`` instead where appropriate. Use ``static_pointer_cast``,
|
||||
``dynamic_pointer_cast``, ``const_pointer_cast`` when dealing with ``shared_ptr``.
|
||||
|
||||
|
||||
3.7. Variables should be initialized where they are declared.
|
||||
|
||||
This ensures that variables are valid at any time. Sometimes it is impossible to
|
||||
@@ -801,7 +800,6 @@ Leave an empty line between groups of include statements. Sort alphabetically wi
|
||||
* When the class is used only inside the compilation unit, e.g., when implementing pImpl
|
||||
idiom (aka Bridge pattern) or similar cases.
|
||||
|
||||
|
||||
3.9. C++ pointers and references should have their reference symbol next to the type rather
|
||||
than to the name.
|
||||
|
||||
@@ -1086,7 +1084,6 @@ member function or a virtual destructor.
|
||||
};
|
||||
|
||||
3.31. The recommended way to throw an exception derived from ``std::exception`` is to use
|
||||
the ``BOOST_THROW_EXCEPTION``
|
||||
`macro <https://www.boost.org/doc/libs/1_58_0/libs/exception/doc/BOOST_THROW_EXCEPTION.html>`__.
|
||||
Exceptions thrown using this macro will be augmented with additional diagnostic information,
|
||||
including file name, line number, and function name from where the exception was thrown.
|
||||
``NDN_THROW`` or one of the other ``NDN_THROW_*`` macros.
|
||||
Exceptions thrown using these macros will be augmented with additional diagnostic information,
|
||||
including the file name, line number, and function name from which the exception was thrown.
|
||||
+83
-203
@@ -1,37 +1,51 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# NFD - Named Data Networking Forwarding Daemon documentation build configuration file, created by
|
||||
# sphinx-quickstart on Sun Apr 6 19:58:22 2014.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
# This file only contains a selection of the most common options. For a full
|
||||
# list see the documentation:
|
||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
sys.path.insert(0, os.path.abspath('.'))
|
||||
#
|
||||
# import os
|
||||
import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = u'ndn-cxx: NDN C++ library with eXperimental eXtensions'
|
||||
copyright = u'Copyright © 2013-2020 Regents of the University of California.'
|
||||
author = u'Named Data Networking Project'
|
||||
|
||||
# The short X.Y version.
|
||||
#version = ''
|
||||
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
#release = ''
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%Y-%m-%d'
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#needs_sphinx = '1.0'
|
||||
#
|
||||
needs_sphinx = '1.3'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.extlinks',
|
||||
'sphinx.ext.todo',
|
||||
'redmine_issue',
|
||||
]
|
||||
|
||||
def addExtensionIfExists(extension):
|
||||
@@ -39,240 +53,106 @@ def addExtensionIfExists(extension):
|
||||
__import__(extension)
|
||||
extensions.append(extension)
|
||||
except ImportError:
|
||||
sys.stderr.write("Extension '%s' in not available. "
|
||||
sys.stderr.write("Extension '%s' not found. "
|
||||
"Some documentation may not build correctly.\n" % extension)
|
||||
sys.stderr.write("To install, use \n"
|
||||
" sudo pip install %s\n" % extension.replace('.', '-'))
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
addExtensionIfExists('sphinxcontrib.doxylink')
|
||||
|
||||
# sphinxcontrib.googleanalytics is currently not working with the latest version of Sphinx
|
||||
# if os.getenv('GOOGLE_ANALYTICS', None):
|
||||
# addExtensionIfExists('sphinxcontrib.googleanalytics')
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The encoding of source files.
|
||||
#source_encoding = 'utf-8-sig'
|
||||
addExtensionIfExists('sphinxcontrib.doxylink')
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'ndn-cxx: NDN C++ library with eXperimental eXtensions'
|
||||
copyright = u'Copyright (c) 2013-2017 Regents of the University of California.'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = []
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
#default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
#keep_warnings = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
# html_theme = 'default'
|
||||
#
|
||||
html_theme = 'named_data_theme'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
html_theme_path = ['./']
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
html_theme_path = ['.']
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#html_extra_path = []
|
||||
html_copy_source = False
|
||||
html_show_sourcelink = False
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
#html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
html_file_suffix = ".html"
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'ndn-cxx-docs'
|
||||
# Disable syntax highlighting of code blocks by default.
|
||||
highlight_language = 'none'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
# -- Options for LaTeX output ------------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
('index', 'ndn-cxx-docs.tex', u'NDN C++ library with eXperimental eXtensions',
|
||||
u'Named Data Networking Project', 'manual'),
|
||||
('index', 'ndn-cxx-docs.tex', u'NDN C++ library with eXperimental eXtensions',
|
||||
author, 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
# -- Options for manual page output ------------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
('manpages/ndnsec', 'ndnsec', u'NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-dump', 'ndnsec-cert-dump', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-gen', 'ndnsec-cert-gen', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-install', 'ndnsec-cert-instal', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-delete', 'ndnsec-delete', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-export', 'ndnsec-export',
|
||||
'export a certificate and its private key to a file', None, 1),
|
||||
('manpages/ndnsec-get-default', 'ndnsec-get-default', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-import', 'ndnsec-import',
|
||||
'import a certificate and its private key from a file', None, 1),
|
||||
('manpages/ndnsec-key-gen', 'ndnsec-key-gen', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-list', 'ndnsec-list', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-set-default', 'ndnsec-set-default', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-sign-req', 'ndnsec-sign-req', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-unlock-tpm', 'ndnsec-unlock-tpm', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndn-client.conf', 'ndn-client.conf', 'Configuration file for NDN platform', None, 5),
|
||||
('manpages/ndn-log', 'ndn-log', 'ndn-cxx logging', None, 7),
|
||||
('manpages/ndnsec', 'ndnsec', 'NDN security toolkit', None, 1),
|
||||
('manpages/ndnsec-cert-dump', 'ndnsec-cert-dump', 'export an NDN certificate', None, 1),
|
||||
('manpages/ndnsec-cert-gen', 'ndnsec-cert-gen', 'create an NDN certificate for an identity', None, 1),
|
||||
('manpages/ndnsec-cert-install', 'ndnsec-cert-install', 'import an NDN certificate from a file', None, 1),
|
||||
('manpages/ndnsec-delete', 'ndnsec-delete', 'delete an NDN identity, key, or certificate', None, 1),
|
||||
('manpages/ndnsec-export', 'ndnsec-export', 'export an NDN certificate and its private key to a file', None, 1),
|
||||
('manpages/ndnsec-get-default', 'ndnsec-get-default', 'show the default NDN identity, key, and certificate for the current user', None, 1),
|
||||
('manpages/ndnsec-import', 'ndnsec-import', 'import an NDN certificate and its private key from a file', None, 1),
|
||||
('manpages/ndnsec-key-gen', 'ndnsec-key-gen', 'generate an NDN key for an identity', None, 1),
|
||||
('manpages/ndnsec-list', 'ndnsec-list', 'list all known NDN identities, keys, and certificates', None, 1),
|
||||
('manpages/ndnsec-set-default', 'ndnsec-set-default', 'change the default NDN identity, key, or certificate for the current user', None, 1),
|
||||
('manpages/ndnsec-sign-req', 'ndnsec-sign-req', 'generate an NDN certificate signing request', None, 1),
|
||||
('manpages/ndnsec-unlock-tpm', 'ndnsec-unlock-tpm', 'unlock the TPM', None, 1),
|
||||
('manpages/ndn-client.conf', 'ndn-client.conf', 'configuration file for NDN applications', None, 5),
|
||||
('manpages/ndn-log', 'ndn-log', 'ndn-cxx logging', None, 7),
|
||||
]
|
||||
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
man_show_urls = True
|
||||
#man_show_urls = True
|
||||
|
||||
|
||||
# ---- Custom options --------
|
||||
# -- Custom options ----------------------------------------------------------
|
||||
|
||||
doxylink = {
|
||||
'ndn-cxx' : ('ndn-cxx.tag', 'doxygen/'),
|
||||
'ndn-cxx': ('ndn-cxx.tag', 'doxygen/'),
|
||||
}
|
||||
|
||||
if os.getenv('GOOGLE_ANALYTICS', None):
|
||||
googleanalytics_id = os.environ['GOOGLE_ANALYTICS']
|
||||
googleanalytics_enabled = True
|
||||
|
||||
# exclude_patterns = ['RELEASE_NOTES.rst']
|
||||
|
||||
redmine_project_url = "https://redmine.named-data.net/"
|
||||
extlinks = {
|
||||
'issue': ('https://redmine.named-data.net/issues/%s', 'issue #'),
|
||||
}
|
||||
+9
-24
@@ -140,7 +140,7 @@ INLINE_INHERITED_MEMB = YES
|
||||
# shortest path that makes the file name unique will be used
|
||||
# The default value is: YES.
|
||||
|
||||
FULL_PATH_NAMES = NO
|
||||
FULL_PATH_NAMES = YES
|
||||
|
||||
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
|
||||
# Stripping is only done if one of the specified strings matches the left-hand
|
||||
@@ -161,7 +161,7 @@ STRIP_FROM_PATH =
|
||||
# specify the list of include paths that are normally passed to the compiler
|
||||
# using the -I flag.
|
||||
|
||||
STRIP_FROM_INC_PATH =
|
||||
STRIP_FROM_INC_PATH = ..
|
||||
|
||||
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
|
||||
# less readable) file names. This can be useful is your file systems doesn't
|
||||
@@ -780,7 +780,7 @@ WARN_LOGFILE =
|
||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||
# Note: If this tag is empty the current directory is searched.
|
||||
|
||||
INPUT = src
|
||||
INPUT = ndn-cxx
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
@@ -836,7 +836,7 @@ EXCLUDE_SYMLINKS = NO
|
||||
# Note that the wildcards are matched against the file with absolute path, so to
|
||||
# exclude all test directories for example use the pattern */test/*
|
||||
|
||||
EXCLUDE_PATTERNS = */src/detail/* */src/*/detail/*
|
||||
EXCLUDE_PATTERNS = */ndn-cxx/impl/* */ndn-cxx/*/impl/* */ndn-cxx/util/nonstd/*
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
@@ -2031,7 +2031,7 @@ SEARCH_INCLUDES = YES
|
||||
# preprocessor.
|
||||
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
|
||||
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_PATH = ..
|
||||
|
||||
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
|
||||
# patterns (like *.h and *.hpp) to filter out the header-files in the
|
||||
@@ -2058,10 +2058,10 @@ PREDEFINED = DOXYGEN \
|
||||
NDN_LOG_MEMBER_DECL_SPECIALIZED(x)= \
|
||||
NDN_LOG_MEMBER_INIT(x,y)= \
|
||||
NDN_LOG_MEMBER_INIT_SPECIALIZED(x,y)= \
|
||||
PUBLIC_WITH_TESTS_ELSE_PROTECTED=protected \
|
||||
PUBLIC_WITH_TESTS_ELSE_PRIVATE=private \
|
||||
PROTECTED_WITH_TESTS_ELSE_PRIVATE=private \
|
||||
VIRTUAL_WITH_TESTS=
|
||||
NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PROTECTED=protected \
|
||||
NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PRIVATE=private \
|
||||
NDN_CXX_PROTECTED_WITH_TESTS_ELSE_PRIVATE=private \
|
||||
NDN_CXX_VIRTUAL_WITH_TESTS=
|
||||
|
||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
|
||||
# tag can be used to specify a list of macro names that should be expanded. The
|
||||
@@ -2128,12 +2128,6 @@ EXTERNAL_GROUPS = YES
|
||||
|
||||
EXTERNAL_PAGES = YES
|
||||
|
||||
# The PERL_PATH should be the absolute path and name of the perl script
|
||||
# interpreter (i.e. the result of 'which perl').
|
||||
# The default file (with absolute path) is: /usr/bin/perl.
|
||||
|
||||
PERL_PATH = /usr/bin/perl
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
@@ -2147,15 +2141,6 @@ PERL_PATH = /usr/bin/perl
|
||||
|
||||
CLASS_DIAGRAMS = YES
|
||||
|
||||
# You can define message sequence charts within doxygen comments using the \msc
|
||||
# command. Doxygen will then run the mscgen tool (see:
|
||||
# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
|
||||
# documentation. The MSCGEN_PATH tag allows you to specify the directory where
|
||||
# the mscgen tool resides. If left empty the tool is assumed to be found in the
|
||||
# default search path.
|
||||
|
||||
MSCGEN_PATH =
|
||||
|
||||
# You can include diagrams made with dia in doxygen documentation. Doxygen will
|
||||
# then run dia to produce the diagram and insert it in the documentation. The
|
||||
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
|
||||
|
||||
+9
-12
@@ -5,7 +5,7 @@ Trivial applications
|
||||
|
||||
To successfully run the following examples, please make sure that NFD is properly
|
||||
configured and running. For more information about NFD, refer to `NFD's official
|
||||
homepage <http://named-data.net/doc/NFD/>`_.
|
||||
homepage <https://named-data.net/doc/NFD/>`_.
|
||||
|
||||
Trivial consumer
|
||||
----------------
|
||||
@@ -18,8 +18,7 @@ callbacks to be called when Data/Nack is retrieved or Interest times out.
|
||||
.. literalinclude:: ../examples/consumer.cpp
|
||||
:language: c++
|
||||
:linenos:
|
||||
:emphasize-lines: 24-27,39,43-47,51,58,75
|
||||
|
||||
:emphasize-lines: 39-45,48,59,65,71
|
||||
|
||||
Trivial producer
|
||||
----------------
|
||||
@@ -42,8 +41,7 @@ using :ndn-cxx:`Face::put` method.
|
||||
.. literalinclude:: ../examples/producer.cpp
|
||||
:language: c++
|
||||
:linenos:
|
||||
:emphasize-lines: 42,55-58,61,64,67,70,76
|
||||
|
||||
:emphasize-lines: 41,50,57-59,62,70,74
|
||||
|
||||
Consumer that uses Scheduler
|
||||
----------------------------
|
||||
@@ -52,19 +50,18 @@ The following example demonstrates how to use :ndn-cxx:`Scheduler` to schedule a
|
||||
events for execution at specific points of time.
|
||||
|
||||
The library internally uses `boost::asio::io_service
|
||||
<https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/io_service.html>`_ to
|
||||
<https://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/io_service.html>`_ to
|
||||
implement fully asynchronous NDN operations (i.e., sending and receiving Interests and
|
||||
Data). In addition to network-related operations, ``boost::asio::io_service`` can be used
|
||||
to execute any arbitrary callback within the processing thread (run either explicitly via
|
||||
``io.run`` or implicitly via :ndn-cxx:`Face::processEvents` as in previous examples).
|
||||
:ndn-cxx:`Scheduler` is just a wrapper on top of ``boost::asio::io_service``,
|
||||
allowing simple interface to schedule tasks at specific times.
|
||||
``io_service::run()`` or implicitly via :ndn-cxx:`Face::processEvents` as in previous
|
||||
examples). :ndn-cxx:`Scheduler` is just a wrapper on top of ``io_service``, providing a
|
||||
simple interface to schedule tasks at specific times.
|
||||
|
||||
The highlighted lines in the example demonstrate all that is needed to express a second
|
||||
Interest approximately 2 seconds after the first one.
|
||||
Interest approximately 3 seconds after the first one.
|
||||
|
||||
.. literalinclude:: ../examples/consumer-with-timer.cpp
|
||||
:language: c++
|
||||
:linenos:
|
||||
:emphasize-lines: 39-40,51-55,59-60,62-63,108-109
|
||||
|
||||
:emphasize-lines: 39-40,56,62,93,106,114-116
|
||||
+19
-16
@@ -1,11 +1,22 @@
|
||||
ndn-cxx: NDN C++ library with eXperimental eXtensions
|
||||
=====================================================
|
||||
|
||||
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
|
||||
used to implement various NDN applications.
|
||||
**ndn-cxx** is a C++14 library implementing Named Data Networking (NDN) primitives
|
||||
that can be used to write various NDN applications. The library is currently being
|
||||
used by the following projects:
|
||||
|
||||
Please submit any bugs or issues to the `ndn-cxx issue tracker
|
||||
<https://redmine.named-data.net/projects/ndn-cxx/issues>`__.
|
||||
* `NFD - NDN Forwarding Daemon <https://github.com/named-data/NFD>`_
|
||||
* `NLSR - Named-data Link-State Routing protocol <https://github.com/named-data/NLSR>`_
|
||||
* `ndn-tools - Essential NDN command-line tools <https://github.com/named-data/ndn-tools>`_
|
||||
* `repo-ng - Next generation of NDN repository <https://github.com/named-data/repo-ng>`_
|
||||
* `ChronoSync - Sync library for multiuser realtime applications <https://github.com/named-data/ChronoSync>`_
|
||||
* `PSync - Partial and full synchronization library <https://github.com/named-data/PSync>`_
|
||||
* `ndn-traffic-generator - Traffic generator for NDN <https://github.com/named-data/ndn-traffic-generator>`_
|
||||
* `NAC - Name-based Access Control <https://github.com/named-data/name-based-access-control>`_
|
||||
* `NDNS - Domain Name Service for NDN <https://github.com/named-data/ndns>`_
|
||||
|
||||
Please submit any bugs or feature requests to the `ndn-cxx issue tracker
|
||||
<https://redmine.named-data.net/projects/ndn-cxx/issues>`_.
|
||||
|
||||
ndn-cxx Documentation
|
||||
---------------------
|
||||
@@ -14,7 +25,6 @@ ndn-cxx Documentation
|
||||
:hidden:
|
||||
:maxdepth: 3
|
||||
|
||||
README
|
||||
INSTALL
|
||||
examples
|
||||
tutorials
|
||||
@@ -29,16 +39,11 @@ ndn-cxx Documentation
|
||||
RELEASE_NOTES
|
||||
releases
|
||||
|
||||
- :doc:`README`
|
||||
|
||||
- :doc:`INSTALL`
|
||||
|
||||
- :doc:`examples`
|
||||
|
||||
- :doc:`tutorials`
|
||||
|
||||
+ `NDN Software Contributor's Guide <https://github.com/named-data/NFD/blob/master/CONTRIBUTING.md>`__ (guide for newcomers to the NDN community of software generally)
|
||||
|
||||
+ `NDN Software Contributor's Guide <https://github.com/named-data/.github/blob/master/CONTRIBUTING.md>`_ (guide for newcomers to the NDN community of software generally)
|
||||
+ :doc:`tutorials/utils-ndn-regex`
|
||||
+ :doc:`tutorials/security-validator-config`
|
||||
|
||||
@@ -51,18 +56,16 @@ ndn-cxx Documentation
|
||||
|
||||
- :doc:`manpages`
|
||||
|
||||
**Additional documentation**
|
||||
Additional Documentation
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- `API documentation (doxygen) <doxygen/annotated.html>`_
|
||||
|
||||
- :doc:`code-style`
|
||||
|
||||
- :doc:`RELEASE_NOTES`
|
||||
|
||||
- :doc:`releases`
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
ndn-cxx is an open source project licensed under LGPL 3.0 license. For more information about
|
||||
ndn-cxx is an open source project licensed under the LGPL version 3. For more information about
|
||||
the license, refer to `COPYING.md <https://github.com/named-data/ndn-cxx/blob/master/COPYING.md>`_.
|
||||
@@ -5,28 +5,31 @@ System configuration of NDN platform is specified in ``client.conf``.
|
||||
|
||||
The configuration file ``client.conf`` is looked up in several directories in the following order:
|
||||
|
||||
- ``$HOME/.ndn/``: user-specific settings
|
||||
- ``@SYSCONFDIR@/ndn/`` (``/usr/local/etc/ndn``, ``/opt/local/etc/ndn``, or other, depending how the
|
||||
library is configured): system-wide settings
|
||||
- ``$HOME/.ndn``: user-specific settings
|
||||
- ``SYSCONFDIR/ndn``: system-wide settings (where ``SYSCONFDIR`` can be ``/usr/local/etc``,
|
||||
``/opt/local/etc``, or other, depending on how the library is configured)
|
||||
- ``/etc/ndn``: default system-wide settings
|
||||
|
||||
Here is an example of ``client.conf`` for current ndn-cxx package:
|
||||
Here is an example of ``client.conf`` for the current ndn-cxx package:
|
||||
|
||||
.. literalinclude:: ../../client.conf.sample
|
||||
:language: ini
|
||||
|
||||
|
||||
NFD
|
||||
---
|
||||
|
||||
transport
|
||||
FaceUri for default connection toward local NDN forwarder. Only ``unix`` and ``tcp4`` FaceUris
|
||||
can be specified here.
|
||||
FaceUri for default connection toward local NDN forwarder. Only ``unix``, ``tcp``, ``tcp4``, and
|
||||
``tcp6`` FaceUris can be specified here.
|
||||
|
||||
By default, ``unix:///var/run/nfd.sock`` is used.
|
||||
By default, ``unix:///run/nfd.sock`` is used on Linux and ``unix:///var/run/nfd.sock`` is used on
|
||||
other platforms.
|
||||
|
||||
..note::
|
||||
.. note::
|
||||
This value can be overridden using the ``NDN_CLIENT_TRANSPORT`` environment variable.
|
||||
|
||||
|
||||
Key Management
|
||||
--------------
|
||||
|
||||
@@ -55,10 +58,10 @@ pib
|
||||
|
||||
rm -rf ~/.ndn/ndnsec-*
|
||||
|
||||
It's not recommended to share the same directory between machines, e.g. via NFS.
|
||||
It is not recommended to share the same directory between machines, e.g. via NFS.
|
||||
Simultaneous access from multiple machines may cause errors.
|
||||
|
||||
..note::
|
||||
.. note::
|
||||
This value can be overridden using the ``NDN_CLIENT_PIB`` environment variable.
|
||||
|
||||
tpm
|
||||
@@ -69,15 +72,15 @@ tpm
|
||||
|
||||
Possible values for ``[scheme]``:
|
||||
|
||||
* ``tpm-osx-keychain`` (default on OS X platform): secure storage of private keys in OS X
|
||||
* ``tpm-osx-keychain`` (default on macOS): secure storage of private keys in the macOS
|
||||
Keychain with OS-provided access restrictions.
|
||||
|
||||
``[location]`` parameter is ignored.
|
||||
|
||||
May not work for daemon applications, as user interaction may be required to access OS X
|
||||
Keychain.
|
||||
May not work for daemon applications, as user interaction may be required to access the
|
||||
macOS Keychain.
|
||||
|
||||
* ``tpm-file`` (default on all other platforms): file-based storage of private keys
|
||||
* ``tpm-file`` (default on all other platforms): file-based storage of private keys.
|
||||
|
||||
Possible values for ``[location]``:
|
||||
|
||||
@@ -90,11 +93,11 @@ tpm
|
||||
|
||||
tpm=tpm-file
|
||||
|
||||
**Change of ``tpm`` setting is only possible together with ``pib`` setting. Otherwise, an
|
||||
error will be generated during PIB/TPM access**
|
||||
**Changing the ``tpm`` setting is only possible together with ``pib`` setting. Otherwise,
|
||||
an error will be generated during PIB/TPM access.**
|
||||
|
||||
It's not recommended to share the same directory between machines, e.g. via NFS.
|
||||
It is not recommended to share the same directory between machines, e.g. via NFS.
|
||||
Simultaneous access from multiple machines may cause errors.
|
||||
|
||||
..note::
|
||||
.. note::
|
||||
This value can be overridden using the ``NDN_CLIENT_TPM`` environment variable.
|
||||
+36
-19
@@ -18,6 +18,11 @@ distinguishing prefixes (``ndn.``, ``sync.``, etc.), which can be specified when
|
||||
setting the environment variable. Wildcards can be used to enable logging for all
|
||||
modules (just ``*``) or all modules under a selected prefix (e.g., ``ndn.*``).
|
||||
|
||||
If an additional environment variable ``NDN_LOG_NOFLUSH`` is set, the automatic flushing
|
||||
after each log record will be disabled. This can improve logging performance but may
|
||||
cause the log records to appear delayed or, in case of application crash, the last
|
||||
few log records may be lost.
|
||||
|
||||
ndn-cxx logging facility provides a mechanism to manage the type of log messages
|
||||
that are written by classifying log messages by severity levels. Listed below
|
||||
are the available log levels.
|
||||
@@ -41,11 +46,13 @@ written.
|
||||
Setting NDN_LOG requires the following syntax with as many prefixes and
|
||||
corresponding loglevels as the user desires:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="<prefix1>=<loglevel1>:<prefix2>=<loglevel2>"
|
||||
|
||||
**Examples:**
|
||||
*Example:*
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="ndn.*=DEBUG"
|
||||
export NDN_LOG="ndn.UnixTransport=INFO"
|
||||
@@ -54,30 +61,40 @@ corresponding loglevels as the user desires:
|
||||
|
||||
**Note:**
|
||||
|
||||
Shorter (general) prefixes should be placed before longer (specific) prefixes.
|
||||
Otherwise, the specific prefix's loglevel will be overwritten. For example,
|
||||
`export NDN_LOG="ndn.UnixTransport=TRACE:ndn.*=ERROR:*=INFO"` sets all modules
|
||||
to INFO; it should be written as
|
||||
`export NDN_LOG="*=INFO:ndn.*=ERROR:ndn.UnixTransport=TRACE"` for the desired effect.
|
||||
The loglevel assignments in ``NDN_LOG`` are processed left-to-right. Thus, shorter
|
||||
(more general) prefixes should be listed before longer (more specific) prefixes.
|
||||
Otherwise, the loglevel setting of a more specific prefix may be overwritten by a
|
||||
more general assignment appearing later in the string. For example:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="ndn.UnixTransport=TRACE:ndn.*=ERROR:*=INFO"
|
||||
|
||||
will set all modules to INFO. To obtain the desired effect, it should instead be
|
||||
written as:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="*=INFO:ndn.*=ERROR:ndn.UnixTransport=TRACE"
|
||||
|
||||
**Note:**
|
||||
|
||||
Setting the environment variable with sudo requires the application to be run
|
||||
in the same command.
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
Correct:
|
||||
# Correct
|
||||
sudo env NDN_LOG=logLevel ./ndn-application
|
||||
|
||||
sudo env NDN_LOG=logLevel ./ndn-application
|
||||
# Also correct
|
||||
sudo -s
|
||||
export NDN_LOG=logLevel
|
||||
./ndn-application
|
||||
|
||||
sudo -s
|
||||
export NDN_LOG=logLevel
|
||||
./ndn-application
|
||||
# Incorrect
|
||||
sudo export NDN_LOG=logLevel
|
||||
sudo ./ndn-application
|
||||
|
||||
Incorrect:
|
||||
|
||||
sudo export NDN_LOG=logLevel
|
||||
sudo ./ndn-application
|
||||
|
||||
NDN_LOG=logLevel sudo ./ndn-application
|
||||
# Incorrect
|
||||
NDN_LOG=logLevel sudo ./ndn-application
|
||||
@@ -1,52 +1,50 @@
|
||||
ndnsec-cert-dump
|
||||
================
|
||||
|
||||
``ndnsec-cert-dump`` is a tool to dump a certificate from **Public Info Base** or file and output
|
||||
it to standard output.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-dump [-h] [-p] [-ikf] name
|
||||
**ndnsec-cert-dump** [**-h**] [**-p**] [**-r** [**-H** *host*] [**-P** *port*]]
|
||||
[**-i**\|\ **-k**\|\ **-f**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-cert-dump`` can read a certificate from **Public Info Base (PIB)** or a file and output
|
||||
the certificate to standard output.
|
||||
:program:`ndnsec-cert-dump` reads a certificate from the **Public Info Base (PIB)**
|
||||
or from a file, and prints it on the standard output.
|
||||
|
||||
By default, ``name`` is interpreted as a certificate name.
|
||||
By default, *name* is interpreted as a certificate name.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-i``
|
||||
Interpret ``name`` as an identity name. If specified, the certificate to dump is the default
|
||||
certificate of the identity.
|
||||
.. option:: -i, --identity
|
||||
|
||||
``-k``
|
||||
Interpret ``name`` as a key name. If specified, the certificate to dump is the default certificate
|
||||
of the key.
|
||||
Interpret *name* as an identity name. If specified, the certificate to dump
|
||||
is the default certificate of the identity.
|
||||
|
||||
``-f``
|
||||
Interpret ``name`` as a path to a file containing the certificate. If ``name`` is ``-``,
|
||||
certificate will be read from standard input.
|
||||
.. option:: -k, --key
|
||||
|
||||
``-p``
|
||||
Print out the certificate to a human-readable format.
|
||||
Interpret *name* as a key name. If specified, the certificate to dump is the
|
||||
default certificate of the key.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -f, --file
|
||||
|
||||
Dump a certificate from PIB to standard output:
|
||||
::
|
||||
Interpret *name* as a path to a file containing the certificate. If *name*
|
||||
is "-", the certificate will be read from the standard input.
|
||||
|
||||
.. option:: -p, --pretty
|
||||
|
||||
Print the certificate in a human-readable format.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Dump a certificate from PIB to standard output::
|
||||
|
||||
$ ndnsec-cert-dump /ndn/test/david/KEY/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
|
||||
Dump a certificate to a human-readable format:
|
||||
::
|
||||
Dump a certificate in human-readable format::
|
||||
|
||||
$ ndnsec-cert-dump -p /ndn/test/david/KEY/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
Certificate name:
|
||||
|
||||
@@ -1,73 +1,91 @@
|
||||
ndnsec-cert-gen
|
||||
===============
|
||||
|
||||
``ndnsec-cert-gen`` is a tool to issue an identity certificate.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-gen [-h] [-S timestamp] [-E timestamp] [-I info] [-s sign-id] [-i issuer-id] request
|
||||
**ndnsec-cert-gen** [**-h**] [**-S** *timestamp*] [**-E** *timestamp*]
|
||||
[**-I** *info*]... [**-s** *signer*] [**-i** *issuer*] *file*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-cert-gen`` takes signing request as input and issues an identity certificate for the key in
|
||||
the signing request. The signing request can be created during ``ndnsec-keygen`` and can be
|
||||
re-generated with ``ndnsec-sign-req``.
|
||||
:program:`ndnsec-cert-gen` takes a signing request as input and issues an
|
||||
identity certificate for the key in the signing request. The signing request
|
||||
can be created with :program:`ndnsec-key-gen` and can be re-generated with
|
||||
:program:`ndnsec-sign-req`.
|
||||
|
||||
By default, the default key/certificate will be used to sign the issued certificate.
|
||||
By default, the default key is used to sign the issued certificate.
|
||||
|
||||
``request`` could be a path to a file that contains the signing request. If ``request`` is ``-``,
|
||||
then signing request will be read from standard input.
|
||||
*file* is the name of a file that contains the signing request. If *file* is
|
||||
"-", the signing request is read from the standard input.
|
||||
|
||||
The generated certificate will be written to standard output in base64 encoding.
|
||||
The generated certificate is written to the standard output in base64 encoding.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-S timestamp``
|
||||
Timestamp when the certificate becomes valid. The default value is now.
|
||||
.. option:: -S <timestamp>, --not-before <timestamp>
|
||||
|
||||
``-E timestamp``
|
||||
Timestamp when the certificate expires. The default value is one year from now.
|
||||
Date and time when the certificate becomes valid, in "YYYYMMDDhhmmss" format.
|
||||
The default value is now.
|
||||
|
||||
``-I info``
|
||||
Other information to be included in the issued certificate. For example,
|
||||
.. option:: -E <timestamp>, --not-after <timestamp>
|
||||
|
||||
::
|
||||
Date and time when the certificate expires, in "YYYYMMDDhhmmss" format.
|
||||
The default value is 365 days after the **--not-before** timestamp.
|
||||
|
||||
-I "affiliation Some Organization" -I "homepage http://home.page/"
|
||||
.. option:: -I <info>, --info <info>
|
||||
|
||||
``-s sign-id``
|
||||
Signing identity. The default key/certificate of ``sign-id`` will be used to sign the requested
|
||||
certificate. If this option is not specified, the system default identity will be used.
|
||||
Other information to be included in the issued certificate. Must be in the
|
||||
form of key and value pairs, where the key is an arbitrary string without
|
||||
spaces, followed by one or more spaces, followed by an arbitrary string
|
||||
representing the value. This option may be repeated multiple times.
|
||||
|
||||
``-s issuer-id``
|
||||
Issuer's ID to be included as part of the issued certificate name. If not specified, "NA"
|
||||
value will be used
|
||||
For example::
|
||||
|
||||
Examples
|
||||
--------
|
||||
-I "affiliation Some Organization" -I "homepage https://home.page/"
|
||||
|
||||
.. option:: -s <signer>, --sign-id <signer>
|
||||
|
||||
Signing identity. The default key/certificate of *signer* will be used to
|
||||
sign the requested certificate. If this option is not specified, the system
|
||||
default identity will be used.
|
||||
|
||||
.. option:: -i <issuer>, --issuer-id <issuer>
|
||||
|
||||
Issuer's ID to be included in the issued certificate name. The default
|
||||
value is "NA".
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-gen -S 20140401000000 -E 20150331235959 -N "David"
|
||||
-I "2.5.4.10 'Some Organization'" -s /ndn/test sign_request.cert
|
||||
Bv0C9wc9CANuZG4IBHRlc3QIA0tFWQgFZGF2aWQIEWtzay0xMzk2OTEzMDU4MTk2
|
||||
CAdJRC1DRVJUCAgAAAFFPp2g3hQDGAECFf0BdjCCAXIwIhgPMjAxNDA0MDEwMDAw
|
||||
MDBaGA8yMDE1MDMzMTIzNTk1OVowKDAMBgNVBCkTBURhdmlkMBgGA1UEChMRU29t
|
||||
ZSBPcmdhbml6YXRpb24wggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC0
|
||||
urnS2nKcnXnMTESH2XqO+H8c6bCE6mmv+FMQ9hSfZVOHbX4kkiDmkcAAf8NCvwGr
|
||||
kEat0NQIhKHFLFtofC5rXLheAo/UxgFA/9bNwiEjMH/c8EN2YTSMzdCDrK6TwE7B
|
||||
623cLTsa3Bb11+BpzC1oLb3Egedgp+vIf+AFIgNQhvfwzsgsgOBB4iJBwcYegU7w
|
||||
JsO0pjY69WQU2DGjABFef6C2Qh8x0TvtnynRLbWlh928+4ilVUvLuWcV3AbPIKLe
|
||||
eZu13+v01JN6kFzNZDPMFtOFPvJ943IdYu7Q9k93PzhSk0+wFp3cHH21PfWeghWe
|
||||
3zLIER8RTWPIQhWSbxRVAgERFjMbAQEcLgcsCANuZG4IA0tFWQgEdGVzdAgRa3Nr
|
||||
LTEzOTQxMjk2OTQ3ODgIB0lELUNFUlQX/QEABUGcl7U+F8cwMHKckerv+1H2Nvsd
|
||||
OfeqX0+4RzWU+wRx2emMGMZZdHSx8M/i45hb0P5hbNEF99L35/SrSTSzhTZdOriD
|
||||
t/LQOcKBoNXY+iw3EUFM0gvRGU0kaEVBKAHtbYhtoHc48QLEyrsVaMqmrjCmpeF/
|
||||
JOcClhzJfFW3cZ/SlhcTEayF0ntogYLR2cMzIwQhhSj5L/Kl7I7uxNxZhK1DS98n
|
||||
q8oGAxHufEAluPrRpDQfI+jeQ4h/YYKcXPW3Vn7VQAGOqIi6gTlUxrmEbyCDF70E
|
||||
xj5t3wfSUmDa1N+hLRMdEAI+IjRRHDSx2Lhj/QcoPIZPWwKjBz9CBL92og==
|
||||
$ ndnsec-cert-gen -S 20200501000000 -E 20210101000000 -I "affiliation Some Organization" -I "foobar Foo Bar" -i "Universe" -s /ndn/test request.cert > signed.cert
|
||||
|
||||
$ cat signed.cert
|
||||
Bv0BcgctCAdleGFtcGxlCANLRVkICOQUmX8oloLrCAhVbml2ZXJzZQgJ/QAAAXHR
|
||||
Ak6CFAkYAQIZBAA27oAVWzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDpJsCkv
|
||||
E5RMjxRVdyK6W6z+FoCq+qREEn/sxf+n2gnsl25qm1NarCfSGf96zIJy9BRA9btu
|
||||
MMeuWlAN/ymvMFwWkBsBAxwcBxoIA25kbggEdGVzdAgDS0VZCAhJP1OaKLualf0A
|
||||
/Sb9AP4PMjAyMDA1MDFUMDAwMDAw/QD/DzIwMjEwMTAxVDAwMDAwMP0BAkH9AgAk
|
||||
/QIBC2FmZmlsaWF0aW9u/QICEVNvbWUgT3JnYW5pemF0aW9u/QIAFf0CAQZmb29i
|
||||
YXL9AgIHRm9vIEJhchdHMEUCIQDPT9Hq1kvkE0r9W1aYSBVTnHlTEzgtz+v1DwkC
|
||||
ug/vLAIgY3xJITCwf55sqey33q5GIQSk1TRCkNNl58ojvPs5sNU=
|
||||
|
||||
$ ndnsec-dump-certificate -p -f signed.cert
|
||||
Certificate name:
|
||||
/example/KEY/%E4%14%99%7F%28%96%82%EB/Universe/%FD%00%00%01q%D1%02N%82
|
||||
Validity:
|
||||
NotBefore: 20200501T000000
|
||||
NotAfter: 20210101T000000
|
||||
Additional Description:
|
||||
affiliation: Some Organization
|
||||
foobar: Foo Bar
|
||||
Public key bits:
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOkmwKS8TlEyPFFV3IrpbrP4WgKr6
|
||||
pEQSf+zF/6faCeyXbmqbU1qsJ9IZ/3rMgnL0FED1u24wx65aUA3/Ka8wXA==
|
||||
Signature Information:
|
||||
Signature Type: SignatureSha256WithEcdsa
|
||||
Key Locator: Name=/ndn/test/KEY/I%3FS%9A%28%BB%9A%95
|
||||
@@ -1,56 +1,50 @@
|
||||
ndnsec-cert-install
|
||||
===================
|
||||
|
||||
``ndnsec-cert-install`` is a tool to install a certificate into **Public Information Base (PIB)**.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-install [-h] [-IKN] cert-source
|
||||
**ndnsec-cert-install** [**-h**] [**-I**\|\ **-K**\|\ **-N**] *file*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-cert-install`` can insert a certificate into PIB. By default, the installed certificate
|
||||
will be set as the default certificate of its corresponding identity and the identity is set as
|
||||
the system default identity.
|
||||
:program:`ndnsec-cert-install` allows importing a certificate into the
|
||||
**Public Information Base (PIB)**. By default, the installed certificate
|
||||
will be set as the default certificate for the corresponding identity and
|
||||
the identity will be set as the user's default identity.
|
||||
|
||||
``cert-source`` could be a filesystem path or an HTTP URL of a file containing to certificate to
|
||||
install or . If ``cert-file`` is ``-``, the certificate will be read from standard input.
|
||||
*file* can be a filesystem path or an HTTP URL of a file containing the certificate
|
||||
to install. If *file* is "-", the certificate will be read from the standard input.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-I``
|
||||
Set the certificate as the default certificate of its corresponding identity, but do not change
|
||||
the system default identity.
|
||||
.. option:: -I, --identity-default
|
||||
|
||||
``-K``
|
||||
Set the certificate as the default certificate of its corresponding key, but do not change the
|
||||
corresponding identity's default key and the system default identity.
|
||||
Set the certificate as the default certificate for the corresponding identity,
|
||||
but do not change the user's default identity.
|
||||
|
||||
``-N``
|
||||
Install the certificate but do not change any default settings.
|
||||
.. option:: -K, --key-default
|
||||
|
||||
Examples
|
||||
--------
|
||||
Set the certificate as the default certificate for the corresponding key, but
|
||||
do not change the identity's default key or the user's default identity.
|
||||
|
||||
Install a certificate and set it as the system default certificate:
|
||||
.. option:: -N, --no-default
|
||||
|
||||
::
|
||||
Install the certificate but do not change any default settings.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Install a certificate and set it as the default certificate::
|
||||
|
||||
$ ndnsec-cert-install cert_file.cert
|
||||
|
||||
Install a certificate with HTTP URL and set it as the system default certificate:
|
||||
|
||||
::
|
||||
Install a certificate via HTTP and set it as the default certificate::
|
||||
|
||||
$ ndnsec-install-cert "http://ndncert.domain.com/cert/get/my-certificate.ndncert"
|
||||
|
||||
Install a certificate but do not change any default settings:
|
||||
|
||||
::
|
||||
Install a certificate but do not change any default settings::
|
||||
|
||||
$ ndnsec-cert-install -N cert_file.cert
|
||||
@@ -1,32 +1,32 @@
|
||||
ndnsec-delete
|
||||
=============
|
||||
|
||||
``ndnsec-delete`` is a tool to delete security data from both **Public Info Base** and
|
||||
**Trusted Platform Module**.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
ndnsec-delete [-h] [-kc] name
|
||||
**ndnsec-delete** [**-h**] [**-k**\|\ **-c**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
By default, ``ndnsec-delete`` interpret ``name`` as an identity name. If an identity is deleted,
|
||||
all the keys and certificates belonging to the identity will be deleted as well. If a key is
|
||||
deleted, all the certificate belonging to the key will be deleted as well.
|
||||
:program:`ndnsec-delete` allows to delete security data from both the
|
||||
**Public Info Base (PIB)** and the **Trusted Platform Module (TPM)**.
|
||||
|
||||
By default, :program:`ndnsec-delete` will interpret *name* as an identity name.
|
||||
If an identity is deleted, all keys and certificates belonging to that identity
|
||||
will be deleted as well. If a key is deleted, all certificates associated with
|
||||
that key will be deleted as well.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Interpret ``name`` as a key name and delete the key and its related data.
|
||||
.. option:: -k, --delete-key
|
||||
|
||||
``-c``
|
||||
Interpret ``name`` as a certificate name and delete the certificate.
|
||||
Interpret *name* as a key name and delete the key and its associated data.
|
||||
|
||||
.. option:: -c, --delete-cert
|
||||
|
||||
Interpret *name* as a certificate name and delete the certificate.
|
||||
|
||||
Exit Status
|
||||
-----------
|
||||
@@ -35,11 +35,9 @@ Normally, the exit status is 0 if the requested entity is deleted successfully.
|
||||
If the entity to be deleted does not exist, the exit status is 1.
|
||||
For other errors, the exit status is 2.
|
||||
|
||||
Examples
|
||||
--------
|
||||
Example
|
||||
-------
|
||||
|
||||
Delete all data related to an identity:
|
||||
|
||||
::
|
||||
Delete all data related to an identity::
|
||||
|
||||
$ ndnsec-delete /ndn/test/david
|
||||
@@ -1,49 +1,53 @@
|
||||
ndnsec-export
|
||||
=============
|
||||
|
||||
Usage
|
||||
-----
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-export [-h] [-o output] identity
|
||||
**ndnsec-export** [**-h**] [**-o** *file*] [**-P** *passphrase*]
|
||||
[**-i**\|\ **-k**\|\ **-c**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-export`` exports the default certificate of an identity and its private key as a file. It
|
||||
will ask for a passphrase to encrypt the private key. The output file can be imported again with
|
||||
``ndnsec-import`` command.
|
||||
:program:`ndnsec-export` exports a certificate from the **Public Info Base (PIB)** and
|
||||
its private key to a file. It will ask for a passphrase to encrypt the private key.
|
||||
The resulting file can be imported again using :program:`ndnsec-import`.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-h``
|
||||
Print a help message.
|
||||
.. option:: -i, --identity
|
||||
|
||||
``-o output``
|
||||
Write to an output file instead of the standard output.
|
||||
Interpret *name* as an identity name. The default certificate of the identity will be exported.
|
||||
This is the default unless **-k** or **-c** is specified.
|
||||
|
||||
``-P passphrase``
|
||||
Passphrase to use for the export. If not specified (or specified an empty passphrase), the
|
||||
user is interactively asked to input the passphrase on the terminal. Note that specifying
|
||||
passphrase via -P is insecure, as it can potentially end up in shell history, be visible in
|
||||
ps output, etc.
|
||||
.. option:: -k, --key
|
||||
|
||||
``identity``
|
||||
The identity name.
|
||||
Interpret *name* as a key name. The default certificate of the key will be exported.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -c, --cert
|
||||
|
||||
Export an identity's default certificate and private key into a file:
|
||||
Interpret *name* as a certificate name.
|
||||
|
||||
::
|
||||
.. option:: -o <file>, --output <file>
|
||||
|
||||
Write to the specified output file instead of the standard output.
|
||||
|
||||
.. option:: -P <passphrase>, --password <passphrase>
|
||||
|
||||
Passphrase to use for the export. If empty or not specified, the user is
|
||||
interactively asked to type the passphrase on the terminal. Note that
|
||||
specifying the passphrase via this option is insecure, as it can potentially
|
||||
end up in the shell's history, be visible in :command:`ps` output, and so on.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Export an identity's default certificate and private key into a file::
|
||||
|
||||
$ ndnsec-export -o alice.ndnkey /ndn/test/alice
|
||||
|
||||
Export an identity's default certificate and private key to the standard output:
|
||||
Export a specific certificate and its private key to the standard output::
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-export /ndn/test/alice
|
||||
$ ndnsec-export -c /ndn/edu/ucla/alice/KEY/1%5D%A7g%90%B2%CF%AA/self/%FD%00%00%01r-%D3%DC%2A
|
||||
@@ -1,61 +1,56 @@
|
||||
ndnsec-get-default
|
||||
==================
|
||||
|
||||
``ndnsec-get-default`` is a tool to display the default setting of a particular entity.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-get-default [-h] [-kc] [-i identity|-K key] [-q]
|
||||
**ndnsec-get-default** [**-h**] [**-k**\|\ **-c**] [**-i** *identity*\|\ **-K** *key*] [**-q**]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
Given a particular entity, ``ndnsec-get-default`` can display its default setting as specified in
|
||||
options. If ``identity`` is specified, the given entity becomes the identity. If ``key`` is
|
||||
specified, the given identity becomes the key. If no entity is specified, the command will take the
|
||||
system default identity as the given entity.
|
||||
Given a particular entity, :program:`ndnsec-get-default` shows its default settings
|
||||
according to the command-line options. By default, if neither **-i** nor **-K** is
|
||||
given, the command displays the default identity or the default key/certificate of
|
||||
the default identity.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Display the given entity's default key name.
|
||||
.. option:: -k, --default-key
|
||||
|
||||
``-c``
|
||||
Display the given entity's default certificate name.
|
||||
Display the chosen entity's default key name.
|
||||
|
||||
``-i identity``
|
||||
Display default setting of the ``identity``
|
||||
.. option:: -c, --default-cert
|
||||
|
||||
``-K key``
|
||||
Display default setting of the ``key``.
|
||||
Display the chosen entity's default certificate name.
|
||||
|
||||
``-q``
|
||||
Disable trailling new line character.
|
||||
.. option:: -i <identity>, --identity <identity>
|
||||
|
||||
Examples
|
||||
--------
|
||||
Display default settings of *identity*.
|
||||
|
||||
Display an identity's default key name.
|
||||
.. option:: -K <key>, --key <key>
|
||||
|
||||
::
|
||||
Display default settings of *key*.
|
||||
|
||||
.. option:: -q, --quiet
|
||||
|
||||
Disable printing the trailing newline character.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Display an identity's default key name::
|
||||
|
||||
$ ndnsec-get-default -k -i /ndn/test/alice
|
||||
/ndn/test/alice/ksk-1394129695025
|
||||
|
||||
Display an identity's default certificate name.
|
||||
|
||||
::
|
||||
Display an identity's default certificate name::
|
||||
|
||||
$ ndnsec-get-default -c -i /ndn/test/alice
|
||||
/ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
|
||||
|
||||
Display a key's default certificate name.
|
||||
|
||||
::
|
||||
Display a key's default certificate name::
|
||||
|
||||
$ ndnsec-get-default -c -K /ndn/test/alice/ksk-1394129695025
|
||||
/ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
|
||||
@@ -1,39 +1,33 @@
|
||||
ndnsec-import
|
||||
=============
|
||||
|
||||
Usage
|
||||
-----
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-import [-h] input
|
||||
**ndnsec-import** [**-h**] [**-P** *passphrase*] *file*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-import`` imports a certificate and private key from a file created by ``ndnsec-export``. It
|
||||
will ask for the passphrase used to encrypt the private key.
|
||||
:program:`ndnsec-import` imports a certificate and its private key from a file
|
||||
created by :program:`ndnsec-export`. It will ask for the passphrase used to
|
||||
encrypt the private key.
|
||||
|
||||
If *file* is "-", read from the standard input.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-h``
|
||||
Print a help message.
|
||||
.. option:: -P <passphrase>, --password <passphrase>
|
||||
|
||||
``-P passphrase``
|
||||
Passphrase to use for the export. If not specified (or specified an empty passphrase), the
|
||||
user is interactively asked to input the passphrase on the terminal. Note that specifying
|
||||
passphrase via -P is insecure, as it can potentially end up in shell history, be visible in
|
||||
ps output, etc.
|
||||
Passphrase to use for the export. If empty or not specified, the user is
|
||||
interactively asked to type the passphrase on the terminal. Note that
|
||||
specifying the passphrase via this option is insecure, as it can potentially
|
||||
end up in the shell's history, be visible in :command:`ps` output, and so on.
|
||||
|
||||
``input``
|
||||
Read from an input file. Specify ``-`` to read from the standard input.
|
||||
Example
|
||||
-------
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
Import a certificate and private key from a file:
|
||||
|
||||
::
|
||||
Import a certificate and private key from a file::
|
||||
|
||||
$ ndnsec-import alice.ndnkey
|
||||
@@ -1,38 +1,47 @@
|
||||
ndnsec-key-gen
|
||||
==============
|
||||
|
||||
``ndnsec-key-gen`` is tool to generate a pair of key.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-key-gen [-h] [-n] [-d] [-t keyType] identity
|
||||
**ndnsec-key-gen** [**-h**] [**-n**] [**-t** *type*]
|
||||
[**-k** *keyidtype*\|\ **--keyid** *keyid*] *identity*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-key-gen`` creates a key pair for the specified ``identity`` and sets the key as the
|
||||
identity's default key. ``ndnsec-key-gen`` will also create a signing request for the generated key.
|
||||
The signing request will be written to standard output in base64 encoding.
|
||||
:program:`ndnsec-key-gen` generates a key pair for the specified *identity* and
|
||||
sets the generated public key as the identity's default key.
|
||||
:program:`ndnsec-key-gen` will also create a signing request for the generated key.
|
||||
The signing request will be written to the standard output in base64 encoding.
|
||||
|
||||
By default, it will also set the identity as the system default identity.
|
||||
By default, it will also set the identity as the user's default identity.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-n``
|
||||
Do not set the identity as the system default identity.
|
||||
.. option:: -n, --not-default
|
||||
|
||||
Note that if it is the first identity/key/certificate, then it will be
|
||||
set as default regardless of ``-n`` flag.
|
||||
Do not set the identity as the user's default identity.
|
||||
|
||||
``-t keyType``
|
||||
Specify the key type. ``r`` (default) for RSA key. ``e`` for ECDSA key.
|
||||
Note that if no other identity/key/certificate exists, then the identity
|
||||
will become the default regardless of this option.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -t <type>, --type <type>
|
||||
|
||||
Type of key to generate. "r" for RSA, "e" for ECDSA (the default).
|
||||
|
||||
.. option:: -k <keyidtype>, --keyid-type <keyidtype>
|
||||
|
||||
Type of KeyId for the generated key. "r" for a 64-bit random number (the default
|
||||
unless **--keyid** is specified), "h" for the SHA-256 of the public key.
|
||||
|
||||
.. option:: --keyid <keyid>
|
||||
|
||||
User-specified KeyId. Must be a non-empty generic name component.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
|
||||
@@ -1,24 +1,20 @@
|
||||
ndnsec-list
|
||||
===========
|
||||
|
||||
``ndnsec-list`` is a tool to display entities stored in **Public Information Base (PIB)**, such as
|
||||
identities, keys, and certificates.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-list [-h] [-KkCc]
|
||||
**ndnsec-list** [**-h**] [**-k**\|\ **-c**]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-list`` lists names of all the entities according to the granularity specified in options
|
||||
(The default granularity is identity). The default entities will be marked with ``*`` in front of
|
||||
their names. For example:
|
||||
:program:`ndnsec-list` prints the names of all the entities stored in the
|
||||
**Public Information Base (PIB)**, such as identities, keys, and certificates,
|
||||
up to the given granularity level. By default, only the identity names are
|
||||
shown. The default entities will be marked with a "*" in front of their names.
|
||||
|
||||
::
|
||||
For example::
|
||||
|
||||
$ ndnsec list
|
||||
* /ndn/edu/ucla/cs/yingdi
|
||||
@@ -26,24 +22,23 @@ their names. For example:
|
||||
/ndn/test/bob
|
||||
/ndn/test/alice
|
||||
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-K, -k``
|
||||
Display key names for each identity. The key name with ``*`` in front is the default key name of
|
||||
the corresponding identity.
|
||||
.. option:: -k, --key
|
||||
|
||||
``-C, -c``
|
||||
Display certificate names for each key. The certificate name with ``*`` in front is the default
|
||||
certificate name of the corresponding key.
|
||||
Display key names for each identity. The key name with a "*" in front is
|
||||
the default key name of the corresponding identity.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -c, --cert
|
||||
|
||||
Display all the key names in PIB.
|
||||
Display certificate names for each key. The certificate name with a "*"
|
||||
in front is the default certificate name of the corresponding key.
|
||||
|
||||
::
|
||||
Example
|
||||
-------
|
||||
|
||||
Display all the key names in PIB::
|
||||
|
||||
$ ndnsec-list -k
|
||||
* /ndn/edu/ucla/cs/yingdi
|
||||
@@ -59,9 +54,7 @@ Display all the key names in PIB.
|
||||
/ndn/test/alice
|
||||
+->* /ndn/test/alice/ksk-1394129695025
|
||||
|
||||
Display all the certificate names in PIB.
|
||||
|
||||
::
|
||||
Display all the certificate names in PIB::
|
||||
|
||||
$ ndnsec-list -c
|
||||
* /ndn/edu/ucla/cs/yingdi
|
||||
|
||||
@@ -1,49 +1,43 @@
|
||||
ndnsec-set-default
|
||||
==================
|
||||
|
||||
``ndnsec-set-default`` is a tool to change the default security settings.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-set-default [-h] [-k|c] name
|
||||
**ndnsec-set-default** [**-h**] [**-k**\|\ **-c**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
By default, ``ndnsec-set-default`` takes ``name`` as an identity name and sets the identity as the
|
||||
system default identity.
|
||||
:program:`ndnsec-set-default` allows changing the default security settings.
|
||||
|
||||
Without any options, *name*, which must be an identity name, is set as the
|
||||
default identity for the current user.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Set default key. ``name`` should be a key name, ``ndnsec-set-default`` can infer the corresponding
|
||||
identity and set the key as the identity's default key.
|
||||
.. option:: -k, --default-key
|
||||
|
||||
``-c``
|
||||
Set default certificate. ``name`` should be a certificate name, ``ndnsec-set-default`` can
|
||||
infer the corresponding key name and set the certificate as the key's default certificate.
|
||||
Set *name*, which must be a key name, as the default key for the
|
||||
corresponding identity.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -c, --default-cert
|
||||
|
||||
Set a key's default certificate:
|
||||
Set *name*, which must be a certificate name, as the default certificate
|
||||
for the corresponding key.
|
||||
|
||||
::
|
||||
Example
|
||||
-------
|
||||
|
||||
Set a key's default certificate::
|
||||
|
||||
$ ndnsec-set-default -c /ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
|
||||
|
||||
Set an identity's default key:
|
||||
|
||||
::
|
||||
Set an identity's default key::
|
||||
|
||||
$ ndnsec-set-default -k /ndn/test/alice/ksk-1394129695025
|
||||
|
||||
Set system default identity:
|
||||
|
||||
::
|
||||
Set the user's default identity::
|
||||
|
||||
$ ndnsec-set-default /ndn/test/alice
|
||||
@@ -1,37 +1,35 @@
|
||||
ndnsec-sign-req
|
||||
===============
|
||||
|
||||
``ndnsec-sign-req`` is a tool to generate a signing request for a particular key.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-sign-req [-h] [-k] name
|
||||
**ndnsec-sign-req** [**-h**] [**-k**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The signing request of a key is actually a self-signed certificate. Given key's information,
|
||||
``ndnsec-sign-req`` looks up the key in PIB. If such a key exists, a self-signed certificate of the
|
||||
key, or its signing request, will be outputed to **stdout** with base64 encoding.
|
||||
:program:`ndnsec-sign-req` generates a signing request for a key.
|
||||
|
||||
By default, ``name`` is interpreted as an identity name. ``ndnsec-sign-req`` will generate a
|
||||
signing request for the identity's default key.
|
||||
The signing request of a key is actually a self-signed certificate. Given the
|
||||
key's information, :program:`ndnsec-sign-req` looks up the key in the PIB.
|
||||
If such a key exists, a self-signed certificate for the key, i.e. its signing
|
||||
request, is written to the standard output in base64 encoding.
|
||||
|
||||
By default, *name* is interpreted as an identity name, and the signing request
|
||||
will be generated for that identity's default key.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Interpret ``name`` as a key name.
|
||||
.. option:: -k, --key
|
||||
|
||||
Examples
|
||||
--------
|
||||
Interpret *name* as a key name, instead of an identity name.
|
||||
|
||||
Create a signing request for an identity's default key.
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
Create a signing request for an identity's default key::
|
||||
|
||||
$ ndnsec-sign-req /ndn/test/david
|
||||
Bv0DAAc9CANuZG4IBHRlc3QIBWRhdmlkCANLRVkIEWtzay0xMzk2OTk4Mzg5MjU3
|
||||
@@ -52,10 +50,7 @@ Create a signing request for an identity's default key.
|
||||
0wHjvDS1cuIH2j6XveoUYapRjZXaEZqB/YoBwRqEYq2KVn/ol5knLM6FIISXXjxn
|
||||
cIh62A==
|
||||
|
||||
|
||||
Create a signing request for a particular key.
|
||||
|
||||
::
|
||||
Create a signing request for a particular key::
|
||||
|
||||
$ ndnsec-sign-req -k /ndn/test/david/ksk-1396913058196
|
||||
Bv0DAAc9CANuZG4IBHRlc3QIBWRhdmlkCANLRVkIEWtzay0xMzk2OTEzMDU4MTk2
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
ndnsec-unlock-tpm
|
||||
=================
|
||||
|
||||
``ndnsec-unlock-tpm`` is a tool to (temporarily) unlock the **Trusted Platform Module (TPM)** that
|
||||
manages private keys.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-unlock-tpm [-h]
|
||||
ndnsec-unlock-tpm [**-h**]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-unlock-tpm`` will ask for password to unlock the TPM.
|
||||
:program:`ndnsec-unlock-tpm` can be used to (temporarily) unlock the
|
||||
**Trusted Platform Module (TPM)** that manages private keys.
|
||||
+46
-64
@@ -1,89 +1,71 @@
|
||||
ndnsec
|
||||
======
|
||||
|
||||
``ndnsec`` is a command-line toolkit to perform various NDN security management
|
||||
operation.
|
||||
:program:`ndnsec` is a command-line toolkit to perform various NDN security
|
||||
management operations.
|
||||
|
||||
Usage
|
||||
-----
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
**ndnsec** *command* [*argument*]...
|
||||
|
||||
$ ndnsec <command> [<args>]
|
||||
|
||||
or alternatively
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-command [<args>]
|
||||
**ndnsec-**\ *command* [*argument*]...
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The NDN security data are stored and managed in two places: **Public Information Base** and
|
||||
**Trusted Platform Module**. ``ndnsec`` toolkit provides a command-line interface of managing and
|
||||
using the NDN security data.
|
||||
The NDN security data are stored in two places: **Public Information Base**
|
||||
(PIB) and **Trusted Platform Module** (TPM). The :program:`ndnsec` toolkit
|
||||
provides a command-line interface for managing and using the NDN security data.
|
||||
|
||||
ndnsec commands
|
||||
---------------
|
||||
Commands
|
||||
--------
|
||||
|
||||
ndnsec-list_
|
||||
Display information in PublicInfo.
|
||||
list_
|
||||
List all known identities/keys/certificates.
|
||||
|
||||
ndnsec-get-default_
|
||||
Get default setting info.
|
||||
get-default_
|
||||
Show the default identity/key/certificate.
|
||||
|
||||
ndnsec-set-default_
|
||||
Configure default setting.
|
||||
set-default_
|
||||
Change the default identity/key/certificate.
|
||||
|
||||
ndnsec-key-gen_
|
||||
Generate a Key-Signing-Key for an identity.
|
||||
delete_
|
||||
Delete an identity/key/certificate.
|
||||
|
||||
ndnsec-dsk-gen_
|
||||
Generate a Data-Signing-Key (DSK) for an identity and sign the DSK using the corresponding KSK.
|
||||
key-gen_
|
||||
Generate a key for an identity.
|
||||
|
||||
ndnsec-sign-req_
|
||||
sign-req_
|
||||
Generate a certificate signing request.
|
||||
|
||||
ndnsec-cert-gen_
|
||||
Generate an identity certificate.
|
||||
cert-gen_
|
||||
Create a certificate for an identity.
|
||||
|
||||
ndnsec-cert-dump_
|
||||
Dump a certificate from PublicInfo.
|
||||
cert-dump_
|
||||
Export a certificate.
|
||||
|
||||
ndnsec-cert-install_
|
||||
Install a certificate into PublicInfo.
|
||||
cert-install_
|
||||
Import a certificate from a file.
|
||||
|
||||
ndnsec-delete_
|
||||
Delete identity/key/certificate.
|
||||
export_
|
||||
Export an identity as a SafeBag.
|
||||
|
||||
ndnsec-export_
|
||||
Export an identity package.
|
||||
import_
|
||||
Import an identity from a SafeBag.
|
||||
|
||||
ndnsec-import_
|
||||
Import an identity package.
|
||||
unlock-tpm_
|
||||
Unlock the TPM.
|
||||
|
||||
ndnsec-set-acl_
|
||||
Configure ACL of a private key.
|
||||
|
||||
ndnsec-unlock-tpm_
|
||||
Unlock Tpm.
|
||||
|
||||
ndnsec-op-tool_
|
||||
Operator tool.
|
||||
|
||||
.. _ndnsec-list: ndnsec-list.html
|
||||
.. _ndnsec-get-default: ndnsec-get-default.html
|
||||
.. _ndnsec-set-default: ndnsec-set-default.html
|
||||
.. _ndnsec-key-gen: ndnsec-key-gen.html
|
||||
.. _ndnsec-dsk-gen: ndnsec-dsk-gen.html
|
||||
.. _ndnsec-sign-req: ndnsec-sign-req.html
|
||||
.. _ndnsec-cert-gen: ndnsec-cert-gen.html
|
||||
.. _ndnsec-cert-dump: ndnsec-cert-dump.html
|
||||
.. _ndnsec-cert-install: ndnsec-cert-install.html
|
||||
.. _ndnsec-delete: ndnsec-delete.html
|
||||
.. _ndnsec-export: ndnsec-export.html
|
||||
.. _ndnsec-import: ndnsec-import.html
|
||||
.. _ndnsec-set-acl: ndnsec-set-acl.html
|
||||
.. _ndnsec-unlock-tpm: ndnsec-unlock-tpm.html
|
||||
.. _ndnsec-op-tool: ndnsec-op-tool.html
|
||||
.. _list: ndnsec-list.html
|
||||
.. _get-default: ndnsec-get-default.html
|
||||
.. _set-default: ndnsec-set-default.html
|
||||
.. _delete: ndnsec-delete.html
|
||||
.. _key-gen: ndnsec-key-gen.html
|
||||
.. _sign-req: ndnsec-sign-req.html
|
||||
.. _cert-gen: ndnsec-cert-gen.html
|
||||
.. _cert-dump: ndnsec-cert-dump.html
|
||||
.. _cert-install: ndnsec-cert-install.html
|
||||
.. _export: ndnsec-export.html
|
||||
.. _import: ndnsec-import.html
|
||||
.. _unlock-tpm: ndnsec-unlock-tpm.html
|
||||
@@ -1,86 +1,45 @@
|
||||
{#
|
||||
named_data_theme/layout.html
|
||||
~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#}
|
||||
{% extends "basic/layout.html" %}
|
||||
{%- extends "agogo/layout.html" %}
|
||||
|
||||
{% block header %}
|
||||
<!--headercontainer-->
|
||||
<div id="header_container">
|
||||
|
||||
<!--header-->
|
||||
<div class="row">
|
||||
<div class="three columns">
|
||||
<div id="logo">
|
||||
<a href="http://named-data.net" title="A Future Internet Architecture"><img src="http://named-data.net/wp-content/uploads/cropped-20130722_Logo2.png" alt="" /></a>
|
||||
</div><!--logo end-->
|
||||
</div>
|
||||
|
||||
<!--top menu-->
|
||||
<div class="nine columns" id="menu_container" >
|
||||
<h1><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></h1>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="three columns">
|
||||
<p class="logo"><a href="https://named-data.net" title="A Future Internet Architecture">
|
||||
<img class="logo" src="{{ pathto('_static/ndn-logo.svg', 1)|e }}" alt="Logo" width="210"/>
|
||||
</a></p>
|
||||
</div>
|
||||
</div><!--header container end-->
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content-wrapper">
|
||||
<div class="content">
|
||||
<div class="document">
|
||||
{%- block document %}
|
||||
{{ super() }}
|
||||
{%- endblock %}
|
||||
<div id="menu_container" class="nine columns">
|
||||
<h1><a href="{{ pathto(master_doc)|e }}">{{ shorttitle|e }}</a></h1>
|
||||
</div>
|
||||
<div class="sidebar">
|
||||
{%- block sidebartoc %}
|
||||
<h3>{{ _('Table Of Contents') }}</h3>
|
||||
{{ toctree(includehidden=True) }}
|
||||
|
||||
<h3>{{ _('Developer documentation') }}</h3>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="doxygen/annotated.html">API documentation (doxygen)</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="code-style.html">ndn-cxx Code Style and Coding Guidelines</a></li>
|
||||
</ul>
|
||||
{%- endblock %}
|
||||
|
||||
{%- block sidebarsearch %}
|
||||
<h3 style="margin-top: 1.5em;">{{ _('Search') }}</h3>
|
||||
<form class="search" action="{{ pathto('search') }}" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="{{ _('Go') }}" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
{{ _('Enter search terms or a module, class or function name.') }}
|
||||
</p>
|
||||
{%- endblock %}
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{%- block sidebartoc %}
|
||||
<h3>{{ _('Table of Contents') }}</h3>
|
||||
{{ toctree(includehidden=True) }}
|
||||
<h3>{{ _('Developer Documentation') }}</h3>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="doxygen/annotated.html">API Documentation (doxygen)</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="code-style.html">ndn-cxx Code Style and Coding Guidelines</a></li>
|
||||
</ul>
|
||||
{%- endblock %}
|
||||
|
||||
{% block footer %}
|
||||
<div id="footer-container">
|
||||
<!--footer container-->
|
||||
<div class="row">
|
||||
</div><!-- footer container-->
|
||||
</div>
|
||||
|
||||
<div id="footer-info">
|
||||
<!--footer container-->
|
||||
<div class="row">
|
||||
<div class="twelve columns">
|
||||
|
||||
<div id="copyright">This research is partially supported by NSF (Award <a href="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1040868" target="_blank>">CNS-1040868</a>)<br/><br/><a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US" target="_blank">Creative Commons Attribution 3.0 Unported License</a> except where noted.</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="twelve columns">
|
||||
<div id="copyright">
|
||||
This research is partially supported by NSF (Award <a href="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1040868" target="_blank">CNS-1040868</a>).<br/><br/>
|
||||
Licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/" target="_blank">Creative Commons Attribution 3.0 Unported License</a> except where noted.
|
||||
</div>
|
||||
</div>
|
||||
</div><!--footer info end-->
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block relbar1 %}{% endblock %}
|
||||
{% block relbar2 %}{% endblock %}
|
||||
@@ -1,459 +0,0 @@
|
||||
* {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
html { font-size: 62.5%; }
|
||||
|
||||
body {
|
||||
font-family: {{ theme_bodyfont }};
|
||||
background-color: {{ theme_bgcolor }};
|
||||
color: #777;
|
||||
border-top: 4px solid #fd7800;
|
||||
}
|
||||
|
||||
body { background: white; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1; color: #222222; position: relative; -webkit-font-smoothing: antialiased; }
|
||||
|
||||
/* Page layout */
|
||||
|
||||
div.header, div.content, div.footer {
|
||||
width: 90%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
div.header-wrapper {
|
||||
background: {{ theme_headerbg }};
|
||||
border-bottom: 3px solid #2e3436;
|
||||
}
|
||||
|
||||
|
||||
/* Default body styles */
|
||||
a {
|
||||
color: {{ theme_linkcolor }};
|
||||
}
|
||||
|
||||
div.bodywrapper a, div.footer a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.clearer {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.left {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.line-block {
|
||||
display: block;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.line-block .line-block {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
margin-left: 1.5em;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-family: {{ theme_headerfont }};
|
||||
font-weight: normal;
|
||||
color: {{ theme_headercolor2 }};
|
||||
margin-bottom: .8em;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: {{ theme_headercolor1 }};
|
||||
}
|
||||
|
||||
h2 {
|
||||
padding-bottom: .5em;
|
||||
border-bottom: 1px solid {{ theme_headercolor2 }};
|
||||
}
|
||||
|
||||
a.headerlink {
|
||||
visibility: hidden;
|
||||
color: #dddddd;
|
||||
padding-left: .3em;
|
||||
}
|
||||
|
||||
h1:hover > a.headerlink,
|
||||
h2:hover > a.headerlink,
|
||||
h3:hover > a.headerlink,
|
||||
h4:hover > a.headerlink,
|
||||
h5:hover > a.headerlink,
|
||||
h6:hover > a.headerlink,
|
||||
dt:hover > a.headerlink {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
div.admonition {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding: 2px 7px 1px 7px;
|
||||
border-left: 0.2em solid black;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
margin: 0px 10px 5px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dt:target, .highlighted {
|
||||
background-color: #fbe54e;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
div.header {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
div.header .headertitle {
|
||||
font-family: {{ theme_headerfont }};
|
||||
font-weight: normal;
|
||||
font-size: 180%;
|
||||
letter-spacing: .08em;
|
||||
margin-bottom: .8em;
|
||||
}
|
||||
|
||||
div.header .headertitle a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.header div.rel {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
div.header div.rel a {
|
||||
color: {{ theme_headerlinkcolor }};
|
||||
letter-spacing: .1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
p.logo {
|
||||
float: right;
|
||||
}
|
||||
|
||||
img.logo {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Content */
|
||||
div.content-wrapper {
|
||||
background-color: white;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
div.document {
|
||||
width: 70%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div.body {
|
||||
padding-right: 2em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.document h1 {
|
||||
line-height: 120%;
|
||||
}
|
||||
|
||||
div.document ul {
|
||||
margin-left: 1.5em;
|
||||
list-style-type: square;
|
||||
}
|
||||
|
||||
div.document dd {
|
||||
margin-left: 1.2em;
|
||||
margin-top: .4em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
div.document .section {
|
||||
margin-top: 1.7em;
|
||||
}
|
||||
div.document .section:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
div.document div.highlight {
|
||||
padding: 3px;
|
||||
background-color: #eeeeec;
|
||||
border-top: 2px solid #dddddd;
|
||||
border-bottom: 2px solid #dddddd;
|
||||
margin-bottom: .8em;
|
||||
}
|
||||
|
||||
div.document h2 {
|
||||
margin-top: .7em;
|
||||
}
|
||||
|
||||
div.document p {
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
div.document li.toctree-l1 {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
div.document .descname {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.document .docutils.literal {
|
||||
background-color: #eeeeec;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
div.document .docutils.xref.literal {
|
||||
background-color: transparent;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
div.document ol {
|
||||
margin: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
div.sidebar {
|
||||
width: 20%;
|
||||
float: right;
|
||||
font-size: .9em;
|
||||
}
|
||||
|
||||
div.sidebar a, div.header a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.sidebar a:hover, div.header a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.sidebar h3 {
|
||||
color: #2e3436;
|
||||
text-transform: uppercase;
|
||||
font-size: 130%;
|
||||
letter-spacing: .1em;
|
||||
}
|
||||
|
||||
div.sidebar ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l1 a {
|
||||
display: block;
|
||||
padding: 1px;
|
||||
border: 1px solid #dddddd;
|
||||
background-color: #eeeeec;
|
||||
margin-bottom: .4em;
|
||||
padding-left: 3px;
|
||||
color: #2e3436;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l2 a {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
margin-left: 1em;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l3 a {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
margin-left: 2em;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l2:last-child a {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l1.current a {
|
||||
border-right: 5px solid {{ theme_headerlinkcolor }};
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l1.current li.toctree-l2 a {
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
div.sidebar input[type="text"] {
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
div.sidebar input[type="submit"] {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
|
||||
/* Footer */
|
||||
|
||||
div.footer-wrapper {
|
||||
background: {{ theme_footerbg }};
|
||||
border-top: 4px solid #babdb6;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
min-height: 80px;
|
||||
}
|
||||
|
||||
div.footer, div.footer a {
|
||||
color: #888a85;
|
||||
}
|
||||
|
||||
div.footer .right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.footer .left {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
|
||||
/* Styles copied from basic theme */
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left;
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right;
|
||||
float: right;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.align-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* -- search page ----------------------------------------------------------- */
|
||||
|
||||
ul.search {
|
||||
margin: 10px 0 0 20px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul.search li {
|
||||
padding: 5px 0 5px 20px;
|
||||
background-image: url(file.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 7px;
|
||||
}
|
||||
|
||||
ul.search li a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.search li div.context {
|
||||
color: #888;
|
||||
margin: 2px 0 0 30px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
ul.keywordmatches li.goodmatch a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* -- index page ------------------------------------------------------------ */
|
||||
|
||||
table.contentstable {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
table.contentstable p.biglink {
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
a.biglink {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
span.linkdescr {
|
||||
font-style: italic;
|
||||
padding-top: 5px;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
/* -- general index --------------------------------------------------------- */
|
||||
|
||||
table.indextable td {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.indextable dl, table.indextable dd {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
table.indextable tr.pcap {
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
table.indextable tr.cap {
|
||||
margin-top: 10px;
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
img.toggler {
|
||||
margin-right: 3px;
|
||||
margin-top: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* -- viewcode extension ---------------------------------------------------- */
|
||||
|
||||
.viewcode-link {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.viewcode-back {
|
||||
float: right;
|
||||
font-family:: {{ theme_bodyfont }};
|
||||
}
|
||||
|
||||
div.viewcode-block:target {
|
||||
margin: -1px -3px;
|
||||
padding: 0 3px;
|
||||
background-color: #f4debf;
|
||||
border-top: 1px solid #ac9;
|
||||
border-bottom: 1px solid #ac9;
|
||||
}
|
||||
|
||||
td.linenos pre {
|
||||
padding: 5px 0px;
|
||||
border: 0;
|
||||
background-color: transparent;
|
||||
color: #aaa;
|
||||
margin-top: -10pt;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
@import url("agogo.css");
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
background-color: #fafafa;
|
||||
color: #222;
|
||||
line-height: 1.2em;
|
||||
border: 2px solid #C6C9CB;
|
||||
font-size: 1.1em;
|
||||
/* margin: 1.5em 0 1.5em 0; */
|
||||
margin: 0;
|
||||
border-right-style: none;
|
||||
border-left-style: none;
|
||||
}
|
||||
+26
-3
@@ -123,10 +123,10 @@ ul.large li { line-height: 21px; }
|
||||
ol li ul, ol li ol { margin-left: 20px; margin-bottom: 0; }
|
||||
|
||||
/* Blockquotes ---------------------- */
|
||||
blockquote, blockquote p { line-height: 1.5; }
|
||||
blockquote, blockquote p { line-height: 1.5; color: #6f6f6f; }
|
||||
|
||||
blockquote { margin: 0 0 17px; padding: 9px 20px 0 19px; }
|
||||
blockquote cite { display: block; font-size: 13pt; color: #555555; }
|
||||
blockquote { margin: 0 0 17px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; }
|
||||
blockquote cite { display: block; font-size: 13px; color: #555555; }
|
||||
blockquote cite:before { content: "\2014 \0020"; }
|
||||
blockquote cite a, blockquote cite a:visited { color: #555555; }
|
||||
|
||||
@@ -786,3 +786,26 @@ ul.link-list li a { display: block; }
|
||||
.flex-video.widescreen { padding-bottom: 57.25%; }
|
||||
.flex-video.vimeo { padding-top: 0; }
|
||||
.flex-video iframe, .flex-video object, .flex-video embed, .flex-video video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||
|
||||
@media only screen and (max-device-width: 800px), only screen and (device-width: 1024px) and (device-height: 600px), only screen and (width: 1280px) and (orientation: landscape), only screen and (device-width: 800px), only screen and (max-width: 767px) { .flex-video { padding-top: 0; } }
|
||||
|
||||
/* Microformats ---------------------- */
|
||||
ul.vcard { display: inline-block; margin: 0 0 12px 0; border: 1px solid #ddd; padding: 10px; }
|
||||
ul.vcard li { margin: 0; display: block; }
|
||||
ul.vcard li.fn { font-weight: bold; font-size: 15px; font-size: 1.5rem; }
|
||||
|
||||
p.vevent span.summary { font-weight: bold; }
|
||||
p.vevent abbr { cursor: default; text-decoration: none; font-weight: bold; border: none; padding: 0 1px; }
|
||||
|
||||
/* Progress Bar ---------------------- */
|
||||
div.progress { padding: 2px; margin-bottom: 10px; border: 1px solid #cccccc; height: 25px; /* meter */ /* border radii */ }
|
||||
div.progress .meter { background: #fd7800; height: 100%; display: block; width: 50%; }
|
||||
div.progress.secondary .meter { background: #e9e9e9; }
|
||||
div.progress.success .meter { background: #5da423; }
|
||||
div.progress.alert .meter { background: #c60f13; }
|
||||
div.progress.radius { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px; }
|
||||
div.progress.radius .meter { -webkit-border-radius: 2px; -moz-border-radius: 2px; -ms-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; }
|
||||
div.progress.round { -webkit-border-radius: 1000px; -moz-border-radius: 1000px; -ms-border-radius: 1000px; -o-border-radius: 1000px; border-radius: 1000px; }
|
||||
div.progress.round .meter { -webkit-border-radius: 1000px; -moz-border-radius: 1000px; -ms-border-radius: 1000px; -o-border-radius: 1000px; border-radius: 1000px; }
|
||||
|
||||
ul li p { display: inline; }
|
||||
@@ -0,0 +1,75 @@
|
||||
@import "agogo.css";
|
||||
@import "foundation.css";
|
||||
@import "named_data_style.css";
|
||||
|
||||
body, h1, h2, h3, h4, p {
|
||||
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
|
||||
}
|
||||
|
||||
h1 { font-size: 26px; }
|
||||
h2 { font-size: 20px; }
|
||||
h3 { font-size: 17px; }
|
||||
h4 { font-size: 15px; }
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h2, h3, h4 {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
blockquote p {
|
||||
color: #222;
|
||||
}
|
||||
|
||||
p.logo {
|
||||
float: left;
|
||||
margin: 1px 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
th, td {
|
||||
border: 1px solid #666;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
div.document p {
|
||||
margin: 0.5em 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.document ol,
|
||||
div.document ul {
|
||||
margin: 0 0 0 2em;
|
||||
}
|
||||
|
||||
div.document pre {
|
||||
font-size: 13px;
|
||||
line-height: 1.3;
|
||||
margin: 0;
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
div.document table p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.document th p {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.bodywrapper a,
|
||||
div.header a:hover,
|
||||
div.sidebar a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
@@ -0,0 +1,713 @@
|
||||
/* General */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
body {
|
||||
/* background: #ccc;
|
||||
font: normal 12px Verdana, sans-serif;
|
||||
color: #777;
|
||||
line-height:18px; */
|
||||
border-top: 4px solid #fd7800;
|
||||
}
|
||||
|
||||
a {
|
||||
/* color: #000;
|
||||
outline: 0; */
|
||||
}
|
||||
|
||||
a:link {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:active,
|
||||
a:hover {
|
||||
/* color: #ccc; */
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #000;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h1 { font-weight: normal; font-size: 24px; line-height: 24px; }
|
||||
h2 { font-weight: normal; font-size: 18px; line-height: 18px; }
|
||||
h3 { font-weight: normal; font-size: 14px; line-height: 14px; }
|
||||
h4 { font-weight: normal; font-size: 12px; line-height: 12px; }
|
||||
|
||||
hr {
|
||||
background-color: #c6c6c6;
|
||||
border:0;
|
||||
height: 1px;
|
||||
margin-bottom: 18px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
div.hr {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr2 {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr hr, div.hr2 hr {
|
||||
display: none;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 0 0 0.5em;
|
||||
line-height:1.6em;
|
||||
}
|
||||
ul {
|
||||
list-style: square;
|
||||
margin: 0 0 18px 0;
|
||||
}
|
||||
ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.5em;
|
||||
}
|
||||
ol ol {
|
||||
list-style:upper-alpha;
|
||||
}
|
||||
ol ol ol {
|
||||
list-style:lower-roman;
|
||||
}
|
||||
ol ol ol ol {
|
||||
list-style:lower-alpha;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
dl {
|
||||
margin:0 0 24px 0;
|
||||
}
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
dd {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
cite,
|
||||
em,
|
||||
i {
|
||||
font-style: italic;
|
||||
border: none;
|
||||
}
|
||||
big {
|
||||
font-size: 131.25%;
|
||||
}
|
||||
ins {
|
||||
background: #FFFFCC;
|
||||
border: none;
|
||||
color: #333;
|
||||
}
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
color: #555;
|
||||
}
|
||||
blockquote {
|
||||
font-style: italic;
|
||||
padding: 0 3em;
|
||||
}
|
||||
blockquote cite,
|
||||
blockquote em,
|
||||
blockquote i {
|
||||
font-style: normal;
|
||||
}
|
||||
pre {
|
||||
background: #f7f7f7;
|
||||
color: #222;
|
||||
line-height: 18px;
|
||||
margin-bottom: 18px;
|
||||
padding: 1.5em;
|
||||
}
|
||||
abbr,
|
||||
acronym {
|
||||
border-bottom: 1px solid #666;
|
||||
cursor: help;
|
||||
}
|
||||
ins {
|
||||
text-decoration: none;
|
||||
}
|
||||
sup,
|
||||
sub {
|
||||
height: 0;
|
||||
line-height: 1;
|
||||
vertical-align: baseline;
|
||||
position: relative;
|
||||
font-size: 10px;
|
||||
}
|
||||
sup {
|
||||
bottom: 1ex;
|
||||
}
|
||||
sub {
|
||||
top: .5ex;
|
||||
}
|
||||
|
||||
p,
|
||||
ul,
|
||||
ol,
|
||||
dd,
|
||||
pre,
|
||||
hr {
|
||||
margin-bottom:10px;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
pre,
|
||||
kbd,
|
||||
tt,
|
||||
var {
|
||||
font-size: 15px;
|
||||
line-height: 21px;
|
||||
}
|
||||
code {
|
||||
font-size: 13px;
|
||||
}
|
||||
strong,
|
||||
b,
|
||||
dt,
|
||||
th {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
|
||||
/* main_container */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#wrapper {
|
||||
padding: 0px 0px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* header*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search-header{
|
||||
margin-top:15px;
|
||||
padding-bottom:13px;
|
||||
}
|
||||
|
||||
#search-header #search{
|
||||
background: #222;
|
||||
|
||||
}
|
||||
|
||||
#search-header #search #s{
|
||||
background: #222;
|
||||
font-size:12px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
#header_container{
|
||||
padding-bottom: 25px;
|
||||
padding-top: 0px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#header {
|
||||
|
||||
}
|
||||
|
||||
#header2 {
|
||||
|
||||
}
|
||||
|
||||
#content_container{
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
#left-col {
|
||||
padding: 10px 20px;
|
||||
padding-left: 0px;
|
||||
background: #fff;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*footer*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
#footer {
|
||||
padding: 5px 20px;
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
#footer-container{
|
||||
padding: 5px 20px;
|
||||
background: #303030;
|
||||
border-top: 8px solid #000;
|
||||
font-size:11px;
|
||||
}
|
||||
|
||||
#footer-info {
|
||||
color:#ccc;
|
||||
text-align:left;
|
||||
background: #1b1b1b;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
#footer-info a{
|
||||
text-decoration:none;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer-info a:hover{
|
||||
color: #ebebeb;
|
||||
}
|
||||
|
||||
#copyright{float: left;}
|
||||
|
||||
.scroll-top {
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
#footer-bar1 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar2 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar3 {
|
||||
}
|
||||
#footer-bar4 {
|
||||
}
|
||||
|
||||
span#follow-box{
|
||||
position: absolute;
|
||||
right: 100px;
|
||||
}
|
||||
|
||||
span#follow-box img{
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
/*logo*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#logo {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo2 {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo img{
|
||||
border: none;
|
||||
}
|
||||
|
||||
#logo2{
|
||||
text-decoration: none;
|
||||
font-size: 42px;
|
||||
letter-spacing: -1pt;
|
||||
font-weight: bold;
|
||||
font-family:arial, "Times New Roman", Times, serif;
|
||||
text-align: left;
|
||||
line-height: 57px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
#logo2 a, #slogan{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
#slogan{
|
||||
text-align: left;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
/*search*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search {
|
||||
width:180px;
|
||||
height:28px;
|
||||
border: 1px solid #ccc;
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#sidebar #search {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
#search #searchsubmit {
|
||||
background:url(images/go-btn.png) no-repeat top right;
|
||||
width:28px;
|
||||
height:28px;
|
||||
border:0px;
|
||||
position:absolute;
|
||||
right: -35px;
|
||||
}
|
||||
|
||||
#search #s {
|
||||
width:170px;
|
||||
height:23px;
|
||||
border:0px;
|
||||
margin-left:7px;
|
||||
margin-right:10px;
|
||||
margin-top:3px;
|
||||
color:#000;
|
||||
display: inline;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/*menu bar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#menu_container{
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
|
||||
/*responsive menu*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/* default style */
|
||||
.selectnav { display: none; }
|
||||
|
||||
/* small screen */
|
||||
@media screen and (max-width: 600px) {
|
||||
.js #nav { display: none; }
|
||||
.js #nav2 { display: none; }
|
||||
.js .selectnav { display: block; }
|
||||
}
|
||||
|
||||
|
||||
/*homepage boxes*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#box_container{
|
||||
padding-top: 35px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.box-head {
|
||||
float: left;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.box-head img{
|
||||
|
||||
}
|
||||
|
||||
.title-head{
|
||||
padding-top:2px;
|
||||
}
|
||||
|
||||
.title-box{
|
||||
color: #333;
|
||||
line-height: 15px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.title-box h1 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.box-content {
|
||||
float: left;
|
||||
padding-top: 10px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* POST */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
.post {
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-shadow{
|
||||
background: url("images/post_shadow.png") no-repeat bottom;
|
||||
height: 9px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.post ol{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.post ul {
|
||||
margin-left: 15px;
|
||||
}
|
||||
.post-entry ul { margin: 0 0 10px 10px; }
|
||||
.post-entry ul li {
|
||||
display: block;
|
||||
margin: 5px 0;
|
||||
padding: 0 0 0 20px;
|
||||
/*background: url(images/bullet.png) no-repeat 0 7px;*/
|
||||
}
|
||||
|
||||
.post-entry ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.6em;
|
||||
}
|
||||
.post-entry ol li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.post-entry {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 10px;
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-head {
|
||||
margin-bottom: 5px;
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
.post-head h1 a, .post-head h1 {
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
margin: 0px;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-head h1 a:hover {
|
||||
color:#777;
|
||||
}
|
||||
|
||||
|
||||
.post-head-notfound h1, .post-head-404 h1, .post-head-archive h1, .post-head-search h1 {
|
||||
margin-bottom: 10px;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-thumb img {
|
||||
border: 0px solid #ebebeb;
|
||||
}
|
||||
|
||||
.post-entry img{
|
||||
margin-bottom: 10px;
|
||||
height:auto;
|
||||
max-width:100% !important;
|
||||
}
|
||||
|
||||
.meta-data{
|
||||
line-height: 16px;
|
||||
padding: 6px 3px;
|
||||
margin-bottom: 3px;
|
||||
font-size: 11px;
|
||||
border-bottom: 1px solid #e9e9e9;
|
||||
}
|
||||
|
||||
.meta-data a{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
.meta-data a:hover{
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.read-more {
|
||||
color: #000;
|
||||
background: #fff;
|
||||
padding: 4px 8px;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-transform: capitalize;
|
||||
cursor: pointer;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.read-more:hover{
|
||||
background: #fff;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.sticky {
|
||||
|
||||
}
|
||||
|
||||
/* content */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
#content_container table {
|
||||
border: 1px solid #e7e7e7;
|
||||
margin: 0 -1px 24px 0;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
#content_container tr th,
|
||||
#content_container thead th {
|
||||
color: #888;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
line-height: 18px;
|
||||
padding: 9px 10px;
|
||||
}
|
||||
#content_container tr td {
|
||||
|
||||
padding: 6px 10px;
|
||||
}
|
||||
#content_container tr.odd td {
|
||||
background: #f2f7fc;
|
||||
}
|
||||
|
||||
/* sidebar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#sidebar {
|
||||
padding:0px 20px 20px 0px;
|
||||
}
|
||||
|
||||
#sidebar ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#sidebar { word-wrap: break-word;}
|
||||
|
||||
/*--navigation--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.navigation {
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
.navigation .alignleft a {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.navigation .alignright a {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#nav-single {
|
||||
overflow:hidden;
|
||||
margin-top:20px;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.nav-previous {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.nav-next {
|
||||
float: right;
|
||||
text-align: right;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
/*--slider--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#slider_container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.flex-caption{
|
||||
background: #232323;
|
||||
color: #fff;
|
||||
padding: 7px;
|
||||
}
|
||||
|
||||
.flexslider p{
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
/*--sub head and breadcrumbs--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#subhead_container{
|
||||
padding: 7px 0px;
|
||||
}
|
||||
|
||||
#subhead h1{
|
||||
color: #000;
|
||||
padding-top: 10px;
|
||||
padding-left: 0px;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
#breadcrumbs {
|
||||
padding-left: 25px;
|
||||
margin-bottom: 15px;
|
||||
color: #9e9e9e;
|
||||
margin:0 auto;
|
||||
width: 964px;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
#breadcrumbs a{
|
||||
text-decoration: none;
|
||||
color: #9e9e9e;
|
||||
}
|
||||
|
||||
/*Alignments */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.alignleft,
|
||||
img.alignleft {
|
||||
display: inline;
|
||||
float: left;
|
||||
margin-right: 22px;
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.alignright,
|
||||
img.alignright {
|
||||
display: inline;
|
||||
float: right;
|
||||
margin-left: 22px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.aligncenter,
|
||||
img.aligncenter {
|
||||
clear: both;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.alignleft,
|
||||
.alignright,
|
||||
.aligncenter,
|
||||
img.alignleft,
|
||||
img.alignright,
|
||||
img.aligncenter
|
||||
{
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
a img.aligncenter {
|
||||
display:block;
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
}
|
||||
@@ -1,813 +0,0 @@
|
||||
@import url("base.css");
|
||||
|
||||
@import url("foundation.css");
|
||||
|
||||
table {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
background-color: #fafafa;
|
||||
color: #222;
|
||||
/* line-height: 1.0em; */
|
||||
border: 2px solid #C6C9CB;
|
||||
font-size: 0.9em;
|
||||
/* margin: 1.5em 0 1.5em 0; */
|
||||
margin: 0;
|
||||
border-right-style: none;
|
||||
border-left-style: none;
|
||||
}
|
||||
|
||||
/* General */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
a:link {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:active,
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #000;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h1 { font-weight: bold; font-size: 24px; }
|
||||
h2 { font-weight: bold; font-size: 18px; }
|
||||
h3 { font-weight: bold; font-size: 16px; }
|
||||
h4 { font-weight: bold; font-size: 14px; }
|
||||
|
||||
hr {
|
||||
background-color: #c6c6c6;
|
||||
border:0;
|
||||
height: 1px;
|
||||
margin-bottom: 18px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
div.hr {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr2 {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr hr, div.hr2 hr {
|
||||
display: none;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 0;
|
||||
line-height:1.6em;
|
||||
}
|
||||
ul {
|
||||
list-style: square;
|
||||
margin: 0 0 18px 0;
|
||||
}
|
||||
ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.5em;
|
||||
}
|
||||
ol ol {
|
||||
list-style:upper-alpha;
|
||||
}
|
||||
ol ol ol {
|
||||
list-style:lower-roman;
|
||||
}
|
||||
ol ol ol ol {
|
||||
list-style:lower-alpha;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
dl {
|
||||
margin:0 0 24px 0;
|
||||
}
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
dd {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
cite,
|
||||
em,
|
||||
i {
|
||||
font-style: italic;
|
||||
border: none;
|
||||
}
|
||||
big {
|
||||
font-size: 131.25%;
|
||||
}
|
||||
ins {
|
||||
background: #FFFFCC;
|
||||
border: none;
|
||||
color: #333;
|
||||
}
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
color: #555;
|
||||
}
|
||||
blockquote {
|
||||
padding: 0 3em;
|
||||
}
|
||||
blockquote cite,
|
||||
blockquote em,
|
||||
blockquote i {
|
||||
font-style: normal;
|
||||
}
|
||||
pre {
|
||||
background: #f7f7f7;
|
||||
color: #222;
|
||||
padding: 1.5em;
|
||||
}
|
||||
abbr,
|
||||
acronym {
|
||||
border-bottom: 1px solid #666;
|
||||
cursor: help;
|
||||
}
|
||||
ins {
|
||||
text-decoration: none;
|
||||
}
|
||||
sup,
|
||||
sub {
|
||||
height: 0;
|
||||
line-height: 1;
|
||||
vertical-align: baseline;
|
||||
position: relative;
|
||||
font-size: 10px;
|
||||
}
|
||||
sup {
|
||||
bottom: 1ex;
|
||||
}
|
||||
sub {
|
||||
top: .5ex;
|
||||
}
|
||||
|
||||
p,
|
||||
ul,
|
||||
ol,
|
||||
dd,
|
||||
hr {
|
||||
margin-bottom:10px;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
pre,
|
||||
kbd,
|
||||
tt,
|
||||
var {
|
||||
}
|
||||
code {
|
||||
font-size: 13px;
|
||||
}
|
||||
strong,
|
||||
b,
|
||||
dt,
|
||||
th {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
|
||||
/* main_container */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#wrapper {
|
||||
padding: 0px 0px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* header*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search-header{
|
||||
margin-top:15px;
|
||||
padding-bottom:13px;
|
||||
}
|
||||
|
||||
#search-header #search{
|
||||
background: #222;
|
||||
|
||||
}
|
||||
|
||||
#search-header #search #s{
|
||||
background: #222;
|
||||
font-size:12px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
#header_container{
|
||||
padding-bottom: 25px;
|
||||
padding-top: 0px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#header {
|
||||
|
||||
}
|
||||
|
||||
#header2 {
|
||||
|
||||
}
|
||||
|
||||
#content_container{
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
#left-col {
|
||||
padding: 10px 20px;
|
||||
padding-left: 0px;
|
||||
background: #fff;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*footer*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
#footer {
|
||||
padding: 5px 20px;
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
#footer-container{
|
||||
padding: 5px 20px;
|
||||
background: #303030;
|
||||
border-top: 8px solid #000;
|
||||
font-size:11px;
|
||||
}
|
||||
|
||||
#footer-info {
|
||||
color:#ccc;
|
||||
text-align:left;
|
||||
background: #1b1b1b;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
#footer-info a{
|
||||
text-decoration:none;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer-info a:hover{
|
||||
color: #ebebeb;
|
||||
}
|
||||
|
||||
#copyright{float: left;}
|
||||
|
||||
.scroll-top {
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
#footer-widget{
|
||||
padding: 8px 0px 8px 0px;
|
||||
color:#6f6f6f;
|
||||
}
|
||||
|
||||
#footer-widget #search {
|
||||
width:120px;
|
||||
height:28px;
|
||||
background: #222;
|
||||
margin-left: 0px;
|
||||
position: relative;
|
||||
border: 1px solid #666;
|
||||
}
|
||||
|
||||
#footer-widget #search #s {
|
||||
width:110px;
|
||||
height:23px;
|
||||
border:0px;
|
||||
margin-left:7px;
|
||||
margin-right:10px;
|
||||
margin-top:3px;
|
||||
color:#fff;
|
||||
display: inline;
|
||||
background: #222;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#footer-widget #calendar_wrap {
|
||||
padding: 8px 0px;
|
||||
}
|
||||
|
||||
#footer-widget #wp-calendar td{
|
||||
padding:2px;
|
||||
}
|
||||
|
||||
|
||||
#footer-widget .textwidget {
|
||||
padding: 5px 0px;
|
||||
line-height: 23px;
|
||||
}
|
||||
|
||||
|
||||
#footer-widget .widget_tag_cloud a{
|
||||
text-decoration: none;
|
||||
margin: 5px;
|
||||
line-height: 24px;
|
||||
margin-left: 0px;
|
||||
color: #6f6f6f;
|
||||
}
|
||||
|
||||
#footer-widget .widget_tag_cloud a:hover{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container ul li a {
|
||||
color:#fd7800;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container ul li a:hover {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container h3 {
|
||||
color: #a5a5a5;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 0px;
|
||||
padding-top: 10px;
|
||||
padding-left: 0px;
|
||||
font-size: 25px;
|
||||
padding-bottom: 8px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container ul li {
|
||||
padding: 5px 0px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
#footer-widget ul {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
#footer-bar1 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar2 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar3 {
|
||||
}
|
||||
#footer-bar4 {
|
||||
}
|
||||
|
||||
span#follow-box{
|
||||
position: absolute;
|
||||
right: 100px;
|
||||
}
|
||||
|
||||
span#follow-box img{
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
/*logo*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#logo {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo2 {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo img{
|
||||
border: none;
|
||||
}
|
||||
|
||||
#logo2{
|
||||
text-decoration: none;
|
||||
font-size: 42px;
|
||||
letter-spacing: -1pt;
|
||||
font-weight: bold;
|
||||
font-family:arial, "Times New Roman", Times, serif;
|
||||
text-align: left;
|
||||
line-height: 57px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
#logo2 a, #slogan{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
#slogan{
|
||||
text-align: left;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
/*search*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search {
|
||||
width:180px;
|
||||
height:28px;
|
||||
border: 1px solid #ccc;
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#sidebar #search {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
#search #searchsubmit {
|
||||
background:url(images/go-btn.png) no-repeat top right;
|
||||
width:28px;
|
||||
height:28px;
|
||||
border:0px;
|
||||
position:absolute;
|
||||
right: -35px;
|
||||
}
|
||||
|
||||
#search #s {
|
||||
width:170px;
|
||||
height:23px;
|
||||
border:0px;
|
||||
margin-left:7px;
|
||||
margin-right:10px;
|
||||
margin-top:3px;
|
||||
color:#000;
|
||||
display: inline;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/*menu bar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#menu_container{
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
|
||||
/*responsive menu*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/* default style */
|
||||
.selectnav { display: none; }
|
||||
|
||||
/* small screen */
|
||||
@media screen and (max-width: 600px) {
|
||||
.js #nav { display: none; }
|
||||
.js #nav2 { display: none; }
|
||||
.js .selectnav { display: block; }
|
||||
}
|
||||
|
||||
|
||||
/*welcome*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
#welcome_container h1{
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
/*homepage boxes*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#box_container{
|
||||
padding-top: 35px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.box-head {
|
||||
float: left;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.box-head img{
|
||||
|
||||
}
|
||||
|
||||
.title-head{
|
||||
padding-top:2px;
|
||||
}
|
||||
|
||||
.title-box{
|
||||
color: #333;
|
||||
line-height: 15px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.title-box h1 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.box-content {
|
||||
float: left;
|
||||
padding-top: 10px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* POST */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
.post {
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-shadow{
|
||||
background: url("images/post_shadow.png") no-repeat bottom;
|
||||
height: 9px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.post ol{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.post ul {
|
||||
margin-left: 15px;
|
||||
}
|
||||
.post-entry ul { margin: 0 0 10px 10px; }
|
||||
.post-entry ul li {
|
||||
display: block;
|
||||
margin: 5px 0;
|
||||
padding: 0 0 0 20px;
|
||||
/*background: url(images/bullet.png) no-repeat 0 7px;*/
|
||||
}
|
||||
|
||||
.post-entry ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.6em;
|
||||
}
|
||||
.post-entry ol li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.post-entry {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 10px;
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-head {
|
||||
margin-bottom: 5px;
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
.post-head h1 a, .post-head h1 {
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
margin: 0px;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-head h1 a:hover {
|
||||
color:#777;
|
||||
}
|
||||
|
||||
|
||||
.post-head-notfound h1, .post-head-404 h1, .post-head-archive h1, .post-head-search h1 {
|
||||
margin-bottom: 10px;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-thumb img {
|
||||
border: 0px solid #ebebeb;
|
||||
}
|
||||
|
||||
.post-entry img{
|
||||
margin-bottom: 10px;
|
||||
height:auto;
|
||||
max-width:100% !important;
|
||||
}
|
||||
|
||||
.meta-data{
|
||||
line-height: 16px;
|
||||
padding: 6px 3px;
|
||||
margin-bottom: 3px;
|
||||
font-size: 11px;
|
||||
border-bottom: 1px solid #e9e9e9;
|
||||
}
|
||||
|
||||
.meta-data a{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
.meta-data a:hover{
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.read-more {
|
||||
color: #000;
|
||||
background: #fff;
|
||||
padding: 4px 8px;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-transform: capitalize;
|
||||
cursor: pointer;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.read-more:hover{
|
||||
background: #fff;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.sticky {
|
||||
|
||||
}
|
||||
|
||||
/* content */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
#content_container table {
|
||||
border: 1px solid #e7e7e7;
|
||||
margin: 0 -1px 24px 0;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
#content_container tr th,
|
||||
#content_container thead th {
|
||||
color: #888;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
line-height: 18px;
|
||||
padding: 9px 10px;
|
||||
}
|
||||
#content_container tr td {
|
||||
|
||||
padding: 6px 10px;
|
||||
}
|
||||
#content_container tr.odd td {
|
||||
background: #f2f7fc;
|
||||
}
|
||||
|
||||
/* sidebar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#sidebar {
|
||||
padding:0px 20px 20px 0px;
|
||||
}
|
||||
|
||||
#sidebar ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#sidebar { word-wrap: break-word;}
|
||||
|
||||
|
||||
/*--navigation--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.navigation {
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
.navigation .alignleft a {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.navigation .alignright a {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#nav-single {
|
||||
overflow:hidden;
|
||||
margin-top:20px;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.nav-previous {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.nav-next {
|
||||
float: right;
|
||||
text-align: right;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
/*--slider--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#slider_container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.flex-caption{
|
||||
background: #232323;
|
||||
color: #fff;
|
||||
padding: 7px;
|
||||
}
|
||||
|
||||
.flexslider p{
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
/*--sub head and breadcrumbs--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#subhead_container{
|
||||
padding: 7px 0px;
|
||||
}
|
||||
|
||||
#subhead h1{
|
||||
color: #000;
|
||||
padding-top: 10px;
|
||||
padding-left: 0px;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
#breadcrumbs {
|
||||
padding-left: 25px;
|
||||
margin-bottom: 15px;
|
||||
color: #9e9e9e;
|
||||
margin:0 auto;
|
||||
width: 964px;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
#breadcrumbs a{
|
||||
text-decoration: none;
|
||||
color: #9e9e9e;
|
||||
}
|
||||
|
||||
/*Alignments */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.alignleft,
|
||||
img.alignleft {
|
||||
display: inline;
|
||||
float: left;
|
||||
margin-right: 22px;
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.alignright,
|
||||
img.alignright {
|
||||
display: inline;
|
||||
float: right;
|
||||
margin-left: 22px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.aligncenter,
|
||||
img.aligncenter {
|
||||
clear: both;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.alignleft,
|
||||
.alignright,
|
||||
.aligncenter,
|
||||
img.alignleft,
|
||||
img.alignright,
|
||||
img.aligncenter
|
||||
{
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
|
||||
a img.aligncenter {
|
||||
display:block;
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
}
|
||||
|
||||
|
||||
table {
|
||||
border-collapse:collapse;
|
||||
}
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 152.13 43.86"><defs><style>.cls-1{fill:#dc9610;}.cls-2{fill:#fff;}.cls-3{fill:#bf4818;}</style></defs><rect class="cls-1" width="87.68" height="22.95" rx="5"/><rect class="cls-1" x="89.93" width="62.2" height="22.95" rx="5"/><path class="cls-2" d="M94.88,4.14h5.28c3.16,0,4.82.55,6.22,2.11a8.1,8.1,0,0,1,1.92,5.47,8.41,8.41,0,0,1-2,5.71c-1.35,1.42-3.08,2-6,2h-5.4Zm5.87,12.37A3.29,3.29,0,0,0,104,15a6.14,6.14,0,0,0,.77-3.24A5.94,5.94,0,0,0,104,8.62a3.09,3.09,0,0,0-3-1.54H98.39v9.43Z" transform="translate(-0.18)"/><path class="cls-2" d="M113.7,16.37l-1,3.08h-3.81l5.45-15.31h4.37l5,15.31h-4l-.84-3.08Zm2.76-8.81-1.89,6h3.53Z" transform="translate(-0.18)"/><path class="cls-2" d="M131,19.45h-3.5V7.08h-4.73V4.14h13V7.08H131Z" transform="translate(-0.18)"/><path class="cls-2" d="M139.37,16.37l-1,3.08h-3.81L140,4.14h4.37l4.95,15.31h-4l-.84-3.08Zm2.76-8.81-1.89,6h3.53Z" transform="translate(-0.18)"/><path class="cls-3" d="M10.82,43.52,6.4,35.69l-1.61-3c0,.8,0,1.38,0,1.83,0,.83,0,1.72,0,2.69v6.29H1.66V28.21H5.3l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V28.21h3.2V43.52Z" transform="translate(-0.18)"/><path class="cls-3" d="M29.23,31.15H21.12v3H28.2v2.71H21.12v3.74h8.25v2.94H17.61V28.21H29.23Z" transform="translate(-0.18)"/><path class="cls-3" d="M39,43.52H35.53V31.15H30.81V28.21H43.75v2.94H39Z" transform="translate(-0.18)"/><path class="cls-3" d="M49,43.52l-4.2-15.31h3.48L50,35.07c.3,1.29.47,2,.86,3.81.26-1.74.42-2.66.66-3.81L53,28.21h3.36l1.45,7c.31,1.51.47,2.34.68,3.69.14-.66.4-1.9.79-3.69l1.73-7h3.48L60.11,43.52H56.84l-1.43-6.38c-.35-1.59-.67-3.24-.77-4-.3,1.65-.49,2.64-.79,4l-1.47,6.38Z" transform="translate(-0.18)"/><path class="cls-3" d="M80.76,36c0,4.66-3.15,7.87-7.71,7.87s-7.73-3.21-7.73-8a7.92,7.92,0,0,1,2.4-6A7.73,7.73,0,0,1,73,27.87C77.72,27.87,80.76,31.06,80.76,36ZM69,35.85C69,39,70.5,41,73.05,41s4-1.91,4-5S75.6,30.78,73,30.78,69,32.68,69,35.85Z" transform="translate(-0.18)"/><path class="cls-3" d="M86.88,43.52H83.45V28.21h6.79c2,0,3.13.25,4.07.92a3.81,3.81,0,0,1,1.49,3.21A3.59,3.59,0,0,1,93.21,36c1.54.48,2.08,1.28,2.2,3.3l.11,2.18a3.24,3.24,0,0,0,.63,2H92.72c-.42-.32-.54-.55-.58-1.33L92,40.1c-.14-1.88-1-2.71-2.78-2.71H86.88Zm3.43-8.84c1.29,0,2-.64,2-1.77s-.7-1.76-2-1.76H86.88v3.53Z" transform="translate(-0.18)"/><path class="cls-3" d="M112.65,43.52h-4.21l-4.72-6.93L102.27,38v5.49H98.84V28.21h3.43v5.65l5.26-5.65h4.6l-6.07,6Z" transform="translate(-0.18)"/><path class="cls-3" d="M117.83,43.52h-3.5V28.21h3.5Z" transform="translate(-0.18)"/><path class="cls-3" d="M130.28,43.52l-4.41-7.83-1.61-3c0,.8,0,1.38,0,1.83,0,.83,0,1.72,0,2.69v6.29h-3.2V28.21h3.64l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V28.21h3.2V43.52Z" transform="translate(-0.18)"/><path class="cls-3" d="M151,35.05v8.47h-2.1l-.49-2c-1.08,1.65-2.41,2.29-4.67,2.29-4.42,0-7.13-3-7.13-7.89s3-8.1,7.57-8.1a6.48,6.48,0,0,1,6.71,5l-3.39.2a3.13,3.13,0,0,0-3.3-2.27c-2.52,0-4.08,1.88-4.08,5,0,3.3,1.51,5.28,4.06,5.28A3.71,3.71,0,0,0,148,37.87h-3.81V35.05Z" transform="translate(-0.18)"/><path class="cls-2" d="M14.72,19.45,10.3,11.62l-1.61-3c.05.8.05,1.38.05,1.84,0,.82,0,1.72,0,2.68v6.29H5.56V4.14H9.2l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V4.14h3.21V19.45Z" transform="translate(-0.18)"/><path class="cls-2" d="M24.82,16.37l-1,3.08H20L25.47,4.14h4.38L34.8,19.45h-4L30,16.37Zm2.76-8.81-1.89,6h3.52Z" transform="translate(-0.18)"/><path class="cls-2" d="M42.43,19.45,40.27,11.3c-.16-.69-.3-1.17-.39-1.49-.12-.48-.14-.57-.28-1,0,.55,0,.94,0,1.19l0,1.47v8H36.46V4.14H41.4l2,8c.31,1.19.57,2.46.75,3.47a4.72,4.72,0,0,0,.1-.49l.25-1c.05-.28.14-.62.24-1s.23-1,.23-1l2-8h4.89V19.45h-3.2v-8l0-1.47a11.79,11.79,0,0,1,.05-1.19c-.26.92-.42,1.54-.49,1.74-.14.42-.21.72-.24.74l-2.13,8.17Z" transform="translate(-0.18)"/><path class="cls-2" d="M66.81,7.08H58.7v3h7.08v2.71H58.7v3.74H67v2.94H55.19V4.14H66.81Z" transform="translate(-0.18)"/><path class="cls-2" d="M69.53,4.14h5.28c3.15,0,4.81.55,6.22,2.11a8.09,8.09,0,0,1,1.91,5.47,8.41,8.41,0,0,1-2,5.71c-1.36,1.42-3.09,2-6,2H69.53Zm5.86,12.37A3.29,3.29,0,0,0,78.59,15a6,6,0,0,0,.78-3.24,6,6,0,0,0-.75-3.16,3.11,3.11,0,0,0-3-1.54H73v9.43Z" transform="translate(-0.18)"/></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
@@ -1,15 +1,12 @@
|
||||
[theme]
|
||||
inherit = agogo
|
||||
stylesheet = named_data_style.css
|
||||
# pygments_style = sphinx
|
||||
|
||||
theme_bodyfont = "normal 12px Verdana, sans-serif"
|
||||
theme_bgcolor = "#ccc"
|
||||
|
||||
theme_documentwidth = "100%"
|
||||
theme_textalign = "left"
|
||||
stylesheet = named_data.css
|
||||
|
||||
[options]
|
||||
|
||||
stickysidebar = true
|
||||
collapsiblesidebar = true
|
||||
pagewidth = 90%
|
||||
documentwidth = 70%
|
||||
sidebarwidth = 20%
|
||||
bgcolor = white
|
||||
headerbg = none
|
||||
footerbg = none
|
||||
textalign = left
|
||||
@@ -1,70 +0,0 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
# Based on http://doughellmann.com/2010/05/09/defining-custom-roles-in-sphinx.html
|
||||
|
||||
"""Integration of Sphinx with Redmine.
|
||||
"""
|
||||
|
||||
from docutils import nodes, utils
|
||||
from docutils.parsers.rst.roles import set_classes
|
||||
|
||||
def redmine_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
|
||||
"""Link to a Redmine issue.
|
||||
|
||||
Returns 2 part tuple containing list of nodes to insert into the
|
||||
document and a list of system messages. Both are allowed to be
|
||||
empty.
|
||||
|
||||
:param name: The role name used in the document.
|
||||
:param rawtext: The entire markup snippet, with role.
|
||||
:param text: The text marked with the role.
|
||||
:param lineno: The line number where rawtext appears in the input.
|
||||
:param inliner: The inliner instance that called us.
|
||||
:param options: Directive options for customization.
|
||||
:param content: The directive content for customization.
|
||||
"""
|
||||
try:
|
||||
issue_num = int(text)
|
||||
if issue_num <= 0:
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
msg = inliner.reporter.error(
|
||||
'Redmine issue number must be a number greater than or equal to 1; '
|
||||
'"%s" is invalid.' % text, line=lineno)
|
||||
prb = inliner.problematic(rawtext, rawtext, msg)
|
||||
return [prb], [msg]
|
||||
app = inliner.document.settings.env.app
|
||||
node = make_link_node(rawtext, app, 'issues', str(issue_num), options)
|
||||
return [node], []
|
||||
|
||||
def make_link_node(rawtext, app, type, slug, options):
|
||||
"""Create a link to a Redmine resource.
|
||||
|
||||
:param rawtext: Text being replaced with link node.
|
||||
:param app: Sphinx application context
|
||||
:param type: Link type (issue, changeset, etc.)
|
||||
:param slug: ID of the thing to link to
|
||||
:param options: Options dictionary passed to role func.
|
||||
"""
|
||||
#
|
||||
try:
|
||||
base = app.config.redmine_project_url
|
||||
if not base:
|
||||
raise AttributeError
|
||||
except AttributeError:
|
||||
raise ValueError('redmine_project_url configuration value is not set')
|
||||
#
|
||||
slash = '/' if base[-1] != '/' else ''
|
||||
ref = base + slash + type + '/' + slug + '/'
|
||||
set_classes(options)
|
||||
node = nodes.reference(rawtext, 'Issue #' + utils.unescape(slug), refuri=ref,
|
||||
**options)
|
||||
return node
|
||||
|
||||
def setup(app):
|
||||
"""Install the plugin.
|
||||
|
||||
:param app: Sphinx application context.
|
||||
"""
|
||||
app.add_role('issue', redmine_role)
|
||||
app.add_config_value('redmine_project_url', None, 'env')
|
||||
return
|
||||
@@ -1 +1 @@
|
||||
release-notes/release-notes-0.6.3.rst
|
||||
release-notes/release-notes-0.7.1.rst
|
||||
@@ -17,17 +17,17 @@ The current features include:
|
||||
- **Base**
|
||||
|
||||
+ Fully asynchronous, event-driven communication model, which is implemented using `Boost.Asio
|
||||
<http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html>`_
|
||||
<https://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html>`_
|
||||
+ Single-threaded, but thread-safe Face operations
|
||||
|
||||
A single Face object can be safely used in multiple threads to express Interests and
|
||||
publish Data packets
|
||||
|
||||
+ Explicit time management for NDN operations using `Boost.Chrono
|
||||
<http://www.boost.org/doc/libs/1_48_0/doc/html/chrono.html>`_
|
||||
<https://www.boost.org/doc/libs/1_48_0/doc/html/chrono.html>`_
|
||||
+ Simplified and extended `NDN API <doxygen/annotated.html>`_
|
||||
+ Extensive set of unit-tests based on `Boost.Test framework
|
||||
<http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/index.html>`_
|
||||
<https://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/index.html>`_
|
||||
|
||||
- Continuous integration using an in-house installation of Jenkins build bots and the
|
||||
hosted `Travis CI <https://travis-ci.org/named-data/ndn-cxx>`_ continuous
|
||||
@@ -35,7 +35,7 @@ The current features include:
|
||||
|
||||
- **Wire format**
|
||||
|
||||
+ Full support of `NDN-TLV packet format v0.1 <http://named-data.net/doc/NDN-TLV/0.1/>`_
|
||||
+ Full support of `NDN-TLV packet format v0.1 <https://named-data.net/doc/NDN-packet-spec/0.1/>`_
|
||||
+ Pure C++ implementation of wire encoding/decoding with simple access to wire format
|
||||
of all NDN packet abstractions via ``wireEncode`` and ``wireDecode`` methods
|
||||
|
||||
@@ -49,11 +49,11 @@ The current features include:
|
||||
<https://github.com/named-data/NFD>`_
|
||||
|
||||
- Full support for `NFD management protocols
|
||||
<http://redmine.named-data.net/projects/nfd/wiki/Management>`_ to NFD status
|
||||
<https://redmine.named-data.net/projects/nfd/wiki/Management>`_ to NFD status
|
||||
information, create and manage NFD Faces, receive NFD Face status change
|
||||
notifications, update StrategyChoice for namespaces, and manage routes in RIB
|
||||
- Support for `LocalControlHeader
|
||||
<http://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader>`_ to implement
|
||||
<https://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader>`_ to implement
|
||||
special NDN applications that need low-level control of NDN packet forwarding
|
||||
|
||||
- **Security support**
|
||||
|
||||
@@ -5,25 +5,26 @@ Release date: August 25, 2014
|
||||
|
||||
Changes since version 0.1.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **Base**
|
||||
|
||||
+ The license under which the library is released is changed to **Lesser GNU Public
|
||||
License version 3.0**.
|
||||
+ The license under which the library is released is changed to the **GNU Lesser
|
||||
General Public License version 3.0**
|
||||
|
||||
+ New ways to use incoming Interest dispatching:
|
||||
|
||||
* New :ndn-cxx:`InterestFilter` abstraction that supports filtering based on name
|
||||
prefixes and regular expressions.
|
||||
|
||||
* Separated :ndn-cxx:`Face::registerPrefix()` and :ndn-cxx:`Face::setInterestFilter()`
|
||||
methods allow distinct operations of registering with the local NDN forwarder and setting
|
||||
* Separate ``Face::registerPrefix()`` and ``Face::setInterestFilter()`` methods
|
||||
allow distinct operations of registering with the local NDN forwarder and setting
|
||||
up application-specific ``OnInterest`` call dispatch using InterestFilters.
|
||||
|
||||
+ Add support for new `NDN naming conventions
|
||||
<http://named-data.net/doc/tech-memos/naming-conventions.pdf>`_ (:issue:`1761`)
|
||||
+ Add support for the `NDN naming conventions (revision 1)
|
||||
<https://named-data.net/publications/techreports/ndn-tr-22-ndn-memo-naming-conventions/>`_
|
||||
(:issue:`1761`)
|
||||
|
||||
- **Security**
|
||||
|
||||
@@ -37,26 +38,25 @@ New features:
|
||||
+ New :ndn-cxx:`SignatureSha256WithEcdsa` signature type
|
||||
|
||||
+ Updates in :ndn-cxx:`Signature` data structure to reflect changes in `NDN-TLV spec
|
||||
0.1.1 <http://named-data.net/doc/NDN-TLV/0.1.1/>`_
|
||||
0.1.1 <https://named-data.net/doc/NDN-packet-spec/0.1.1/>`_
|
||||
|
||||
- **Wire encoding**
|
||||
|
||||
+ :ndn-cxx:`Data::getFullName() <getFullName()>` method to get :ndn-cxx:`Data` packet
|
||||
name with implicit digest
|
||||
+ ``Data::getFullName()`` method to get the Data packet name including the implicit digest
|
||||
|
||||
+ New :ndn-cxx:`Name::getSuccessor()` method to get name successor (:issue:`1677`)
|
||||
+ ``Name::getSuccessor()`` method to get name successor (:issue:`1677`)
|
||||
|
||||
+ New in-wire refreshing of Interest's nonce (:issue:`1758`)
|
||||
|
||||
- **Management**
|
||||
|
||||
+ Support for :ndn-cxx:`ChannelStatus`, :ndn-cxx:`StrategyChoice` datasets
|
||||
+ Support for :ndn-cxx:`ChannelStatus` and :ndn-cxx:`StrategyChoice` datasets
|
||||
|
||||
+ Defining new common Route Origins for NFD RIB management protocol (:issue:`1719`)
|
||||
|
||||
+ New RibEntry and Route data structures for RIB management protocol (:issue:`1764`)
|
||||
+ New ``RibEntry`` and ``Route`` data structures for RIB management protocol (:issue:`1764`)
|
||||
|
||||
+ Add support for RIB flags for setInterestFilter and registerPrefix (:issue:`1842`)
|
||||
+ Add support for RIB flags in ``setInterestFilter()`` and ``registerPrefix()`` (:issue:`1842`)
|
||||
|
||||
- **Miscellaneous tools**
|
||||
|
||||
@@ -71,10 +71,10 @@ New features:
|
||||
|
||||
- **Build**
|
||||
|
||||
+ enabled support of precompiled headers for clang and gcc compilers to speed up compilation
|
||||
+ Enabled support of precompiled headers for clang and gcc compilers to speed up compilation
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **Base**
|
||||
|
||||
@@ -84,13 +84,13 @@ Updates and bug fixes:
|
||||
:ndn-cxx:`Face::put` methods (:issue:`1774`)
|
||||
|
||||
+ Cleaning up transport state on communication failure, so Face can try to reconnect
|
||||
in the future.
|
||||
in the future
|
||||
|
||||
+ Fix bug with Face::removePendingInterest (:issue:`1917`)
|
||||
+ Fix bug in ``Face::removePendingInterest`` (:issue:`1917`)
|
||||
|
||||
- **Wire encoding**
|
||||
|
||||
+ Nonce field is now encoded as 4-byte uint8_t value, as defined by NDN-TLV spec.
|
||||
+ The Nonce field is now encoded as a 4-byte value, as defined by NDN-TLV spec
|
||||
|
||||
+ Optimized Data packet signing
|
||||
|
||||
@@ -104,27 +104,27 @@ Updates and bug fixes:
|
||||
|
||||
- **Management**
|
||||
|
||||
+ Add link-layer byte counts in FaceStatus data structure (:issue:`1765`)
|
||||
+ Add link-layer byte counts in ``FaceStatus`` data structure (:issue:`1765`)
|
||||
|
||||
- **Security**
|
||||
|
||||
+ Allow user to explicitly specify the cert name prefix before 'KEY' component in
|
||||
``ndnsec-certgen``
|
||||
|
||||
+ ``SignatureSha256`` has been renamed to :ndn-cxx:`DigestSha256` to conform with
|
||||
`NDN-TLV specification <http://named-data.net/doc/ndn-tlv/>`_.
|
||||
+ ``SignatureSha256`` has been renamed to :ndn-cxx:`DigestSha256` to conform to
|
||||
`NDN-TLV specification <https://named-data.net/doc/NDN-packet-spec/0.1.1/>`_
|
||||
|
||||
+ Add checking of ``Timestamp`` and ``Nonce`` fields in signed Interest within
|
||||
+ Add checking of Timestamp and Nonce fields in signed Interest within
|
||||
:ndn-cxx:`ValidatorConfig`
|
||||
|
||||
+ Allow validator customization using hooks:
|
||||
+ Allow validator customization using hooks.
|
||||
|
||||
Sub-classes of :ndn-cxx:`Validator` class can use the following hooks to fine-tune the
|
||||
validation process:
|
||||
|
||||
* ``preCertificateValidation`` to process received certificate before validation.
|
||||
* ``preCertificateValidation`` to process received certificate before validation
|
||||
* ``onTimeout`` to process interest timeout
|
||||
* ``afterCheckPolicy`` to process validation requests.
|
||||
* ``afterCheckPolicy`` to process validation requests
|
||||
|
||||
+ Fix memory issues in ``SecPublicInfoSqlite3``
|
||||
|
||||
@@ -136,8 +136,8 @@ Updates and bug fixes:
|
||||
|
||||
- Other minor fixes and corrections
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``SignatureSha256`` class, use :ndn-cxx:`DigestSha256` instead.
|
||||
|
||||
@@ -161,10 +161,10 @@ Deprecated:
|
||||
- ``CommandInterestGenerator`` and ``CommandInterestValidator`` utility classes.
|
||||
:ndn-cxx:`ValidatorConfig` should be used instead.
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- support of ndnd-tlv (only NFD management protocol is supported now)
|
||||
- Support for ndnd-tlv (only NFD management protocol is supported now)
|
||||
|
||||
- ``SecPublicInfoMemory`` and ``SecTpmMemory`` classes that were no longer used
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: February 2, 2015
|
||||
|
||||
Changes since version 0.2.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **Build**
|
||||
|
||||
@@ -85,8 +85,8 @@ New features:
|
||||
|
||||
+ New NetworkMonitor helper to detect network state changes (:issue:`2443`)
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **Base**
|
||||
|
||||
@@ -198,8 +198,8 @@ Updates and bug fixes:
|
||||
|
||||
- Other minor fixes and corrections
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``ndn::ptr_lib`` and ``ndn::func_lib`` namespace aliases
|
||||
|
||||
@@ -216,8 +216,8 @@ Deprecated:
|
||||
|
||||
- ``EventEmitter`` is deprecated in favor of ``Signal``
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- FaceFlags APIs (:issue:`1992`)
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: March 3, 2015
|
||||
|
||||
Changes since version 0.3.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **Management**
|
||||
|
||||
@@ -17,8 +17,8 @@ New features:
|
||||
|
||||
- Add CachingPolicy to ``LocalControlHeader`` (:issue:`2183`)
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **Wire encoding**
|
||||
|
||||
@@ -51,8 +51,8 @@ Updates and bug fixes:
|
||||
- Explicitly define ``_GLIBCXX_USE_NANOSLEEP``, necessary for gcc < 4.8 in some environments
|
||||
(:issue:`2499`)
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Delete deprecated ``Block(std::istream&)`` constructor (:issue:`2241`)
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: May 12, 2015
|
||||
|
||||
Changes since version 0.3.1:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Add Link abstraction (:issue:`2587`)
|
||||
|
||||
@@ -18,8 +18,8 @@ New features:
|
||||
* In-memory PIB implementation
|
||||
* Define new abstraction for identity, key, and certificate
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Enable decoding Exclude containing ImplicitSha256DigestComponent (:issue:`2629`)
|
||||
|
||||
@@ -35,13 +35,13 @@ Updates and bug fixes:
|
||||
|
||||
- Disable precompiled headers on OS X with clang < 6.1.0 (:issue:`2804`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- `Block::fromBuffer` overloads with output parameter (:issue:`2553`)
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Delete deprecated Controller functions:
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: July 1, 2015
|
||||
|
||||
Changes since version 0.3.2:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Allow compilation of ndn-cxx as a shared library (:issue:`2243`)
|
||||
|
||||
@@ -41,8 +41,8 @@ New features:
|
||||
* ``makeStringBlock``
|
||||
* ``readString``
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Use C++11 lambda expression and smart pointers in Face implementation (:issue:`2112`)
|
||||
|
||||
@@ -72,8 +72,8 @@ Improvements and bug fixes:
|
||||
restrictive move operation (`move_if_noexcept`) is used (e.g., in STL library's containers)
|
||||
(:issue:`2966`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- The following ``KeyChain::sign*`` methods, in favor of generalized ``KeyChain::sign(..., SigningInfo)``
|
||||
|
||||
@@ -101,23 +101,23 @@ Deprecated:
|
||||
* ``CommandOptions::setSigningIdentity``
|
||||
* ``CommandOptions::setSigningCertificate``
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Remove SCOPE from Interests and all references to it in the related code (:issue:`2345`)
|
||||
|
||||
- Direct FIB management in Face class (:issue:`2533`)
|
||||
- Direct FIB management in Face class (:issue:`2533`).
|
||||
|
||||
``Face::register`` and ``Face::setInterestFilter`` methods now only support NFD RIB management
|
||||
protocol.
|
||||
|
||||
For special needs, FIB management can be implemented using ``nfd::Controller``
|
||||
(``start<FibAddNextHopCommand>``, and ``start<FibRemoveNextHopCommand>``)
|
||||
(``start<FibAddNextHopCommand>`` and ``start<FibRemoveNextHopCommand>``).
|
||||
|
||||
Upcoming features (partially finished in development branches):
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Upcoming features (partially finished in development branches)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- NDNLPv2 (http://redmine.named-data.net/projects/nfd/wiki/NDNLPv2, :issue:`2520`,
|
||||
- NDNLPv2 (https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2, :issue:`2520`,
|
||||
:issue:`2879`, :issue:`2763`, :issue:`2883`, :issue:`2841`, :issue:`2866`)
|
||||
|
||||
- New NDN certificate format (:issue:`2861`, :issue:`2868`)
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: August 31, 2015
|
||||
|
||||
Changes since version 0.3.3:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- By default, library is now compiled as a shared library (:issue:`2867`)
|
||||
|
||||
@@ -26,8 +26,8 @@ New features:
|
||||
- New Dispatcher class to simplify server-side implementation of NFD management protocol
|
||||
(:issue:`2107`)
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Fix compilation error with Boost 1.59 (:issue:`3128`)
|
||||
|
||||
@@ -44,8 +44,8 @@ Improvements and bug fixes:
|
||||
|
||||
- Add ability to create ``util::Digest`` object from ``std::istream&`` (:issue:`3022`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- The following methods of ``CommandOptions`` class in favor of ``getSigningInfo`` and
|
||||
``setSigningInfo`` methods (:issue:`2893`):
|
||||
@@ -61,8 +61,8 @@ Deprecated:
|
||||
- Overloads of ``Face::registerPrefix`` and ``Face::setInterestFilter`` that do not accept
|
||||
SigningInfo parameter (:issue:`2932`)
|
||||
|
||||
Upcoming features (partially implemented in development branches):
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Upcoming features (partially implemented in development branches)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Introduce new API to simplify security transformations (:issue:`3009`)
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ Release date: December 31, 2015
|
||||
|
||||
Changes since version 0.3.4:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **(breaking change)** LocalControlHeader for special signaling between application and NFD has
|
||||
been replaced with NDNLPv2 signaling (:issue:`2879`, :issue:`2930`)
|
||||
@@ -32,8 +32,8 @@ New features:
|
||||
|
||||
- Ability to create Face with custom IO service and default transport (:issue:`2500`)
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **(breaking change)** SegmentFetcher helper changed to use asynchronous data validation (:issue:`2734`)
|
||||
|
||||
@@ -46,8 +46,8 @@ Improvements and bug fixes:
|
||||
|
||||
- Minor documentation updates (:issue:`3207`, :issue:`3210`, :issue:`3221`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- Overloads of ``Face::registerPrefix`` and ``Face::setInterestFilter`` that do not accept
|
||||
SigningInfo parameter (:issue:`2932`)
|
||||
@@ -61,13 +61,13 @@ Deprecated:
|
||||
- ndn::util::DummyClientFace::sentDatas, use ndn::util::DummyClientFace.sentData instead
|
||||
(:issue:`3146`)
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Deprecated EventEmitter class (:issue:`2351`)
|
||||
|
||||
Planned features for future releases:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Planned features for future releases
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Introduce new API to simplify security transformations (:issue:`3009`)
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: March 25, 2016
|
||||
|
||||
Changes since version 0.4.0:
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Improved support for ECDSA signatures (:issue:`3438`, :issue:`3439`)
|
||||
|
||||
@@ -15,14 +15,14 @@ Improvements and bug fixes:
|
||||
- Use InMemoryStorage for StatusDataset and Notification produced by managers based on
|
||||
Dispatcher class (:issue:`2182`)
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Deprecated ``tlvdump`` command-line tool (use ``ndn-dissect`` tool from `NDN Essential Tools
|
||||
<https://github.com/named-data/ndn-tools>`__ instead
|
||||
|
||||
Planned features for future releases:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Planned features for future releases
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Introduce new API to simplify security transformations (:issue:`3009`)
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@ Release date: October 4, 2016
|
||||
|
||||
Changes since version 0.4.1:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- New transformation API (:issue:`3009`)
|
||||
|
||||
@@ -104,7 +104,7 @@ Deprecated
|
||||
- ``ndn::crypto::sha256`` in favor of ``ndn::crypto::computeSha256Digest``
|
||||
|
||||
- ``security/cryptopp.hpp`` header. Use ``security/v1/cryptopp.hpp`` when needed, avoid direct
|
||||
include as CryptoPP dependency may be removed from future versions of the library.
|
||||
include as CryptoPP dependency will be removed from future versions of the library.
|
||||
|
||||
- ``security/identity-certificate.hpp`` header. Use ``security/v1/identity-certificate.hpp`` instead.
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ Release date: January 25, 2017
|
||||
|
||||
Changes since version 0.5.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Add version 2 of the security framework (introduced in ``security::v2`` namespace)
|
||||
|
||||
|
||||
@@ -5,18 +5,18 @@ Release date: October 16, 2017
|
||||
|
||||
Changes since version 0.5.1:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **breaking change** Security framework version 2 (:issue:`3098`, :issue:`3920`,
|
||||
:issue:`3644`, :issue:`4085`, :issue:`4323`, :issue:`4339`)
|
||||
- **(breaking change)** Security framework version 2 (:issue:`3098`, :issue:`3920`,
|
||||
:issue:`3644`, :issue:`4085`, :issue:`4323`, :issue:`4339`).
|
||||
|
||||
The released version of the library only supports the new version of the security (v2
|
||||
certificate format) and features a number of updates of KeyChain and Validator
|
||||
interfaces. At the same time, management APIs for :ndn-cxx:`ValidatorConfig` remained
|
||||
intact; transition to the new framework would require only adjusting
|
||||
:ndn-cxx:`Validator::validate` calls and updating configuration files to follow the new
|
||||
naming conventions of :ref:`NDN Certificate Format Version 2.0`.
|
||||
The released version of the library only supports the new version of the security (v2
|
||||
certificate format) and features a number of updates of KeyChain and Validator
|
||||
interfaces. At the same time, management APIs for :ndn-cxx:`ValidatorConfig` remained
|
||||
intact; transition to the new framework would require only adjusting
|
||||
:ndn-cxx:`Validator::validate` calls and updating configuration files to follow the new
|
||||
naming conventions of :ref:`NDN Certificate Format Version 2.0`.
|
||||
|
||||
- Integration of fetching certificates using Certificate Bundle as part of specialized
|
||||
``CertificateFetcher`` (:issue:`3891`)
|
||||
|
||||
@@ -3,8 +3,8 @@ ndn-cxx version 0.6.1
|
||||
|
||||
Release date: February 19, 2018
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- (potentially breaking change) :ndn-cxx:`expressInterest` now by default loopbacks Interests to
|
||||
producer callbacks on the same :ndn-cxx:`Face`. When undesired, use
|
||||
@@ -13,50 +13,40 @@ New features:
|
||||
- New signal in :ndn-cxx:`SegmentFetcher` to notify retrieval of Data segments
|
||||
(:issue:`4438`)
|
||||
|
||||
- Initial support for the Content Store management protocol
|
||||
(:issue:`4050`)
|
||||
- Initial support for the Content Store management protocol (:issue:`4050`)
|
||||
|
||||
- Literal operators for ``time::duration`` types, such as ``1_s``, ``42_ms``, ``30_days``
|
||||
(:issue:`4468`)
|
||||
|
||||
- Support for BLAKE2 hash function (requires OpenSSL >= 1.1.0)
|
||||
|
||||
- A ``escape()`` helper function complementing the existing ``unescape()`` (:issue:`4484`)
|
||||
- An ``escape()`` helper function complementing the existing ``unescape()`` (:issue:`4484`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- ``ndnsec key-gen`` command line now allows customization of key ID (:issue:`4294`)
|
||||
|
||||
- Fixed encoding of ``'~'`` and ``'+'`` in :ndn-cxx:`Component::toUri()`
|
||||
(:issue:`4484`)
|
||||
- Fixed encoding of ``'~'`` and ``'+'`` in ``name::Component::toUri()`` (:issue:`4484`)
|
||||
|
||||
- Fixed handling of large dates when converting to/from string
|
||||
(:issue:`4478`, :issue:`3915`)
|
||||
- Fixed handling of large dates when converting to/from string (:issue:`4478`, :issue:`3915`)
|
||||
|
||||
- Fixed error handling in :ndn-cxx:`KeyChain::importSafeBag()`
|
||||
(:issue:`4359`)
|
||||
- Fixed error handling in ``KeyChain::importSafeBag()`` (:issue:`4359`)
|
||||
|
||||
- Fixed parsing of IPv6 addresses with scope-id
|
||||
(:issue:`4474`)
|
||||
- Fixed parsing of IPv6 addresses with scope-id (:issue:`4474`)
|
||||
|
||||
- :ndn-cxx:`io::load()` now handles empty files properly
|
||||
(:issue:`4434`)
|
||||
- ``io::load()`` now handles empty files properly (:issue:`4434`)
|
||||
|
||||
- Switched to using `boost::asio::basic_waitable_timer`
|
||||
(:issue:`4431`)
|
||||
- Switched to using ``boost::asio::basic_waitable_timer`` (:issue:`4431`)
|
||||
|
||||
- Allow linking multiple :ndn-cxx:`DummyClientFace` instances together to emulate a broadcast medium
|
||||
(:issue:`3913`)
|
||||
- Allow linking multiple :ndn-cxx:`DummyClientFace` instances together to emulate a broadcast
|
||||
medium (:issue:`3913`)
|
||||
|
||||
- Fixed build when ``std::to_string`` is not available
|
||||
(:issue:`4393`)
|
||||
- Fixed build when ``std::to_string`` is not available (:issue:`4393`)
|
||||
|
||||
- Avoid undefined behavior when casting to :ndn-cxx:`tlv::SignatureTypeValue`
|
||||
(:issue:`4370`)
|
||||
- Avoid undefined behavior when casting to :ndn-cxx:`tlv::SignatureTypeValue` (:issue:`4370`)
|
||||
|
||||
- Fixed compilation with Boost 1.66.0
|
||||
(:issue:`4422`)
|
||||
- Fixed compilation with Boost 1.66.0 (:issue:`4422`)
|
||||
|
||||
- Various documentation updates
|
||||
(:issue:`3918`, :issue: `4184`, :issue: `4275`)
|
||||
@@ -64,6 +54,4 @@ Improvements and bug fixes
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Removed obsolete TLV-TYPE constants
|
||||
(:issue:`4055`, :issue:`3098`, :issue: `3755`)
|
||||
|
||||
- Removed obsolete TLV-TYPE constants (:issue:`4055`, :issue:`3098`, :issue: `3755`)
|
||||
@@ -3,16 +3,11 @@ ndn-cxx version 0.6.2
|
||||
|
||||
Release date: May 4, 2018
|
||||
|
||||
Note that this is the last release that encodes to [NDN packet format version
|
||||
0.2.1](https://named-data.net/doc/NDN-packet-spec/0.2.1/). A future release will continue to
|
||||
decode v0.2.1 format, but will encode to [v0.3
|
||||
format](https://named-data.net/doc/NDN-packet-spec/0.3/).
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
- Initial support for [NDN packet format version
|
||||
0.3](https://named-data.net/doc/NDN-packet-spec/0.3/) (:issue:`4527`)
|
||||
- Initial support for `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
* Recognize typed name components, allow typed name component in ``FinalBlockId``
|
||||
(:issue:`4526`)
|
||||
@@ -46,7 +41,7 @@ Improvements and bug fixes
|
||||
- Logging system improvements (:issue:`4552`)
|
||||
|
||||
Deprecated
|
||||
~~~~~~~~~~
|
||||
^^^^^^^^^^
|
||||
|
||||
- Selectors (:issue:`4527`)
|
||||
|
||||
|
||||
@@ -3,22 +3,17 @@ ndn-cxx version 0.6.3
|
||||
|
||||
Release date: September 18, 2018
|
||||
|
||||
Note that this is the last release that encodes to `NDN packet format version 0.2.1
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.2.1/>`__. A future release will continue to
|
||||
decode v0.2.1 format, but will encode to `v0.3 format
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__.
|
||||
|
||||
The build requirements have been upgraded to gcc >= 5.3 or clang >= 3.6, boost >= 1.58,
|
||||
openssl >= 1.0.2. This effectively drops support for all versions of Ubuntu older than 16.04
|
||||
that use distribution-provided compilers and packages.
|
||||
|
||||
The compilation now uses the C++14 standard.
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- More support for `NDN packet format version
|
||||
0.3 <https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
- More support for `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
- Allow applications to declare a default ``CanBePrefix`` setting (:issue:`4581`)
|
||||
|
||||
@@ -72,7 +67,7 @@ Improvements and bug fixes
|
||||
- Correct and improve documentation
|
||||
|
||||
Deprecated
|
||||
~~~~~~~~~~
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``SegmentFetcher::fetch()`` static functions in favor of ``start()`` (:issue:`4464`)
|
||||
|
||||
@@ -88,6 +83,6 @@ Deprecated
|
||||
- ``Data::get/setFinalBlockId()`` in favor of ``Data::get/setFinalBlock()``
|
||||
|
||||
Removed
|
||||
~~~~~~~
|
||||
^^^^^^^
|
||||
|
||||
- Dependency on Boost.Regex in favor of ``std::regex``
|
||||
@@ -0,0 +1,78 @@
|
||||
ndn-cxx version 0.6.5
|
||||
---------------------
|
||||
|
||||
Release date: February 4, 2019
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- More support for `NDN packet format version
|
||||
0.3 <https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
* Stop using ``ChildSelector`` in ``NotificationSubscriber`` (:issue:`4664`)
|
||||
|
||||
* Stop using ``ChildSelector`` in ``CertificateBundleFetcher`` (:issue:`4665`)
|
||||
|
||||
- Support floating point numbers in TLV-VALUE (:issue:`4612`)
|
||||
|
||||
- Scoped prefix registration, scoped Interest filter, and scoped pending Interest
|
||||
(:issue:`3919`, :issue:`4316`)
|
||||
|
||||
- Counters for satisfied and unsatisfied Interests in ``ForwarderStatus``
|
||||
(:issue:`4720`)
|
||||
|
||||
- ``random::getRandomNumberEngine()`` in the public API
|
||||
|
||||
- ``MetadataObject`` class to encode/decode RDR-style metadata (:issue:`4707`)
|
||||
|
||||
- ``SegmentFetcher::stop()`` (:issue:`4692`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Use openssl-based routines for the PKCS#8 decoding/decryption when exporting key from macOS
|
||||
Keychain (:issue:`4450`)
|
||||
|
||||
- Switch to AES-256 for private key encryption in PKCS #8 export
|
||||
|
||||
- Add exponential backoff in ``CertificateFetcherFromNetwork`` (:issue:`4718`, :issue:`4712`)
|
||||
|
||||
- Throw exception when loading an orphaned ``ValidationPolicyConfig`` (API violation)
|
||||
(:issue:`4758`)
|
||||
|
||||
- Forbid unrecognized TLVs before ``Name`` (:issue:`4667`)
|
||||
|
||||
- Prevent memory pool size from becoming zero in ``InMemoryStorage`` (:issue:`4769`)
|
||||
|
||||
- Clean up fetchers when destructing ``nfd::Controller`` (:issue:`4775`)
|
||||
|
||||
- Fix ``SegmentFetcher`` undefined behavior caused by uncanceled pending interest
|
||||
(:issue:`4770`)
|
||||
|
||||
- Seed the PRNG with more entropy (:issue:`4808`)
|
||||
|
||||
- Stop accepting NonNegativeInteger as sequence number in NDNLP (:issue:`4598`)
|
||||
|
||||
- Backport C++17 ``std::any`` and ``std::variant`` as ``ndn::any`` and ``ndn::variant``
|
||||
|
||||
- Reimplement ``scheduler::EventId`` with ``CancelHandle`` (:issue:`4698`)
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``ndn-cxx/util/scheduler-scoped-event-id.hpp`` header as it is now sufficient to use
|
||||
``ndn-cxx/util/scheduler.hpp`` header (:issue:`4698`)
|
||||
|
||||
- Implicit conversion from nullptr to ``scheduler::EventId`` (:issue:`4698`)
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- ``ndn::ip::address{,V6}FromString``
|
||||
|
||||
- ``SegmentFetcher::fetch`` (:issue:`4464`)
|
||||
|
||||
- ``{get,set}FinalBlockId()``
|
||||
|
||||
- Headers that were already considered internal implementation details have been explicitly
|
||||
moved to a ``detail/`` subdir to more clearly separate private and public headers
|
||||
@@ -0,0 +1,62 @@
|
||||
ndn-cxx version 0.6.6
|
||||
---------------------
|
||||
|
||||
Release date: April 27, 2019
|
||||
|
||||
.. note::
|
||||
This is the last release to support the `NDN packet format version 0.2.1
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.2.1/>`__.
|
||||
The next release will be able to encode and decode only the `v0.3 packet format
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- More support for `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
* Support new naming conventions to encode/decode segment numbers, byte offsets, versions,
|
||||
timestamps, and sequence numbers based on typed name components (:issue:`4777`)
|
||||
|
||||
* Stop using ``ChildSelector`` in ``CertificateBundleFetcher`` (:issue:`4665`)
|
||||
|
||||
- ``NDN_THROW`` macro to throw exceptions including file position and runtime context of the
|
||||
throw statement (:issue:`4834`)
|
||||
|
||||
- Ensure that a ``Block`` with TLV-TYPE zero is treated as invalid (:issue:`4726`, :issue:`4895`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Avoid directly using memory address as ``PendingInterestId`` to prevent potential false
|
||||
removal of an entry (:issue:`2865`)
|
||||
|
||||
- Follow up packet specification changes to rename the ``Parameters`` element to
|
||||
``ApplicationParameters`` and to change its number to be a non-critical element type
|
||||
(:issue:`4658`, :issue:`4780`)
|
||||
|
||||
- Add an option to disable the infrastructure Interest in ``CertificateFetcherDirectFetch``
|
||||
(:issue:`4879`)
|
||||
|
||||
- Fix compilation against recent versions of Boost libraries and issues with Xcode 10.2 and
|
||||
older versions of Boost libraries (:issue:`4890`, :issue:`4923`, :issue:`4860`)
|
||||
|
||||
- Improve the "CanBePrefix unset" warning (:issue:`4581`)
|
||||
|
||||
- Improve documentation
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``PendingInterestId``, ``RegisteredPrefixId``, and ``InterestFilterId`` types in favor of
|
||||
``PendingInterestHandle``, ``RegisteredPrefixHandle``, and ``InterestFilterHandle``
|
||||
(:issue:`4316`, :issue:`3919`)
|
||||
|
||||
- ``Block::empty`` in favor of ``Block::isValid`` (with inverted semantics)
|
||||
|
||||
- ``Scheduler::scheduleEvent`` and ``Scheduler::cancelEvent`` in favor of ``Scheduler::schedule``
|
||||
and ``EventId::cancel`` (or use ``ScopedEventId`` to automatically cancel the event when
|
||||
the object goes out of scope) (:issue:`4883`)
|
||||
|
||||
- ``ndn::util::Scheduler`` (use ``ndn::Scheduler`` or ``ndn::scheduler::Scheduler``) and
|
||||
``ndn::EventId`` (use ``ndn::scheduler::EventId``) (:issue:`4883`)
|
||||
@@ -0,0 +1,79 @@
|
||||
ndn-cxx version 0.7.0
|
||||
---------------------
|
||||
|
||||
Release date: January 13, 2020
|
||||
|
||||
**Breaking Change**
|
||||
|
||||
This release features support of only `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`, :issue:`4567`,
|
||||
:issue:`4709`, :issue:`4913`). The library encodes and interprets Interest and Data
|
||||
packets only in 0.3 format; support for version 0.2 has been completely removed. In
|
||||
addition, the URI representation of Interest packets has been updated to follow the
|
||||
packet format changes.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- HMAC signing support (:issue:`3075`)
|
||||
|
||||
- Support for ``ParametersSha256DigestComponent`` in ``Name`` and ``Interest`` classes
|
||||
(:issue:`4658`)
|
||||
|
||||
- Encoding/decoding of ``HopLimit`` field in Interest (:issue:`4806`)
|
||||
|
||||
- PIT token (:issue:`4532`).
|
||||
|
||||
PIT token is a hop-by-hop header field that identifies an Interest-Data exchange. The
|
||||
downstream node can assign an opaque token to an outgoing Interest, and the upstream node
|
||||
is expected to return the same token on the Data or Nack in reply to that Interest. This
|
||||
would allow the downstream node to accelerate its processing, especially in PIT lookup.
|
||||
|
||||
- ``io::loadBuffer`` and ``io::saveBuffer`` helper functions
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Various improvements in the Linux implementation of ``NetworkMonitor`` class
|
||||
|
||||
- Rework of ``RttEstimator`` class:
|
||||
|
||||
* split into two classes: ``RttEstimator`` and ``RttEstimatorWithStats`` (:issue:`4887`)
|
||||
* add a getter for the smoothed RTT value (:issue:`4892`)
|
||||
* switch to use ``time::nanoseconds`` (:issue:`4887`)
|
||||
|
||||
- Make use of attributes in logging facilities and generalize logger backend support
|
||||
(:issue:`4969`, :issue:`3782`)
|
||||
|
||||
- Silently accept an empty validation policy instead of throwing an exception (:issue:`5049`)
|
||||
|
||||
- Introduce alternative URI syntax for component types used in naming conventions, with
|
||||
ability to choose between canonical and alternate format (:issue:`4777`)
|
||||
|
||||
- Don't force the generation of an Interest nonce during decoding (:issue:`4685`)
|
||||
|
||||
- Various documentation improvements
|
||||
|
||||
Removals
|
||||
^^^^^^^^
|
||||
|
||||
- ``ndn::util::Scheduler`` (use ``ndn::Scheduler`` or ``ndn::scheduler::Scheduler``) and
|
||||
``ndn::EventId`` (use ``ndn::scheduler::EventId``) (:issue:`4883`)
|
||||
|
||||
- Unused ``KeyClass`` and ``AclType`` enums
|
||||
|
||||
- Unused ``v2::PublicKey`` alias of ``transform::PublicKey``
|
||||
|
||||
- ``HmacFilter`` class, use SignerFilter and VerifierFilter instead
|
||||
|
||||
- Ill-defined equality operators for ``Interest``, ``MetaInfo``, ``Signature`` (:issue:`4569`)
|
||||
|
||||
- Implicit conversion from the ``xyzHandle`` types to ``const xyzId*`` (where ``xyz`` is
|
||||
``PendingInterest``, ``RegisteredPrefixId``, and ``InterestFilterId``)
|
||||
|
||||
- Deprecated ``KeyLocator::Type`` enum
|
||||
|
||||
- Private header files of concrete PIB, TPM, and KeyHandle implementations are no longer
|
||||
installed (:issue:`4782`)
|
||||
|
||||
- Renamed ``util/backports-ostream-joiner.hpp`` to ``util/ostream-joiner.hpp``
|
||||
@@ -0,0 +1,77 @@
|
||||
ndn-cxx version 0.7.1
|
||||
---------------------
|
||||
|
||||
Release date: October 8, 2020
|
||||
|
||||
The build requirements have been increased to require Clang >= 4.0, Xcode >= 9.0, and Python >= 3.6.
|
||||
Meanwhile, it is *recommended* to use GCC >= 7.4.0 and Boost >= 1.65.1.
|
||||
This effectively drops official support for Ubuntu 16.04 when using distribution-provided Boost
|
||||
packages -- ndn-cxx may still work on this platform, but we provide no official support for it.
|
||||
Additionally, this release drops support for CentOS 7 and adds support for CentOS 8.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Signed Interests according to Packet Specification v0.3 (:issue:`4804`)
|
||||
|
||||
- Add "in-order" mode to ``SegmentFetcher`` and a corresponding signal that is emitted after each
|
||||
segment is received and validated in segment order. Segments that arrive out-of-order will be
|
||||
buffered internally until all earlier segments have arrived and passed validation.
|
||||
|
||||
- Allow ``KeyLocator`` to either identify the full name of a certificate, an unversioned certificate
|
||||
prefix, or the name of a public key (without issuer and version) (:issue:`5115`)
|
||||
|
||||
- Allow face MTU to be changed via management (:issue:`5056`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Change default key type generated by ndnsec to ECDSA
|
||||
|
||||
- Use named curve when encoding ECDSA public keys (:issue:`5037`)
|
||||
|
||||
- Allow non-default key to be exported for an identity via ``ndnsec-export`` (:issue:`5043`)
|
||||
|
||||
- Fix spurious error message from ``ndnsec-key-gen`` when ``key-id`` is specified (:issue:`5057`)
|
||||
|
||||
- Provide more fine-grained choices for ``name::UriFormat`` (:issue:`4777`)
|
||||
|
||||
- Allow automatic log flushing to be disabled (:issue:`3668`)
|
||||
|
||||
- Avoid unnecessarily invalidating cached wire encodings of Data packets
|
||||
|
||||
- Correct extraction of signed portion of Data packets to be compatible with Packet Specification
|
||||
v0.3 (:issue:`4583`)
|
||||
|
||||
- Fix regression in ``CertificateBundleFetcher`` with ``FinalBlockId`` handling
|
||||
|
||||
- Improve error handling during TPM signing (:issue:`4585`, :issue:`5086`)
|
||||
|
||||
- Correctly handle non-existent identity in ``PibImpl::setDefaultIdentity``
|
||||
|
||||
- Fix incompatibility with ``time::toIsoString`` in Boost 1.73.0+
|
||||
|
||||
- Fix incompatibility with ``<version>`` header in C++20
|
||||
|
||||
- Various fixes for Android
|
||||
|
||||
- Various improvements to documentation, test suite structure, and authors list
|
||||
|
||||
Deprecations
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Deprecate old Signed Interest and Command Interest formats (:issue:`4804`)
|
||||
|
||||
- Deprecate ``Signature`` in favor of ``SignatureInfo`` in Data packets and certificates (:issue:`4804`)
|
||||
|
||||
- ``SignatureInfo::unsetKeyLocator`` and ``SignatureInfo::unsetValidityPeriod`` have been deprecated
|
||||
|
||||
- Header files under ``ndn/security/v2`` have been moved into the main ``ndn/security`` directory
|
||||
|
||||
Removals
|
||||
^^^^^^^^
|
||||
|
||||
- Remove deprecated ``PendingInterestId``, ``InterestFilterId``, and ``RegisteredPrefixId``
|
||||
(:issue:`4885`)
|
||||
|
||||
- Remove a number of long-deprecated functions and enums
|
||||
+32
-2
@@ -1,10 +1,14 @@
|
||||
ndn-cxx Versions
|
||||
++++++++++++++++
|
||||
All ndn-cxx Releases
|
||||
++++++++++++++++++++
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
:maxdepth: 1
|
||||
|
||||
release-notes/release-notes-0.7.1
|
||||
release-notes/release-notes-0.7.0
|
||||
release-notes/release-notes-0.6.6
|
||||
release-notes/release-notes-0.6.5
|
||||
release-notes/release-notes-0.6.3
|
||||
release-notes/release-notes-0.6.2
|
||||
release-notes/release-notes-0.6.1
|
||||
@@ -21,6 +25,32 @@ ndn-cxx Versions
|
||||
release-notes/release-notes-0.2.0
|
||||
release-notes/release-notes-0.1.0
|
||||
|
||||
* **ndn-cxx version 0.7.1**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.7.1>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.7.1/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.7.1>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.7.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.7.1.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.7.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.7.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.7.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.7.0>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.7.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.7.0.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.6**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.6>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.6/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.6>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.6.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.6.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.5**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.5>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.5/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.5>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.5.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.5.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.4 was skipped**
|
||||
|
||||
* **ndn-cxx version 0.6.3**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.3>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.3/>`__)
|
||||
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
NDN Certificate Format Version 2.0
|
||||
==================================
|
||||
|
||||
.. contents::
|
||||
|
||||
Since signature verification is a common operation in NDN applications, it is
|
||||
important to define a common certificate format to standardize the public key
|
||||
authentication procedure. As every NDN data packet is signed, a data packet
|
||||
@@ -46,31 +44,26 @@ specification.
|
||||
| SignatureValue |
|
||||
+--------------------------+
|
||||
|
||||
.. code-block:: abnf
|
||||
|
||||
CertificateV2 ::= DATA-TLV TLV-LENGTH
|
||||
Name (= /<NameSpace>/KEY/[KeyId]/[IssuerId]/[Version])
|
||||
MetaInfo (.ContentType = KEY,
|
||||
.FreshnessPeriod >~ 1h))
|
||||
Content (= X509PublicKeyContent)
|
||||
SignatureInfo (= CertificateV2SignatureInfo)
|
||||
SignatureValue
|
||||
CertificateV2 = DATA-TYPE TLV-LENGTH
|
||||
Name ; /<NameSpace>/KEY/[KeyId]/[IssuerId]/[Version]
|
||||
MetaInfo ; ContentType == KEY, FreshnessPeriod required
|
||||
Content ; X509PublicKey
|
||||
CertificateV2SignatureInfo
|
||||
SignatureValue
|
||||
|
||||
X509PublicKeyContent ::= CONTENT-TLV TLV-LENGTH
|
||||
BYTE+ (= public key bits in PKCS#8 format)
|
||||
|
||||
CertificateV2SignatureInfo ::= SIGNATURE-INFO-TYPE TLV-LENGTH
|
||||
SignatureType
|
||||
KeyLocator
|
||||
ValidityPeriod
|
||||
... optional critical or non-critical extension blocks ...
|
||||
CertificateV2SignatureInfo = SIGNATURE-INFO-TYPE TLV-LENGTH
|
||||
SignatureType
|
||||
KeyLocator
|
||||
ValidityPeriod
|
||||
*CertificateV2Extension
|
||||
|
||||
|
||||
Name
|
||||
----
|
||||
|
||||
The name of a certificate consists of five parts as shown below:
|
||||
|
||||
::
|
||||
The name of a certificate consists of five parts as shown below::
|
||||
|
||||
/<SubjectName>/KEY/[KeyId]/[IssuerId]/[Version]
|
||||
|
||||
@@ -86,17 +79,13 @@ identifier.
|
||||
controlled by the certificate issuer and, similar to KeyId, can be an 8-byte random number,
|
||||
SHA-256 digest of the issuer's public key, or a simple numerical identifier.
|
||||
|
||||
|
||||
For example,
|
||||
|
||||
::
|
||||
For example::
|
||||
|
||||
/edu/ucla/cs/yingdi/KEY/%03%CD...%F1/%9F%D3...%B7/%FD%d2...%8E
|
||||
\_________________/ \___________/ \___________/\___________/
|
||||
Certificate Namespace Key Id Issuer Id Version
|
||||
(Identity)
|
||||
|
||||
|
||||
MetaInfo
|
||||
--------
|
||||
|
||||
@@ -124,17 +113,15 @@ certificate expires.
|
||||
Using ISO style string is the convention of specifying the validity period of certificate,
|
||||
which has been adopted by many certificate systems, such as X.509, PGP, and DNSSEC.
|
||||
|
||||
::
|
||||
.. code-block:: abnf
|
||||
|
||||
ValidityPeriod ::= VALIDITY-PERIOD-TYPE TLV-LENGTH
|
||||
NotBefore
|
||||
NotAfter
|
||||
ValidityPeriod = VALIDITY-PERIOD-TYPE TLV-LENGTH
|
||||
NotBefore
|
||||
NotAfter
|
||||
|
||||
NotBefore ::= NOT-BEFORE-TYPE TLV-LENGTH
|
||||
BYTE{15}
|
||||
NotBefore = NOT-BEFORE-TYPE TLV-LENGTH 8DIGIT "T" 6DIGIT
|
||||
|
||||
NotAfter ::= NOT-AFTER-TYPE TLV-LENGTH
|
||||
BYTE{15}
|
||||
NotAfter = NOT-AFTER-TYPE TLV-LENGTH 8DIGIT "T" 6DIGIT
|
||||
|
||||
For each TLV, the TLV-TYPE codes are assigned as below:
|
||||
|
||||
@@ -171,7 +158,7 @@ Extensions
|
||||
We list currently defined extensions:
|
||||
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| TLV-TYPE | Assigned code | Assigned code |
|
||||
| TLV-TYPE | Assigned number | Assigned number|
|
||||
| | (decimal) | (hexadecimal) |
|
||||
+=============================================+===================+================+
|
||||
| AdditionalDescription (non-critical) | 258 | 0x0102 |
|
||||
@@ -186,23 +173,23 @@ key-value pairs. Both key and value are UTF-8 strings, e.g.,
|
||||
``("Organization", "UCLA")``. The issuer of a certificate can specify arbitrary
|
||||
key-value pair to provide additional description about the certificate.
|
||||
|
||||
::
|
||||
.. code-block:: abnf
|
||||
|
||||
AdditionalDescription ::= ADDITIONAL-DESCRIPTION-TYPE TLV-LENGTH
|
||||
DescriptionEntry+
|
||||
CertificateV2Extension = AdditionalDescription
|
||||
|
||||
DescriptionEntry ::= DESCRIPTION-ENTRY-TYPE TLV-LENGTH
|
||||
DescriptionKey
|
||||
DescriptionValue
|
||||
AdditionalDescription = ADDITIONAL-DESCRIPTION-TYPE TLV-LENGTH
|
||||
1*DescriptionEntry
|
||||
|
||||
DescriptionKey ::= DESCRIPTION-KEY-TYPE TLV-LENGTH
|
||||
BYTE+
|
||||
DescriptionEntry = DESCRIPTION-ENTRY-TYPE TLV-LENGTH
|
||||
DescriptionKey
|
||||
DescriptionValue
|
||||
|
||||
DescriptionValue ::= DESCRIPTION-VALUE-TYPE TLV-LENGTH
|
||||
BYTE+
|
||||
DescriptionKey = DESCRIPTION-KEY-TYPE TLV-LENGTH 1*OCTET
|
||||
|
||||
DescriptionValue = DESCRIPTION-VALUE-TYPE TLV-LENGTH 1*OCTET
|
||||
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| TLV-TYPE | Assigned code | Assigned code |
|
||||
| TLV-TYPE | Assigned number | Assigned number|
|
||||
| | (decimal) | (hexadecimal) |
|
||||
+=============================================+===================+================+
|
||||
| DescriptionEntry | 512 | 0x0200 |
|
||||
|
||||
+12
-9
@@ -1,24 +1,27 @@
|
||||
Export/Import Credentials
|
||||
=========================
|
||||
SafeBag Format for Exported Credentials
|
||||
=======================================
|
||||
|
||||
Sometimes, one may need to export credentials (e.g., certificate and private key) from
|
||||
one machine, and import them into another machine. This requires a secured container for
|
||||
sensitive information. We define **SafeBag**, which contains both an NDN certificate
|
||||
(:doc:`version 2.0 <certificate-format>`) and the corresponding private
|
||||
key which is encrypted in `PKCS#8 format <https://tools.ietf.org/html/rfc5208>`_.
|
||||
key, which is encrypted in `PKCS #8 format <https://tools.ietf.org/html/rfc5208>`_.
|
||||
|
||||
The format of **SafeBag** is defined as:
|
||||
|
||||
::
|
||||
.. code-block:: abnf
|
||||
|
||||
SafeBag ::= SAFE-BAG-TYPE TLV-LENGTH
|
||||
Certificate ; a data packet following certificate format spec
|
||||
EncryptedKeyBag ; private key encrypted in PKCS#8 format
|
||||
SafeBag = SAFE-BAG-TYPE TLV-LENGTH
|
||||
CertificateV2
|
||||
EncryptedKeyBag
|
||||
|
||||
All TLV-TYPE codes are application specific:
|
||||
EncryptedKeyBag = ENCRYPTED-KEY-BAG-TYPE TLV-LENGTH
|
||||
*OCTET ; private key encrypted in PKCS #8 format
|
||||
|
||||
All TLV-TYPE numbers are application specific:
|
||||
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| TLV-TYPE | Assigned code | Assigned code |
|
||||
| TLV-TYPE | Assigned number | Assigned number|
|
||||
| | (decimal) | (hexadecimal) |
|
||||
+=============================================+===================+================+
|
||||
| SafeBag | 128 | 0x80 |
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
.. _Signed Interest:
|
||||
|
||||
Signed Interest
|
||||
===============
|
||||
Signed Interest Version 0.2 (DEPRECATED)
|
||||
========================================
|
||||
|
||||
.. warning::
|
||||
This document describes a deprecated format for signed Interest packets. The current format can
|
||||
be found in the
|
||||
`NDN Packet Specification <https://named-data.net/doc/NDN-packet-spec/current/signed-interest.html>`__.
|
||||
|
||||
**Signed Interest** is a mechanism to issue an authenticated interest.
|
||||
|
||||
@@ -13,7 +18,7 @@ penultimate name component TLV:
|
||||
|
||||
+-------------+----------+-----------------------------------------------------------------------------------+
|
||||
| Interest | Interest | +------+--------+--------------------------------------------------+ +----------+ |
|
||||
| Type (0x01) | length | | Name | Name | +---------+-- --+---------+---------+---------+| | Other | |
|
||||
| Type (0x05) | length | | Name | Name | +---------+-- --+---------+---------+---------+| | Other | |
|
||||
| | | | Type | Length | |Component| ... |Component|Component|Component|| | TLVs ... | |
|
||||
| | | | | | | TLV 1 | | TLV n-2 | TLV n-1 | TLV n || | in | |
|
||||
| | | | | | +---------+-- --+---------+---------+---------+| | Interest | |
|
||||
@@ -27,14 +32,12 @@ penultimate name component TLV:
|
||||
|
||||
More specifically, the SignedInterest is defined to have four additional components:
|
||||
|
||||
- ``<timestamp>``
|
||||
- ``<nonce>``
|
||||
- ``<SignatureInfo>``
|
||||
- ``<SignatureValue>``
|
||||
- ``timestamp``
|
||||
- ``nonce``
|
||||
- ``SignatureInfo``
|
||||
- ``SignatureValue``
|
||||
|
||||
For example, for ``/signed/interest/name`` name, CommandInterest will be defined as:
|
||||
|
||||
::
|
||||
For example, for ``/signed/interest/name`` name, CommandInterest will be defined as::
|
||||
|
||||
/signed/interest/name/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
|
||||
|
||||
@@ -51,21 +54,21 @@ Timestamp component (n-3 *th*)
|
||||
|
||||
The value of the n-3 *th* component is the interest's timestamp (in terms of millisecond offset
|
||||
from UTC 1970-01-01 00:00:00) encoded as
|
||||
`nonNegativeInteger <http://named-data.net/doc/ndn-tlv/tlv.html#non-negative-integer-encoding>`__.
|
||||
`NonNegativeInteger <https://named-data.net/doc/NDN-packet-spec/0.2.1/tlv.html#non-negative-integer-encoding>`__.
|
||||
The timestamp may be used to protect against replay attack.
|
||||
|
||||
Nonce component (n-2 *th*)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The value of the n-2 *th* component is random value (encoded as
|
||||
`nonNegativeInteger <http://named-data.net/doc/ndn-tlv/tlv.html#non-negative-integer-encoding>`__)
|
||||
`NonNegativeInteger <https://named-data.net/doc/NDN-packet-spec/0.2.1/tlv.html#non-negative-integer-encoding>`__)
|
||||
that adds additional assurances that the interest will be unique.
|
||||
|
||||
SignatureInfo component (n-1 *th*)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The value of the n-1 *th* component is actually a
|
||||
`SignatureInfo <http://named-data.net/doc/ndn-tlv/signature.html>`__ TLV.
|
||||
`SignatureInfo <https://named-data.net/doc/NDN-packet-spec/0.2.1/signature.html>`__ TLV.
|
||||
|
||||
::
|
||||
|
||||
@@ -83,7 +86,7 @@ SignatureValue component (n *th*)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The value of the n *th* component is actually a
|
||||
`SignatureValue <http://named-data.net/doc/ndn-tlv/signature.html>`__ TLV.
|
||||
`SignatureValue <https://named-data.net/doc/NDN-packet-spec/0.2.1/signature.html>`__ TLV.
|
||||
|
||||
::
|
||||
|
||||
@@ -108,7 +111,7 @@ be signed, it will be treated as invalid in the following three cases:
|
||||
missing or cannot be parsed correctly;
|
||||
- the key is not trusted for signing the Interest;
|
||||
- the signature cannot be verified with the public key pointed by the
|
||||
`KeyLocator <http://named-data.net/doc/ndn-tlv/signature.html#keylocator>`__ in
|
||||
`KeyLocator <https://named-data.net/doc/NDN-packet-spec/0.2.1/signature.html#keylocator>`__ in
|
||||
SignatureInfo.
|
||||
|
||||
Recipients of a signed interest may further check the timestamp and the uniqueness of the
|
||||
|
||||
@@ -51,8 +51,7 @@ configuration file containing two rules and a trust anchor.
|
||||
file-name "testbed-trust-anchor.cert"
|
||||
}
|
||||
|
||||
.. note::
|
||||
**ATTENTION: The order of rules MATTERS!**
|
||||
.. attention:: **The order of rules MATTERS!**
|
||||
|
||||
A rule can be broken into two parts:
|
||||
|
||||
@@ -97,8 +96,7 @@ rule. The filter property is not required in a rule; if omitted, the rule will c
|
||||
packets passed to it. A rule may contain multiple filters, in this case, a packet
|
||||
is captured by the rule only if all filters are satisfied.
|
||||
|
||||
.. note::
|
||||
**ATTENTION: A packet that satisfies all the filters may not be valid**.
|
||||
.. attention:: **A packet that satisfies all the filters may not be valid.**
|
||||
|
||||
The **checker** property defines the conditions that a matched packet must fulfill to be
|
||||
treated as a valid packet. A rule must have at least one **checker** property. A packet is
|
||||
@@ -377,9 +375,9 @@ period, such as
|
||||
There is also a special trust anchor **any**. As long as such a trust-anchor is defined
|
||||
in config file, packet validation will be turned off.
|
||||
|
||||
.. note::
|
||||
**ATTENTION: This type of trust anchor is dangerous. You should used it only when you
|
||||
want to disable packet validation temporarily (e.g, debugging code, building a demo).**
|
||||
.. danger::
|
||||
This type of trust anchor is dangerous. You should used it only when you
|
||||
want to disable packet validation temporarily (e.g., debugging code, building a demo).
|
||||
|
||||
::
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ NDN regular expression is a kind of regular expression that can match NDN names.
|
||||
performed at two levels: the name level and the name component level.
|
||||
|
||||
A name component matcher, enclosed in ``<`` and ``>``, specifies the pattern of a name component. The
|
||||
component pattern is expressed with the `Perl Regular Expression Syntax
|
||||
<https://www.boost.org/doc/libs/1_58_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html>`__.
|
||||
component pattern is expressed using the `Modified ECMAScript Regular Expression Syntax
|
||||
<https://en.cppreference.com/w/cpp/regex/ecmascript>`_.
|
||||
For example, ``<ab*c>`` matches the 1st, 3rd, and 4th components of ``/ac/dc/abc/abbc``, but does
|
||||
not match the 2nd component. A special case is that ``<>`` denotes a wildcard matcher that can match
|
||||
**ANY** name component.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -21,18 +21,15 @@
|
||||
* @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
|
||||
*/
|
||||
|
||||
// correct way to include ndn-cxx headers
|
||||
// #include <ndn-cxx/face.hpp>
|
||||
// #include <ndn-cxx/util/scheduler.hpp>
|
||||
#include "face.hpp"
|
||||
#include "util/scheduler.hpp"
|
||||
#include <ndn-cxx/face.hpp>
|
||||
#include <ndn-cxx/util/scheduler.hpp>
|
||||
|
||||
#include <boost/asio/io_service.hpp>
|
||||
#include <iostream>
|
||||
|
||||
// Enclosing code in ndn simplifies coding (can also use `using namespace ndn`)
|
||||
namespace ndn {
|
||||
// Additional nested namespaces can be used to prevent/limit name conflicts
|
||||
// Additional nested namespaces should be used to prevent/limit name conflicts
|
||||
namespace examples {
|
||||
|
||||
class ConsumerWithTimer
|
||||
@@ -47,19 +44,22 @@ public:
|
||||
void
|
||||
run()
|
||||
{
|
||||
Interest interest(Name("/example/testApp/randomData"));
|
||||
interest.setInterestLifetime(2_s); // 2 seconds
|
||||
interest.setMustBeFresh(true);
|
||||
Name interestName("/example/testApp/randomData");
|
||||
interestName.appendVersion();
|
||||
|
||||
Interest interest(interestName);
|
||||
interest.setCanBePrefix(false);
|
||||
interest.setMustBeFresh(true);
|
||||
interest.setInterestLifetime(2_s);
|
||||
|
||||
std::cout << "Sending Interest " << interest << std::endl;
|
||||
m_face.expressInterest(interest,
|
||||
bind(&ConsumerWithTimer::onData, this, _1, _2),
|
||||
bind(&ConsumerWithTimer::onNack, this, _1, _2),
|
||||
bind(&ConsumerWithTimer::onTimeout, this, _1));
|
||||
|
||||
std::cout << "Sending " << interest << std::endl;
|
||||
|
||||
// Schedule a new event
|
||||
m_scheduler.scheduleEvent(3_s, [this] { delayedInterest(); });
|
||||
m_scheduler.schedule(3_s, [this] { delayedInterest(); });
|
||||
|
||||
// m_ioService.run() will block until all events finished or m_ioService.stop() is called
|
||||
m_ioService.run();
|
||||
@@ -71,22 +71,22 @@ public:
|
||||
|
||||
private:
|
||||
void
|
||||
onData(const Interest& interest, const Data& data)
|
||||
onData(const Interest&, const Data& data) const
|
||||
{
|
||||
std::cout << data << std::endl;
|
||||
std::cout << "Received Data " << data << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
onNack(const Interest& interest, const lp::Nack& nack)
|
||||
onNack(const Interest& interest, const lp::Nack& nack) const
|
||||
{
|
||||
std::cout << "received Nack with reason " << nack.getReason()
|
||||
<< " for interest " << interest << std::endl;
|
||||
std::cout << "Received Nack with reason " << nack.getReason()
|
||||
<< " for " << interest << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
onTimeout(const Interest& interest)
|
||||
onTimeout(const Interest& interest) const
|
||||
{
|
||||
std::cout << "Timeout " << interest << std::endl;
|
||||
std::cout << "Timeout for " << interest << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -94,20 +94,23 @@ private:
|
||||
{
|
||||
std::cout << "One more Interest, delayed by the scheduler" << std::endl;
|
||||
|
||||
Interest interest(Name("/example/testApp/randomData"));
|
||||
interest.setInterestLifetime(2_s); // 2 seconds
|
||||
interest.setMustBeFresh(true);
|
||||
Name interestName("/example/testApp/randomData");
|
||||
interestName.appendVersion();
|
||||
|
||||
Interest interest(interestName);
|
||||
interest.setCanBePrefix(false);
|
||||
interest.setMustBeFresh(true);
|
||||
interest.setInterestLifetime(2_s);
|
||||
|
||||
std::cout << "Sending Interest " << interest << std::endl;
|
||||
m_face.expressInterest(interest,
|
||||
bind(&ConsumerWithTimer::onData, this, _1, _2),
|
||||
bind(&ConsumerWithTimer::onNack, this, _1, _2),
|
||||
bind(&ConsumerWithTimer::onTimeout, this, _1));
|
||||
|
||||
std::cout << "Sending " << interest << std::endl;
|
||||
}
|
||||
|
||||
private:
|
||||
// Explicitly create io_service object, which can be shared between Face and Scheduler
|
||||
// Explicitly create io_service object, which will be shared between Face and Scheduler
|
||||
boost::asio::io_service m_ioService;
|
||||
Face m_face;
|
||||
Scheduler m_scheduler;
|
||||
@@ -119,12 +122,13 @@ private:
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
ndn::examples::ConsumerWithTimer consumer;
|
||||
try {
|
||||
ndn::examples::ConsumerWithTimer consumer;
|
||||
consumer.run();
|
||||
return 0;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "ERROR: " << e.what() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+22
-21
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -21,56 +21,56 @@
|
||||
* @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
|
||||
*/
|
||||
|
||||
// correct way to include ndn-cxx headers
|
||||
// #include <ndn-cxx/face.hpp>
|
||||
#include "face.hpp"
|
||||
#include <ndn-cxx/face.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// Enclosing code in ndn simplifies coding (can also use `using namespace ndn`)
|
||||
namespace ndn {
|
||||
// Additional nested namespaces can be used to prevent/limit name conflicts
|
||||
// Additional nested namespaces should be used to prevent/limit name conflicts
|
||||
namespace examples {
|
||||
|
||||
class Consumer : noncopyable
|
||||
class Consumer
|
||||
{
|
||||
public:
|
||||
void
|
||||
run()
|
||||
{
|
||||
Interest interest(Name("/example/testApp/randomData"));
|
||||
interest.setInterestLifetime(2_s); // 2 seconds
|
||||
interest.setMustBeFresh(true);
|
||||
Name interestName("/example/testApp/randomData");
|
||||
interestName.appendVersion();
|
||||
|
||||
Interest interest(interestName);
|
||||
interest.setCanBePrefix(false);
|
||||
interest.setMustBeFresh(true);
|
||||
interest.setInterestLifetime(6_s); // The default is 4 seconds
|
||||
|
||||
std::cout << "Sending Interest " << interest << std::endl;
|
||||
m_face.expressInterest(interest,
|
||||
bind(&Consumer::onData, this, _1, _2),
|
||||
bind(&Consumer::onNack, this, _1, _2),
|
||||
bind(&Consumer::onTimeout, this, _1));
|
||||
|
||||
std::cout << "Sending " << interest << std::endl;
|
||||
|
||||
// processEvents will block until the requested data received or timeout occurs
|
||||
// processEvents will block until the requested data is received or a timeout occurs
|
||||
m_face.processEvents();
|
||||
}
|
||||
|
||||
private:
|
||||
void
|
||||
onData(const Interest& interest, const Data& data)
|
||||
onData(const Interest&, const Data& data) const
|
||||
{
|
||||
std::cout << data << std::endl;
|
||||
std::cout << "Received Data " << data << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
onNack(const Interest& interest, const lp::Nack& nack)
|
||||
onNack(const Interest&, const lp::Nack& nack) const
|
||||
{
|
||||
std::cout << "received Nack with reason " << nack.getReason()
|
||||
<< " for interest " << interest << std::endl;
|
||||
std::cout << "Received Nack with reason " << nack.getReason() << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
onTimeout(const Interest& interest)
|
||||
onTimeout(const Interest& interest) const
|
||||
{
|
||||
std::cout << "Timeout " << interest << std::endl;
|
||||
std::cout << "Timeout for " << interest << std::endl;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -83,12 +83,13 @@ private:
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
ndn::examples::Consumer consumer;
|
||||
try {
|
||||
ndn::examples::Consumer consumer;
|
||||
consumer.run();
|
||||
return 0;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "ERROR: " << e.what() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+22
-30
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -21,20 +21,18 @@
|
||||
* @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
|
||||
*/
|
||||
|
||||
// correct way to include ndn-cxx headers
|
||||
// #include <ndn-cxx/face.hpp>
|
||||
// #include <ndn-cxx/security/key-chain.hpp>
|
||||
#include "face.hpp"
|
||||
#include "security/key-chain.hpp"
|
||||
#include <ndn-cxx/face.hpp>
|
||||
#include <ndn-cxx/security/key-chain.hpp>
|
||||
#include <ndn-cxx/security/signing-helpers.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// Enclosing code in ndn simplifies coding (can also use `using namespace ndn`)
|
||||
namespace ndn {
|
||||
// Additional nested namespaces can be used to prevent/limit name conflicts
|
||||
// Additional nested namespaces should be used to prevent/limit name conflicts
|
||||
namespace examples {
|
||||
|
||||
class Producer : noncopyable
|
||||
class Producer
|
||||
{
|
||||
public:
|
||||
void
|
||||
@@ -42,48 +40,41 @@ public:
|
||||
{
|
||||
m_face.setInterestFilter("/example/testApp",
|
||||
bind(&Producer::onInterest, this, _1, _2),
|
||||
RegisterPrefixSuccessCallback(),
|
||||
nullptr, // RegisterPrefixSuccessCallback is optional
|
||||
bind(&Producer::onRegisterFailed, this, _1, _2));
|
||||
m_face.processEvents();
|
||||
}
|
||||
|
||||
private:
|
||||
void
|
||||
onInterest(const InterestFilter& filter, const Interest& interest)
|
||||
onInterest(const InterestFilter&, const Interest& interest)
|
||||
{
|
||||
std::cout << "<< I: " << interest << std::endl;
|
||||
std::cout << ">> I: " << interest << std::endl;
|
||||
|
||||
// Create new name, based on Interest's name
|
||||
Name dataName(interest.getName());
|
||||
dataName
|
||||
.append("testApp") // add "testApp" component to Interest name
|
||||
.appendVersion(); // add "version" component (current UNIX timestamp in milliseconds)
|
||||
|
||||
static const std::string content = "HELLO KITTY";
|
||||
static const std::string content("Hello, world!");
|
||||
|
||||
// Create Data packet
|
||||
shared_ptr<Data> data = make_shared<Data>();
|
||||
data->setName(dataName);
|
||||
data->setFreshnessPeriod(10_s); // 10 seconds
|
||||
auto data = make_shared<Data>(interest.getName());
|
||||
data->setFreshnessPeriod(10_s);
|
||||
data->setContent(reinterpret_cast<const uint8_t*>(content.data()), content.size());
|
||||
|
||||
// Sign Data packet with default identity
|
||||
m_keyChain.sign(*data);
|
||||
// m_keyChain.sign(data, <identityName>);
|
||||
// m_keyChain.sign(data, <certificate>);
|
||||
// m_keyChain.sign(*data, signingByIdentity(<identityName>));
|
||||
// m_keyChain.sign(*data, signingByKey(<keyName>));
|
||||
// m_keyChain.sign(*data, signingByCertificate(<certName>));
|
||||
// m_keyChain.sign(*data, signingWithSha256());
|
||||
|
||||
// Return Data packet to the requester
|
||||
std::cout << ">> D: " << *data << std::endl;
|
||||
std::cout << "<< D: " << *data << std::endl;
|
||||
m_face.put(*data);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
onRegisterFailed(const Name& prefix, const std::string& reason)
|
||||
{
|
||||
std::cerr << "ERROR: Failed to register prefix \""
|
||||
<< prefix << "\" in local hub's daemon (" << reason << ")"
|
||||
<< std::endl;
|
||||
std::cerr << "ERROR: Failed to register prefix '" << prefix
|
||||
<< "' with the local forwarder (" << reason << ")" << std::endl;
|
||||
m_face.shutdown();
|
||||
}
|
||||
|
||||
@@ -98,12 +89,13 @@ private:
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
ndn::examples::Producer producer;
|
||||
try {
|
||||
ndn::examples::Producer producer;
|
||||
producer.run();
|
||||
return 0;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "ERROR: " << e.what() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+17
-18
@@ -3,22 +3,21 @@
|
||||
top = '..'
|
||||
|
||||
def build(bld):
|
||||
# List all .cpp files (whole example should be in one .cpp)
|
||||
for i in bld.path.ant_glob(['*.cpp']):
|
||||
name = str(i)[:-len(".cpp")]
|
||||
bld(features=['cxx', 'cxxprogram'],
|
||||
target=name,
|
||||
source=[i] + bld.path.ant_glob(['%s/**/*.cpp' % name]),
|
||||
use='ndn-cxx',
|
||||
install_path=None
|
||||
)
|
||||
# List all .cpp files (whole example in one .cpp)
|
||||
for ex in bld.path.ant_glob('*.cpp'):
|
||||
name = ex.change_ext('').path_from(bld.path.get_bld())
|
||||
bld.program(name='example-%s' % name,
|
||||
target=name,
|
||||
source=[ex],
|
||||
use='ndn-cxx',
|
||||
install_path=None)
|
||||
|
||||
# List all directories files (example can has multiple .cpp in the directory)
|
||||
for name in bld.path.ant_glob(['*'], dir=True, src=False):
|
||||
bld(features=['cxx', 'cxxprogram'],
|
||||
target="%s/%s" % (name, name),
|
||||
source=bld.path.ant_glob(['%s/**/*.cpp' % name]),
|
||||
use='ndn-cxx',
|
||||
install_path=None,
|
||||
includes='%s' % name,
|
||||
)
|
||||
# List all directories (example can have multiple .cpp in the directory)
|
||||
for subdir in bld.path.ant_glob('*', dir=True, src=False):
|
||||
name = subdir.path_from(bld.path)
|
||||
bld.program(name='example-%s' % name,
|
||||
target=name,
|
||||
source=subdir.ant_glob('**/*.cpp'),
|
||||
use='ndn-cxx',
|
||||
includes=name,
|
||||
install_path=None)
|
||||
@@ -0,0 +1,461 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2020 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ndn-cxx library 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received copies of the GNU General Public License and GNU Lesser
|
||||
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#include "ndn-cxx/data.hpp"
|
||||
#include "ndn-cxx/signature.hpp"
|
||||
#include "ndn-cxx/util/sha256.hpp"
|
||||
#include <iostream>
|
||||
|
||||
namespace ndn {
|
||||
|
||||
BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
|
||||
BOOST_CONCEPT_ASSERT((WireEncodable<Data>));
|
||||
BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<Data>));
|
||||
BOOST_CONCEPT_ASSERT((WireDecodable<Data>));
|
||||
static_assert(std::is_base_of<tlv::Error, Data::Error>::value,
|
||||
"Data::Error must inherit from tlv::Error");
|
||||
|
||||
Data::Data(const Name& name)
|
||||
: m_name(name)
|
||||
{
|
||||
}
|
||||
|
||||
Data::Data(const Block& wire)
|
||||
{
|
||||
wireDecode(wire);
|
||||
}
|
||||
|
||||
template<encoding::Tag TAG>
|
||||
size_t
|
||||
Data::wireEncode(EncodingImpl<TAG>& encoder, bool wantUnsignedPortionOnly) const
|
||||
{
|
||||
// Data = DATA-TYPE TLV-LENGTH
|
||||
// Name
|
||||
// [MetaInfo]
|
||||
// [Content]
|
||||
// [ServiceClass]
|
||||
// [TargetRate]
|
||||
// SignatureInfo
|
||||
// SignatureValue
|
||||
// (elements are encoded in reverse order)
|
||||
|
||||
size_t totalLength = 0;
|
||||
|
||||
// SignatureValue
|
||||
if (!wantUnsignedPortionOnly) {
|
||||
if (!m_signatureInfo) {
|
||||
NDN_THROW(Error("Requested wire format, but Data has not been signed"));
|
||||
}
|
||||
totalLength += encoder.prependBlock(m_signatureValue);
|
||||
}
|
||||
|
||||
// SignatureInfo
|
||||
totalLength += m_signatureInfo.wireEncode(encoder, SignatureInfo::Type::Data);
|
||||
|
||||
// TargetRate
|
||||
if (getTargetRate()) {
|
||||
uint64_t targetRate = *getTargetRate();
|
||||
totalLength += encoder.prependByteArrayBlock(tlv::TargetRate, reinterpret_cast<uint8_t*>(&targetRate), sizeof(targetRate));
|
||||
}
|
||||
|
||||
// ServiceClass
|
||||
if (getServiceClass()) {
|
||||
uint8_t serviceClass = *getServiceClass();
|
||||
totalLength += encoder.prependByteArrayBlock(tlv::ServiceClass, reinterpret_cast<uint8_t*>(&serviceClass), sizeof(serviceClass));
|
||||
}
|
||||
|
||||
// Content
|
||||
if (hasContent()) {
|
||||
totalLength += encoder.prependBlock(m_content);
|
||||
}
|
||||
|
||||
// MetaInfo
|
||||
totalLength += m_metaInfo.wireEncode(encoder);
|
||||
|
||||
// Name
|
||||
totalLength += m_name.wireEncode(encoder);
|
||||
|
||||
if (!wantUnsignedPortionOnly) {
|
||||
totalLength += encoder.prependVarNumber(totalLength);
|
||||
totalLength += encoder.prependVarNumber(tlv::Data);
|
||||
}
|
||||
return totalLength;
|
||||
}
|
||||
|
||||
template size_t
|
||||
Data::wireEncode<encoding::EncoderTag>(EncodingBuffer&, bool) const;
|
||||
|
||||
template size_t
|
||||
Data::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, bool) const;
|
||||
|
||||
const Block&
|
||||
Data::wireEncode(EncodingBuffer& encoder, const Block& signatureValue) const
|
||||
{
|
||||
size_t totalLength = encoder.size();
|
||||
totalLength += encoder.appendBlock(signatureValue);
|
||||
|
||||
encoder.prependVarNumber(totalLength);
|
||||
encoder.prependVarNumber(tlv::Data);
|
||||
|
||||
const_cast<Data*>(this)->wireDecode(encoder.block());
|
||||
return m_wire;
|
||||
}
|
||||
|
||||
const Block&
|
||||
Data::wireEncode() const
|
||||
{
|
||||
if (m_wire.hasWire())
|
||||
return m_wire;
|
||||
|
||||
EncodingEstimator estimator;
|
||||
size_t estimatedSize = wireEncode(estimator);
|
||||
|
||||
EncodingBuffer buffer(estimatedSize, 0);
|
||||
wireEncode(buffer);
|
||||
|
||||
const_cast<Data*>(this)->wireDecode(buffer.block());
|
||||
return m_wire;
|
||||
}
|
||||
|
||||
void
|
||||
Data::wireDecode(const Block& wire)
|
||||
{
|
||||
if (wire.type() != tlv::Data) {
|
||||
NDN_THROW(Error("Data", wire.type()));
|
||||
}
|
||||
m_wire = wire;
|
||||
m_wire.parse();
|
||||
|
||||
// Data = DATA-TYPE TLV-LENGTH
|
||||
// Name
|
||||
// [MetaInfo]
|
||||
// [Content]
|
||||
// [ServiceClass]
|
||||
// [TargetRate]
|
||||
// SignatureInfo
|
||||
// SignatureValue
|
||||
|
||||
auto element = m_wire.elements_begin();
|
||||
if (element == m_wire.elements_end() || element->type() != tlv::Name) {
|
||||
NDN_THROW(Error("Name element is missing or out of order"));
|
||||
}
|
||||
m_name.wireDecode(*element);
|
||||
|
||||
m_metaInfo = {};
|
||||
m_content = {};
|
||||
m_signatureInfo = {};
|
||||
m_signatureValue = {};
|
||||
m_fullName.clear();
|
||||
|
||||
int lastElement = 1; // last recognized element index, in spec order
|
||||
for (++element; element != m_wire.elements_end(); ++element) {
|
||||
// std::cout << "element: " << element->type() << std::endl;
|
||||
switch (element->type()) {
|
||||
case tlv::MetaInfo: {
|
||||
if (lastElement >= 2) {
|
||||
NDN_THROW(Error("MetaInfo element is out of order"));
|
||||
}
|
||||
m_metaInfo.wireDecode(*element);
|
||||
lastElement = 2;
|
||||
break;
|
||||
}
|
||||
case tlv::Content: {
|
||||
if (lastElement >= 3) {
|
||||
NDN_THROW(Error("Content element is out of order"));
|
||||
}
|
||||
m_content = *element;
|
||||
lastElement = 3;
|
||||
break;
|
||||
}
|
||||
case tlv::ServiceClass: {
|
||||
if (lastElement >= 4) {
|
||||
break; // ServiceClass is non-critical, ignore out-of-order appearance
|
||||
}
|
||||
if (element->value_size() != 1) {
|
||||
NDN_THROW(Error("ServiceClass element is malformed"));
|
||||
}
|
||||
m_serviceClass = *element->value();
|
||||
lastElement = 4;
|
||||
break;
|
||||
}
|
||||
case tlv::TargetRate: {
|
||||
if (lastElement >= 5) {
|
||||
break; // TargetRate is non-critical, ignore out-of-order appearance
|
||||
}
|
||||
uint64_t targetRate = 0;
|
||||
if (element->value_size() != 8) {
|
||||
NDN_THROW(Error("TargetRate element is malformed"));
|
||||
}
|
||||
std::memcpy(&targetRate, element->value(), sizeof(targetRate));
|
||||
m_targetRate = targetRate;
|
||||
lastElement = 5;
|
||||
break;
|
||||
}
|
||||
case tlv::SignatureInfo: {
|
||||
if (lastElement >= 6) {
|
||||
NDN_THROW(Error("SignatureInfo element is out of order"));
|
||||
}
|
||||
m_signatureInfo.wireDecode(*element);
|
||||
lastElement = 6;
|
||||
break;
|
||||
}
|
||||
case tlv::SignatureValue: {
|
||||
if (lastElement >= 7) {
|
||||
NDN_THROW(Error("SignatureValue element is out of order"));
|
||||
}
|
||||
m_signatureValue = *element;
|
||||
lastElement = 7;
|
||||
break;
|
||||
}
|
||||
|
||||
default: { // unrecognized element
|
||||
// if the TLV-TYPE is critical, abort decoding
|
||||
if (tlv::isCriticalType(element->type())) {
|
||||
NDN_THROW(Error("Unrecognized element of critical type " + to_string(element->type())));
|
||||
}
|
||||
// otherwise, ignore it
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_signatureInfo) {
|
||||
NDN_THROW(Error("SignatureInfo element is missing"));
|
||||
}
|
||||
if (!m_signatureValue.isValid()) {
|
||||
NDN_THROW(Error("SignatureValue element is missing"));
|
||||
}
|
||||
}
|
||||
|
||||
const Name&
|
||||
Data::getFullName() const
|
||||
{
|
||||
if (m_fullName.empty()) {
|
||||
if (!m_wire.hasWire()) {
|
||||
NDN_THROW(Error("Cannot compute full name because Data has no wire encoding (not signed)"));
|
||||
}
|
||||
m_fullName = m_name;
|
||||
m_fullName.appendImplicitSha256Digest(util::Sha256::computeDigest(m_wire.wire(), m_wire.size()));
|
||||
}
|
||||
|
||||
return m_fullName;
|
||||
}
|
||||
|
||||
void
|
||||
Data::resetWire()
|
||||
{
|
||||
m_wire.reset();
|
||||
m_fullName.clear();
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setName(const Name& name)
|
||||
{
|
||||
if (name != m_name) {
|
||||
m_name = name;
|
||||
resetWire();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setMetaInfo(const MetaInfo& metaInfo)
|
||||
{
|
||||
m_metaInfo = metaInfo;
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setContent(const Block& block)
|
||||
{
|
||||
if (!block.isValid()) {
|
||||
NDN_THROW(std::invalid_argument("Content block must be valid"));
|
||||
}
|
||||
|
||||
if (block.type() == tlv::Content) {
|
||||
m_content = block;
|
||||
}
|
||||
else {
|
||||
m_content = Block(tlv::Content, block);
|
||||
}
|
||||
m_content.encode();
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setContent(const uint8_t* value, size_t length)
|
||||
{
|
||||
if (value == nullptr && length != 0) {
|
||||
NDN_THROW(std::invalid_argument("Content buffer cannot be nullptr"));
|
||||
}
|
||||
|
||||
m_content = makeBinaryBlock(tlv::Content, value, length);
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setContent(ConstBufferPtr value)
|
||||
{
|
||||
if (value == nullptr) {
|
||||
NDN_THROW(std::invalid_argument("Content buffer cannot be nullptr"));
|
||||
}
|
||||
|
||||
m_content = Block(tlv::Content, std::move(value));
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::unsetContent()
|
||||
{
|
||||
m_content = {};
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Signature
|
||||
Data::getSignature() const
|
||||
{
|
||||
return Signature(m_signatureInfo, m_signatureValue);
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setSignature(const Signature& signature)
|
||||
{
|
||||
m_signatureInfo = signature.getSignatureInfo();
|
||||
m_signatureValue = signature.getValue();
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setSignatureInfo(const SignatureInfo& info)
|
||||
{
|
||||
m_signatureInfo = info;
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setSignatureValue(ConstBufferPtr value)
|
||||
{
|
||||
if (value == nullptr) {
|
||||
NDN_THROW(std::invalid_argument("SignatureValue buffer cannot be nullptr"));
|
||||
}
|
||||
|
||||
m_signatureValue = Block(tlv::SignatureValue, std::move(value));
|
||||
resetWire();
|
||||
return *this;
|
||||
}
|
||||
|
||||
InputBuffers
|
||||
Data::extractSignedRanges() const
|
||||
{
|
||||
InputBuffers bufs;
|
||||
bufs.reserve(1); // One range containing data value up to, but not including, SignatureValue
|
||||
|
||||
wireEncode();
|
||||
auto lastSignedIt = std::prev(m_wire.find(tlv::SignatureValue));
|
||||
bufs.emplace_back(m_wire.value(),
|
||||
std::distance(m_wire.value_begin(), lastSignedIt->end()));
|
||||
return bufs;
|
||||
}
|
||||
|
||||
const Data&
|
||||
Data::setServiceClass(optional<uint8_t> serviceClass) const
|
||||
{
|
||||
if (m_serviceClass != serviceClass) {
|
||||
m_serviceClass = serviceClass;
|
||||
m_wire.reset();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
const Data&
|
||||
Data::setTargetRate(optional<uint64_t> targetRate) const
|
||||
{
|
||||
if (m_targetRate != targetRate) {
|
||||
m_targetRate = targetRate;
|
||||
m_wire.reset();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setContentType(uint32_t type)
|
||||
{
|
||||
if (type != m_metaInfo.getType()) {
|
||||
m_metaInfo.setType(type);
|
||||
resetWire();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setFreshnessPeriod(time::milliseconds freshnessPeriod)
|
||||
{
|
||||
if (freshnessPeriod != m_metaInfo.getFreshnessPeriod()) {
|
||||
m_metaInfo.setFreshnessPeriod(freshnessPeriod);
|
||||
resetWire();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Data&
|
||||
Data::setFinalBlock(optional<name::Component> finalBlockId)
|
||||
{
|
||||
if (finalBlockId != m_metaInfo.getFinalBlock()) {
|
||||
m_metaInfo.setFinalBlock(std::move(finalBlockId));
|
||||
resetWire();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(const Data& lhs, const Data& rhs)
|
||||
{
|
||||
return lhs.getName() == rhs.getName() &&
|
||||
lhs.getMetaInfo().wireEncode() == rhs.getMetaInfo().wireEncode() &&
|
||||
lhs.getContent() == rhs.getContent() &&
|
||||
lhs.getSignatureInfo() == rhs.getSignatureInfo() &&
|
||||
lhs.getSignatureValue() == rhs.getSignatureValue();
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
operator<<(std::ostream& os, const Data& data)
|
||||
{
|
||||
os << "Name: " << data.getName() << "\n"
|
||||
<< "MetaInfo: [" << data.getMetaInfo() << "]\n";
|
||||
|
||||
if (data.hasContent()) {
|
||||
os << "Content: [" << data.getContent().value_size() << " bytes]\n";
|
||||
}
|
||||
|
||||
os << "Signature: [type: " << static_cast<tlv::SignatureTypeValue>(data.getSignatureType())
|
||||
<< ", length: "<< data.getSignatureValue().value_size() << "]\n";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
} // namespace ndn
|
||||
@@ -0,0 +1,380 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2020 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ndn-cxx library 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received copies of the GNU General Public License and GNU Lesser
|
||||
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_CXX_DATA_HPP
|
||||
#define NDN_CXX_DATA_HPP
|
||||
|
||||
#include "ndn-cxx/detail/packet-base.hpp"
|
||||
#include "ndn-cxx/encoding/block.hpp"
|
||||
#include "ndn-cxx/meta-info.hpp"
|
||||
#include "ndn-cxx/name.hpp"
|
||||
#include "ndn-cxx/security/security-common.hpp"
|
||||
#include "ndn-cxx/signature-info.hpp"
|
||||
|
||||
namespace ndn {
|
||||
|
||||
class Signature;
|
||||
|
||||
/** @brief Represents a %Data packet.
|
||||
* @sa https://named-data.net/doc/NDN-packet-spec/0.3/data.html
|
||||
*/
|
||||
class Data : public PacketBase, public std::enable_shared_from_this<Data>
|
||||
{
|
||||
public:
|
||||
class Error : public tlv::Error
|
||||
{
|
||||
public:
|
||||
using tlv::Error::Error;
|
||||
};
|
||||
|
||||
/** @brief Construct an unsigned Data packet with given @p name and empty Content.
|
||||
* @warning In certain contexts that use `Data::shared_from_this()`, Data must be created using
|
||||
* `std::make_shared`. Otherwise, `shared_from_this()` may trigger undefined behavior.
|
||||
* One example where this is necessary is storing Data into a subclass of InMemoryStorage.
|
||||
*/
|
||||
explicit
|
||||
Data(const Name& name = Name());
|
||||
|
||||
/** @brief Construct a Data packet by decoding from @p wire.
|
||||
* @param wire TLV block of type tlv::Data; may be signed or unsigned.
|
||||
* @warning In certain contexts that use `Data::shared_from_this()`, Data must be created using
|
||||
* `std::make_shared`. Otherwise, `shared_from_this()` may trigger undefined behavior.
|
||||
* One example where this is necessary is storing Data into a subclass of InMemoryStorage.
|
||||
*/
|
||||
explicit
|
||||
Data(const Block& wire);
|
||||
|
||||
/** @brief Prepend wire encoding to @p encoder
|
||||
* @param encoder EncodingEstimator or EncodingBuffer instance.
|
||||
* @param wantUnsignedPortionOnly If true, prepend only Name, MetaInfo, Content, and
|
||||
* SignatureInfo to @p encoder, but omit SignatureValue and the outermost TLV
|
||||
* Type and Length of the Data element. This is intended to be used with
|
||||
* wireEncode(EncodingBuffer&, const Block&) const.
|
||||
* @throw Error %Signature is not present and @p wantUnsignedPortionOnly is false.
|
||||
*/
|
||||
template<encoding::Tag TAG>
|
||||
size_t
|
||||
wireEncode(EncodingImpl<TAG>& encoder, bool wantUnsignedPortionOnly = false) const;
|
||||
|
||||
/** @brief Finalize Data packet encoding with the specified SignatureValue
|
||||
* @param encoder EncodingBuffer containing Name, MetaInfo, Content, and SignatureInfo, but
|
||||
* without SignatureValue and the outermost Type-Length of the Data element.
|
||||
* @param signatureValue SignatureValue element.
|
||||
*
|
||||
* This method is intended to be used in concert with `wireEncode(encoder, true)`, e.g.:
|
||||
* @code
|
||||
* Data data;
|
||||
* ...
|
||||
* EncodingBuffer encoder;
|
||||
* data.wireEncode(encoder, true);
|
||||
* ...
|
||||
* Block signatureValue = <sign_over_unsigned_portion>(encoder.buf(), encoder.size());
|
||||
* data.wireEncode(encoder, signatureValue)
|
||||
* @endcode
|
||||
*/
|
||||
const Block&
|
||||
wireEncode(EncodingBuffer& encoder, const Block& signatureValue) const;
|
||||
|
||||
/** @brief Encode into a Block.
|
||||
* @pre Data must be signed.
|
||||
*/
|
||||
const Block&
|
||||
wireEncode() const;
|
||||
|
||||
/** @brief Decode from @p wire.
|
||||
*/
|
||||
void
|
||||
wireDecode(const Block& wire);
|
||||
|
||||
/** @brief Check if this instance has cached wire encoding.
|
||||
*/
|
||||
bool
|
||||
hasWire() const noexcept
|
||||
{
|
||||
return m_wire.hasWire();
|
||||
}
|
||||
|
||||
/** @brief Get full name including implicit digest
|
||||
* @pre hasWire() == true; i.e. wireEncode() must have been called
|
||||
* @throw Error Data has no wire encoding
|
||||
*/
|
||||
const Name&
|
||||
getFullName() const;
|
||||
|
||||
public: // Data fields
|
||||
/** @brief Get name
|
||||
*/
|
||||
const Name&
|
||||
getName() const noexcept
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
/** @brief Set name
|
||||
* @return a reference to this Data, to allow chaining
|
||||
*/
|
||||
Data&
|
||||
setName(const Name& name);
|
||||
|
||||
/** @brief Get MetaInfo
|
||||
*/
|
||||
const MetaInfo&
|
||||
getMetaInfo() const noexcept
|
||||
{
|
||||
return m_metaInfo;
|
||||
}
|
||||
|
||||
/** @brief Set MetaInfo
|
||||
* @return a reference to this Data, to allow chaining
|
||||
*/
|
||||
Data&
|
||||
setMetaInfo(const MetaInfo& metaInfo);
|
||||
|
||||
/**
|
||||
* @brief Return whether this Data has a Content element
|
||||
*/
|
||||
bool
|
||||
hasContent() const noexcept
|
||||
{
|
||||
return m_content.isValid();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the Content element
|
||||
*
|
||||
* If the element is not present (hasContent() == false), an invalid Block will be returned.
|
||||
*
|
||||
* The value of the returned Content Block (if valid) can be accessed through
|
||||
* Block::value() / Block::value_size() or Block::value_begin() / Block::value_end().
|
||||
*
|
||||
* @sa hasContent()
|
||||
* @sa Block::blockFromValue(), Block::parse()
|
||||
*/
|
||||
const Block&
|
||||
getContent() const noexcept
|
||||
{
|
||||
return m_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set Content from a Block
|
||||
* @param block TLV block to be used as Content; must be valid
|
||||
* @return a reference to this Data, to allow chaining
|
||||
*
|
||||
* If the block's TLV-TYPE is tlv::Content, it will be used directly as this Data's
|
||||
* Content element. Otherwise, the block will be nested into a Content element.
|
||||
*/
|
||||
Data&
|
||||
setContent(const Block& block);
|
||||
|
||||
/**
|
||||
* @brief Set Content by copying from a raw buffer
|
||||
* @param value buffer with the TLV-VALUE of the content; may be nullptr if @p length is zero
|
||||
* @param length size of the buffer
|
||||
* @return a reference to this Data, to allow chaining
|
||||
*/
|
||||
Data&
|
||||
setContent(const uint8_t* value, size_t length);
|
||||
|
||||
/**
|
||||
* @brief Set Content from a shared buffer
|
||||
* @param value buffer with the TLV-VALUE of the content; must not be nullptr
|
||||
* @return a reference to this Data, to allow chaining
|
||||
*/
|
||||
Data&
|
||||
setContent(ConstBufferPtr value);
|
||||
|
||||
/**
|
||||
* @brief Remove the Content element
|
||||
* @return a reference to this Data, to allow chaining
|
||||
* @post hasContent() == false
|
||||
*/
|
||||
Data&
|
||||
unsetContent();
|
||||
|
||||
/** @brief Get Signature
|
||||
* @deprecated Use getSignatureInfo and getSignatureValue
|
||||
*/
|
||||
[[deprecated("use getSignatureInfo and getSignatureValue")]]
|
||||
Signature
|
||||
getSignature() const;
|
||||
|
||||
/** @brief Set Signature
|
||||
* @deprecated Use setSignatureInfo and setSignatureValue
|
||||
* @return a reference to this Data, to allow chaining
|
||||
*/
|
||||
[[deprecated("use setSignatureInfo and setSignatureValue")]]
|
||||
Data&
|
||||
setSignature(const Signature& signature);
|
||||
|
||||
/** @brief Get SignatureInfo
|
||||
*/
|
||||
const SignatureInfo&
|
||||
getSignatureInfo() const noexcept
|
||||
{
|
||||
return m_signatureInfo;
|
||||
}
|
||||
|
||||
/** @brief Set SignatureInfo
|
||||
*
|
||||
* This is a low-level function that should not normally be called directly by applications.
|
||||
* Instead, provide a SignatureInfo to the SigningInfo object passed to KeyChain::sign().
|
||||
*
|
||||
* @return a reference to this Data, to allow chaining
|
||||
* @warning SignatureInfo is overwritten when the packet is signed via KeyChain::sign().
|
||||
* @sa SigningInfo
|
||||
*/
|
||||
Data&
|
||||
setSignatureInfo(const SignatureInfo& info);
|
||||
|
||||
/** @brief Get SignatureValue
|
||||
*/
|
||||
const Block&
|
||||
getSignatureValue() const noexcept
|
||||
{
|
||||
return m_signatureValue;
|
||||
}
|
||||
|
||||
/** @brief Set SignatureValue
|
||||
* @param value buffer containing the TLV-VALUE of the SignatureValue; must not be nullptr
|
||||
*
|
||||
* This is a low-level function that should not normally be called directly by applications.
|
||||
* Instead, use KeyChain::sign() to sign the packet.
|
||||
*
|
||||
* @return a reference to this Data, to allow chaining
|
||||
* @warning SignatureValue is overwritten when the packet is signed via KeyChain::sign().
|
||||
*/
|
||||
Data&
|
||||
setSignatureValue(ConstBufferPtr value);
|
||||
|
||||
/** @brief Extract ranges of Data covered by the signature
|
||||
* @throw Error Data cannot be encoded or is missing ranges necessary for signing
|
||||
* @warning The returned pointers will be invalidated if wireDecode() or wireEncode() are called.
|
||||
*/
|
||||
InputBuffers
|
||||
extractSignedRanges() const;
|
||||
|
||||
|
||||
optional<uint8_t>
|
||||
getServiceClass() const noexcept
|
||||
{
|
||||
return m_serviceClass;
|
||||
}
|
||||
const Data&
|
||||
setServiceClass(optional<uint8_t> serviceClass) const;
|
||||
optional<uint64_t>
|
||||
getTargetRate() const noexcept
|
||||
{
|
||||
return m_targetRate;
|
||||
}
|
||||
const Data&
|
||||
setTargetRate(optional<uint64_t> targetRate) const;
|
||||
|
||||
public: // MetaInfo fields
|
||||
uint32_t
|
||||
getContentType() const
|
||||
{
|
||||
return m_metaInfo.getType();
|
||||
}
|
||||
|
||||
Data&
|
||||
setContentType(uint32_t type);
|
||||
|
||||
time::milliseconds
|
||||
getFreshnessPeriod() const
|
||||
{
|
||||
return m_metaInfo.getFreshnessPeriod();
|
||||
}
|
||||
|
||||
Data&
|
||||
setFreshnessPeriod(time::milliseconds freshnessPeriod);
|
||||
|
||||
const optional<name::Component>&
|
||||
getFinalBlock() const
|
||||
{
|
||||
return m_metaInfo.getFinalBlock();
|
||||
}
|
||||
|
||||
Data&
|
||||
setFinalBlock(optional<name::Component> finalBlockId);
|
||||
|
||||
public: // SignatureInfo fields
|
||||
/** @brief Get SignatureType
|
||||
* @return tlv::SignatureTypeValue, or -1 to indicate the signature is invalid
|
||||
*/
|
||||
int32_t
|
||||
getSignatureType() const noexcept
|
||||
{
|
||||
return m_signatureInfo.getSignatureType();
|
||||
}
|
||||
|
||||
/** @brief Get KeyLocator
|
||||
*/
|
||||
optional<KeyLocator>
|
||||
getKeyLocator() const noexcept
|
||||
{
|
||||
return m_signatureInfo.hasKeyLocator() ? make_optional(m_signatureInfo.getKeyLocator()) : nullopt;
|
||||
}
|
||||
|
||||
protected:
|
||||
/** @brief Clear wire encoding and cached FullName
|
||||
* @note This does not clear the SignatureValue.
|
||||
*/
|
||||
void
|
||||
resetWire();
|
||||
|
||||
private:
|
||||
Name m_name;
|
||||
MetaInfo m_metaInfo;
|
||||
Block m_content;
|
||||
SignatureInfo m_signatureInfo;
|
||||
Block m_signatureValue;
|
||||
// Add for QSCCP
|
||||
mutable optional<uint8_t> m_serviceClass;
|
||||
mutable optional<uint64_t> m_targetRate;
|
||||
|
||||
mutable Block m_wire;
|
||||
mutable Name m_fullName; ///< cached FullName computed from m_wire
|
||||
};
|
||||
|
||||
#ifndef DOXYGEN
|
||||
extern template size_t
|
||||
Data::wireEncode<encoding::EncoderTag>(EncodingBuffer&, bool) const;
|
||||
|
||||
extern template size_t
|
||||
Data::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, bool) const;
|
||||
#endif
|
||||
|
||||
std::ostream&
|
||||
operator<<(std::ostream& os, const Data& data);
|
||||
|
||||
bool
|
||||
operator==(const Data& lhs, const Data& rhs);
|
||||
|
||||
inline bool
|
||||
operator!=(const Data& lhs, const Data& rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_CXX_DATA_HPP
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -19,7 +19,8 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#include "delegation-list.hpp"
|
||||
#include "ndn-cxx/delegation-list.hpp"
|
||||
#include "ndn-cxx/util/ostream-joiner.hpp"
|
||||
|
||||
namespace ndn {
|
||||
|
||||
@@ -27,11 +28,6 @@ BOOST_CONCEPT_ASSERT((boost::EqualityComparable<DelegationList>));
|
||||
BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<DelegationList>));
|
||||
BOOST_CONCEPT_ASSERT((WireDecodable<DelegationList>));
|
||||
|
||||
DelegationList::Error::Error(const std::string& what, const std::exception& innerException)
|
||||
: Error(what + ": "s + innerException.what())
|
||||
{
|
||||
}
|
||||
|
||||
DelegationList::DelegationList()
|
||||
: m_isSorted(true)
|
||||
{
|
||||
@@ -67,12 +63,12 @@ size_t
|
||||
DelegationList::wireEncode(EncodingImpl<TAG>& encoder, uint32_t type) const
|
||||
{
|
||||
if (!isValidTlvType(type)) {
|
||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid TLV-TYPE " + to_string(type) +
|
||||
" when encoding DelegationList"));
|
||||
NDN_THROW(std::invalid_argument("Unexpected TLV-TYPE " + to_string(type) +
|
||||
" while encoding DelegationList"));
|
||||
}
|
||||
|
||||
if (this->size() == 0) {
|
||||
BOOST_THROW_EXCEPTION(Error("Empty DelegationList"));
|
||||
NDN_THROW(Error("Empty DelegationList"));
|
||||
}
|
||||
|
||||
// LinkContent ::= (type) TLV-LENGTH
|
||||
@@ -109,8 +105,7 @@ void
|
||||
DelegationList::wireDecode(const Block& block, bool wantSort)
|
||||
{
|
||||
if (!isValidTlvType(block.type())) {
|
||||
BOOST_THROW_EXCEPTION(Error("Unexpected TLV-TYPE " + to_string(block.type()) +
|
||||
" when decoding DelegationList"));
|
||||
NDN_THROW(Error("Unexpected TLV-TYPE " + to_string(block.type()) + " while decoding DelegationList"));
|
||||
}
|
||||
|
||||
m_isSorted = wantSort;
|
||||
@@ -119,40 +114,39 @@ DelegationList::wireDecode(const Block& block, bool wantSort)
|
||||
block.parse();
|
||||
for (const auto& del : block.elements()) {
|
||||
if (del.type() != tlv::LinkDelegation) {
|
||||
BOOST_THROW_EXCEPTION(Error("Unexpected TLV-TYPE " + to_string(del.type()) +
|
||||
" when decoding Delegation"));
|
||||
NDN_THROW(Error("Unexpected TLV-TYPE " + to_string(del.type()) + " while decoding Delegation"));
|
||||
}
|
||||
del.parse();
|
||||
|
||||
auto val = del.elements_begin();
|
||||
if (val == del.elements_end() || val->type() != tlv::LinkPreference) {
|
||||
BOOST_THROW_EXCEPTION(Error("Missing Preference field in Delegation"));
|
||||
NDN_THROW(Error("Missing Preference field in Delegation"));
|
||||
}
|
||||
uint64_t preference = 0;
|
||||
try {
|
||||
preference = readNonNegativeInteger(*val);
|
||||
}
|
||||
catch (const tlv::Error& inner) {
|
||||
BOOST_THROW_EXCEPTION(Error("Invalid Preference field in Delegation", inner));
|
||||
catch (const tlv::Error&) {
|
||||
NDN_THROW_NESTED(Error("Invalid Preference field in Delegation"));
|
||||
}
|
||||
|
||||
++val;
|
||||
if (val == del.elements_end() || val->type() != tlv::Name) {
|
||||
BOOST_THROW_EXCEPTION(Error("Missing Name field in Delegation"));
|
||||
NDN_THROW(Error("Missing Name field in Delegation"));
|
||||
}
|
||||
Name name;
|
||||
try {
|
||||
name.wireDecode(*val);
|
||||
}
|
||||
catch (const tlv::Error& inner) {
|
||||
BOOST_THROW_EXCEPTION(Error("Invalid Name field in Delegation", inner));
|
||||
catch (const tlv::Error&) {
|
||||
NDN_THROW_NESTED(Error("Invalid Name field in Delegation"));
|
||||
}
|
||||
|
||||
this->insertImpl(preference, name);
|
||||
}
|
||||
|
||||
if (this->size() == 0) {
|
||||
BOOST_THROW_EXCEPTION(Error("Empty DelegationList"));
|
||||
NDN_THROW(Error("Empty DelegationList"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,8 +186,8 @@ DelegationList::insert(uint64_t preference, const Name& name,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
BOOST_ASSERT_MSG(false, "Unknown onConflict");
|
||||
return false;
|
||||
|
||||
NDN_THROW(std::invalid_argument("Unknown InsertConflictResolution"));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -226,12 +220,6 @@ DelegationList::eraseImpl(optional<uint64_t> preference, const Name& name)
|
||||
return nErased;
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(const DelegationList& lhs, const DelegationList& rhs)
|
||||
{
|
||||
return lhs.m_dels == rhs.m_dels;
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
operator<<(std::ostream& os, const DelegationList& dl)
|
||||
{
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -22,7 +22,8 @@
|
||||
#ifndef NDN_DELEGATION_LIST_HPP
|
||||
#define NDN_DELEGATION_LIST_HPP
|
||||
|
||||
#include "delegation.hpp"
|
||||
#include "ndn-cxx/delegation.hpp"
|
||||
|
||||
#include <initializer_list>
|
||||
|
||||
namespace ndn {
|
||||
@@ -40,8 +41,6 @@ public:
|
||||
{
|
||||
public:
|
||||
using tlv::Error::Error;
|
||||
|
||||
Error(const std::string& what, const std::exception& innerException);
|
||||
};
|
||||
|
||||
/** \brief construct an empty DelegationList
|
||||
@@ -99,7 +98,7 @@ public:
|
||||
return m_dels.end();
|
||||
}
|
||||
|
||||
bool
|
||||
NDN_CXX_NODISCARD bool
|
||||
empty() const noexcept
|
||||
{
|
||||
return m_dels.empty();
|
||||
@@ -216,6 +215,26 @@ private:
|
||||
size_t
|
||||
eraseImpl(optional<uint64_t> preference, const Name& name);
|
||||
|
||||
private: // non-member operators
|
||||
// NOTE: the following "hidden friend" operators are available via
|
||||
// argument-dependent lookup only and must be defined inline.
|
||||
|
||||
/** \brief Compare whether two DelegationLists are equal.
|
||||
* \note Order matters! If two DelegationLists contain the same Delegations but at least one is
|
||||
* unsorted, they may compare unequal if the Delegations appear in different order.
|
||||
*/
|
||||
friend bool
|
||||
operator==(const DelegationList& lhs, const DelegationList& rhs)
|
||||
{
|
||||
return lhs.m_dels == rhs.m_dels;
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator!=(const DelegationList& lhs, const DelegationList& rhs)
|
||||
{
|
||||
return lhs.m_dels != rhs.m_dels;
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_isSorted;
|
||||
|
||||
@@ -227,8 +246,6 @@ private:
|
||||
* therefore the overhead of moving items during insertion and deletion is small.
|
||||
*/
|
||||
std::vector<Delegation> m_dels;
|
||||
|
||||
friend bool operator==(const DelegationList&, const DelegationList&);
|
||||
};
|
||||
|
||||
#ifndef DOXYGEN
|
||||
@@ -239,19 +256,6 @@ extern template size_t
|
||||
DelegationList::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, uint32_t) const;
|
||||
#endif
|
||||
|
||||
/** \brief compare whether two DelegationLists are equal
|
||||
* \note Order matters! If two DelegationLists contain the same Delegations but at least one is
|
||||
* unsorted, they may compare unequal if the Delegations appear in different order.
|
||||
*/
|
||||
bool
|
||||
operator==(const DelegationList& lhs, const DelegationList& rhs);
|
||||
|
||||
inline bool
|
||||
operator!=(const DelegationList& lhs, const DelegationList& rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
operator<<(std::ostream& os, const DelegationList& dl);
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2020 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ndn-cxx library 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received copies of the GNU General Public License and GNU Lesser
|
||||
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_DELEGATION_HPP
|
||||
#define NDN_DELEGATION_HPP
|
||||
|
||||
#include "ndn-cxx/name.hpp"
|
||||
|
||||
namespace ndn {
|
||||
|
||||
/** \brief Represents a %Delegation.
|
||||
* \sa https://named-data.net/doc/NDN-packet-spec/0.3/link.html
|
||||
*/
|
||||
class Delegation
|
||||
{
|
||||
private: // non-member operators
|
||||
// NOTE: the following "hidden friend" operators are available via
|
||||
// argument-dependent lookup only and must be defined inline.
|
||||
|
||||
friend bool
|
||||
operator==(const Delegation& lhs, const Delegation& rhs)
|
||||
{
|
||||
return !(lhs != rhs);
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator!=(const Delegation& lhs, const Delegation& rhs)
|
||||
{
|
||||
return lhs.preference != rhs.preference ||
|
||||
lhs.name != rhs.name;
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator<(const Delegation& lhs, const Delegation& rhs)
|
||||
{
|
||||
return std::tie(lhs.preference, lhs.name) <
|
||||
std::tie(rhs.preference, rhs.name);
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator<=(const Delegation& lhs, const Delegation& rhs)
|
||||
{
|
||||
return !(rhs < lhs);
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator>(const Delegation& lhs, const Delegation& rhs)
|
||||
{
|
||||
return rhs < lhs;
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator>=(const Delegation& lhs, const Delegation& rhs)
|
||||
{
|
||||
return !(lhs < rhs);
|
||||
}
|
||||
|
||||
friend std::ostream&
|
||||
operator<<(std::ostream& os, const Delegation& d)
|
||||
{
|
||||
return os << d.name << '(' << d.preference << ')';
|
||||
}
|
||||
|
||||
public:
|
||||
uint64_t preference;
|
||||
Name name;
|
||||
};
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_DELEGATION_HPP
|
||||
@@ -0,0 +1,6 @@
|
||||
# Implementation Detail
|
||||
|
||||
This folder contains implementation detail of ndn-cxx library.
|
||||
Declarations contained in these files are not considered public API and they can change without notice.
|
||||
|
||||
Headers in this folder are installed to the target system.
|
||||
@@ -19,8 +19,8 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_NET_ASIO_FWD_HPP
|
||||
#define NDN_NET_ASIO_FWD_HPP
|
||||
#ifndef NDN_DETAIL_ASIO_FWD_HPP
|
||||
#define NDN_DETAIL_ASIO_FWD_HPP
|
||||
|
||||
#include <boost/version.hpp>
|
||||
|
||||
@@ -37,4 +37,4 @@ class io_service;
|
||||
} // namespace asio
|
||||
} // namespace boost
|
||||
|
||||
#endif // NDN_NET_ASIO_FWD_HPP
|
||||
#endif // NDN_DETAIL_ASIO_FWD_HPP
|
||||
@@ -0,0 +1,37 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ndn-cxx library 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received copies of the GNU General Public License and GNU Lesser
|
||||
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#include "ndn-cxx/detail/cancel-handle.hpp"
|
||||
|
||||
namespace ndn {
|
||||
namespace detail {
|
||||
|
||||
void
|
||||
CancelHandle::cancel() const
|
||||
{
|
||||
if (m_cancel != nullptr) {
|
||||
m_cancel();
|
||||
m_cancel = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace ndn
|
||||
@@ -0,0 +1,139 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ndn-cxx library 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received copies of the GNU General Public License and GNU Lesser
|
||||
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_DETAIL_CANCEL_HANDLE_HPP
|
||||
#define NDN_DETAIL_CANCEL_HANDLE_HPP
|
||||
|
||||
#include "ndn-cxx/detail/common.hpp"
|
||||
|
||||
namespace ndn {
|
||||
namespace detail {
|
||||
|
||||
/** \brief Handle to cancel an operation.
|
||||
*/
|
||||
class CancelHandle
|
||||
{
|
||||
public:
|
||||
CancelHandle() noexcept;
|
||||
|
||||
explicit
|
||||
CancelHandle(std::function<void()> cancel) noexcept
|
||||
: m_cancel(std::move(cancel))
|
||||
{
|
||||
}
|
||||
|
||||
/** \brief Cancel the operation.
|
||||
*/
|
||||
void
|
||||
cancel() const;
|
||||
|
||||
private:
|
||||
mutable std::function<void()> m_cancel;
|
||||
};
|
||||
|
||||
inline
|
||||
CancelHandle::CancelHandle() noexcept = default;
|
||||
|
||||
/** \brief Cancels an operation automatically upon destruction.
|
||||
*/
|
||||
template<typename HandleT>
|
||||
class ScopedCancelHandle
|
||||
{
|
||||
static_assert(std::is_convertible<HandleT*, CancelHandle*>::value,
|
||||
"HandleT must publicly derive from CancelHandle");
|
||||
|
||||
public:
|
||||
ScopedCancelHandle() noexcept;
|
||||
|
||||
/** \brief Implicit constructor from HandleT.
|
||||
*/
|
||||
ScopedCancelHandle(HandleT hdl) noexcept
|
||||
: m_hdl(std::move(hdl))
|
||||
{
|
||||
}
|
||||
|
||||
/** \brief Copy construction is disallowed.
|
||||
*/
|
||||
ScopedCancelHandle(const ScopedCancelHandle&) = delete;
|
||||
|
||||
/** \brief Move constructor.
|
||||
*/
|
||||
ScopedCancelHandle(ScopedCancelHandle&& other) noexcept
|
||||
: m_hdl(other.release())
|
||||
{
|
||||
}
|
||||
|
||||
/** \brief Copy assignment is disallowed.
|
||||
*/
|
||||
ScopedCancelHandle&
|
||||
operator=(const ScopedCancelHandle&) = delete;
|
||||
|
||||
/** \brief Move assignment operator.
|
||||
*/
|
||||
ScopedCancelHandle&
|
||||
operator=(ScopedCancelHandle&& other)
|
||||
{
|
||||
m_hdl.cancel();
|
||||
m_hdl = other.release();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/** \brief Cancel the operation.
|
||||
*/
|
||||
~ScopedCancelHandle()
|
||||
{
|
||||
m_hdl.cancel();
|
||||
}
|
||||
|
||||
/** \brief Cancel the operation.
|
||||
*/
|
||||
void
|
||||
cancel()
|
||||
{
|
||||
release().cancel();
|
||||
}
|
||||
|
||||
/** \brief Release the operation so that it won't be cancelled when this ScopedCancelHandle is
|
||||
* destructed.
|
||||
*/
|
||||
HandleT
|
||||
release() noexcept
|
||||
{
|
||||
return std::exchange(m_hdl, HandleT{});
|
||||
}
|
||||
|
||||
explicit
|
||||
operator bool() const noexcept
|
||||
{
|
||||
return !!m_hdl;
|
||||
}
|
||||
|
||||
private:
|
||||
HandleT m_hdl;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
ScopedCancelHandle<T>::ScopedCancelHandle() noexcept = default;
|
||||
|
||||
} // namespace detail
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_DETAIL_CANCEL_HANDLE_HPP
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2017 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -19,10 +19,10 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_UTIL_CF_RELEASER_OSX_HPP
|
||||
#define NDN_UTIL_CF_RELEASER_OSX_HPP
|
||||
#ifndef NDN_DETAIL_CF_RELEASER_OSX_HPP
|
||||
#define NDN_DETAIL_CF_RELEASER_OSX_HPP
|
||||
|
||||
#include "../common.hpp"
|
||||
#include "ndn-cxx/detail/common.hpp"
|
||||
|
||||
#ifndef NDN_CXX_HAVE_OSX_FRAMEWORKS
|
||||
#error "This file should not be included ..."
|
||||
@@ -31,7 +31,7 @@
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
namespace ndn {
|
||||
namespace util {
|
||||
namespace detail {
|
||||
|
||||
/**
|
||||
* @brief Helper class to wrap CoreFoundation object pointers
|
||||
@@ -100,18 +100,6 @@ public: // Access
|
||||
return m_typeRef;
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(const std::nullptr_t&)
|
||||
{
|
||||
return m_typeRef == nullptr;
|
||||
}
|
||||
|
||||
bool
|
||||
operator!=(const std::nullptr_t&)
|
||||
{
|
||||
return m_typeRef != nullptr;
|
||||
}
|
||||
|
||||
public: // Miscellaneous
|
||||
void
|
||||
retain(const T& typeRef)
|
||||
@@ -140,11 +128,24 @@ public: // Miscellaneous
|
||||
}
|
||||
}
|
||||
|
||||
private: // Comparison with nullptr
|
||||
friend bool
|
||||
operator==(const CFReleaser& lhs, std::nullptr_t)
|
||||
{
|
||||
return lhs.m_typeRef == nullptr;
|
||||
}
|
||||
|
||||
friend bool
|
||||
operator!=(const CFReleaser& lhs, std::nullptr_t)
|
||||
{
|
||||
return lhs.m_typeRef != nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
T m_typeRef;
|
||||
};
|
||||
|
||||
} // namespace util
|
||||
} // namespace detail
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_UTIL_CF_RELEASER_OSX_HPP
|
||||
#endif // NDN_DETAIL_CF_RELEASER_OSX_HPP
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -19,10 +19,10 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#include "cf-string-osx.hpp"
|
||||
#include "ndn-cxx/detail/cf-string-osx.hpp"
|
||||
|
||||
namespace ndn {
|
||||
namespace util {
|
||||
namespace detail {
|
||||
namespace cfstring {
|
||||
|
||||
CFReleaser<CFStringRef>
|
||||
@@ -30,7 +30,7 @@ fromBuffer(const uint8_t* buf, size_t buflen)
|
||||
{
|
||||
CFStringRef cfStr = CFStringCreateWithBytes(kCFAllocatorDefault, buf, buflen, kCFStringEncodingUTF8, false);
|
||||
if (cfStr == nullptr) {
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Failed to create CFString from buffer"));
|
||||
NDN_THROW(std::runtime_error("Failed to create CFString from buffer"));
|
||||
}
|
||||
return cfStr;
|
||||
}
|
||||
@@ -40,7 +40,7 @@ fromStdString(const std::string& str)
|
||||
{
|
||||
CFStringRef cfStr = CFStringCreateWithCString(kCFAllocatorDefault, str.data(), kCFStringEncodingUTF8);
|
||||
if (cfStr == nullptr) {
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Failed to create CFString from std::string"));
|
||||
NDN_THROW(std::runtime_error("Failed to create CFString from std::string"));
|
||||
}
|
||||
return cfStr;
|
||||
}
|
||||
@@ -58,7 +58,7 @@ toStdString(CFStringRef cfStr)
|
||||
std::string str(CFStringGetLength(cfStr) + 1, '\0');
|
||||
// copy the CFString into the std::string buffer
|
||||
if (!CFStringGetCString(cfStr, &str.front(), str.size(), kCFStringEncodingUTF8)) {
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("CFString to std::string conversion failed"));
|
||||
NDN_THROW(std::runtime_error("CFString to std::string conversion failed"));
|
||||
}
|
||||
// drop the null terminator, std::string doesn't need it
|
||||
str.pop_back();
|
||||
@@ -67,5 +67,5 @@ toStdString(CFStringRef cfStr)
|
||||
}
|
||||
|
||||
} // namespace cfstring
|
||||
} // namespace util
|
||||
} // namespace detail
|
||||
} // namespace ndn
|
||||
@@ -19,16 +19,16 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_UTIL_CF_STRING_OSX_HPP
|
||||
#define NDN_UTIL_CF_STRING_OSX_HPP
|
||||
#ifndef NDN_DETAIL_CF_STRING_OSX_HPP
|
||||
#define NDN_DETAIL_CF_STRING_OSX_HPP
|
||||
|
||||
#include "../common.hpp"
|
||||
#include "ndn-cxx/detail/common.hpp"
|
||||
|
||||
#ifndef NDN_CXX_HAVE_OSX_FRAMEWORKS
|
||||
#error "This file should not be included ..."
|
||||
#endif
|
||||
|
||||
#include "cf-releaser-osx.hpp"
|
||||
#include "ndn-cxx/detail/cf-releaser-osx.hpp"
|
||||
|
||||
/**
|
||||
* @file
|
||||
@@ -37,7 +37,7 @@
|
||||
*/
|
||||
|
||||
namespace ndn {
|
||||
namespace util {
|
||||
namespace detail {
|
||||
namespace cfstring {
|
||||
|
||||
/**
|
||||
@@ -62,7 +62,7 @@ std::string
|
||||
toStdString(CFStringRef cfStr);
|
||||
|
||||
} // namespace cfstring
|
||||
} // namespace util
|
||||
} // namespace detail
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_UTIL_CF_STRING_OSX_HPP
|
||||
#endif // NDN_DETAIL_CF_STRING_OSX_HPP
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2020 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -20,15 +20,20 @@
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief import common constructs for ndn-cxx library internal use
|
||||
* \warning This file is an implementation detail of ndn-cxx library.
|
||||
* \brief Common includes and macros used throughout the library.
|
||||
* \warning This file is an implementation detail of the ndn-cxx library.
|
||||
* Aliases imported in this file MUST NOT be used outside of ndn-cxx.
|
||||
*/
|
||||
|
||||
#ifndef NDN_COMMON_HPP
|
||||
#define NDN_COMMON_HPP
|
||||
#ifndef NDN_DETAIL_COMMON_HPP
|
||||
#define NDN_DETAIL_COMMON_HPP
|
||||
|
||||
#include "ndn-cxx-config.hpp"
|
||||
#include "ndn-cxx/detail/config.hpp"
|
||||
|
||||
// require C++14
|
||||
#if __cplusplus < 201402L
|
||||
#error "ndn-cxx applications must be compiled using the C++14 standard (-std=c++14)"
|
||||
#endif
|
||||
|
||||
// ndn-cxx specific macros declared in this and other headers must have NDN_CXX_ prefix
|
||||
// to avoid conflicts with other projects that include ndn-cxx headers.
|
||||
@@ -44,11 +49,6 @@
|
||||
#define NDN_CXX_PROTECTED_WITH_TESTS_ELSE_PRIVATE private
|
||||
#endif
|
||||
|
||||
// require C++14
|
||||
#if __cplusplus < 201402L
|
||||
#error "ndn-cxx applications must be compiled using the C++14 standard (-std=c++14)"
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
@@ -59,7 +59,6 @@
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <unistd.h>
|
||||
#include <utility>
|
||||
|
||||
namespace ndn {
|
||||
@@ -113,13 +112,13 @@ NDN_CXX_SPECIALIZE_BOOST_IS_PLACEHOLDER_FOR_STD_PLACEHOLDER(9)
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/concept_check.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
|
||||
namespace ndn {
|
||||
using boost::noncopyable;
|
||||
} // namespace ndn
|
||||
|
||||
#include "util/backports.hpp"
|
||||
#include "ndn-cxx/util/backports.hpp"
|
||||
#include "ndn-cxx/util/exception.hpp"
|
||||
|
||||
#endif // NDN_COMMON_HPP
|
||||
#endif // NDN_DETAIL_COMMON_HPP
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2017 Regents of the University of California.
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -19,8 +19,8 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#include "packet-base.hpp"
|
||||
#include "lp/tags.hpp"
|
||||
#include "ndn-cxx/detail/packet-base.hpp"
|
||||
#include "ndn-cxx/lp/tags.hpp"
|
||||
|
||||
namespace ndn {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2017 Regents of the University of California.
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -19,10 +19,10 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_PACKET_BASE_HPP
|
||||
#define NDN_PACKET_BASE_HPP
|
||||
#ifndef NDN_DETAIL_PACKET_BASE_HPP
|
||||
#define NDN_DETAIL_PACKET_BASE_HPP
|
||||
|
||||
#include "tag-host.hpp"
|
||||
#include "ndn-cxx/detail/tag-host.hpp"
|
||||
|
||||
namespace ndn {
|
||||
|
||||
@@ -44,4 +44,4 @@ public:
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_PACKET_BASE_HPP
|
||||
#endif // NDN_DETAIL_PACKET_BASE_HPP
|
||||
@@ -19,11 +19,11 @@
|
||||
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
|
||||
*/
|
||||
|
||||
#ifndef NDN_TAG_HOST_HPP
|
||||
#define NDN_TAG_HOST_HPP
|
||||
#ifndef NDN_DETAIL_TAG_HOST_HPP
|
||||
#define NDN_DETAIL_TAG_HOST_HPP
|
||||
|
||||
#include "common.hpp"
|
||||
#include "tag.hpp"
|
||||
#include "ndn-cxx/detail/common.hpp"
|
||||
#include "ndn-cxx/tag.hpp"
|
||||
|
||||
#include <map>
|
||||
|
||||
@@ -97,4 +97,4 @@ TagHost::removeTag() const
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
#endif // NDN_TAG_HOST_HPP
|
||||
#endif // NDN_DETAIL_TAG_HOST_HPP
|
||||
Loaded 100 of 767 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user