Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OTStoragePB.hpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * OTStoragePB.hpp
4  *
5  */
6 
7 /************************************************************
8  -----BEGIN PGP SIGNED MESSAGE-----
9  Hash: SHA1
10 
11  * OPEN TRANSACTIONS
12  *
13  * Financial Cryptography and Digital Cash
14  * Library, Protocol, API, Server, CLI, GUI
15  *
16  * -- Anonymous Numbered Accounts.
17  * -- Untraceable Digital Cash.
18  * -- Triple-Signed Receipts.
19  * -- Cheques, Vouchers, Transfers, Inboxes.
20  * -- Basket Currencies, Markets, Payment Plans.
21  * -- Signed, XML, Ricardian-style Contracts.
22  * -- Scripted smart contracts.
23  *
24  * Copyright (C) 2010-2013 by "Fellow Traveler" (A pseudonym)
25  *
26  * EMAIL:
28  *
29  * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ
30  *
31  * KEY FINGERPRINT (PGP Key in license file):
32  * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E
33  *
34  * OFFICIAL PROJECT WIKI(s):
35  * https://github.com/FellowTraveler/Moneychanger
36  * https://github.com/FellowTraveler/Open-Transactions/wiki
37  *
38  * WEBSITE:
39  * http://www.OpenTransactions.org/
40  *
41  * Components and licensing:
42  * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3
43  * -- otlib.........A class library.......LICENSE:...LAGPLv3
44  * -- otapi.........A client API..........LICENSE:...LAGPLv3
45  * -- opentxs/ot....Command-line client...LICENSE:...LAGPLv3
46  * -- otserver......Server Application....LICENSE:....AGPLv3
47  * Github.com/FellowTraveler/Open-Transactions/wiki/Components
48  *
49  * All of the above OT components were designed and written by
50  * Fellow Traveler, with the exception of Moneychanger, which
51  * was contracted out to Vicky C ([email protected]).
52  * The open-source community has since actively contributed.
53  *
54  * -----------------------------------------------------
55  *
56  * LICENSE:
57  * This program is free software: you can redistribute it
58  * and/or modify it under the terms of the GNU Affero
59  * General Public License as published by the Free Software
60  * Foundation, either version 3 of the License, or (at your
61  * option) any later version.
62  *
63  * ADDITIONAL PERMISSION under the GNU Affero GPL version 3
64  * section 7: (This paragraph applies only to the LAGPLv3
65  * components listed above.) If you modify this Program, or
66  * any covered work, by linking or combining it with other
67  * code, such other code is not for that reason alone subject
68  * to any of the requirements of the GNU Affero GPL version 3.
69  * (==> This means if you are only using the OT API, then you
70  * don't have to open-source your code--only your changes to
71  * Open-Transactions itself must be open source. Similar to
72  * LGPLv3, except it applies to software-as-a-service, not
73  * just to distributing binaries.)
74  *
75  * Extra WAIVER for OpenSSL, Lucre, and all other libraries
76  * used by Open Transactions: This program is released under
77  * the AGPL with the additional exemption that compiling,
78  * linking, and/or using OpenSSL is allowed. The same is true
79  * for any other open source libraries included in this
80  * project: complete waiver from the AGPL is hereby granted to
81  * compile, link, and/or use them with Open-Transactions,
82  * according to their own terms, as long as the rest of the
83  * Open-Transactions terms remain respected, with regard to
84  * the Open-Transactions code itself.
85  *
86  * Lucre License:
87  * This code is also "dual-license", meaning that Ben Lau-
88  * rie's license must also be included and respected, since
89  * the code for Lucre is also included with Open Transactions.
90  * See Open-Transactions/src/otlib/lucre/LUCRE_LICENSE.txt
91  * The Laurie requirements are light, but if there is any
92  * problem with his license, simply remove the Lucre code.
93  * Although there are no other blind token algorithms in Open
94  * Transactions (yet. credlib is coming), the other functions
95  * will continue to operate.
96  * See Lucre on Github: https://github.com/benlaurie/lucre
97  * -----------------------------------------------------
98  * You should have received a copy of the GNU Affero General
99  * Public License along with this program. If not, see:
100  * http://www.gnu.org/licenses/
101  *
102  * If you would like to use this software outside of the free
103  * software license, please contact FellowTraveler.
104  * (Unfortunately many will run anonymously and untraceably,
105  * so who could really stop them?)
106  *
107  * DISCLAIMER:
108  * This program is distributed in the hope that it will be
109  * useful, but WITHOUT ANY WARRANTY; without even the implied
110  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
111  * PURPOSE. See the GNU Affero General Public License for
112  * more details.
113 
114  -----BEGIN PGP SIGNATURE-----
115  Version: GnuPG v1.4.9 (Darwin)
116 
117  iQIcBAEBAgAGBQJRSsfJAAoJEAMIAO35UbuOQT8P/RJbka8etf7wbxdHQNAY+2cC
118  vDf8J3X8VI+pwMqv6wgTVy17venMZJa4I4ikXD/MRyWV1XbTG0mBXk/7AZk7Rexk
119  KTvL/U1kWiez6+8XXLye+k2JNM6v7eej8xMrqEcO0ZArh/DsLoIn1y8p8qjBI7+m
120  aE7lhstDiD0z8mwRRLKFLN2IH5rAFaZZUvj5ERJaoYUKdn4c+RcQVei2YOl4T0FU
121  LWND3YLoH8naqJXkaOKEN4UfJINCwxhe5Ke9wyfLWLUO7NamRkWD2T7CJ0xocnD1
122  sjAzlVGNgaFDRflfIF4QhBx1Ddl6wwhJfw+d08bjqblSq8aXDkmFA7HeunSFKkdn
123  oIEOEgyj+veuOMRJC5pnBJ9vV+7qRdDKQWaCKotynt4sWJDGQ9kWGWm74SsNaduN
124  TPMyr9kNmGsfR69Q2Zq/FLcLX/j8ESxU+HYUB4vaARw2xEOu2xwDDv6jt0j3Vqsg
125  x7rWv4S/Eh18FDNDkVRChiNoOIilLYLL6c38uMf1pnItBuxP3uhgY6COm59kVaRh
126  nyGTYCDYD2TK+fI9o89F1297uDCwEJ62U0Q7iTDp5QuXCoxkPfv8/kX6lS6T3y9G
127  M9mqIoLbIQ1EDntFv7/t6fUTS2+46uCrdZWbQ5RjYXdrzjij02nDmJAm2BngnZvd
128  kamH0Y/n11lCvo1oQxM+
129  =uSzz
130  -----END PGP SIGNATURE-----
131  **************************************************************/
132 
133 #ifndef OPENTXS_CORE_OTSTORAGEPB_HPP
134 #define OPENTXS_CORE_OTSTORAGEPB_HPP
135 
136 #include "util/Assert.hpp"
137 
138 #include <deque>
139 #include <iostream>
140 #include <map>
141 #include <vector>
142 
143 #if defined(OTDB_PROTOCOL_BUFFERS)
144 
145 #ifdef _WIN32
146 #pragma warning(push)
147 #pragma warning(disable : 4244)
148 #pragma warning(disable : 4267)
149 #endif
150 
151 #if defined(ANDROID) || defined(OT_KEYRING_IOS)
152 #include "Generics-lite.pb.h"
153 #include "Markets-lite.pb.h"
154 #include "Bitcoin-lite.pb.h"
155 #include "Moneychanger-lite.pb.h"
156 #else
157 
158 // (NOT Android.)
159 //
160 #include "Generics.pb.h"
161 #include "Markets.pb.h"
162 #include "Bitcoin.pb.h"
163 #include "Moneychanger.pb.h"
164 #endif
165 
166 #ifdef _WIN32
167 #pragma warning(pop)
168 #endif
169 
170 // To make subclasses of the various data objects (for Protocol Buffers):
171 //
172 // typedef ProtobufSubclass<theBaseType, theInternalType> theType;
173 //
174 // Also, REMEMBER for each object type declared, to add the hooks to the CPP
175 // file.
176 // (Instructions are below.)
177 //
178 /*
179 REPLACING OT_PROTOBUF_DECLARE() WITH A TEMPLATE FOR NOW...
180 
181 #define OT_PROTOBUF_DECLARE(theType, theBaseType, theInternalType) \
182 class theType : public theBaseType, implements IStorablePB \
183 { \
184 private: \
185 theInternalType __pb_obj; \
186 protected: \
187 theType() : theBaseType() { } \
188 public: \
189 ::google::protobuf::MessageLite& getPBMessage() { return
190 dynamic_cast<::google::protobuf::MessageLite>(__pb_obj); } \
191 static Storable* Instantiate() { return dynamic_cast<Storable*>(new
192 theType()); } \
193 virtual ~theType() { } \
194 virtual void hookBeforePack(); \
195 virtual void hookAfterUnpack(); \
196 }
197 // OT_PROTOBUF_DECLARE(BitcoinAcctPB, BitcoinAcct, BitcoinAcct_InternalPB);
198 // OT_PROTOBUF_DECLARE(BitcoinServerPB, BitcoinServer,
199 BitcoinServer_InternalPB);
200 
201 
202 
203 #define DECLARE_PACKED_BUFFER_SUBCLASS(theNewType, thePackerType,
204 theInterfaceType, theInternalType) \
205 class theNewType : public PackedBuffer \
206 { \
207 friend class thePackerType; \
208 friend OTInterface theInterfaceType; \
209 theInternalType m_buffer; \
210 \
211 public: \
212 theNewType() : PackedBuffer() {} \
213 virtual ~theNewType(); \
214 virtual bool PackString(std::string& theString); \
215 virtual bool UnpackString(std::string& theString); \
216 virtual bool ReadFromIStream(std::istream &inStream, int64_t lFilesize); \
217 virtual bool WriteToOStream(std::ostream &outStream); \
218 }
219 */
220 
221 namespace opentxs
222 {
223 
224 namespace OTDB
225 {
226 
227 // Interface: IStorablePB
228 //
229 DeclareBasedInterface(IStorablePB,
230  IStorable) virtual ::google::protobuf::MessageLite
231  * getPBMessage();
232 virtual bool onPack(PackedBuffer& theBuffer, Storable& inObj);
233 virtual bool onUnpack(PackedBuffer& theBuffer, Storable& outObj);
236 
237  // BUFFER for Protocol Buffers.
238  // Google's protocol buffers serializes to std::strings and streams. How
239  // conveeeeeenient.
240  //
241  // typedef PackedBufferSubclass<PackerPB, IStorablePB, std::string>
242  // BufferPB;
243  DECLARE_PACKED_BUFFER_SUBCLASS(BufferPB, PackerSubclass<BufferPB>,
244  IStorablePB, std::string);
245 
246 // Protocol Buffers packer.
247 //
248 typedef PackerSubclass<BufferPB> PackerPB;
249 
250 // Used for subclassing IStorablePB:
251 //
252 template <class theBaseType, class theInternalType,
253  StoredObjectType theObjectType>
254 class ProtobufSubclass : public theBaseType, implements IStorablePB
255 {
256 private:
257  theInternalType __pb_obj;
258  std::string m_Type;
259 
260 public:
261  static Storable* Instantiate()
262  {
263  return dynamic_cast<Storable*>(
264  new ProtobufSubclass<theBaseType, theInternalType, theObjectType>);
265  }
266 
267  ProtobufSubclass()
268  : theBaseType()
269  , IStorablePB()
270  , m_Type(StoredObjectTypeStrings[static_cast<int32_t>(theObjectType)])
271  {
272  m_Type += "PB";
273  /*std::cout << m_Type << " -- Constructor" << std::endl;*/ }
274 
275  ProtobufSubclass(const ProtobufSubclass<theBaseType, theInternalType,
276  theObjectType>& rhs)
277  : theBaseType()
278  , IStorablePB()
279  , m_Type(StoredObjectTypeStrings[static_cast<int32_t>(theObjectType)])
280  {
281  m_Type += "PB";
282  /*std::cout << m_Type << " -- Copy Constructor" << std::endl; */ rhs
283  .CopyToObject(*this);
284  }
285 
286  ProtobufSubclass<theBaseType, theInternalType, theObjectType>& operator=(
287  const ProtobufSubclass<theBaseType, theInternalType, theObjectType>&
288  rhs)
289  {
290  rhs.CopyToObject(*this);
291  return *this;
292  }
293 
294  void CopyToObject(ProtobufSubclass<theBaseType, theInternalType,
295  theObjectType>& theNewStorable) const
296  {
297  OTPacker* pPacker = OTPacker::Create(PACK_PROTOCOL_BUFFERS);
298  const OTDB::Storable* pIntermediate =
299  dynamic_cast<const OTDB::Storable*>(this);
300 
301  if (nullptr == pPacker) {
302  OT_FAIL;
303  }
304  PackedBuffer* pBuffer =
305  pPacker->Pack(*(const_cast<OTDB::Storable*>(pIntermediate)));
306  if (nullptr == pBuffer) {
307  OT_FAIL;
308  }
309  if (!pPacker->Unpack(*pBuffer, theNewStorable)) {
310  OT_FAIL;
311  }
312  if (nullptr != pPacker) {
313  delete pPacker;
314  pPacker = nullptr;
315  }
316  if (nullptr != pBuffer) {
317  delete pBuffer;
318  pBuffer = nullptr;
319  }
320  }
321 
322  virtual ::google::protobuf::MessageLite* getPBMessage();
323 
324  // IStorable * clone(void) const
325  // {return dynamic_cast<IStorable *>(new
326  // ProtobufSubclass<theBaseType, theInternalType, theObjectType>(*this));}
327 
328  virtual theBaseType* clone(void) const
329  { /*std::cout << "Cloning a " << m_Type << std::endl;*/
330  return dynamic_cast<theBaseType*>(do_clone());
331  }
332 
333  IStorable* do_clone(void) const
334  {
335  Storable* pNewStorable =
336  Storable::Create(theObjectType, PACK_PROTOCOL_BUFFERS);
337  if (nullptr == pNewStorable) OT_FAIL;
338  CopyToObject(*(dynamic_cast<
339  ProtobufSubclass<theBaseType, theInternalType, theObjectType>*>(
340  pNewStorable)));
341  return dynamic_cast<IStorable*>(pNewStorable);
342  }
343 
344  virtual ~ProtobufSubclass()
345  {
346  }
348  virtual void hookBeforePack(); // <=== Implement this if you subclass.
349  virtual void hookAfterUnpack(); // <=== Implement this if you subclass.
350 };
351 
352 #define DECLARE_PROTOBUF_SUBCLASS(theBaseType, theInternalType, theNewType, \
353  theObjectType) \
354  template <> \
355  void ProtobufSubclass<theBaseType, theInternalType, \
356  theObjectType>::hookBeforePack(); \
357  template <> \
358  void ProtobufSubclass<theBaseType, theInternalType, \
359  theObjectType>::hookAfterUnpack(); \
360  typedef ProtobufSubclass<theBaseType, theInternalType, theObjectType> \
361  theNewType
362 
363 // THE ACTUAL SUBCLASSES:
364 
365 DECLARE_PROTOBUF_SUBCLASS(OTDBString, String_InternalPB, StringPB,
367 DECLARE_PROTOBUF_SUBCLASS(Blob, Blob_InternalPB, BlobPB, STORED_OBJ_BLOB);
368 DECLARE_PROTOBUF_SUBCLASS(StringMap, StringMap_InternalPB, StringMapPB,
370 DECLARE_PROTOBUF_SUBCLASS(BitcoinAcct, BitcoinAcct_InternalPB, BitcoinAcctPB,
372 DECLARE_PROTOBUF_SUBCLASS(BitcoinServer, BitcoinServer_InternalPB,
373  BitcoinServerPB, STORED_OBJ_BITCOIN_SERVER);
374 DECLARE_PROTOBUF_SUBCLASS(RippleServer, RippleServer_InternalPB, RippleServerPB,
376 DECLARE_PROTOBUF_SUBCLASS(LoomServer, LoomServer_InternalPB, LoomServerPB,
378 DECLARE_PROTOBUF_SUBCLASS(ServerInfo, ServerInfo_InternalPB, ServerInfoPB,
380 DECLARE_PROTOBUF_SUBCLASS(ContactAcct, ContactAcct_InternalPB, ContactAcctPB,
382 DECLARE_PROTOBUF_SUBCLASS(ContactNym, ContactNym_InternalPB, ContactNymPB,
384 DECLARE_PROTOBUF_SUBCLASS(Contact, Contact_InternalPB, ContactPB,
386 DECLARE_PROTOBUF_SUBCLASS(AddressBook, AddressBook_InternalPB, AddressBookPB,
388 DECLARE_PROTOBUF_SUBCLASS(WalletData, WalletData_InternalPB, WalletDataPB,
390 DECLARE_PROTOBUF_SUBCLASS(MarketData, MarketData_InternalPB, MarketDataPB,
392 DECLARE_PROTOBUF_SUBCLASS(MarketList, MarketList_InternalPB, MarketListPB,
394 
395 DECLARE_PROTOBUF_SUBCLASS(BidData, OfferDataMarket_InternalPB, BidDataPB,
397 DECLARE_PROTOBUF_SUBCLASS(AskData, OfferDataMarket_InternalPB, AskDataPB,
399 DECLARE_PROTOBUF_SUBCLASS(OfferListMarket, OfferListMarket_InternalPB,
400  OfferListMarketPB, STORED_OBJ_OFFER_LIST_MARKET);
401 DECLARE_PROTOBUF_SUBCLASS(TradeDataMarket, TradeDataMarket_InternalPB,
402  TradeDataMarketPB, STORED_OBJ_TRADE_DATA_MARKET);
403 DECLARE_PROTOBUF_SUBCLASS(TradeListMarket, TradeListMarket_InternalPB,
404  TradeListMarketPB, STORED_OBJ_TRADE_LIST_MARKET);
405 DECLARE_PROTOBUF_SUBCLASS(OfferDataNym, OfferDataNym_InternalPB, OfferDataNymPB,
407 DECLARE_PROTOBUF_SUBCLASS(OfferListNym, OfferListNym_InternalPB, OfferListNymPB,
409 DECLARE_PROTOBUF_SUBCLASS(TradeDataNym, TradeDataNym_InternalPB, TradeDataNymPB,
411 DECLARE_PROTOBUF_SUBCLASS(TradeListNym, TradeListNym_InternalPB, TradeListNymPB,
413 
414 typedef OfferDataMarket_InternalPB BidData_InternalPB;
415 typedef OfferDataMarket_InternalPB AskData_InternalPB;
416 
417 // !! ALL OF THESE have to provide implementations for hookBeforePack() and
418 // hookAfterUnpack().
419 // In .cpp file:
420 /*
421 void SUBCLASS_HERE::hookBeforePack()
422 {
423 __pb_obj.set_PROPERTY_NAME_GOES_HERE(PROPERTY_NAME_GOES_HERE);
424 }
425 void SUBCLASS_HERE::hookAfterUnpack()
426 {
427 PROPERTY_NAME_GOES_HERE = __pb_obj.PROPERTY_NAME_GOES_HERE();
428 }
429 */
430 
431 } // namespace OTDB
432 
433 } // namespace opentxs
434 
435 #endif // defined(OTDB_PROTOCOL_BUFFERS)
436 
437 #endif // OPENTXS_CORE_OTSTORAGEPB_HPP
virtual void hookAfterUnpack()
Definition: OTStorage.hpp:384
#define DeclareBasedInterface(name, base)
Definition: OTStorage.hpp:195
#define DECLARE_PACKED_BUFFER_SUBCLASS(theNewType, thePackerType,theInterfaceType, theInternalType)
Definition: OTStorage.hpp:506
#define OT_USING_ISTORABLE_HOOKS
Definition: OTStorage.hpp:1967
virtual void hookBeforePack()
Definition: OTStorage.hpp:380
#define EndInterface
Definition: OTStorage.hpp:203
const char * StoredObjectTypeStrings[]
Definition: OTStorage.cpp:300
static OTPacker * Create(PackType ePackType)
Definition: OTStorage.cpp:889
#define OT_FAIL
Definition: Assert.hpp:139
Storable & inObj
Definition: OTStorage.hpp:376
#define implements
Definition: OTStorage.hpp:207
static EXPORT Storable * Create(StoredObjectType eType, PackType thePackType)
Definition: OTStorage.cpp:860
virtual bool onUnpack(PackedBuffer &theBuffer, Storable &outObj)=0