improve examples
[elektra-initiative:libelektra.git] / src / bindings / cpp / examples / cpp_example_userio.cpp
1 /**
2  * @file
3  *
4  * This examples show how elektras KDBException can be changed in a way
5  * so that it has user defined output.
6  *
7  * It works -- because of binary compatibility -- if only the receiver
8  * of the message (where it is catched) redefines the IO functions
9  * printError and printWarnings. They need to be defined with the
10  * same signature and in either global or kdb namespace.
11  *
12  * The output operators of Key and KeySet can be redefined without any
13  * macro by simply not including \<keyio.hpp\> and \<keysetio.hpp\>.
14  */
15
16 #define USER_DEFINED_IO
17
18 #include <iostream>
19 #include <iomanip>
20
21 #include <key.hpp>
22
23 inline std::ostream & printError(std::ostream & os, kdb::Key const & error)
24 {
25         os << "User defined IO (errors)" << std::endl;
26
27         if (!error.getMeta<const kdb::Key>("error"))
28         {
29                 // no error available
30                 return os;
31         }
32
33         try{
34                 error.getMeta<std::string>("error");
35                 os << "Error number " << error.getMeta<std::string>("error/number") << " occurred!" << std::endl;
36                 os << "Description: " << error.getMeta<std::string>("error/description") << std::endl;
37                 os << "Ingroup: " << error.getMeta<std::string>("error/ingroup") << std::endl;
38                 os << "Module: " << error.getMeta<std::string>("error/module") << std::endl;
39                 os << "At: " << error.getMeta<std::string>("error/file") << ":" << error.getMeta<std::string>("error/line") << std::endl;
40                 os << "Reason: " << error.getMeta<std::string>("error/reason") << std::endl;
41         } catch (kdb::KeyMetaException const& e)
42         {
43                 os << "Error meta data is not set correctly by a plugin" << std::endl;
44         }
45
46         return os;
47 }
48
49 inline std::ostream & printWarnings(std::ostream & os, kdb::Key const & error)
50 {
51         os << "User defined IO (warnings)" << std::endl;
52
53         if (!error.getMeta<const kdb::Key>("warnings"))
54         {
55                 // no warnings were issued
56                 return os;
57         }
58
59         try{
60                 int nr = error.getMeta<int>("warnings");
61                 if (!nr)
62                 {
63                         os << "1 Warning was issued:" << std::endl;
64                 }
65                 else
66                 {
67                         os << nr+1 << " Warnings were issued:" << std::endl;
68                 }
69
70                 for (int i=0; i<=nr; i++)
71                 {
72                         std::ostringstream name;
73                         name << "warnings/#" << std::setfill('0') << std::setw(2) << i;
74                         // os << "\t" << name.str() << ": " << error.getMeta<std::string>(name.str()) << std::endl;
75                         os << "\tWarning number: " << error.getMeta<std::string>(name.str() + "/number") << std::endl;
76                         os << "\tDescription: " << error.getMeta<std::string>(name.str() + "/description") << std::endl;
77                         os << "\tIngroup: " << error.getMeta<std::string>(name.str() + "/ingroup") << std::endl;
78                         os << "\tModule: " << error.getMeta<std::string>(name.str() + "/module") << std::endl;
79                         os << "\tAt: " << error.getMeta<std::string>(name.str() + "/file") << ":"
80                                   << error.getMeta<std::string>(name.str() + "/line") << std::endl;
81                         os << "\tReason: " << error.getMeta<std::string>(name.str() + "/reason") << std::endl;
82                 }
83
84         } catch (kdb::KeyMetaException const& e)
85         {
86                 os << "Warnings meta data not set correctly by a plugin" << std::endl;
87         }
88
89         return os;
90 }
91
92 #include <kdb.hpp>
93
94 #include <keyio.hpp>
95 #include <keysetio.hpp>
96 #include <kdbio.hpp>
97
98 int main()
99 {
100         kdb::Key k("user/sw/MyApp", KEY_END);
101         std::cout << k << std::endl;
102
103         kdb::KeySet ks;
104         ks.append(k);
105         std::cout << ks;
106
107         try
108         {
109                 kdb::KDB kdb(k);
110                 kdb.get(ks, k);
111
112                 std::cout << ks;
113
114                 kdb.set(ks, k);
115                 kdb.close(k);
116                 printWarnings(std::cout, k);
117         }
118         catch (kdb::KDBException const & e)
119         {
120                 std::cout << e.what(); // will print user defined IO
121         }
122 }